「追加のパイロンを構築する必要があります!」


28

前書き

戦略ゲームStarcraft 2には、Terran、Zerg、およびProtossから選択できる3つの「レース」があります。この課題では、プロトスと象徴的なフレーズ「追加のパイロンを構築する必要があります!」に焦点を当てます。このメッセージは、軍隊を構築するために供給が足りなくなったときに表示されます。そのため、スタークラフトコミュニティを支援するには、プレーヤーに必要なパイロンの数を正確に伝えるプログラムまたは関数を作成する必要があります。

チャレンジ

単一の整数Nとスペースで区切られたユニットのリストで構成される文字列の入力が与えられます。Nは常にゼロまたは正であり、ユニットのリストには常に1つ以上の有効なユニットがあります。Nプレーヤーが現在持っているパイロンの量を表します。あなたの仕事は、プレイヤーが持っているパイロンの量がユニットを構築するのに十分かどうかを計算することです。十分な供給がある場合は、あなたのプログラムまたは機能しなければならない出力は/ truthy値を返す、または十分な供給がない場合は、出力しなければならないパイロンの量は、単位を構築するために必要とされています。必要な場合は複数で、そうでない場合は複数でなければならないことに注意してください(、)。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. 経験豊富なStarcraft 2プレイヤーなら、母艦に変える前に母艦コアが必要であることを知っているでしょう。また、一度に1つのマザーシップしか持てません(実際のマザーシップまたはマザーシップコア)。これらの条件のいずれも当てはまらない場合、偽の値を出力します。プログラムが一度に1つのマザーシップのみがアクティブであり、実際のマザーシップの前にマザーシップコアが構築されていることを確認できる場合は、バイトカウントを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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# 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
スペースで区切る必要がありますか、それとも「便利」にすることができますか?
ブルー

@muddyfish私が正しく理解していれば、はい、入力はフォームでスペースで区切る必要がありますN unit1 unit2 unit3...
-GamrCorps

パイロンが9個以上になることはありますか?正確に出力するtrue必要がありますか、それとも真実の値は受け入れられますか?
ドムヘイスティングス

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

よくやった!必ずしも真ではない値を出力するだけでよいので、単ににTrue置き換え1>0て2バイト節約できます1
ティムペデリック

@TimPederick私はそれが十分に真実として数えられるかどうか確信が持てませんでした。
モーガンスラップ


3
追加の
ブライアン

4

JavaScript、274 265バイト(ボーナスなし) 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")
)


なぜボーナスを見なかったのか、見当がつかない。
ニカエル

-(c>>3)代わりにを使用して8バイトを節約しますMath.ceil(-c/8)。のc<-8代わりにを使用して、さらに2バイトを保存しますc/8<-1
ニール

あなたの内部の一致は/gそれらを必要としませんか?これにより、さらに6バイト節約できます。また/ob/i、別の5バイトの節約でも機能するようです。
ニール

あなたのテストは間違っているようです-あなたは使用して>0いますが、完全に一致する場合、それはまだ真実です。明らかにゴルフの目的のために、あなたはそれをスイッチに切り替えて<0?:腕を逆にするでしょう。
ニール

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
ニール

4

Python 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:]コメントで、指摘言及する私に6バイト-ないが保存され、どのようにそのビットに別のバイトを保存します。


説明

1行目の文字列は、すべてのユニットとその供給要件をエンコードしています。各ユニットは、2つの文字で表されます。ユニットの名前の長さを示す16進数と、名前の最初の文字(たとえば8O、Observer aM、Mothership)です。供給要件は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を超えることで識別される)およびマザーシップコアmpCユニット名のサブストリングで識別される)のカウントをインクリメントします。次に、これらのいずれかが1より大きい場合、またはM少なくとも1であるmが、まだゼロである場合、フラグoが設定されます。(実際にはインクリメントされますが、後で気にするのはゼロか非ゼロかだけです。)

パイロンの赤字qは、少し奇妙に、8行n // 8 - int(p)目で計算されます。単純に、それは(つまり、供給コストの8分の1から、すでにあるパイロンを引いたもの)であるべきです。しかし、切り上げが必要な場合は切り捨てられます。//ただし、整数の除算()は負の無限大に向かって丸められるため、すべてを負で処理します:int(p) - -(n // -8)、実際に使用される形式に単純化します。

最後に、出力。パイロンが1本だけの場合、q-1になります。したがって、テストq>-2(trueの場合sは文字列から切り取り、s!それ以外の場合は保持します)になります。パイロン欠損がない場合、qゼロまたは正になるためq<0、真理値1または出力文字列から選択します。最後に、フラグoがゼロでない場合、結果(1または文字列)にブール値False(数値0として処理)を掛けると、偽の値(0または空の文字列)が得られます。


3

C ++ 11、732-30%= 512.4バイト

Dom Hastingsの貧乏人ceilとMartinBü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プログラミングパズルとコードゴルフ、およびStack Exchangeのすべてへようこそ。これは非常に良い最初の答えです。ヘルプが必要な場合@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の回答では、個々の文字列をチェックする代わりに正規表現を使用します。各文字列を一意の番号(文字コードの合計)にマッピングするハッシュを見つけてみてください。これらの数字は、文字列よりも短い場合があります。
マーティンエンダー

確かではありませんが、多分それは次のようなもので十分に節約できますdict(x[:2],int(x[2:]) for x in "Ne-11 Pr1 Ze2".split())

1

Lua、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関数は、ベースライブラリがロードされていること、およびホストアプリケーションがprintnil以外の値を受け入れる適切な関数を定義していることを前提としています。私は、Luaのstring.gsub能力を最大限に活用し、その演算子andor演算子を活用しています。

これがきれいなバージョンです:

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

テスト

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

興味深いスニペット

  • 貧乏人ceilint$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)であるので、追加するだけでよいと思います。
ティムペデリック

@TimPederick良い点は、競争力を高めるためにもっと節約する必要があることです!私のために他のボーナスに探して価値があるかもしれない...
ドムヘイスティングス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.