"Devi costruire tralicci aggiuntivi!"


28

introduzione

Nel gioco di strategia Starcraft 2, ci sono tre "razze" tra cui scegliere: Terran, Zerg e Protoss. In questa sfida ci concentreremo sul Protoss e sull'iconica frase "Devi costruire piloni aggiuntivi!" Questo messaggio viene dichiarato quando esaurisci le scorte per costruire il tuo esercito. Quindi, per aiutare la comunità di Starcraft, devi scrivere un programma o una funzione che indichi ai giocatori esattamente quanti piloni hanno bisogno.

La sfida

Ti verrà dato un input di una stringa composta da un singolo intero Ne da un elenco di unità separato da spazi. Nsarà sempre zero o positivo e l'elenco delle unità avrà sempre una o più unità valide. Nrappresenta la quantità di piloni attualmente in possesso del giocatore. Il tuo compito è calcolare se la quantità di piloni che il giocatore ha è sufficiente per costruire le unità. Il tuo programma o funzione deve produrre / restituire un valore veritiero se c'è abbastanza rifornimento, o se non c'è abbastanza rifornimento devi produrre You must construct ZZZ additional pylonsdove ZZZè la quantità di piloni necessari per costruire le unità. Nota che pylon(s)deve essere plurale quando necessario e non plurale quando non ( ...1 additional pylon!, ...2 additional pylons!).

Unità Protoss e costi di fornitura

Ecco un elenco di tutte le unità e il costo di fornitura corrispondente. I piloni forniscono un rifornimento aggiuntivo di 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

Esempi SENZA Bonus

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. 

bonus

  1. Qualsiasi giocatore Starcraft 2 esperto saprebbe che prima di trasformarlo in una nave madre è necessario un nucleo di nave madre. Inoltre, puoi avere solo una nave madre alla volta (che si tratti di una nave madre vera e propria o di un nucleo nave madre). Se nessuna di queste condizioni è vera, genera un valore errato. Se il tuo programma è in grado di verificare che sia attiva una sola nave madre alla volta e che un nucleo della nave madre sia costruito prima della nave madre effettiva, prendi il 20% di sconto sul conteggio dei byte.
  2. Poco si può sapere, ma i nexus (centri di comando protoss) in realtà forniscono anche approvvigionamento! Se il tuo programma può aggiungere 11 alla fornitura massima ogni volta che incontra un nesso nell'elenco delle unità, risparmia il 10% sul conteggio dei byte. Nota che non importa dove sia il Nexus nell'ordine di costruzione, quindi 0 Probe Nexusritornerebbe comunque true.

Esempi CON Bonus

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

Immettere una stringa composta da un numero intero e nomi di unità separati da spazio (dalla tabella sopra). Emetti un valore veritiero se puoi costruire tutte le unità con la fornitura fornita dai Npiloni (l'intero in input). Output You must construct ZZZ additional pylon(s)se sono necessari più piloni, dov'è ZZZla quantità di piloni necessari. Assicurati di rendere i piloni plurali se necessario.

Questo è , quindi vince il codice più breve in byte (o il metodo di conteggio della tua lingua)!

Classifica

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, utilizzando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

# [><>](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
Deve essere separato dallo spazio o può essere "conveniente"?
Blue

@muddyfish Se ti capisco correttamente, sì, l'input deve essere separato da spazio nel modulo N unit1 unit2 unit3....
GamrCorps

Ci saranno mai più di 9 piloni? Devo produrre esattamente trueo è accettabile un valore veritiero?
Dom Hastings,

@DomHastings ci possono essere più di 9. Qualsiasi valore di verità è accettabile.
GamrCorps,

2
Oh andiamo! Qualcuno ricorda Starcraft: Broodwar o l'originale Starcraft? Hanno anche quella frase!

Risposte:


4

Rubino, 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

uso

ruby sc.rb 0 Probe Nexus


7

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

Implementa il bonus nexus.
Risparmiato 26 byte grazie a DSM.
Salvato 2 byte grazie a 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])

Bel lavoro! Poiché è necessario solo generare un valore di verità, non necessariamente True, è possibile salvare due byte sostituendoli 1>0con just 1.
Tim Pederick,

@ TimPederick Non ero sicuro che fosse considerato abbastanza vero.
Morgan Thrapp,


3
Devi costruire altri pitoni ...
Brian

4

JavaScript, 274 265 byte (nessun bonus) 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":""}!`

Questo sembra essere piuttosto lungo ...

Demo + spiegazione:

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


Non ho idea del perché non ho visto i bonus, dovrei farlo.
nicael,

Salvare 8 byte usando -(c>>3)invece di Math.ceil(-c/8). Salvare altri 2 byte usando c<-8invece di c/8<-1.
Neil,

Le tue partite interiori non sono necessarie /g? Ciò risparmierebbe altri 6 byte. /ob/iSembra anche che funzionerebbe per un altro salvataggio di 5 byte.
Neil,

Il tuo test sembra essere sbagliato - lo stai usando >0ma se hai una corrispondenza esatta è ancora vero. Ovviamente ai fini del golf lo cambieresti <0e invertirai le ?:braccia.
Neil,

1
Penso che puoi risparmiare altri 17 byte usando la sottrazione in tutto. Questo è quello che ho finora: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

Implementa entrambi i bonus. Stampa 1 come valore di verità e 0 o una stringa vuota come valore di falsità.

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

Ringraziamo la soluzione di Dom Hastings per avermi aiutato a radunare alcuni buoni byte con un "povero ceil" mio, e Morgan Thrapp per l'idea sottostante 's!'[q>-2:], che mi ha salvato sei byte, per non parlare del fatto che, nei commenti, come per salvare un altro byte su quel bit.


spiegazioni

La stringa nella riga 1 codifica per tutte le unità e i loro requisiti di fornitura. Ogni unità è rappresentata da due caratteri: una cifra esadecimale che indica la lunghezza del nome dell'unità e il primo carattere del nome (ad es. 8OL'osservatore; aMè la nave madre). Il requisito di fornitura è l'indice dell'unità codificata all'interno della sequenza s, formata dividendo la stringa sugli spazi. I punti di arresto completi indicano quantità inutilizzate di approvvigionamento (nessuna unità necessita di 5 o 7 rifornimenti) e, come caso speciale, il Nexus ( 5N) si trova all'indice 0.

La riga 2 inizializza i valori: mè il numero di nuclei della nave madre, Mè il numero di navi madre, nè il costo totale di approvvigionamento e oindica se le condizioni di costruzione della nave madre sono state o meno violate. La riga 3 prende l'input, inserendo il numero di piloni pe l'elenco di unità in u.

All'interno del ciclo che inizia alla riga 4, Sè un indice in se, quindi, anche la quantità di alimentazione necessaria per l'unità corrente v. Nella riga 6, l' whileistruzione passa sfino a quando non viene trovata l'unità. ( '%x'%len(v)trasforma la lunghezza del nome dell'unità in una cifra esadecimale.)

La riga 7 aggiorna il costo totale della fornitura n(notare il caso speciale -11, se Sè zero). Quindi incrementa il conteggio delle navi madre M(identificato dal costo di approvvigionamento di oltre 7) e dei nuclei nave madre m(identificato dalla sottostringa pCnel nome dell'unità). Quindi, se uno di questi è maggiore di 1 o se Mè almeno uno mentre mè ancora zero, oviene impostato il flag . (In realtà, è incrementato, ma in seguito ci importa solo se è zero o diverso da zero.)

Il deficit del pilone qviene calcolato, un po 'stranamente, nella riga 8. Ingenuamente, dovrebbe essere n // 8 - int(p)(cioè un ottavo del costo di fornitura, meno eventuali piloni che abbiamo già). Ma questo sarebbe arrotondato, quando avremo bisogno di arrotondare. La divisione intera ( //) arrotonda verso l'infinito negativo, tuttavia, quindi lavoriamo tutto in negativi: int(p) - -(n // -8)che semplifica la forma effettivamente utilizzata.

Infine, l'output. Se siamo solo un pilone corto, qsarà -1, quindi il test q>-2(che taglia sla stringa s!se vera, e la mantiene altrimenti). Se non c'è deficit del pilone, qsarà zero o positivo, quindi q<0selezionare tra il valore di verità 1 o la stringa di output. Infine, se il flag onon è zero, moltiplicando il risultato (1 o una stringa) per Booleano False(gestito come 0 numerico) si otterrà un valore di falso (0 o la stringa vuota).


3

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

Utilizza i ceilsuggerimenti del povero di Dom Hastings e di Martin Büttner di mettere in cortocircuito il dizionario.

#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 Benvenuto in Puzzle di programmazione e Code Golf, e in tutti gli scambi di stack. Questa è un'ottima prima risposta. Se desideri aiuto, chiedi semplicemente digitando @usernameall'inizio di un commento, ad es @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]

Come potrei accorciare il mio dizionario?
NoOneIsHere

2
Ci sono molti modi per farlo. Ad esempio, la risposta JavaScript utilizza espressioni regolari anziché verificare le singole stringhe. Forse potresti provare a trovare un hash che associa ogni stringa a un numero univoco (forse la somma dei codici carattere). Quei numeri potrebbero essere più brevi delle stringhe.
Martin Ender,

Non sono sicuro, ma forse è abbastanza lungo ottenere risparmi con qualcosa del generedict(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

Implementa il bonus Nexus.

La prima volta che ho pubblicato qualcosa qui. Stavo scrivendo gli script di Lua per un gioco, ci siamo imbattuti in questo e mi è sembrato di contribuire, eh.

Nota: questa funzione Lua presuppone che la libreria di base sia stata caricata e che l'applicazione host definisca una printfunzione appropriata che accetta qualsiasi valore diverso da zero. Sto sfruttando Lua's string.gsubal meglio delle mie capacità, così come i suoi ande gli oroperatori.

Ecco la bella versione:

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

Test

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, codice 212 byte + 3 per -p- 10% = 193,5 byte

Sono sicuro di poterlo ridurre ancora un po ', non contento del for$s(...){...}blocco completo ma per ora ho finito!

$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

Frammenti interessanti

  • Poveri mans ceil: int$n+.9- Ho provato a usare 0|ma ho quello che sembra troppo pieno!
  • Duplicazione elenco: (9)x9rese(9,9,9,9,9,9,9,9,9,9)

Uso:

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

Grazie a Tim Pederick per l'aiuto nel salvare un byte extra!


Credo che il tuo "povero ceil" debba solo aggiungere .9, perché il decimale più basso che otterrai è 0,125 (1/8).
Tim Pederick,

@TimPederick Un buon punto, devo risparmiare molto di più per essere competitivo! Potrebbe valere la pena esaminare l'altro bonus per me ...
Dom Hastings,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.