"¡Debes construir pilones adicionales!"

28

Introducción

En el juego de estrategia Starcraft 2, hay tres "razas" para elegir: terran, zerg y protoss. En este desafío nos centraremos en los protoss y en la frase icónica "¡Debes construir pilones adicionales!" Este mensaje aparece cuando te quedas sin suministros para construir tu ejército. Entonces, para ayudar a la comunidad de Starcraft, debes escribir un programa o función que les diga a los jugadores exactamente cuántos pilones necesitan.

El reto

Se le dará una entrada de una cadena que consiste en un único entero Ny una lista de unidades separadas por espacios. Nsiempre será cero o positivo, y la lista de unidades siempre tendrá una o más unidades válidas.Nrepresenta la cantidad de pilones que tiene el jugador actualmente. Tu trabajo es calcular si la cantidad de pilones que tiene el jugador es suficiente para construir las unidades. Su programa o función debe generar / devolver un valor verdadero si hay suficiente suministro, o si no hay suficiente suministro, debe generar You must construct ZZZ additional pylonsdónde ZZZestá la cantidad de pilones necesarios para construir las unidades. Tenga en cuenta que pylon(s)debe ser plural cuando sea necesario y no plural cuando no ( ...1 additional pylon!,...2 additional pylons! ).

Unidades protoss y costo de suministro

Aquí hay una lista de todas las unidades y su costo de suministro correspondiente. Los pilones proporcionan un suministro adicional de 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

Ejemplos SIN Bonos

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. 

Bonos

  1. Cualquier jugador experimentado de Starcraft 2 sabría que necesitas un núcleo de nave nodriza antes de transformarlo en una nave nodriza. Además, solo puede tener una nave nodriza a la vez (ya sea una nave nodriza real o un núcleo de nave nodriza). Si ninguna de estas condiciones es verdadera, envíe un valor falso. Si su programa puede verificar que solo una nave nodriza está activa a la vez, y que se construye un núcleo de nave nodriza antes de la nave nodriza real, tome el 20% descuento en el número de bytes.
  2. ¡Puede que sepas poco, pero los nexos (centros de comando protoss) también proporcionan suministros! Si su programa puede agregar 11 al suministro máximo cada vez que encuentra un nexo en la lista de unidades, obtenga un 10% de descuento en su recuento de bytes. Tenga en cuenta que no importa dónde se encuentre el Nexus en el orden de compilación, por 0 Probe Nexuslo que aún regresaría true.

Ejemplos con bonos

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

Ingrese una cadena que consta de un número entero y nombres de unidades separadas por espacios (de la tabla anterior). Genere un valor verdadero si puede construir todas las unidades con el suministro proporcionado por los Npilones (el entero en la entrada). Salida You must construct ZZZ additional pylon(s)si se necesitan más pilones, dondeZZZ es la cantidad de pilones necesarios. Asegúrese de hacer los pilones en plural si es necesario.

Esto es , por lo que gana el código más corto en bytes (o el método de conteo de su idioma).

Tabla de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

# [><>](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>

GamrCorps
fuente
1
¿Tiene que estar separado por espacios o puede ser 'conveniente'?
Azul
@muddyfish Si te entiendo correctamente, sí, la entrada debe estar separada por espacios en el formulario N unit1 unit2 unit3....
GamrCorps
¿Habrá alguna vez más de 9 pilones? ¿Tengo que dar salida exactamente trueo es aceptable un valor verdadero?
Dom Hastings
@DomHastings puede haber más de 9. Cualquier valor verdadero es aceptable.
GamrCorps
2
¡Oh vamos! ¿Alguien recuerda Starcraft: Broodwar o el Starcraft original? ¡También tienen esa frase!

Respuestas:

4

Rubí, 263-30% = 184 bytes

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

Alex Flores
fuente
7

Python 3, 207 * .9 == 186.3 bytes.

Implementa la bonificación nexus.
Guardado 26 bytes gracias a DSM.
Guardado 2 bytes gracias 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])
Morgan Thrapp
fuente
¡Buen trabajo! Dado que solo necesita generar un valor verdadero, no necesariamente True, puede guardar dos bytes reemplazándolos 1>0con just 1.
Tim Pederick el
@TimPederick No estaba seguro si eso contaba como lo suficientemente cierto
Morgan Thrapp
Satisface la definición más popular de "verdad" del meta .
Tim Pederick
3
Debes construir pitones adicionales ...
Brian
4

JavaScript, 274 265 bytes (sin bonificaciones) 281 - 10% = 252.9 bytes

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

Esto parece ser bastante largo ...

Demo + explicación:

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
fuente
No tengo idea de por qué no busqué bonos, debería hacerlo.
nicael
Ahorre 8 bytes usando en -(c>>3)lugar de Math.ceil(-c/8). Guarde otros 2 bytes utilizando en c<-8lugar de c/8<-1.
Neil
Tus partidos internos no necesitan, /g¿ verdad ? Eso ahorraría otros 6 bytes. También /ob/iparece que funcionaría para otro ahorro de 5 bytes.
Neil
Su prueba parece estar equivocada: está usando >0pero si tiene una coincidencia exacta, entonces eso sigue siendo cierto. Obviamente, para fines de golf, debe cambiarlo <0e invertir los ?:brazos.
Neil
1
Creo que puede guardar otros 17 bytes utilizando la resta en todo momento. Esto es lo que tengo hasta ahora: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 bytes

Implementa ambos bonos. Imprime 1 como su valor verdadero y 0 o una cadena vacía como su valor falso.

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

Crédito para la solución Dom Hastings' por ayudarme a afeitarse unos cuantos bytes con un 'pobre hombre ceil' de la mía, y Morgan Thrapp de la idea que subyace 's!'[q>-2:], lo que me salvó seis bytes, por no mencionar señalando, en los comentarios, cómo para guardar otro byte en ese bit.


Explicaciones

La cadena en la línea 1 codifica todas las unidades y sus requisitos de suministro. Cada unidad se representa como dos caracteres: un dígito hexadecimal que indica la longitud del nombre de la unidad y el primer carácter del nombre (por ejemplo, 8Oes el Observador; aMes la Nave nodriza). El requisito de suministro es el índice de la unidad codificada dentro de la secuencia s, formada al dividir la cadena en los espacios. Las paradas completas marcan las cantidades de suministro no utilizadas (ninguna unidad necesita un suministro de 5 o 7), y como caso especial, el Nexus ( 5N) está en el índice 0.

La línea 2 inicializa los valores: mes el número de núcleos de naves nodriza, Mes el número de naves nodrizas, nes el costo total de suministro e oindica si se han violado o no las condiciones de construcción de la nave nodriza. La línea 3 toma la entrada, coloca el número de pilones py la lista de unidades u.

Dentro del bucle que comienza en la línea 4, Ses un índice dentro de sy, por tanto, también la cantidad de alimentación necesaria para la unidad actual, v. En la línea 6, la whiledeclaración avanza shasta que se encuentra la unidad. ( '%x'%len(v)convierte la longitud del nombre de la unidad en un dígito hexadecimal).

La línea 7 actualiza el costo total de suministro n(observe el caso especial -11, si Ses cero). Luego incrementa los recuentos de naves nodrizas M(identificadas por el costo de suministro superior a 7) y los núcleos de naves nodrizas m(identificados por la subcadena pCen el nombre de la unidad). Entonces, si cualquiera de estos es mayor que 1, o si Mes al menos uno mientras mtodavía es cero, ose establece el indicador . (En realidad, se incrementa, pero más tarde solo nos importa si es cero o no).

El déficit del pilón qse calcula, un poco extraño, en la línea 8. Ingenuamente, debería ser n // 8 - int(p)(es decir, una octava parte del costo de suministro, menos los pilones que ya tenemos). Pero eso se redondearía cuando necesitemos redondear. Sin //embargo, la división entera ( ) se redondea hacia el infinito negativo, por lo que simplemente trabajamos todo en negativos: lo int(p) - -(n // -8)que simplifica la forma realmente utilizada.

Por último, la salida. Si solo tenemos un pilón corto, qserá -1, de ahí la prueba q>-2(que corta sla cadena s!si es verdadera, y la mantiene de otra manera). Si no hay déficit de pilón, qserá cero o positivo, por lo tanto, q<0para seleccionar entre el valor verdadero 1 o la cadena de salida. Por último, si la bandera ono es cero, multiplicando el resultado (1 o una cadena) por booleano False(manejado como 0 numérico) dará un valor falso (0 o la cadena vacía).

Tim Pederick
fuente
3

C ++ 11, 732-30% = 512.4 bytes

Utiliza las ceilsugerencias del pobre de Dom Hastings y Martin Büttner de acortar el diccionario.

#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;}}
Entrenador Walt
fuente
+1 Bienvenido a Programming Puzzles y Code Golf, y a todo Stack Exchange. Esta es una muy buena primera respuesta. Si desea ayuda, solo pregunte escribiendo @usernameal comienzo de un comentario, por ejemplo @wizzwizz4.
wizzwizz4
2

Pitón 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]
No hay nadie aquí
fuente
¿Cómo podría acortar mi diccionario?
NoOneIsHere
2
Hay muchas formas de hacerlo. Por ejemplo, la respuesta de JavaScript usa expresiones regulares en lugar de verificar contra cadenas individuales. Tal vez podría intentar encontrar un hash que asigne cada cadena a un número único (tal vez la suma de los códigos de caracteres). Esos números pueden ser más cortos que las cuerdas.
Martin Ender
No estoy seguro, pero tal vez sea suficiente para ahorrar con algo comodict(x[:2],int(x[2:]) for x in "Ne-11 Pr1 Ze2".split())
1

Lua, 418 - 10% = 376,2 bytes

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 el bono Nexus.

Primera vez que publico algo aquí. Estaba escribiendo guiones de Lua para un juego, me topé con esto y me sentí como contribuyente, ja.

Nota: Esta función Lua supone que la biblioteca base se ha cargado y que la aplicación de host define una printfunción apropiada que acepta cualquier valor no nulo. Estoy explotando Lua de string.gsuba lo mejor de mi capacidad, así como sus andy oroperadores.

Aquí está la versión bonita:

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

Prueba

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>

edc65
fuente
0

Perl, código de 212 bytes + 3 para -p - 10% = 193.5 bytes

Estoy seguro de que puedo reducir esto un poco más, no estoy contento con el for$s(...){...}bloque completo , ¡pero ya he terminado!

$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

Fragmentos interesantes

  • Pobre hombre ceil: int$n+.9- ¡Intenté usarlo 0|pero obtuve lo que parece desbordamiento!
  • Lista de duplicación: (9)x9rendimientos(9,9,9,9,9,9,9,9,9,9)

Uso:

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

¡Gracias a Tim Pederick por ayudar a ahorrar un byte adicional!

Dom Hastings
fuente
Creo que tu "hombre pobre ceil" solo necesita sumar .9, porque el decimal más bajo que obtendrás es 0.125 (1/8).
Tim Pederick
@TimPederick Un buen punto, ¡necesito ahorrar mucho más para ser competitivo! Podría ser digno de mirar en la otra ventaja para mí ...
Dom Hastings