"Ви повинні побудувати додаткові пілони!"


28

Вступ

У стратегічній грі Starcraft 2 є три "раси" на вибір: Terran, Zerg і Protoss. У цьому виклику ми зупинимося на протосі та знаковій фразі "Ви повинні побудувати додаткові пілони!" Це повідомлення повідомляється, коли у вас закінчується постачання для створення армії. Отже, щоб допомогти спільноті 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необхідна кількість пілонів. Обов’язково зробіть пілони множиною, якщо це необхідно.

Це , тому найкоротший код у байтах (або метод підрахунку вашої мови) виграє!

Таблиця лідерів

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

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# 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або прийнятне значення truthy?
Дом Гастінгс

@DomHastings їх може бути більше 9. Будь-яке значення truthy є прийнятним.
GamrCorps

2
О, давай! Хтось пам’ятає Starcraft: Broodwar чи оригінальний Starcraft? У них є і ця фраза!

Відповіді:


4

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


Я поняття не маю, чому я не дивився на бонуси, повинен це робити.
nicael

Збережіть 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 або порожній рядок як значення фальси.

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власного "бідного чоловіка ", та Морган Трапп за основу ідеї '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) дасть значення фальси (0 або порожній рядок).


3

C ++ 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 Ласкаво просимо до головоломки програмування та коду для гольфу та до всіх бірж стеків. Це дуже хороша перша відповідь. Якщо вам потрібна допомога, просто попросіть, набравши @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]

Як я міг скоротити свій словник?
NoOneIs Here

2
Є багато способів зробити це. Наприклад, у відповіді JavaScript використовуються регулярні вирази, а не перевірка окремих рядків. Можливо, ви можете спробувати знайти хеш, який відображає кожну рядок на унікальне число (можливо, суму кодів символів). Ці числа можуть бути коротшими за рядки.
Мартін Ендер

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