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 N
lista de unidades inteiras e separadas por espaço. N
sempre será zero ou positivo e a lista de unidades sempre terá uma ou mais unidades válidas. N
representa 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 pylons
onde ZZZ
está 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
- 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.
- 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 Nexus
ainda 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 N
postes (o número inteiro na entrada). Saída You must construct ZZZ additional pylon(s)
se forem necessários mais postes, onde ZZZ
está a quantidade de postes necessários. Certifique-se de montar postes no plural, se necessário.
Isso é código-golfe , 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 N
está 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>
N unit1 unit2 unit3...
.true
ou um valor verdadeiro é aceitável?Respostas:
Ruby, 263 - 30% = 184 bytes
Uso
ruby sc.rb 0 Probe Nexus
fonte
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
fonte
True
, é possível salvar dois bytes substituindo1>0
por just1
.JavaScript,
274265bytes (sem bônus)281 - 10% = 252,9 bytesParece ser bastante demorado ...
Demonstração + explicação:
fonte
-(c>>3)
vez deMath.ceil(-c/8)
. Salve outros 2 bytes usando emc<-8
vez dec/8<-1
./g
? Isso economizaria outros 6 bytes. Também/ob/i
parece que funcionaria por mais 5 bytes de economia.>0
mas se tiver uma correspondência exata, isso ainda é verdade. Obviamente, para fins de golfe, você o trocaria<0
e reverteria os?:
braços.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
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.
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ências
, 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 eo
indica 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 postesp
e a lista de unidadesu
.Dentro do loop que começa na linha 4,
S
há um índices
e, portanto, também a quantidade de suprimento necessária para a unidade atualv
. Na linha 6, awhile
instrução avanças
até 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
, seS
for zero). Em seguida, incrementa a contagem de naves-mãeM
(identificadas pelo custo de suprimento superior a 7) e nos núcleos das mesmasm
(identificadas pela substringpC
no nome da unidade). Então, se um desses itens for maior que 1 ou seM
pelo menos um enquantom
ainda for zero, o sinalizadoro
será definido. (Na verdade, é incrementado, mas mais tarde só nos importamos se é zero ou diferente de zero.)O déficit de
q
pilões é calculado, um pouco estranhamente, na linha 8. Ingenuamente, deveria sern // 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 negativosint(p) - -(n // -8)
:, o que simplifica a forma realmente usada.Por fim, a saída. Se formos apenas um pilão curto,
q
será -1, daí o testeq>-2
(que cortas
o fio da cordas!
se for verdadeiro e mantém o contrário). Se não houver déficit de pilão,q
será zero ou positivo; portanto,q<0
selecione entre o valor de verdade 1 ou a sequência de saída. Por fim, se o sinalizadoro
não for zero, multiplicar o resultado (1 ou uma sequência de caracteres) por BooleanFalse
(tratado como numérico 0) fornecerá um valor de falsey (0 ou a sequência vazia).fonte
C ++ 11, 732-30% = 512,4 bytes
Usa as
ceil
sugestões do pobre homem de Dom Hastings e Martin Büttner para encurtar o dicionário.fonte
@username
no início de um comentário, por exemplo@wizzwizz4
.Python 2,
442359464332314306 - 10% = 275,4fonte
dict(x[:2],int(x[2:]) for x in "Ne-11 Pr1 Ze2".split())
Lua, 418 - 10% = 376,2 bytes
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
print
função apropriada que aceita qualquer valor diferente de zero. Estou explorando Lua destring.gsub
com o melhor de minha capacidade, assim como seusand
eor
operadores.Aqui está a versão bonita:
fonte
JavaScript (ES6), 228-10% = 206
Teste
fonte
Perl, código de 212 bytes + 3 para
-p
- 10% = 193,5 bytesTenho certeza de que posso reduzir isso um pouco mais, não satisfeito com o
for$s(...){...}
bloco inteiro , mas estou pronto por enquanto!Snippets interessantes
ceil
:int$n+.9
- Tentei usar,0|
mas consegui o que parece transbordar!(9)x9
rendimentos(9,9,9,9,9,9,9,9,9,9)
Uso:
Agradecemos a Tim Pederick por ajudar a economizar um byte extra!
fonte
ceil
" só precisa adicionar.9
, porque o decimal mais baixo que você recebe é 0,125 (1/8).