"Você deve construir postes adicionais!"

28

Introdução

No jogo de estratégia Starcraft 2, há três "raças" para escolher: Terran, Zerg e Protoss. Neste desafio, focaremos nos Protoss e na frase icônica "Você deve construir postes adicionais!" Esta mensagem é declarada quando você fica sem suprimento para construir seu exército. Portanto, para ajudar a comunidade Starcraft, você deve escrever um programa ou função que informe aos jogadores exatamente quantos postes eles precisam.

O desafio

Você receberá uma entrada de uma sequência que consiste em uma única Nlista de unidades inteiras e separadas por espaço. Nsempre será zero ou positivo e a lista de unidades sempre terá uma ou mais unidades válidas. Nrepresenta a quantidade de postes que o jogador possui atualmente. Seu trabalho é calcular se a quantidade de postes que o jogador possui é suficiente para construir as unidades. Seu programa ou função deve gerar / retornar um valor verdadeiro, se houver suprimento suficiente, ou se não houver suprimento suficiente, você deve exibir You must construct ZZZ additional pylonsonde ZZZestá a quantidade de postes necessários para construir as unidades. Observe que pylon(s)deve ser plural quando necessário e não plural quando não ( ...1 additional pylon!, ...2 additional pylons!).

Unidades Protoss e Custo de Fornecimento

Aqui está uma lista de todas as unidades e seu custo de fornecimento correspondente. Os postes fornecem um suprimento 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

Exemplos SEM BÔNUS

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. 

Bônus

  1. Qualquer jogador experiente de Starcraft 2 saberia que você precisa de um núcleo de nave-mãe antes para transformá-lo em uma nave-mãe. Além disso, você pode ter apenas uma nave-mãe de cada vez (seja uma nave-mãe real ou um núcleo de nave-mãe). Se nenhuma dessas condições for verdadeira, produza qualquer valor falso. Se o seu programa puder verificar se apenas uma nave-mãe está ativa por vez e se o núcleo da nave-mãe é construído antes da nave-mãe, tire 20% da sua contagem de bytes.
  2. Pouco você sabe, mas os nexus (centros de comando protoss) também fornecem suprimentos! Se o seu programa puder adicionar 11 ao suprimento máximo toda vez que encontrar um nexo na lista de unidades, economize 10% na contagem de bytes. Observe que não importa onde o Nexus esteja na ordem de compilação, portanto 0 Probe Nexusainda retornará true.

Exemplos com bônus

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

Insira uma sequência que consiste em um número inteiro e nomes de unidades separados por espaço (da tabela acima). Emita um valor verdadeiro se você puder construir todas as unidades com o suprimento fornecido pelos Npostes (o número inteiro na entrada). Saída You must construct ZZZ additional pylon(s)se forem necessários mais postes, onde ZZZestá a quantidade de postes necessários. Certifique-se de montar postes no plural, se necessário.

Isso é , então o código mais curto em bytes (ou o método de contagem do seu idioma) vence!

Entre os melhores

Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

# Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:

# [><>](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
fonte
1
Ele precisa ser separado por espaço ou pode ser "conveniente"?
Azul
@muddyfish Se eu entendi direito, sim, a entrada deve ser separada por espaço no formulário N unit1 unit2 unit3....
GamrCorps
Haverá mais de 9 postes? Preciso produzir exatamente trueou um valor verdadeiro é aceitável?
Dom Hastings
@DomHastings pode haver mais de 9. Qualquer valor verdadeiro é aceitável.
GamrCorps 12/01
2
Oh vamos lá! Alguém se lembra de Starcraft: Broodwar ou o Starcraft original? Eles têm essa frase também!

Respostas:

4

Ruby, 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
fonte
7

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

Implementa o bônus do nexo.
Economizou 26 bytes graças ao DSM.
Economizou 2 bytes graças 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
fonte
Bom trabalho! Como você só precisa gerar um valor de verdade, não necessariamente True, é possível salvar dois bytes substituindo 1>0por just 1.
precisa saber é o seguinte
@ TimPederick Eu não tinha certeza se isso contava como verdade o suficiente.
Morgan Thrapp
Satisfaz a definição mais popular de "verdade" do meta .
precisa saber é o seguinte
3
Você deve construir pítons adicionais ...
Brian
4

JavaScript, 274265 bytes (sem bônus) 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":""}!`

Parece ser bastante demorado ...

Demonstração + explicação:

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
fonte
Não faço ideia por que não olhei para os bônus, deveria fazê-lo.
Nicael
Salve 8 bytes usando em -(c>>3)vez de Math.ceil(-c/8). Salve outros 2 bytes usando em c<-8vez de c/8<-1.
Neil
Suas correspondências internas não precisam /g? Isso economizaria outros 6 bytes. Também /ob/iparece que funcionaria por mais 5 bytes de economia.
Neil
Seu teste parece estar errado - você está usando, >0mas se tiver uma correspondência exata, isso ainda é verdade. Obviamente, para fins de golfe, você o trocaria <0e reverteria os ?:braços.
Neil
1
Eu acho que você pode salvar outros 17 bytes usando subtração por toda parte. Isto é o que eu tenho até agora: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 os dois bônus. Imprime 1 como seu valor verdadeiro e 0 ou uma string vazia como seu valor falsey.

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

Os meus agradecimentos à solução de Dom Hastings por me ajudar a cortar alguns bytes com um "homem pobre ceil", e a de Morgan Thrapp pela idéia subjacente 's!'[q>-2:], que me salvou seis bytes - sem mencionar como, nos comentários, como para salvar outro byte nesse bit.


Explicações

A cadeia na linha 1 codifica todas as unidades e seus requisitos de fornecimento. Cada unidade é representada como dois caracteres: um dígito hexadecimal fornecendo o comprimento do nome da unidade e o primeiro caractere do nome (por exemplo, 8Oé o Observador; aMé a Nave Mãe). O requisito de fornecimento é o índice da unidade codificada dentro da sequência s, formada pela divisão da cadeia nos espaços. Paradas completas marcam quantidades de suprimentos não utilizadas (nenhuma unidade precisa de 5 ou 7) e, como um caso especial, o Nexus ( 5N) está no índice 0.

A linha 2 inicializa os valores: mé o número de núcleos da nave-mãe, Mé o número de naves-mãe, né o custo total de fornecimento e oindica se as condições de construção da nave-mãe foram ou não violadas. A linha 3 pega a entrada, colocando o número de postes pe a lista de unidades u.

Dentro do loop que começa na linha 4, Shá um índice se, portanto, também a quantidade de suprimento necessária para a unidade atual v. Na linha 6, a whileinstrução avança saté a unidade ser encontrada. ( '%x'%len(v)transforma o comprimento do nome da unidade em um dígito hexadecimal.)

A linha 7 atualiza o custo total de fornecimento n(observe o caso especial -11, se Sfor zero). Em seguida, incrementa a contagem de naves-mãe M(identificadas pelo custo de suprimento superior a 7) e nos núcleos das mesmas m(identificadas pela substring pCno nome da unidade). Então, se um desses itens for maior que 1 ou se Mpelo menos um enquanto mainda for zero, o sinalizador oserá definido. (Na verdade, é incrementado, mas mais tarde só nos importamos se é zero ou diferente de zero.)

O déficit de qpilões é calculado, um pouco estranhamente, na linha 8. Ingenuamente, deveria ser n // 8 - int(p)(isto é, um oitavo do custo de fornecimento, menos os pilões que já temos). Mas isso seria arredondado quando precisamos arredondar. A divisão inteira ( //) arredonda para o infinito negativo, no entanto, apenas trabalhamos tudo em negativos int(p) - -(n // -8):, o que simplifica a forma realmente usada.

Por fim, a saída. Se formos apenas um pilão curto, qserá -1, daí o teste q>-2(que corta so fio da corda s!se for verdadeiro e mantém o contrário). Se não houver déficit de pilão, qserá zero ou positivo; portanto, q<0selecione entre o valor de verdade 1 ou a sequência de saída. Por fim, se o sinalizador onão for zero, multiplicar o resultado (1 ou uma sequência de caracteres) por Boolean False(tratado como numérico 0) fornecerá um valor de falsey (0 ou a sequência vazia).

Tim Pederick
fonte
3

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

Usa as ceilsugestões do pobre homem de Dom Hastings e Martin Büttner para encurtar o dicionário.

#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;}}
Trainer Walt
fonte
+1 Bem-vindo aos Puzzles de programação e Code Golf e a todo o Stack Exchange. Esta é uma primeira resposta muito boa. Se você quiser alguma ajuda, basta perguntar digitando @usernameno início de um comentário, por exemplo @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]
Ninguém está aqui
fonte
Como eu poderia encurtar meu dicionário?
NoOneIsHere
2
Existem várias maneiras de fazer isso. Por exemplo, a resposta do JavaScript usa expressões regulares em vez de verificar as strings individuais. Talvez você possa tentar encontrar um hash que mapeie cada sequência para um número único (talvez a soma dos códigos de caracteres). Esses números podem ser menores que as strings.
Martin Ender
Não tenho certeza, mas talvez seja o suficiente para obter economia com 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 o bônus do Nexus.

Primeira vez que publiquei algo aqui. Estava escrevendo scripts de Lua para um jogo, tropeçou nisso e tive vontade de contribuir, hah.

Nota: Esta função Lua assume que a biblioteca base foi carregada e que o aplicativo host define uma printfunção apropriada que aceita qualquer valor diferente de zero. Estou explorando Lua de string.gsubcom o melhor de minha capacidade, assim como seus ande oroperadores.

Aqui está a versão 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
fonte
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':''}!`)

Teste

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
fonte
0

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

Tenho certeza de que posso reduzir isso um pouco mais, não satisfeito com o for$s(...){...}bloco inteiro , mas estou pronto por enquanto!

$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

Snippets interessantes

  • Pobre homem ceil: int$n+.9- Tentei usar, 0|mas consegui o que parece transbordar!
  • Duplicação da lista: (9)x9rendimentos(9,9,9,9,9,9,9,9,9,9)

Uso:

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

Agradecemos a Tim Pederick por ajudar a economizar um byte extra!

Dom Hastings
fonte
Eu acredito que o seu "homem pobre ceil" só precisa adicionar .9, porque o decimal mais baixo que você recebe é 0,125 (1/8).
Tim Pederick
@ TimPederick Um bom ponto, preciso economizar muito mais para ser competitivo! Pode valer a pena olhar para o outro bónus para mim ...
Dom Hastings