«Вы должны построить дополнительные пилоны!»


28

Введение

В стратегической игре Starcraft 2 есть три «расы» на выбор: терран, зерг и протосс. В этом вызове мы сосредоточимся на протоссе и знаковой фразе «Вы должны построить дополнительные пилоны!» Это сообщение объявляется, когда у вас кончаются запасы для создания армии. Итак, чтобы помочь сообществу Starcraft, вы должны написать программу или функцию, которая сообщает игрокам, сколько именно пилонов им нужно.

Соревнование

Вам будет предоставлен ввод строки, состоящей из единственного целого Nи разделенного пробелами списка единиц. Nвсегда будет нулевым или положительным, а список единиц будет всегда иметь одну или несколько действительных единиц. Nпредставляет количество пилонов, которые есть у игрока Ваша задача - рассчитать, достаточно ли количество пилонов, имеющихся у игрока, для построения юнитов. Ваша программа или функция должна выводить / возвращать истинное значение, если имеется достаточный запас, или если его недостаточно, вы должны вывести, You must construct ZZZ additional pylonsгде ZZZнаходится количество пилонов, необходимое для построения модулей. Обратите внимание, что pylon(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 знает, что вам нужно ядро ​​материнского корабля, прежде чем превратить его в материнский корабль. Кроме того, вы можете иметь только один материнский корабль за раз (будь то настоящий материнский корабль или ядро ​​материнского корабля). Если ни одно из этих условий не выполняется, выведите любое ложное значение. Если ваша программа может проверить, что одновременно активен только один материнский корабль, и что ядро ​​материнского корабля построено до фактического материнского корабля, снимите 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 находится необходимое количество пилонов. Убедитесь, что пилоны множественного числа, если это необходимо.

Это , поэтому выигрывает самый короткий код в байтах (или метод подсчета вашего языка)!

Leaderboard

Вот фрагмент стека, чтобы генерировать как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# 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
Должен ли он быть разделен пробелом или он может быть «удобным»?
Голубой

@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 байта.

Реализует бонус нексуса.
Сохранено 26 байт благодаря DSM.
Сохранено 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просто 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")
)


Я понятия не имею, почему я не смотрел на бонусы, должен это делать.
Никель

Сохраните 8 байтов, используя -(c>>3)вместо Math.ceil(-c/8). Сохраните еще 2 байта, используя c<-8вместо 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, либо пустую строку в качестве значения false.

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

Благодарю решение Dom Hastings за то, что оно помогло мне сэкономить несколько байт с ceilмоим «бедняком », а Моргана Треппа - за основную идею 's!'[q>-2:], которая спасла мне шесть байтов, не говоря уже о том, чтобы указать в комментариях, как чтобы сохранить еще один байт на этом бите.


Пояснения

Строка в строке 1 кодирует все устройства и их требования к питанию. Каждый юнит представлен в виде двух символов: шестнадцатеричная цифра, указывающая длину имени юнита, и первый символ имени (например 8O, «Наблюдатель» aM- «Материнский корабль»). Требование к поставке - это индекс закодированной единицы в последовательности s, сформированной путем разбиения строки на пробелы. Полные остановки отмечают неиспользованные объемы поставок (ни одному устройству не нужно 5 или 7 поставок), и в качестве особого случая Nexus ( 5N) имеет индекс 0.

В строке 2 инициализируются значения: mколичество ядер материнского судна, Mколичество кораблей, nобщая стоимость поставок и oуказание, были ли нарушены условия строительства материнского судна. В строке 3 вводятся входные данные, в которые вводится число пилонов pи список единиц u.

Внутри цикла , который начинается в строке 4, Sявляется индексом в sи, таким образом, также количество подаваемого необходимого для текущего блока, v. В строке 6 whileоператор проходит sдо тех пор, пока единица не будет найдена. ( '%x'%len(v)превращает длину имени устройства в шестнадцатеричное число.)

В строке 7 обновляется общая стоимость поставок n(обратите внимание на особый случай -11, если он Sравен нулю). Затем он увеличивает количество материнских кораблей M(определяемых по стоимости поставки более 7) и сердечников материнских кораблей m(определяемых подстрокой pCв имени подразделения). Затем, если какой-либо из них больше 1 или если Mхотя бы один из mних все еще равен нулю, флаг oустанавливается. (На самом деле, он увеличивается, но позже мы заботимся только о том, является ли он нулевым или ненулевым.)

Дефицит пилонов qрассчитывается, как ни странно, в строке 8. Наивно, он должен быть n // 8 - int(p)(т. Е. Одна восьмая стоимости поставки, за вычетом любых пилонов, которые у нас уже есть). Но это будет округлять, когда нам нужно округлить. Целочисленное деление ( //) округляет до отрицательной бесконечности, поэтому мы просто работаем с отрицательными значениями:, int(p) - -(n // -8)что упрощает до фактически используемой формы.

Наконец, вывод. Если у нас всего один пилон, qбудет -1, отсюда и тест q>-2(который вырезает sстроку, s!если она истинна, и сохраняет ее в противном случае). Если дефицита пилона нет, qон будет нулевым или положительным, поэтому q<0нужно выбирать между истинным значением 1 или выходной строкой. Наконец, если флаг oне равен нулю, умножение результата (1 или строки) на Boolean False(обрабатывается как числовой 0) даст значение Falsey (0 или пустую строку).


3

С ++ 11, 732-30% = 512,4 байта

Использует предложения бедного человека от Дома Гастингса ceilи Мартина Бюттнера о сокращении словаря.

#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 Добро пожаловать в Программирование Пазлов и Code Golf, а также на все обмены стэков. Это очень хороший первый ответ. Если вам нужна помощь, просто спросите, набрав @usernameв начале комментария, например @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]

Как я могу сократить свой словарь?
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 предполагает, что базовая библиотека была загружена, и что приложение хоста определяет соответствующую printфункцию, которая принимает любое значение, отличное от nil. Я использую 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

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 байт + 3 для -p- 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

Спасибо Тиму Педерику за помощь в сохранении дополнительного байта!


Я считаю, что вашему «беднягу ceil» нужно только добавить .9, потому что самое низкое десятичное число, которое вы получите, составляет 0,125 (1/8).
Тим Педерик

@TimPederick Хороший вопрос, мне нужно сэкономить гораздо больше, чтобы быть конкурентоспособным! Может быть, стоит посмотреть на другой бонус для меня ...
Дом Гастингс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.