Bạn phải xây dựng các trụ bổ sung!


28

Giới thiệu

Trong trò chơi chiến lược Starcraft 2, có ba "chủng tộc" để lựa chọn: Terran, Zerg và Protoss. Trong thử thách này, chúng tôi sẽ tập trung vào Protoss và cụm từ mang tính biểu tượng "Bạn phải xây dựng các trụ bổ sung!" Thông báo này được nêu khi bạn hết nguồn cung cấp để xây dựng quân đội của bạn. Vì vậy, để giúp đỡ cộng đồng Starcraft, bạn phải viết một chương trình hoặc chức năng cho người chơi biết chính xác họ cần bao nhiêu giá treo.

Các thách thức

Bạn sẽ được cung cấp đầu vào của một chuỗi bao gồm một số nguyên đơn Nvà danh sách các đơn vị được phân tách bằng dấu cách. Nsẽ luôn bằng 0 hoặc dương và danh sách các đơn vị sẽ luôn có một hoặc nhiều đơn vị hợp lệ. Nđại diện cho số lượng trụ mà người chơi hiện có. Công việc của bạn là tính toán nếu số lượng trụ mà người chơi có đủ để xây dựng các đơn vị. Đầu ra chương trình hoặc chức năng bắt buộc của bạn / trả về một giá trị truthy nếu có đủ nguồn cung cấp, hoặc nếu không có đủ nguồn cung cấp bạn phải ra You must construct ZZZ additional pylonsnơi ZZZlà số tiền của giá treo cần thiết để xây dựng các đơn vị. Lưu ý rằng pylon(s)phải là số nhiều khi cần thiết và số nhiều khi không ( ...1 additional pylon!, ...2 additional pylons!).

Đơn vị Protoss và chi phí cung cấp

Dưới đây là danh sách tất cả các đơn vị và chi phí cung cấp tương ứng của họ. Giá treo cung cấp thêm 8 nguồn cung cấp.

Unit            Supply Cost

Probe           1
Zealot          2
Sentry          2
Stalker         2
HighTemplar     2
DarkTemplar     2
Immortal        4
Colossus        6
Archon          4
Observer        1
WarpPrism       2
Phoenix         2
MothershipCore  2
VoidRay         4
Oracle          3
Tempest         4
Carrier         6
Mothership      8

Ví dụ KHÔNG CÓ Tiền thưởng

Input:
   2 Probe Probe Probe Probe Stalker Zealot Carrier Probe Zealot
Output:
   You must construct 1 additional pylon!
Why?
   Adding up the supply costs for all of the units gives 17. The current 2 pylons provide 16 supply, so one more is needed to provide enough for 17.

Input:
   5 Mothership Carrier Probe Tempest HighTemplar
Output:
   true
Why?
   Adding up the units gets 21. The current 5 pylons provide 40 supply, which is plenty enough.

Input:
  0 Mothership Colossus Zealot
Output:
  You must construct 2 additional pylons!
Why?
  Adding the units gets 16. There is no pylons so 2 need to be built to provide enough supply. 

Tiền thưởng

  1. Bất kỳ người chơi Starcraft 2 có kinh nghiệm nào cũng sẽ biết rằng bạn cần có một tình mẫu tử trước khi biến nó thành tình mẫu tử. Ngoài ra, bạn chỉ có thể có một lần làm mẹ tại một thời điểm (cho dù đó là việc làm mẹ thực sự hay cốt lõi làm mẹ). Nếu cả hai điều kiện này đều không đúng, hãy xuất bất kỳ giá trị giả nào. Nếu chương trình của bạn có thể kiểm tra để thấy rằng chỉ có một chế độ làm mẹ hoạt động tại một thời điểm và lõi của chế độ làm mẹ được xây dựng trước khi làm mẹ thực tế, hãy giảm 20% số byte của bạn.
  2. Bạn có thể biết ít, nhưng nexuses (trung tâm chỉ huy protoss) thực sự cũng cung cấp! Nếu chương trình của bạn có thể thêm 11 vào nguồn cung tối đa mỗi lần nó gặp một nexus trong danh sách đơn vị, hãy giảm 10% số byte của bạn. Lưu ý rằng việc Nexus ở đâu trong thứ tự xây dựng không quan trọng, vì vậy 0 Probe Nexusvẫn sẽ quay lại true.

Ví dụ với tiền thưởng

Input (Bonus 1):
  3 Mothership Zealot
Output:
  false
Why?
  According to the first bonus, a mothership core has to be built before a mothership.

Input (Bonus 1):
  3 MothershipCore Mothership MothershipCore
Output:
  false
Why?
  According to the first bonus, only one mothership can be built and here there is two (MothershipCore -> Mothership and a second MothershipCore).

Input (Bonus 2):
  0 Probe Nexus Probe
Output:
  true
Why?
  According to the second bonus, nexuses add 11 to the maximum supply, allowing both probes to be built.

Input (Both Bonuses):
  0 Nexus MothershipCore Mothership Carrier
Output:
  You must construct 1 additional pylon.
Why?
  There are no pylons, but the nexus provides 11 supply. The motherships take up 2 and 8, respectively and the carrier takes up 6. You need one more pylon to have enough to provide for all 16 supply.

TL; DR

Nhập một chuỗi bao gồm một tên đơn vị số nguyên và phân cách bằng dấu cách (từ bảng trên). Xuất ra một giá trị trung thực nếu bạn có thể xây dựng tất cả các đơn vị với nguồn cung được cung cấp bởi các Ngiá treo (số nguyên trong đầu vào). Đầu ra You must construct ZZZ additional pylon(s)nếu cần nhiều giá treo hơn, ZZZthì số lượng trụ cần thiết là bao nhiêu. Hãy chắc chắn để làm giá treo số nhiều nếu cần thiết.

Đây là , vì vậy mã ngắn nhất tính bằng byte (hoặc phương pháp đếm ngôn ngữ của bạn) sẽ thắng!

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

# Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=69011,OVERRIDE_USER=36670;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?([\d\.]+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


1
Nó có phải cách nhau không gian hay có thể 'thuận tiện' không?
Màu xanh

@muddyfish Nếu tôi hiểu bạn một cách chính xác, vâng, đầu vào phải được phân tách không gian trong biểu mẫu N unit1 unit2 unit3....
GamrCorps

Sẽ có hơn 9 giá treo? Tôi có phải xuất chính xác truehay là một giá trị trung thực được chấp nhận?
Dom Hastings

@DomHastings có thể có nhiều hơn 9. Mọi giá trị trung thực đều được chấp nhận.
GamrCorps

2
Ồ, thôi nào! Có ai còn nhớ Starcraft: Broodwar hay Starcraft gốc không? Họ cũng có cụm từ đó!

Câu trả lời:


4

Ruby, 263 - 30% = 184 byte

v=c=k=0
l,a={PeOr:1,ZtSySrHrDrWmPxMe:2,Oe:3,VyIlAnTt:4,CsCr:6,Mp:8,Ns:-11},ARGV.shift
ARGV.map{|u|k+=l[l.keys.grep(/#{q=u[0]+u[-1]}/)[0]];c+=1if q=="Me";v=!0if c!=1&&q=~/M/}
n=k/8.0-a.to_i
p v ?n<0||"You must construct #{n.ceil} additional pylon#{'s'if n>1}!":nil

Sử dụng

ruby sc.rb 0 Probe Nexus


7

Python 3, 207 * .9 == 186.3 byte.

Triển khai phần thưởng nexus.
Đã lưu 26 ​​byte nhờ DSM.
Đã lưu 2 byte nhờ Tim Pederick

x,*l=input().split()
d=-((int(x)*8-sum((('vexuobcl'+2*'clsuie'+4*'Ratahoiesuhihi').count(q[-3:-1])*(1-12*(q[0]>'w'))or 2)for q in l))//8)
print((1,"You must construct %s additional pylon"%d+'s!'[d<2:])[d>0])

Công việc tốt đẹp! Vì bạn chỉ cần xuất một giá trị trung thực, không nhất thiết True, bạn có thể lưu hai byte bằng cách thay thế 1>0bằng chỉ 1.
Tim Pederick 16/1/2016

@TimPederick Tôi không chắc liệu điều đó có đủ trung thực hay không.
Morgan Thrapp


3
Bạn phải xây dựng thêm những con trăn ...
Brian

4

JavaScript, 274 265 byte (không có tiền thưởng) 281 - 10% = 252,9 byte

s=>(c=eval(s[a="replace"](" ","-(")[a](/ /g,"+")[a](/\w+/g,m=>m[b="match"](/^(Pr|Ob)/g)?1:m[b](/^([ZSHDWP]|M\w+C)/g)?2:m[b](/^O/g)?3:m[b](/^[IAVT]/g)?4:m[b](/^N/g)?-11:m[b](/^C/g)?6:+m!=m?8:m*8)+")"))>0?true:`You must construct ${Math.ceil(-c/8)} additional pylon${c/8<-1?"s":""}!`

Điều này dường như khá dài ...

Demo + giải thích:

p = s => (c = eval(
  s[a = "replace"](" ", "-(")         //replace the first space (after the number of pylons) with "-" and open the bracket
   [a](/ /g, "+")                       //replace all the remaining spaces with "+"
   [a](/\w+/g, m =>                     //replace any sequence of characters with...
    m[b = "match"](/^(Pr|Ob)/g) ? 1 :   //with 1, if matches "Probe" or "Observer"
    m[b](/^([ZSHDWP]|M\w+C)/g) ? 2 :    //with 2, if it matches bunch of the units with cost 2. "Probe" didn't match already, so it's safe to catch "Phoenix" by only the first letter.
    m[b](/^O/g) ? 3 :                   //with 3, if match is "Oracle"
    m[b](/^[IAVT]/g) ? 4 :              //with 4, if matches "Immortal", "Archon", "VoidRay" or "Tempest"
    m[b](/^C/g) ? 6 :                   //with 6, if it's "Carrier" or "Colossus"
    m[b](/^N/g) ? -11 :                 //don't forget nexuses!
    +m != m ? 8 : m * 8                 //and if's not a number, then it's "Mothership", so with 8. If it's number, it can only be the number of pylons, replace it with itself multiplied by 8.
  ) + ")"                             //close the opened bracket
)) > 0 ? true : `You must construct ${Math.ceil(-c/8)} additional pylon${c/8<-1?"s":""}!`

document.write(
  p("2 Probe Probe Probe Probe Stalker Zealot Carrier Probe Zealot") + "<br>" +
  p("5 Mothership Carrier Probe Tempest HighTemplar") + "<br>" +
  p("0 Mothership Colossus Zealot") + "<br>" +
  p("0 Probe Nexus Probe")
)


Tôi không biết tại sao tôi không nhìn vào tiền thưởng, nên làm điều đó.
nicael

Lưu 8 byte bằng cách sử dụng -(c>>3)thay vì Math.ceil(-c/8). Lưu thêm 2 byte bằng cách sử dụng c<-8thay vì c/8<-1.
Neil

Trận đấu bên trong của bạn không cần /glàm chúng? Điều đó sẽ tiết kiệm thêm 6 byte. Cũng có /ob/ivẻ như nó sẽ hoạt động để tiết kiệm 5 byte khác.
Neil

Thử nghiệm của bạn dường như sai - bạn đang sử dụng >0nhưng nếu bạn có kết quả khớp chính xác thì điều đó vẫn đúng. Rõ ràng cho mục đích chơi gôn, bạn sẽ chuyển nó sang <0và đảo ngược ?:cánh tay.
Neil

1
Tôi nghĩ bạn có thể tiết kiệm thêm 17 byte bằng cách sử dụng phép trừ trong suốt. Đây là những gì tôi có cho đến nay:s=>(c=eval(s.replace(/ /g,"-").replace(/\w+/g,m=>m[b="match"](/ob/i)?1:m[b](/^([ZSHDWP]|M\w+C)/)?2:m[b](/^O/)?3:m[b](/^[IAVT]/)?4:m[b](/^N/)?-11:m[b](/^C/)?6:+m!=m?8:m*8)))<0?`You must construct ${-(c>>3)} additional pylon${c<-8?"s":""}!`:true
Neil

4

Python 3, 293 - 30% = 205.1 byte

Thực hiện cả hai phần thưởng. In 1 là giá trị trung thực của nó và 0 hoặc một chuỗi rỗng làm giá trị falsey của nó.

s='5N 8O5P bDbHeM7P6S7S9W6Z 6O 6A8I7T7V . 7C8C . aM'.split()
m=M=n=o=0
p,*u=input().split()
for v in u:
 S=0
 while'%x'%len(v)+v[0]not in s[S]:S+=1
 n+=S or-11;M+=S>7;m+='pC'in v;o+=m>1or M>1or m<1<=M
q=int(p)+n//-8
print([1,'You must construct %d additional pylon'%-q+'s!'[q>-2:]][q<0]*(o<1))

Tín dụng cho giải pháp của Dom Hastings vì đã giúp tôi loại bỏ một vài byte tốt bằng "người nghèo ceil" của riêng tôi và của Morgan Thrapp cho ý tưởng tiềm ẩn 's!'[q>-2:], giúp tôi tiết kiệm được sáu byte mà không đề cập đến, trong các bình luận, làm thế nào để lưu một byte khác trên bit đó.


Giải thích

Chuỗi trong dòng 1 mã hóa tất cả các đơn vị và yêu cầu cung cấp của chúng. Mỗi đơn vị được biểu diễn dưới dạng hai ký tự: một chữ số thập lục phân cho độ dài của tên đơn vị và ký tự đầu tiên của tên (ví dụ: 8ONgười quan sát; aMlà Bà mẹ). Yêu cầu cung cấp là chỉ mục của đơn vị được mã hóa trong chuỗi s, được hình thành bằng cách tách chuỗi trên khoảng trắng. Điểm dừng hoàn toàn đánh dấu lượng cung không sử dụng (không có đơn vị nào cần 5 hoặc 7 nguồn cung) và trong trường hợp đặc biệt, Nexus ( 5N) nằm ở chỉ số 0.

Giá trị khởi tạo dòng 2: mlà số lõi của mẹ, Mlà số lượng mẹ, nlà tổng chi phí cung cấp và ocho biết liệu các điều kiện xây dựng quyền làm mẹ có bị vi phạm hay không. Dòng 3 lấy đầu vào, đưa số trụ vào pvà danh sách các đơn vị vào u.

Trong vòng lặp bắt đầu từ dòng 4, Slà một chỉ mục vào svà, do đó, cũng là lượng cung cấp cần thiết cho đơn vị hiện tại , v. Trong dòng 6, whilecâu lệnh bước qua scho đến khi tìm thấy đơn vị. ( '%x'%len(v)biến độ dài của tên đơn vị thành một chữ số hex.)

Dòng 7 cập nhật tổng chi phí cung cấp n(lưu ý trường hợp đặc biệt -11, nếu Sbằng không). Sau đó, nó sẽ tăng số lượng các mối quan hệ mẹ con M(được xác định bởi chi phí cung cấp lớn hơn 7) và các lõi làm mẹ m(được xác định bởi chuỗi con pCtrong tên của đơn vị). Sau đó, nếu một trong hai giá trị này lớn hơn 1 hoặc nếu Mít nhất một trong khi mvẫn bằng 0, cờ ođược đặt. (Trên thực tế, nó đã tăng lên, nhưng sau này chúng tôi chỉ quan tâm nếu nó bằng không hoặc khác không.)

Sự thâm hụt của pylon qđược tính toán, hơi kỳ lạ, trong dòng 8. Rõ ràng, nó phải là n // 8 - int(p)(tức là một phần tám chi phí cung cấp, trừ đi bất kỳ giá treo nào chúng ta đã có). Nhưng điều đó sẽ làm tròn xuống, khi chúng ta cần làm tròn lên. //Mặc dù vậy, phép chia số nguyên ( ) hướng tới vô cực âm, vì vậy chúng tôi chỉ xử lý mọi thứ theo cách phủ định : int(p) - -(n // -8), đơn giản hóa cho biểu mẫu thực sự được sử dụng.

Cuối cùng, đầu ra. Nếu chúng ta chỉ ngắn một trụ, qsẽ là -1, do đó, bài kiểm tra q>-2(sẽ cắt sra khỏi chuỗi s!nếu đúng và giữ nó theo cách khác). Nếu không có thâm hụt trụ, qsẽ bằng 0 hoặc dương, do đó q<0phải chọn giữa giá trị trung thực 1 hoặc chuỗi đầu ra. Cuối cùng, nếu cờ okhông bằng 0, nhân kết quả (1 hoặc chuỗi) bằng Boolean False(được xử lý dưới dạng số 0) sẽ cho giá trị falsey (0 hoặc chuỗi trống).


3

C ++ 11, 732-30% = 512,4 byte

Sử dụng ceilnhững gợi ý của người đàn ông nghèo của Dom Hastings và Martin Büttner về việc rút ngắn từ điển.

#include <iostream>
#include <map>
#include <string>
#include <cctype>
using namespace std;
map<int,int>a ={{536,1},{655,2},{677,2},{758,2},{1173,2},{1175,2},{869,4},{891,6},{635,4},{872,1},{997,2},{763,2},{1516,2},{766,4},{630,3},{770,4},{744,6},{1091,8},{563,-11}};
int main(){string b,c;int d,e,l,j,k=0,m=0,n=0,v=0;cin>>d;getline(cin,b);
while(b.size()){e=0;auto z=b.find(" ");c=b.substr(0,z);b.erase(0,((z==string::npos)?z:z+1));
for(int i=0;i<c.size();i++){e+=tolower(c[i]);}
if(e==1516){m++;}else if(e==1091){((m>1)?v=1:v=0);}
if((l=k-(d*8)>0)&&(m==n==1)){j=(int)(((float)l/8)+0.99);cout<<"You must construct "<<j<<" additional pylon"<<((j==1)?"!":"s!")<<endl;}
else{cout<<((m==n==1&&!v)?"True":"False")<<endl;}}

+1 Chào mừng bạn đến với Câu đố lập trình và Code Golf và tất cả Stack Exchange. Đây là một câu trả lời đầu tiên rất tốt. Nếu bạn muốn bất kỳ trợ giúp, chỉ cần hỏi bằng cách gõ @usernamevào đầu nhận xét, ví dụ @wizzwizz4.
wizzwizz4

2

Python 2, 442 359 464 332 314 306 - 10% = 275.4

a,*l=input().split(' ');p=int(a)*8;for i in l:p-={"Ne":-11,"Pr":1,"Ze":2,"Se":2,"St":2,"Hi":2,"Da":2,"Im":4,"Co":6,"Ar":4,"Ob":1,"Wa":2,"Ph":2,"MoC":2,"Vo":4,"Or":3,"Te":4,"Ca":6,"Mo":8}[i[:2]+("C"if i[-4:]=="Core")]
e=int(.9+p/8)+1;print[1,"You must construct "+`e`+" additional pylon"+"s!"[e>1:]][p>=0]

Làm thế nào tôi có thể rút ngắn từ điển của tôi?
NoOneIsHãy là

2
Có rất nhiều cách để làm điều đó. Ví dụ: câu trả lời JavaScript sử dụng các biểu thức thông thường thay vì kiểm tra các chuỗi riêng lẻ. Có lẽ bạn có thể thử tìm một hàm băm ánh xạ mỗi chuỗi thành một số duy nhất (có thể là tổng của các mã ký tự). Những con số đó có thể ngắn hơn chuỗi.
Martin Ender

Tôi không chắc chắn, nhưng có lẽ nó đủ dài để tiết kiệm với thứ gì đó nhưdict(x[:2],int(x[2:]) for x in "Ne-11 Pr1 Ze2".split())

1

Lua, 418 - 10% = 376,2 byte

function p(i)i=i:gsub("(%w+)",function(w)q=tonumber(w)*8;return""end,1);n=0;i:gsub("(%w+)",function(w)m=w.match;n=n+(m(w,"^Pr.*")and 1 or m(w,"^Ob.*")and 1 or m(w,"^[ZSHDWP]")and 2 or m(w,"^M.*C")and 2 or m(w,"^O")and 3 or m(w,"^[IAVT]")and 4 or m(w,"^C")and 6 or m(w,"^N")and -11 or 8)end)if n>q then a=math.ceil((n-q)/8);print("You must construct "..a.." additional pylon"..(a>1 and"s"or"")..".")else print(1)end end

Triển khai phần thưởng Nexus.

Lần đầu tiên tôi đã đăng một cái gì đó ở đây. Đang viết kịch bản Lua cho một trò chơi, tình cờ thấy điều này và cảm thấy muốn đóng góp, hah.

Lưu ý: Hàm Lua này giả định rằng thư viện cơ sở đã được tải và ứng dụng máy chủ xác định một printhàm thích hợp chấp nhận mọi giá trị không phải là số không. Tôi đang khai thác Lua của string.gsubđể hết khả năng của tôi, cũng như của nó andorkhai thác.

Đây là phiên bản đẹp:

function pylons(i)
    -- Replace the first word, the number, with a space, while also storing it as a number * 8
    i = i:gsub("(%w+)", function(w)
        q = tonumber(w) * 8
        return ""
    end, 1)
    n = 0
    -- the function passed to gsub gets every word in the string,  and then I misuse Lua's and/or
    -- operator order to assign supply values to string.match calls that do not return nil
    i:gsub("(%w+)", function(w)
        m = w.match
        n = n + (m(w,"^Pr.*") and 1 or
        m(w,"^Ob.*") and 1 or
        m(w,"^[ZSHDWP]") and 2 or
        m(w,"^M.*C") and 2 or
        m(w,"^O") and 3 or
        m(w,"^[IAVT]") and 4 or
        m(w,"^C") and 6 or
        m(w,"^N") and -11 or 8)
    end)
    if n>q then
        a = math.ceil((n-q)/8)
        print("You must construct "..a.." additional pylon"..(a>1 and"s"or"")..".")
    else
        print(1)
    end
end

pylons("5 Nexus Probe Observer Zealot Sentry Stalker HighTemplar DarkTemplar WarpPrism Phoenix MothershipCore Oracle Immortal Archon VoidRay Tempest Colossus Carrier Mothership")
pylons("2 Probe Probe Probe Probe Stalker Zealot Carrier Probe Zealot")
pylons("5 Mothership Carrier Probe Tempest HighTemplar")
pylons("0 Mothership Colossus Zealot")

0

JavaScript (ES6), 228-10% = 206

s=>(s.replace(/\w+/g,x=>t+=~~{Ns:-11,Pe:1,Zt:2,Sy:2,Sr:2,Hr:2,Dr:2,Il:4,Cs:6,An:4,Or:1,Wm:2,Px:2,Me:2,Vy:4,Oe:3,Tt:4,Cr:6,Mp:8}[x[0]+x.slice(-1)]-8*~~x,t=7),t=t/8|0,t<=0||`You must construct ${t} additional pylon${t>1?'s':''}!`)

Kiểm tra

F=s=>(
  t=7,
  s.replace(/\w+/g,
   x=>t+=~~{Ns:-11,Pe:1,Zt:2,Sy:2,Sr:2,Hr:2,Dr:2,Il:4,Cs:6,An:4,Or:1,Wm:2,Px:2,Me:2,Vy:4,Oe:3,Tt:4,Cr:6,Mp:8}[x[0]+x.slice(-1)]-8*~~x),
  t=t/8|0,
  t<=0||`You must construct ${t} additional pylon${t>1?'s':''}!`
)

console.log=x=>O.textContent+=x+'\n';

;['2 Probe Probe Probe Probe Stalker Zealot Carrier Probe Zealot',
'5 Mothership Carrier Probe Tempest HighTemplar',
'0 Mothership Colossus Zealot','0 Probe Nexus Probe'
].forEach(t=>console.log(t+'\n'+F(t)))
<pre id=O></pre>


0

Perl, mã 212 byte + 3 cho -p- 10% = 193,5 byte

Tôi chắc chắn rằng tôi có thể giảm thêm một số thứ này, không hài lòng về for$s(...){...}khối đầy đủ nhưng tôi đã hoàn thành ngay bây giờ!

$x=$_*8;s/^\d+ //;map{for$s(Pr,Ob,Or,C,V,I,A,T,Z,S,H,D,W,Ph,'.+C',N,'.+p$'){$x-=(1,1,3,6,(4)x4,(2)x7,-11,8)[$i++%17]*/^$s/}}/\w+/g;$x=int$x/-8+.9;$s=1<$x&&'s';$_=$x>0?"You must construct $x additional pylon$s!":1

Đoạn trích thú vị

  • Những người đàn ông tội nghiệp ceil: int$n+.9- Tôi đã cố gắng sử dụng 0|nhưng có những gì trông giống như tràn!
  • Danh sách trùng lặp: (9)x9sản lượng(9,9,9,9,9,9,9,9,9,9)

Sử dụng:

perl -p pylons.pl <<< '3 Mothership Zealot'
1

Cảm ơn Tim Pederick vì đã giúp tiết kiệm thêm một byte!


Tôi tin rằng "người nghèo" của bạn ceilchỉ cần thêm .9, bởi vì số thập phân thấp nhất bạn sẽ nhận được là 0,125 (1/8).
Tim Pederick

@TimPederick Một điểm tốt, tôi cần tiết kiệm nhiều hơn nữa để có thể cạnh tranh! Có thể đáng để xem xét phần thưởng khác cho tôi ...
Dom Hastings
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.