"추가 철탑을 건설해야합니다!"


28

소개

전략 게임 Starcraft 2에는 Terran, Zerg 및 Protoss의 세 가지 "레이스"가 있습니다. 이 도전에서 우리는 프로토스와 상징적 인 문구 인 "추가 철탑을 건설해야합니다!"에 중점을 둘 것입니다. 이 메시지는 군대를 건설하기 위해 공급이 부족할 때 언급됩니다. 따라서 스타 크래프트 커뮤니티를 돕기 위해 플레이어에게 필요한 철탑 수를 정확히 알려주는 프로그램이나 기능을 작성해야합니다.

도전

단일 정수 N와 공백으로 구분 된 단위 목록 으로 구성된 문자열의 입력이 제공 됩니다. N는 항상 0 또는 양수이며 단위 목록에는 항상 하나 이상의 유효한 단위가 있습니다. N플레이어가 현재 가지고있는 철탑의 양을 나타냅니다. 당신의 임무는 플레이어가 가진 철탑의 양이 유닛을 만들기에 충분한 지 계산하는 것입니다. 이 충분한 공급이 경우, 또는 귀하의 프로그램 또는 기능을 반드시 출력 / A truthy 값을 반환하면 출력해야 충분한 공급이없는 경우 단위를 구축하는 데 필요한 철탑의 양이. 참고 필요하고 unplural하지 않을 때 (때 복수해야한다 , ).You must construct ZZZ additional pylonsZZZpylon(s)...1 additional pylon!...2 additional pylons!

프로토스 유닛 및 공급 비용

다음은 모든 장치 목록과 해당 공급 비용입니다. 철탑은 추가로 8 개의 공급을 제공합니다.

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

보너스가없는 예

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. 

보너스

  1. 숙련 된 스타 크래프트 2 플레이어는 모선으로 전환하기 전에 모선 코어가 필요하다는 것을 알고있을 것입니다. 또한 한 번에 하나의 모선 만 가질 수 있습니다 (실제 모선이든 모선 핵심이든). 이러한 조건 중 어느 것도 해당되지 않으면 잘못된 값을 출력하십시오. 프로그램에서 한 번에 하나의 모선 만 활성화되고 실제 모선 보다 먼저 모선 코어가 구축 되어 있는지 확인하면 바이트 수를 20 % 할인하십시오.
  2. 당신은 거의 알지 못하지만, 넥서스 (원형 명령 센터)는 실제로 공급도 제공합니다! 장치 목록에서 넥서스가 발생할 때마다 프로그램이 최대 공급 장치에 11을 추가 할 수있는 경우 바이트 수를 10 % 할인하십시오. Nexus가 빌드 순서의 위치에 상관없이 0 Probe Nexus계속 반환 true됩니다.

보너스가있는 예

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

정수와 공백으로 구분 된 단위 이름으로 구성된 문자열을 입력하십시오 (위의 표에서). N철탑이 제공하는 공급 장치 (입력의 정수)로 모든 장치를 만들 수있는 경우 참 값을 출력합니다 . You must construct ZZZ additional pylon(s)더 많은 철탑이 필요한 경우 출력 , ZZZ필요한 철탑 양. 필요한 경우 철탑을 복수로 만들어야합니다.

이것은 이므로 바이트 단위의 가장 짧은 코드 (또는 언어 계산 방법)가 이깁니다!

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신은 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

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

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

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

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

# [><>](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
공백으로 분리해야합니까? 아니면 '편리 할 수 ​​있습니까?'
Blue

@muddyfish 내가 당신을 올바르게 이해한다면, 입력은 형식으로 공백으로 분리되어야합니다 N unit1 unit2 unit3....
GamrCorps

9 개 이상의 철탑이 있습니까? 정확히 출력해야 true합니까, 아니면 진실한 가치가 허용됩니까?
Dom Hastings

@DomHastings는 9 개가 넘을 수 있습니다.
GamrCorps

2
오 어서! 누구나 Starcraft : Broodwar 또는 오리지널 Starcraft를 기억합니까? 그들도 그 문구를 가지고 있습니다!

답변:


4

루비, 263-30 % = 184 바이트

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

용법

ruby sc.rb 0 Probe Nexus


7

Python 3, 207 * .9 == 186.3 바이트

넥서스 보너스를 구현합니다.
DSM 덕분에 26 바이트를 절약했습니다.
Tim Pederick 덕분에 2 바이트 절약

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])

잘 하셨어요! 당신은 단지 출력에게 truthy 값을 필요로하기 때문에, 반드시 True, 당신은 대체하여 2 바이트를 저장할 수 있습니다 1>0단지와 함께 1.
팀 Pederick

@TimPederick 나는 그것이 진실이라고 생각하는지 확신하지 못했습니다.
Morgan Thrapp


3
추가 파이썬을 만들어야합니다 ...
Brian

4

자바 스크립트, 274 265 바이트 (NO 보너스) 281~10% = 252.9 바이트

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":""}!`

꽤 긴 것 같습니다 ...

데모 + 설명 :

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")
)


보너스를 보지 않은 이유를 모르겠습니다.
nicael

-(c>>3)대신 8 바이트를 사용하여 저장하십시오 Math.ceil(-c/8). c<-8대신을 사용하여 다른 2 바이트를 저장하십시오 c/8<-1.
Neil

당신의 내면의 일치가 필요 /g하지 않습니까? 다른 6 바이트를 절약 할 수 있습니다. 또한 /ob/i5 바이트를 더 절약 할 수있는 것처럼 보입니다.
Neil

테스트가 잘못 된 것 같습니다-사용하고 >0있지만 정확하게 일치하는 경우 여전히 그렇습니다. 분명히 골프 목적으로 당신은 그것을 팔로 바꾸고 팔을 <0뒤집을 것 ?:입니다.
Neil

1
뺄셈을 사용하여 17 바이트를 더 절약 할 수 있다고 생각합니다. 이것이 내가 지금까지 한 것입니다 :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

파이썬 3, 293-30 % = 205.1 바이트

보너스를 모두 구현 합니다 . 1을 정확한 값으로, 0 또는 빈 문자열을 잘못된 값으로 인쇄합니다.

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))

에 신용 돔 헤이스팅스 '솔루션 나에게 "가난한 사람의와 함께 좋은 몇 바이트를 면도 돕는 ceil"내 자신의, 그리고 모건 Thrapp의 기본 아이디어에 대한 's!'[q>-2:]의견에서 지적 언급 나에게 여섯 바이트가 아니라 저장, 어떻게 그 비트에 다른 바이트를 저장합니다.


설명

1 행의 문자열은 모든 장치와 해당 공급 요구 사항을 인코딩합니다. 각 단위는 두 개의 문자로 표시됩니다. 단위 이름의 길이를 나타내는 16 진 숫자와 이름의 첫 문자 (예 : 8O관찰자, aM모성)입니다. 공급 요구 사항은 s문자열을 공백으로 분할하여 형성된 시퀀스 내에서 인코딩 된 장치의 인덱스입니다 . 멈춤 장치는 사용하지 않은 공급량을 표시합니다 (5 또는 7 개의 공급 장치가 필요 없음). 특별한 경우 Nexus ( 5N)는 인덱스 0에 있습니다.

2 행 m은 값을 초기화합니다 : 모선 핵심 M의 수, 모선의 수 n, 총 공급 비용, o모선 건설 조건 위반 여부를 나타냅니다. 3 행은 철탑 수 p와 단위 목록을 입력하여 입력 을 u받습니다.

라인 4에서 시작하는 루프 내에는 현재 장치에 필요한 공급량에 S대한 색인이 있습니다. 6 행에서, 명령문 은 장치가 발견 될 때까지 단계별로 진행 됩니다. ( 단위 이름의 길이를 16 진수로 바꿉니다.)svwhiles'%x'%len(v)

7 호선 업데이트 총 공급 비용 n(주 특별한 경우 -11, 경우 S제로). 그런 다음 모선 수 M(공급 비용이 7 이상 임으로 m식별 됨 )와 모선 코어 ( pC장치 이름 의 하위 문자열 로 식별 됨 ) 수를 증가시킵니다 . 그런 다음 이들 중 하나가 1보다 크거나 1 M이상인 동안 m여전히 0이면 플래그 o가 설정됩니다. (실제로 증가하지만 나중에 0 또는 0이 아닌 경우에만 관심이 있습니다.)

철탑 결손 q은 8 번 라인에서 조금 이상하게 계산됩니다. 순진하게, 그것은 n // 8 - int(p)(즉, 이미 가지고있는 철탑을 뺀) 공급 비용의 1/8입니다. 그러나 반올림해야 할 때 반올림됩니다. 정수 나누기 ( //)는 음의 무한대로 반올림되므로 모든 것을 음수 int(p) - -(n // -8)로 처리합니다.

마지막으로 출력. 우리가 단 하나의 철탑 길이라면 q-1이 될 것이므로 테스트 q>-2( 참이면 s문자열 을 잘라 내고 s!그렇지 않으면 유지합니다). 철탑 결손이없는 경우 q0 또는 양수이므로 q<0진리 값 1 또는 출력 문자열 중에서 선택합니다. 마지막으로, 플래그 o가 0이 아닌 경우 결과 (1 또는 문자열)에 부울 False(숫자 0으로 처리)을 곱하면 잘못된 값 (0 또는 빈 문자열)이 제공됩니다.


3

C ++ 11, 732-30 % = 512.4 바이트

Dom Hastings의 가난한 사람 ceil과 Martin Büttner의 사전을 제안하는 제안을 사용합니다.

#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 프로그래밍 퍼즐 및 코드 골프 및 모든 스택 교환에 오신 것을 환영합니다. 이것은 매우 좋은 첫 번째 대답입니다. 도움 @username이 필요하면 의견 맨 앞에 입력 하십시오 (예 :) @wizzwizz4.
wizzwizz4

2

파이썬 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]

사전을 어떻게 단축 할 수 있습니까?
NoOneIsHere 여기

2
그렇게하는 방법은 많이 있습니다. 예를 들어 JavaScript 응답은 개별 문자열을 검사하는 대신 정규식을 사용합니다. 어쩌면 각 문자열을 고유 번호 (문자 코드의 합계)에 매핑하는 해시를 찾을 수 있습니다. 이 숫자는 문자열보다 짧을 수 있습니다.
Martin Ender 2016 년

확실하지는 않지만, 아마도 다음과 같은 방법으로 충분히 시간을 절약 할 수있을 것입니다.dict(x[:2],int(x[2:]) for x in "Ne-11 Pr1 Ze2".split())

1

루아, 418-10 % = 376,2 바이트

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

Nexus 보너스를 구현합니다.

처음으로 여기에 뭔가를 게시했습니다. 게임을위한 Lua 스크립트를 작성하고 있었으며, 이것에 걸려 넘어지는듯한 느낌이 들었습니다.

참고 :이 Lua 함수는 기본 라이브러리가로드되었고 호스트 응용 프로그램 print이 0이 아닌 값을 허용 하는 적절한 함수를 정의한다고 가정 합니다. 나는 Lua string.gsub를 최선을 다해 활용 하고 and있으며 or운영자 와 운영자를 이용하고 있습니다.

예쁜 버전은 다음과 같습니다.

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

자바 스크립트 (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':''}!`)

테스트

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, 212 바이트 코드 + -p3-10 % = 193.5 바이트

나는 전체 for$s(...){...}블록 에 대해 행복하지 않지만 이것을 더 줄일 수 있다고 확신 하지만 지금은 끝났습니다!

$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

재미있는 스 니펫

  • 불쌍한 남자 ceil: int$n+.9-사용하려고했지만 0|오버플로처럼 보입니다!
  • 목록 복제 : (9)x9수율(9,9,9,9,9,9,9,9,9,9)

용법:

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

여분의 바이트를 절약하는 데 도움을 준 Tim Pederick 에게 감사합니다 !


나는 당신의 "가난한 사람 ceil"이 추가해야 할 필요가 있다고 생각합니다 .9. 왜냐하면 가장 낮은 소수점은 0.125 (1/8)이기 때문입니다.
팀 Pederick

@TimPederick 좋은 점은 경쟁력을 유지하기 위해 더 많은 비용을 절약해야한다는 것입니다. 나를 위해 다른 보너스를 살펴볼 가치가 있습니다 ...
Dom Hastings
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.