"Vous devez construire des pylônes supplémentaires!"


28

introduction

Dans le jeu de stratégie Starcraft 2, vous avez le choix entre trois "races": Terran, Zerg et Protoss. Dans ce défi, nous nous concentrerons sur le Protoss et la phrase emblématique "Vous devez construire des pylônes supplémentaires!" Ce message s'affiche lorsque vous manquez de vivres pour construire votre armée. Donc, pour aider la communauté Starcraft, vous devez écrire un programme ou une fonction qui indique exactement aux joueurs le nombre de pylônes dont ils ont besoin.

Le défi

Vous recevrez une entrée d'une chaîne composée d'un seul entier Net d'une liste d'unités séparées par des espaces. Nsera toujours zéro ou positif, et la liste des unités aura toujours une ou plusieurs unités valides. Nreprésente la quantité de pylônes dont le joueur dispose actuellement. Votre travail consiste à calculer si la quantité de pylônes dont dispose le joueur est suffisante pour construire les unités. Votre programme ou fonction doit produire / renvoyer une valeur véridique s'il y a suffisamment d'approvisionnement, ou s'il n'y a pas assez d'approvisionnement, vous devez générer You must construct ZZZ additional pylonsZZZest la quantité de pylônes nécessaires pour construire les unités. Notez qu'il pylon(s)doit être au pluriel si nécessaire et non pluriel dans le cas contraire ( ...1 additional pylon!, ...2 additional pylons!).

Unités Protoss et coût d'approvisionnement

Voici une liste de toutes les unités et leur coût d'approvisionnement correspondant. Les pylônes fournissent 8 réserves supplémentaires.

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

Exemples SANS 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. Tout joueur expérimenté de Starcraft 2 saurait que vous avez besoin d'un noyau de vaisseau mère avant de le transformer en vaisseau mère. En outre, vous ne pouvez avoir qu'un seul vaisseau-mère à la fois (qu'il s'agisse d'un véritable vaisseau-mère ou d'un noyau de vaisseau-mère). Si aucune de ces conditions n'est vraie, sortez toute valeur falsifiée. Si votre programme peut vérifier pour voir qu'un seul vaisseau-mère est actif à la fois, et qu'un noyau de vaisseau-mère est construit avant le vaisseau-mère réel, prenez 20% sur votre nombre d'octets.
  2. Vous ne savez peut-être pas grand-chose, mais les nexus (centres de commandement protoss) fournissent également de l'approvisionnement! Si votre programme peut ajouter 11 à l'approvisionnement maximal à chaque fois qu'il rencontre un lien dans la liste des unités, prenez 10% sur votre nombre d'octets. Notez que peu importe où se trouve le Nexus dans l'ordre de construction, il 0 Probe Nexusreviendrait quand même true.

Exemples AVEC 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

Saisissez une chaîne composée d'un entier et de noms d'unités séparés par des espaces (dans le tableau ci-dessus). Sortez une valeur véridique si vous pouvez construire toutes les unités avec l'alimentation fournie par les Npylônes (l'entier en entrée). Sortie You must construct ZZZ additional pylon(s)si plus de pylônes sont nécessaires, où ZZZest la quantité de pylônes nécessaires. Assurez-vous de faire des pylônes au pluriel si nécessaire.

Il s'agit de , donc le code le plus court en octets (ou la méthode de comptage de votre langue) gagne!

Classement

Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.

Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:

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

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

# [><>](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
Doit-il être séparé de l'espace ou peut-il être «pratique»?
Blue

@muddyfish Si je vous comprends bien, oui l'entrée doit être séparée par des espaces dans le formulaire N unit1 unit2 unit3....
GamrCorps

Y aura-t-il jamais plus de 9 pylônes? Dois-je produire exactement trueou une valeur véridique est-elle acceptable?
Dom Hastings du

@DomHastings, il peut y en avoir plus de 9. Toute valeur véridique est acceptable.
GamrCorps

2
Oh, allez! Est-ce que quelqu'un se souvient de Starcraft: Broodwar ou du Starcraft original? Ils ont aussi cette phrase!

Réponses:


4

Rubis, 263 - 30% = 184 octets

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

Usage

ruby sc.rb 0 Probe Nexus


7

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

Implémente le bonus Nexus.
Sauvegardé 26 octets grâce à DSM.
Enregistré 2 octets grâce à 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])

Bon travail! Comme vous n'avez besoin que de produire une valeur véridique, pas nécessairement True, vous pouvez enregistrer deux octets en les remplaçant 1>0par juste 1.
Tim Pederick

@TimPederick Je ne savais pas si cela comptait comme suffisamment véridique.
Morgan Thrapp


3
Vous devez construire des pythons supplémentaires ...
Brian

4

JavaScript, 274 265 octets (sans bonus) 281 - 10% = 252,9 octets

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

Cela semble être assez long ...

Démo + explication:

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


Je ne sais pas pourquoi je n'ai pas regardé les bonus, je devrais le faire.
nicael

Économisez 8 octets en utilisant -(c>>3)au lieu de Math.ceil(-c/8). Enregistrez encore 2 octets en utilisant c<-8au lieu de c/8<-1.
Neil

Vos matchs intérieurs n'ont pas besoin d' /geux? Cela économiserait encore 6 octets. Il /ob/isemble également que cela fonctionnerait pour une autre économie de 5 octets.
Neil

Votre test semble être faux - vous utilisez >0mais si vous avez une correspondance exacte, c'est toujours vrai. Évidemment, à des fins de golf, vous devez le basculer <0et inverser les ?:bras.
Neil

1
Je pense que vous pouvez économiser 17 octets supplémentaires en utilisant la soustraction tout au long. Voici ce que j'ai jusqu'à présent: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 octets

Met en œuvre les deux bonus. Imprime 1 comme valeur véridique et 0 ou une chaîne vide comme valeur 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))

Crédit à la solution de Dom Hastings pour me aider à raser un bon quelques octets avec un « pauvre homme de ceil» de moi, et Morgan Thrapp de l'idée sous - jacente 's!'[q>-2:], qui m'a sauvé six octets, sans parler de remarquer, dans les commentaires, comment pour enregistrer un autre octet sur ce bit.


Explications

La chaîne de la ligne 1 code toutes les unités et leurs besoins en alimentation. Chaque unité est représentée par deux caractères: un chiffre hexadécimal donnant la longueur du nom de l'unité, et le premier caractère du nom (par exemple, 8Ol'observateur; aMest le vaisseau-mère). Le besoin en approvisionnement est l'indice de l'unité codée dans la séquence s, formé en divisant la chaîne sur les espaces. Les arrêts complets indiquent les quantités d'approvisionnement non utilisées (aucune unité n'a besoin de 5 ou 7) et, comme cas spécial, le Nexus ( 5N) est à l'indice 0.

La ligne 2 initialise les valeurs: mest le nombre de noyaux de vaisseau mère, Mest le nombre de vaisseaux mères, nest le coût d'approvisionnement total et oindique si les conditions de construction du vaisseau mère ont été violées ou non. La ligne 3 prend l'entrée, mettant le nombre de pylônes pet la liste des unités u.

Dans la boucle qui commence à la ligne 4, Sest un index dans set, par conséquent, également la quantité d'alimentation nécessaire pour l'unité courante, v. À la ligne 6, l' whileinstruction continue sjusqu'à ce que l'unité soit trouvée. ( '%x'%len(v)transforme la longueur du nom de l'unité en un chiffre hexadécimal.)

La ligne 7 met à jour le coût total d'approvisionnement n(notez le cas spécial,, -11si Sest zéro). Il incrémente ensuite le nombre de vaisseaux mères M(identifiés par le coût d'approvisionnement supérieur à 7) et de noyaux de vaisseaux mères m(identifiés par la sous-chaîne pCau nom de l'unité). Ensuite, si l'une de ces valeurs est supérieure à 1, ou si Mau moins un while mest toujours nul, l'indicateur oest activé. (En fait, il est incrémenté, mais plus tard, nous ne nous soucions que s'il est nul ou non nul.)

Le déficit du pylône qest calculé, un peu bizarrement, à la ligne 8. Naïvement, il devrait l'être n // 8 - int(p)(c'est-à-dire un huitième du coût d'approvisionnement, moins tous les pylônes que nous avons déjà). Mais cela s'arrondirait quand nous aurions besoin d'arrondir. La division entière ( //) arrondit vers l'infini négatif, donc nous travaillons simplement tout en négatif int(p) - -(n // -8):, ce qui simplifie la forme réellement utilisée.

Enfin, la sortie. Si nous ne sommes qu'à un pylône court, ce qsera -1, d'où le test q>-2(qui tranche la ssortie de la chaîne s!si elle est vraie, et la maintient autrement). S'il n'y a pas de déficit de pylône, qsera nul ou positif, donc q<0pour choisir entre la valeur véridique 1 ou la chaîne de sortie. Enfin, si l'indicateur on'est pas nul, la multiplication du résultat (1 ou une chaîne) par Boolean False(géré comme un 0 numérique) donnera une valeur de falsey (0 ou la chaîne vide).


3

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

Utilise les ceilsuggestions du pauvre homme de Dom Hastings et de Martin Büttner pour raccourcir le dictionnaire.

#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 Bienvenue dans Programming Puzzles et Code Golf, ainsi que dans tout Stack Exchange. C'est une très bonne première réponse. Si vous souhaitez de l'aide, il vous suffit de le demander en tapant @usernameau début d'un commentaire, par exemple @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]

Comment pourrais-je raccourcir mon dictionnaire?
NoOneIsHere

2
Il y a des tonnes de façons de le faire. Par exemple, la réponse JavaScript utilise des expressions régulières au lieu de vérifier les chaînes individuelles. Vous pourriez peut-être essayer de trouver un hachage qui mappe chaque chaîne à un numéro unique (peut-être la somme des codes de caractères). Ces nombres peuvent être plus courts que les chaînes.
Martin Ender

Je ne suis pas sûr, mais c'est peut-être assez long pour faire des économies avec quelque chose commedict(x[:2],int(x[2:]) for x in "Ne-11 Pr1 Ze2".split())

1

Lua, 418 - 10% = 376,2 octets

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

Met en œuvre le bonus Nexus.

La première fois que j'ai publié quelque chose ici. J'écrivais des scripts Lua pour un jeu, je suis tombé dessus et j'avais envie de contribuer, hah.

Remarque: Cette fonction Lua suppose que la bibliothèque de base a été chargée et que l'application hôte définit une printfonction appropriée qui accepte toute valeur non nulle. J'exploite Lua string.gsubau mieux de mes capacités, ainsi que ses opérateurs andet or.

Voici la jolie version:

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

Tester

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, code de 212 octets + 3 pour -p- 10% = 193,5 octets

Je suis sûr que je peux encore réduire cela, je ne suis pas content du for$s(...){...}bloc complet , mais j'ai terminé pour l'instant!

$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

Extraits intéressants

  • Poor mans ceil: int$n+.9- J'ai essayé d'utiliser 0|mais j'ai obtenu ce qui ressemble à un débordement!
  • Duplication de liste: (9)x9rendements(9,9,9,9,9,9,9,9,9,9)

Usage:

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

Merci à Tim Pederick d' avoir aidé à économiser un octet supplémentaire!


Je crois que votre "pauvre homme ceil" n'a qu'à ajouter .9, car la décimale la plus basse que vous obtiendrez est 0,125 (1/8).
Tim Pederick

@TimPederick Un bon point, je dois économiser beaucoup plus pour être compétitif! Cela pourrait valoir la peine de s'intéresser à l'autre bonus pour moi ...
Dom Hastings
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.