"Sie müssen zusätzliche Pylone bauen!"

28

Einführung

Im Strategiespiel Starcraft 2 stehen drei "Rassen" zur Auswahl: Terraner, Zerg und Protoss. Bei dieser Herausforderung konzentrieren wir uns auf die Protoss und die Ikone "Sie müssen zusätzliche Pylone bauen!" Diese Meldung wird angezeigt, wenn Sie nicht mehr genügend Vorräte haben, um Ihre Armee aufzubauen. Um der Starcraft-Community zu helfen, müssen Sie ein Programm oder eine Funktion schreiben, die den Spielern genau sagt, wie viele Pylone sie benötigen.

Die Herausforderung

Sie erhalten eine Eingabe einer Zeichenfolge, die aus einer einzelnen Ganzzahl Nund einer durch Leerzeichen getrennten Liste von Einheiten besteht. Nist immer null oder positiv, und die Liste der Einheiten enthält immer eine oder mehrere gültige Einheiten. NStellt die Anzahl der Pylone dar, über die der Spieler derzeit verfügt. Ihre Aufgabe ist es zu berechnen, ob die Anzahl der Pylone, über die der Spieler verfügt, ausreicht, um die Einheiten zu bauen. Ihr Programm oder Ihre Funktion muss einen Wahrheitswert ausgeben / zurückgeben, wenn es genügend Versorgung gibt, oder wenn es nicht genug Versorgung gibt, müssen Sie ausgeben, You must construct ZZZ additional pylonswo ZZZdie Anzahl der Pylone ist, die zum Aufbau der Einheiten erforderlich sind. Beachten Sie, dass pylon(s)bei Bedarf ein Plural und bei Nichtbeachtung ein Plural sein muss ( ...1 additional pylon!, ...2 additional pylons!).

Protoss-Einheiten und Lieferkosten

Hier finden Sie eine Liste aller Einheiten und der zugehörigen Lieferkosten. Pylone bieten zusätzlich 8 Versorgung.

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

Beispiele OHNE Boni

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. 

Boni

  1. Jeder erfahrene Starcraft 2-Spieler würde wissen, dass Sie einen Mutterschiffkern benötigen, um ihn in ein Mutterschiff zu verwandeln. Außerdem können Sie immer nur ein Mutterschiff gleichzeitig haben (unabhängig davon, ob es sich um ein tatsächliches Mutterschiff oder einen Mutterschiffkern handelt). Wenn keine dieser Bedingungen zutrifft, geben Sie einen falschen Wert aus. Wenn Ihr Programm überprüfen kann, ob jeweils nur ein Mutterschiff aktiv ist und ein Mutterschiffkern vor dem eigentlichen Mutterschiff erstellt wurde, reduzieren Sie Ihre Bytezahl um 20% .
  2. Sie wissen vielleicht nicht viel, aber Nexuses (Protoss-Kommandozentralen) stellen tatsächlich auch die Versorgung sicher! Wenn Ihr Programm jedes Mal, wenn es auf einen Nexus in der Einheitenliste stößt, die maximale Anzahl um 11 erhöhen kann, reduzieren Sie Ihre Byteanzahl um 10% . Beachten Sie, dass es keine Rolle spielt, wo sich der Nexus in der Erstellungsreihenfolge befindet, und dass er 0 Probe Nexustrotzdem zurückkehren würde true.

Beispiele mit Boni

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

Geben Sie eine Zeichenfolge ein, die aus einer Ganzzahl und durch Leerzeichen getrennten Einheitennamen besteht (aus der obigen Tabelle). Geben Sie einen Wahrheitswert aus, wenn Sie alle Einheiten mit der von den NPylonen bereitgestellten Versorgung (der Ganzzahl in der Eingabe) erstellen können . Ausgabe, You must construct ZZZ additional pylon(s)wenn mehr Pylone benötigt werden, wo ZZZist die Anzahl der benötigten Pylone. Stellen Sie sicher, dass Sie bei Bedarf mehrere Pylone verwenden.

Das ist , also gewinnt der kürzeste Code in Bytes (oder die Zählmethode Ihrer Sprache)!

Bestenliste

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

# [><>](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
quelle
1
Muss es durch Leerzeichen getrennt sein oder kann es "praktisch" sein?
Blue
@muddyfish Wenn ich Sie richtig verstehe, muss die Eingabe im Formular durch Leerzeichen getrennt sein N unit1 unit2 unit3....
GamrCorps
Wird es jemals mehr als 9 Pylone geben? Muss ich genau ausgeben trueoder ist ein wahrer Wert akzeptabel?
Dom Hastings
@ DomHastings kann mehr als 9 sein. Jeder wahrheitsgemäße Wert ist akzeptabel.
GamrCorps
2
Ach komm schon! Erinnert sich jemand an Starcraft: Broodwar oder das ursprüngliche Starcraft? Sie haben diesen Satz auch!

Antworten:

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

Verwendung

ruby sc.rb 0 Probe Nexus

Alex Flores
quelle
7

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

Implementiert den Nexus-Bonus.
26 Bytes dank DSM gespart.
2 Bytes gespart dank 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
quelle
Gute Arbeit! Da Sie nur einen Ausgang truthy Wert benötigen, nicht notwendigerweise True, können Sie zwei Bytes speichern durch Ersetzen 1>0mit nur 1.
Tim Pederick
@ TimPederick Ich war mir nicht sicher, ob das als wahr genug galt.
Morgan Thrapp
Es erfüllt die populärste Definition von "Wahrheit" aus Meta .
Tim Pederick
3
Sie müssen zusätzliche Pythons konstruieren ...
Brian
4

JavaScript, 274 265 Bytes (keine Boni) 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":""}!`

Das scheint ziemlich lang zu sein ...

Demo + Erklärung:

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
quelle
Ich habe keine Ahnung, warum ich Boni nicht angeschaut habe, sollte es tun.
Nicoleel
Sparen Sie 8 Bytes, indem Sie -(c>>3)anstelle von verwenden Math.ceil(-c/8). Speichern Sie weitere 2 Byte, indem Sie c<-8anstelle von verwenden c/8<-1.
Neil
Deine inneren Streichhölzer brauchen /gsie nicht? Das würde weitere 6 Bytes einsparen. Auch /ob/isieht aus wie es für eine weitere 5 - Byte - Einsparung funktionieren würde.
Neil
Ihr Test scheint falsch zu sein - Sie verwenden, >0aber wenn Sie eine genaue Übereinstimmung haben, dann ist das immer noch wahr. Offensichtlich für Golfzwecke würden Sie es wechseln <0und die ?:Arme umkehren .
Neil
1
Ich denke, Sie können weitere 17 Bytes sparen, indem Sie durchgehend subtrahieren. Dies ist, was ich bisher habe: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

Implementiert beide Boni. Gibt 1 als Wahrheitswert und entweder 0 oder eine leere Zeichenfolge als Falsey-Wert aus.

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

Dank an Dom Hastings 'Lösung, die mir geholfen hat, ein paar Bytes mit einem "armen Mann ceil" von mir abzuwaschen , und Morgan Thrapps für die Idee 's!'[q>-2:], die mir sechs Bytes erspart hat - ganz zu schweigen davon, wie ich in den Kommentaren darauf hingewiesen habe um ein weiteres Byte in diesem Bit zu speichern.


Erklärungen

Die Zeichenfolge in Zeile 1 codiert alle Einheiten und deren Versorgungsanforderungen. Jede Einheit wird als zwei Zeichen dargestellt: eine hexadezimale Ziffer, die die Länge des Namens der Einheit angibt, und das erste Zeichen des Namens (z. B. 8Oist der Beobachter; aMist das Mutterschiff). Der Versorgungsbedarf ist der Index der codierten Einheit innerhalb der Sequenz s, der durch Aufteilen der Zeichenfolge auf die Leerzeichen gebildet wird. Durchgehende Stopps kennzeichnen nicht genutzte Vorratsmengen (kein Gerät benötigt 5 oder 7 Vorratsmengen), und als Sonderfall befindet sich der Nexus ( 5N) auf Index 0.

Zeile 2 initialisiert die Werte: mist die Anzahl der Mutterschiffskerne, Mist die Anzahl der Mutterschiffe, nist die Gesamtversorgungskosten und ozeigt an, ob die Mutterschiffsbaubedingungen verletzt wurden oder nicht. Zeile 3 übernimmt die Eingabe, wobei die Anzahl der Pylone pund die Liste der Einheiten eingegeben werden u.

Innerhalb der Schleife, die in Zeile 4 beginnt, Sbefindet sich ein Index in sund damit auch die für die aktuelle Einheit benötigte Versorgungsmenge v. In Zeile 6 whiledurchläuft die Anweisung, sbis die Einheit gefunden wurde. ( '%x'%len(v)Wandelt die Länge des Gerätenamens in eine hexadezimale Zahl um.)

Zeile 7 aktualisiert die Gesamtversorgungskosten n(beachten Sie den Sonderfall -11, wenn SNull ist). Es erhöht dann die Anzahl der Mutterschiffe M(bei denen die Versorgungskosten über 7 liegen) und der Mutterschiff-Kerne m(bei denen es sich um die Teilzeichenfolge pCim Namen der Einheit handelt). Wenn dann einer dieser Werte größer als 1 ist oder wenn Mmindestens einer mnoch Null ist, wird das Flag ogesetzt. (Eigentlich wird es inkrementiert, aber später interessiert es uns nur, ob es Null ist oder nicht.)

Das qPylonendefizit wird ein wenig seltsam in Zeile 8 berechnet. Naiv sollte es sein n // 8 - int(p)(dh ein Achtel der Lieferkosten abzüglich aller Pylone, die wir bereits haben). Aber das würde sich abrunden, wenn wir aufrunden müssen. Die Ganzzahldivision ( //) rundet jedoch in Richtung negativer Unendlichkeit, sodass wir nur alles in Negativen: arbeiten int(p) - -(n // -8), was sich in der tatsächlich verwendeten Form vereinfacht.

Zuletzt die Ausgabe. Wenn wir nur einen Pylon kurz haben, qist der Wert -1, daher der Test q>-2(der den Wert saus der Zeichenfolge herausschneidet, s!wenn er wahr ist, und ihn ansonsten beibehält). Wenn es kein Pylon-Defizit gibt, qist es null oder positiv, daher kann q<0zwischen dem Wahrheitswert 1 oder der Ausgangszeichenfolge gewählt werden. Wenn das Flag onicht Null ist, ergibt das Multiplizieren eines Ergebnisses (1 oder einer Zeichenfolge) mit Boolean False(behandelt als numerische 0) einen falschen Wert (0 oder die leere Zeichenfolge).

Tim Pederick
quelle
3

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

Verwendet die ceilVorschläge von Dom Hastings und Martin Büttner, das Wörterbuch zu verkürzen.

#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
quelle
+1 Willkommen bei Programming Puzzles und Code Golf sowie bei Stack Exchange. Dies ist eine sehr gute erste Antwort. Wenn Sie Hilfe benötigen, geben Sie einfach @usernameam Anfang eines Kommentars eine Frage ein, z @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]
Niemand ist hier
quelle
Wie könnte ich mein Wörterbuch kürzen?
NoOneIsHere
2
Dafür gibt es unzählige Möglichkeiten. Die JavaScript-Antwort verwendet beispielsweise reguläre Ausdrücke, anstatt einzelne Zeichenfolgen zu prüfen. Möglicherweise könnten Sie versuchen, einen Hash zu finden, der jede Zeichenfolge einer eindeutigen Zahl (möglicherweise der Summe der Zeichencodes) zuordnet. Diese Zahlen sind möglicherweise kürzer als die Zeichenfolgen.
Martin Ender
Ich bin nicht sicher, aber vielleicht ist es lang genug, um Einsparungen mit so etwas wiedict(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

Implementiert den Nexus-Bonus.

Zum ersten Mal habe ich hier etwas gepostet. Ich habe Lua-Skripte für ein Spiel geschrieben, bin über dieses Thema gestolpert und hatte das Gefühl, etwas beizutragen, hah.

Hinweis: Diese Lua-Funktion setzt voraus, dass die Basisbibliothek geladen wurde und dass die Hostanwendung eine geeignete printFunktion definiert , die alle Nicht-Null-Werte akzeptiert. Ich nutze Lua string.gsubnach besten Kräften, ebenso wie seine andund seine orOperatoren.

Hier ist die hübsche 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")
BinarySpark
quelle
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':''}!`)

Prüfung

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

Perl, 212 Byte Code + 3 für -p- 10% = 193,5 Byte

Ich bin mir sicher, dass ich das noch etwas reduzieren kann, nicht glücklich über den vollen for$s(...){...}Block, aber ich bin fürs Erste fertig!

$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

Interessante Schnipsel

  • Armer Mann ceil: int$n+.9- Ich habe versucht, zu verwenden, habe 0|aber etwas bekommen, das wie ein Überlauf aussieht!
  • Listenverdopplung: (9)x9Erträge(9,9,9,9,9,9,9,9,9,9)

Verwendung:

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

Vielen Dank an Tim Pederick für die Unterstützung beim Speichern eines zusätzlichen Bytes!

Dom Hastings
quelle
Ich glaube, Ihr "armer Mann ceil" muss nur addieren .9, denn die niedrigste Dezimalstelle, die Sie erhalten, ist 0,125 (1/8).
Tim Pederick
@ TimPederick Ein guter Punkt, ich muss viel mehr sparen, um wettbewerbsfähig zu sein! Könnte es sich lohnen, in den anderen Bonus für mich zu schauen ...
Dom Hastings