Erstellen Sie ein WM-Schätzprogramm

13

Wie Sie wissen, ist die WM-Gruppenphase vorbei, und ab morgen treten die besten 16 Teams in die Ko-Runde ein:

  • Brasilien (BRA)
  • Mexiko (MEX)
  • Niederlande (NED)
  • Chile (CHI)
  • Kolumbien (COL)
  • Griechenland (GRE)
  • Costa Rica (CRC)
  • Uruguay (URU)
  • Frankreich (FRA)
  • Schweiz (SUI)
  • Argentinien (ARG)
  • Nigeria (NGA)
  • Deutschland (GER)
  • Vereinigte Staaten (USA)
  • Belgien (BEL)
  • Algerien (ALG)

In der Ko-Phase gelangt der Sieger nach jedem Spiel in die nächste Runde und der Verlierer geht nach Hause (es gibt kein Unentschieden). Klicken Sie hier , um mehr über die Ko-Phase zu erfahren.

Sie wurden von golfbet.com angeheuert, einer neuen Wettwebsite, da Sie bekanntermaßen sowohl im Programmieren als auch beim Sportwetten gut sind. Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die den Gewinner eines Matches erraten kann. Natürlich macht jeder andere Vermutungen, es spielt keine Rolle, solange Ihre Vermutungen konsistent sind.

Wenn Sie nicht raten möchten, können Sie die folgenden Vermutungen verwenden:

BRA
        BRA
CHI
                BRA
COL
        COL
URU
                        GER
FRA
        FRA
NGA
                GER
GER
        GER
ALG
                                        GER
NED
        NED
MEX
                NED
CRC
        CRC
GRE
                        ARG
ARG
        ARG
SUI
                ARG
BEL
        BEL
USA
  1. Das Programm muss den gleichen Gewinner ausgeben, unabhängig von der Reihenfolge der an Mannschaften (der Gewinner des BRA-CHI-Spiels muss der gleiche sein wie der des CHI-BRA-Spiels).
  2. Wenn eine Mannschaft verliert, kann sie keine weiteren Spiele mehr bestreiten. Dies bedeutet, dass Sie für Matches, die nicht stattfinden, dies angeben müssen. Wenn Ihr Programm beispielsweise davon ausgeht, dass Brasilien das BRA-CHI-Spiel gewinnt, muss CHI-GER "no result" zurückgeben, da Chile nicht gegen Deutschland spielt. Siehe den Link oben für den Zeitplan.

Der Einfachheit halber muss man sich nicht mit dem Bronzematch auseinandersetzen (aber das kann man natürlich).

Ihr Programm oder Ihre Funktion verwendet zwei Zeichenfolgen als Eingabe: den dreistelligen Ländercode der beiden Teams und den Ländercode des Gewinnerteams (Sie können die Standardeingabe / -ausgabe oder zwei Funktionsparameter / den Rückgabewert verwenden). Wenn die beiden angegebenen Teams nicht nach Ihren Schätzungen spielen, müssen Sie etwas anderes zurückgeben (dies kann alles andere als die Ländercodes sein, z. B. leere Zeichenfolge, Null, Fehlermeldung). Sie können davon ausgehen, dass die Eingabe korrekt ist (zwei verschiedene Ländercodes in der Liste).

Dies ist in erster Linie ein Code-Golf, also gewinnt das kürzeste Programm in Bytes. Aber auch nette und knifflige Lösungen sind wertvoll.

Beispiel (natürlich können Sie Ihre eigenen Vermutungen anstellen):

Eingang: BRA CHI Ausgang: BRA

Eingang: CHI BRA Ausgang: BRA

Eingabe: CHI GER Ausgabe: kein Ergebnis

David Frank
quelle
Hätte ein [hinterhältiger] sein sollen, der zufällige Vermutungen ausgibt, aber lass uns immer dein Lieblingsteam gewinnen;) (Wie in: gibt einen zufälligen Vermutungsbaum aus)
27ıɐɔuʇǝɥʇs
@ ɐɔıɐɔuʇǝɥʇs codegolf.stackexchange.com/questions/32092/… Dieser ist dem sehr ähnlich
David Frank
4
@ ɐɔıɐɔuʎs, das ist viel interessanter als es ist. Wir erhalten einen Raum möglicher Programme, die in etwa Hash-Funktionen in einer Drei-Elemente-Menge entsprechen, und wir müssen das kleinste Programm finden, das mit jedem Programm in diesem Raum äquivalent ist.
Peter Taylor
1
Kann die Eingabe übernehmen gültig sein wird oder würde BRA BRAund HAZ CHEEZBURGERhaben richtig gehandhabt werden?
Dennis
@Dennis siehe meine Bearbeitung - die Eingabe ist immer gültig
David Frank

Antworten:

6

Python 2.x - 368 283

Interessante Herausforderung. Natürlich müssen wir aktuelle Ranglisten von der FIFA bekommen . Brasilien hat den sogenannten "12. Mann", da sie Heimvorteil haben, daher die Gewichtung 12/11.

a='BRA CHI COL URU FRA NGA ALG GER MEX NED CRC GRE ARG SUI BEL USA'.split()
d=[1242*12/11,1026,1137,1147,913,640,858,1300,882,981,762,1064,1175,1149,1074,1035]
m={}
for n in[16,8,4,2]:
 j=0
 for k in range(0,n,2):
  s=a[k] if d[k]>d[k+1] else a[k+1]
  m[a[k]+' '+a[k+1]]=s
  a[j]=s    
  j+=1
def f(s): 
 try: print m[s] 
 except: print 'no result'   

Tipps zur Verkürzung der oben genannten sind willkommen :-).

Verbesserungen dank @TheRare und @MrLemon

a='BRA CHI COL URU FRA NGA ALG GER MEX NED CRC GRE ARG SUI BEL USA'.split()
d=15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7
m={}
for n in 16,8,4,2:
 j=0
 for k in range(0,n,2):s=a[k]if d[k]>d[k+1]else a[k+1];m[a[k]+' '+a[k+1]]=s;a[j]=s;j+=1     
def f(s):print s in m and m[s]or'no result'

Dies führt zu folgenden Ergebnissen:

BRA CHI: BRA
COL URU: URU
FRA NGA: FRA
ALG GER: GER
MEX NED: NED
CRC GRE: GRE
ARG SUI: ARG
BEL USA: BEL
------------
BRA URU: BRA
FRA GER: GER
NED GRE: GRE
ARG BEL: ARG
------------
BRA GER: BRA
GRE ARG: ARG
------------
BRA ARG: BRA

Beispielanrufe:

f('BRA MEX')
no result
f('BRA CHI')
BRA
Willem
quelle
1. Sie verwenden nicht j(es ist immer Null). 2. for kkann mit einem ;Trennzeichen in eine Zeile geschrieben werden . 3. Nach Schlüsselwörtern wie tryoder brauchen Sie kein Leerzeichen. except4. Sie können Leerzeichen zwischen Klammern und Schlüsselwörtern entfernen ( a[k]if d[k]>d[k+1]else a[k+1]ist gültig). 5. for n in 16,8,4,26.def f(s):print s in m and m[s]or'no result'
Siehe auch
@TheRare Er verwendet j, aber es gibt einen leichten Formatierungsfehler mit dem j+=1. Und Sie können natürlich viele Charaktere speichern, indem Sie die FIFA-Daten neu verschlüsseln [15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7].
MrLemon
@MrLemon Ah, ich habe den Code nicht selbst ausprobiert, sondern nur angeschaut.
Siehe auch
5

C 182 178 133 (oder 126)

Hier ist es nicht das kürzeste Programm, aber es ist das kürzeste, in dem die Vorhersage leicht geändert werden kann. Jetzt, da alle Semifinalisten bekannt sind, aktualisiere ich.

Es gibt auch einige Änderungen am Code. Abgesehen von Dennis 'Vorschlägen in den Kommentaren wurde das Programm in eine Funktion konvertiert (da dies nach den Regeln beim erneuten Lesen zulässig ist) und das Hashing wurde verkürzt.

Code, 133

f(char*a,char*b){
  char*p,*t=" HIAEAIH N?=R=?N ;@4S4@; 5BDGDB5 B@?I?@B",h[3]={*a-a[1]%16,*b-b[1]%16};
  (p=strstr(t,h))&&puts(p-t&2?a:b);
}

Wie es funktioniert

Die Eingaben aund bwerden vom Ausdruck *a-a[1]%16auf ein einzelnes Zeichen gehasht ( *aist ein kürzeres Äquivalent zu a[0]). Die Hash-Ergebnisse für Teams aund bwerden in gespeichert h. Zum Beispiel wird BRA CHI @;. Die Hash-Werte lauten wie folgt (die bestätigten Semifinalisten und mein vorhergesagter Champion sind mit gekennzeichnet *.)

GRE E   CRC A   *NED I   MEX H
USA R   BEL =   *ARG ?   SUI N
URU S   COL 4  **BRA @   CHI ;
NGA G   FRA D   *GER B   ALG 5

t[]speichert meine Vorhersagen. Die Ergebnisse des Achtelfinals und des Viertelfinals sind nun bekannt. Jede Gruppe von 4 Teams ist so angeordnet, dass das 1. und 4. Team ausgeschieden sind und das 3. Team das Halbfinale ist. Ähnlich wie bei den Semifinalisten gehe ich davon aus, dass der 1. und 4. ausscheiden und der 3. Semifinalist der Gesamtsieger sein wird. Wenn Sie mit meinen Vorhersagen nicht einverstanden sind, ordnen Sie die Tabelle einfach neu.

Die Vorhersagen werden in palindromischen Blöcken gespeichert, um der Möglichkeit Rechnung zu tragen, dass der Benutzer die Teams in einer beliebigen Reihenfolge betritt. In der Reihenfolge werden die Gewinnerteams jedes 4er-Satzes zu einem dritten Spiel zusammengefasst. Somit Everlor GRE in der ersten Gruppe gegen CRC und MEX Hgegen NED. Dadurch wird CRC so eingerichtet A, dass Iim Viertelfinale NED gespielt wird, ohne dass die Eingabe wiederholt werden muss. Die Zeichenfolge ist mit einem Leerzeichen zwischen jeder Gruppe von 4 Teams / 7 Zeichen aufgefüllt, um sicherzustellen, dass keine Ausgabe für Teams erfolgt, die nicht gegeneinander spielen.

Der Sieger jeder möglichen Übereinstimmung in jeder Gruppe von 8 Zeichen ist wie folgt: invalid,b,a,a,b,b,a,invalid. Somit kann die richtige Wahl des Gewinners getroffen werden, indem die Position hin t AND 2 eingenommen wird . Leider ist die strstrFunktion ist nicht der straighforward als es einen Zeiger zurückgibt p, so dass wir abziehen müssen pvon tin die aktuelle Position zu bekommen t.Wenn das Spiel ungültig ist (kann nicht gefunden werden t), pist null und der Ausdruck no resultgedruckt wird.

Einige zweifelhafte Verbesserungen, 126

2 Zeichen, die durch einen verbesserten Hash-Ausdruck gespeichert wurden. Leider setzt dies voraus, dass die Teams wie im Testprogramm unter der Funktion angegeben sind (z. B. Brastatt BRAwie im obigen Programm verwendet). Ich habe mich davon überzeugt, dass dies nicht mit einem einzigen Bediener möglich ist. Also 2 Operatoren und eine Konstante mit einem Zeichen ist so gut wie es nur geht. Beachten Sie auch, dass eine Zuordnung Uruzu spaceeinem alternativen Zeichen |erforderlich ist, um die Gruppen von Teamcodes zu trennen.

5 Zeichen werden durch Eliminieren tund Behandeln der Vorhersagezeichenfolge als Literal gespeichert . Dies bedeutet, dass die Adresse, an der der String gespeichert ist, nicht bekannt ist. Jedoch, sofern er nicht bei Null gespeichert ist, werden wir nur in interessiert , p&2so der Code wird funktionieren , wenn die Adresse durch 4 (Hinweis teilbar ist , dass es nicht zu behandeln Zeiger erlaubt wird pdirekt als eine ganze Zahl, muss sie von einem anderen Zeiger subtrahiert werden Ich benutze den Zeiger aalso amuss auch durch 4 teilbar sein.) Man kann ziemlich sicher sein, dass auf diese Weise ein 32 oder 64 Bit Compiler / Architektur Strings gespeichert werden. Dies hat für mich unter GCC / cygwin gut funktioniert, obwohl es sich weigert, unter Visual Studio / Windows zu kompilieren.

g(char*a,char*b){
  char*p,h[3]={*a^a[1]+3,*b^b[1]+3};
  (p=strstr("|%&626&%|+4*#*4+|(71 17(|./3$3/.|/74&47/",h))&&puts(p-a&2?a:b);
}

main(){
  char team[16][4]={"Gre","Crc","Ned","Mex", "Usa","Bel","Arg","Sui", "Uru","Col","Bra","Chi", "Nga","Fra","Ger","Alg"}; 
  int i;
  for(i=1;i<16;i++){printf("%s %s \n",team[i-1],team[i]);g(team[i],team[i-1]);g(team[i-1],team[i]);}  
}
Level River St
quelle
Interessanter Ansatz! Sie können ein paar Bytes speichern , indem der Raum zwischen charund *pund ersetzt a[0], b[0]und h[0]mit *a, b 'und *h. Die Frage besagt außerdem, dass * wenn die angegebenen zwei Teams nicht gemäß Ihren Vermutungen spielen, Sie etwas anderes zurückgeben müssen (dies kann alles andere als die Ländercodes sein, z. B. leere Zeichenfolge, Null, Fehlermeldung) , sodass beim Drucken kein Ergebnis angezeigt wird nicht erforderlich und man konnte ersetzen puts(...)mit (p=strstr(t,h))&&puts(p-t&2?a:b).
Dennis
Danke vor allem für die Tipps a[0]->*a! Wird bald aktualisiert. Gibt es eine Möglichkeit, auf ein mehrdimensionales Array mit einer einzelnen Nummer zuzugreifen? Ich habe diese Befehlszeilenversion mit identischer Länge geschrieben (kann 1 Byte mit einem einsparen #define). Es wäre schön, die doppelten Indizes in diesem und ähnlichen Fällen zu vermeiden:char *p,h[2],*t="-LgRrRgL bA9j9Ab hp535ph OKYtYKO KpAgApK";main(int c,char**v){h[0]=v[1][1]*3-v[1][0]*2;h[1]=v[2][1]*3-v[2][0]*2;puts((p=strstr(t,h))?v[1+!(p-t&2)]:"no result");}
Level River St
1. Ich habe einen kleinen Fehler gefunden. hsollte nullterminiert sein, so muss es sein h[3]. 2. Wenn Sie einstellen p=v[1], können Sie v[i][j]als zugreifen p[4*(i-1)+j]. Es funktioniert auf meinem Computer, aber ich weiß nicht, ob es portabel ist ... 3. Sie sollten in der Lage sein, zu initialisieren, hwenn Sie es in deklarieren main:main(int c,char**v){char*t="-LgRrRgL bA9j9Ab hp535ph OKYtYKO KpAgApK",*p=v[1],h[3]={p[1]*3-*p*2,p[5]*3-p[4]*2};(p=strstr(t,h))&&puts(v[1+!(p-t&2)]);}
Dennis
@ Tennis Ihr Code funktioniert sowohl auf GCC / Cygwin als auch auf VS / Windows auf meinem Computer. Ebenfallsfor(int i=0;i<1000;i++)printf("%d %c ",i,i[*argv]) Echos Evey druckbare Zeichen der Befehlszeile auf VS zurück, aber auf GCC ist der Programmname bei 0, das erste Argument ist bei 40 und das zweite Argument ist nirgends zu sehen (ich ging bis zu 1000) Neugierig. Wie auch immer, ich habe zu einer Funktion gewechselt, die innerhalb der Regeln liegt, zusätzlich zur Aktualisierung meiner Vorhersagen (ich habe nur auf das heutige Ergebnis gewartet, um es vor dem Posten zu bestätigen.) Nochmals vielen Dank und viel Glück gegen Brasilien am Dienstag.
Level River St
3

JavaScript 215 206 120 116

Viel Raum für Verbesserungen:

ES5 - 215

a=prompt().split(' ');("BRACHI0COLURU0FRANGA0GERALG0NEDMEX0CRCGRE0ARGSUI0BELUSA0BRACOL0FRAGER0NEDCRC0ARGBEL0BRAGER0NEDARG0BRANED".split(0).filter(function(x){return x.match(a[0])&&x.match(a[1])})[0]||"").substr(0,3)


ES6 - 206

a=prompt().split(' ');("BRACHI0COLURU0FRANGA0GERALG0NEDMEX0CRCGRE0ARGSUI0BELUSA0BRACOL0FRAGER0NEDCRC0ARGBEL0BRAGER0NEDARG0BRANED".split(0).filter((x)=>{return x.match(a[0])&&x.match(a[1])})[0]||"").substr(0,3)

Regex-Ansatz - 116

Danke an toıɐɔuʇǝɥʇs für das Veröffentlichen dieses Links konnte ich den

a=prompt().split(' ').sort();a.join('').match(/LG(.R(A|G)|GE)|RG(S|BE|CR)|ELUS|AC(H|O)|OLUR|CGR|CM|FRANG|XNE/)&&a[0]
William Barbosa
quelle
1
Sie können Ihre Lösungen verkürzen, indem Sie split(' ')nach split``und join('')nach konvertieren join``.
Arjun
2

Python ( 179 148 139 cq viel zu lang)

f=lambda *l:sorted(l)[0]if"".join(sorted(l))in"BRACHI COLURU FRANGA ALGGER MEXNED CRCGRE ARGSUI BELUSA BRACOL ALGFRA CRCMEX ARGBEL BRAFRA CRCMEX ARGBEL BRAFRA ARGCRC ARGBRA"else 0

Jeder weiß, dass das Land mit dem Namen, der im Alphabet an erster Stelle steht, gewinnen wird. (Diese Antwort gibt es nur, um den Anfang zu machen.)

Danke an die Wohltätigkeit der Jungs hier konnte ich meine Antwort ein wenig verkürzen:

import re;f=lambda *l:sorted(l)[0]if re.match('RGB|CM|RGS|CGR|L.F|XNE|EL.S|O.UR|RGCR|B.AF|L.GE|^BRACHI$|^FRANGA$|^BRACOL$',"".join(sorted(l)))else 0

Dies setzt gültige Teams voraus, erfordert jedoch keine gültige Aufstellung (f('BRA','NED') würde 0 ergeben (ungültiges Spiel), f('XNE')würde aber zurückkehren 'XNE'. Ich verstehe aus Ihrer Frage jedoch nicht, dass dies ein Problem ist diese Regex, wie Sie es für richtig halten.

Danke @Ventero, ich weiß nichts über reguläre Ausdrücke.

import re;f=lambda*l:sorted(l)[0]if re.match('RGB|CM|RGS|CGR|L.F|XNE|EL.S|O.UR|RGCR|B.AF|L.GE|BRACHI|FRANGA|BRACOL',"".join(sorted(l)))else 0
ɐɔıɐɔuʇǝɥʇs
quelle
Sie wollen wahrscheinlich re.searchin der Golfversion nicht re.match. Außerdem sollten Sie in der Lage sein, die Anker ^und fallen zu lassen $.
Ventero
2

Scala (150)

type s=String;var m=Map[s,s]();def f(x:(s,s))={var a=x._1;var b=x._2;if(b<a){b=a;a=x._1};if(m.getOrElse(a,a)=="")m.getOrElse(b,b)else{m=m+(b->"");a}}

Hier sind Matches zwischen "foo" und "bar" möglich, auch Teams, die in den ersten Runden nicht real gegeneinander spielen, haben ein Ergebnis (zB beginnend mit BRA, ARG)

Es geht nur darum, Teams zu verlieren.

type s=String //just aliasing for saving characters
var m=Map[s,s]() //map for storing loosing teams, a set would do too
def f(x:(s,s))={
  var a=x._1 var b=x._2
  if(b<a){b=a;a=x._1};//swap if b<a lexographically
  if(m.getOrElse(a,a)=="")//if a has loosed previously
     m.getOrElse(b,b)// return b if b was not in the map else return ""
  else{
    m=m+(b->"") //add b to the map, because a will definitly win this amazing match
    a //and return a
  }
}

Angerufen mit:

f(("GER","BRA"))
das gg
quelle
2

PowerShell ( 261 221)

$a=Read-Host;$b=Read-Host;$x="CHIBRA","URUCOL","FRANGA","ALGGER","MEXNED","CRCGRE","SUIARG","BELUSA";0..($x.Length-2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)};$x|?{"$a$b","$b$a"-eq$_}|%{$_.Substring(3);exit};0

Als relativ neuer PowerShell-Benutzer finde ich die Pipeline absolut erstaunlich. Ich denke, als nächstes könnte versucht werden, mit dem Array herumzuspielen, um hoffentlich alle diese Teilzeichenfolgenaufrufe zu eliminieren. (Ich musste am Ende einen Anruf hinzufügen oder es gab beide Teams aus)

Neues Mitglied, erster Versuch, Code Golf zu spielen!

Hätte das Viertelfinale, das Halbfinale und das Finale hart codieren können, um ein paar Zeichen zu speichern, aber das wäre nicht so lustig.

Sollte leicht zu entziffern sein, aber beide Bedingungen erfüllen: Es gibt denselben Gewinner, unabhängig von der eingegebenen Reihenfolge, und es wird nur ein Gewinner für Spiele zurückgegeben, die tatsächlich stattfinden!

Jeder Verbesserungsvorschlag wäre sehr dankbar, danke!

Original

$a=Read-Host;$b=Read-Host;$x=("CHIBRA","URUCOL","FRANGA","ALGGER","MEXNED","CRCGRE","SUIARG","BELUSA");for($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}foreach($i in $x){if($i-match$a-and$i-match$b){return $i.Substring(3)}}return 0
fuandon
quelle
1
Ein paar Dinge (die vollständige Behebung würde viel mehr Zeit in Anspruch nehmen): Schreiben Sie PowerShell nicht so, als wäre es C oder C #. Dies bedeutet, returnist in den meisten Fällen nicht erforderlich. foreachund die meisten expliziten Schleifen sind überbewertet und unbrauchbar. Methoden wie .Substringsollten nur unter extremen Umständen angewendet werden (und obwohl über den Nutzen des Fußballs diskutiert wird, handelt es sich nicht um eine Extremsportart). Im Allgemeinen möchten Sie die Pipeline so oft wie möglich nutzen.
Joey
1
Statt ein langatmiges das Schreiben forSchleife wie for($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}Sie gerade eine Pipeline mit einer Reihe verwenden können und ForEach-Object(aliased %): 0..($x.Length/2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)}. Wenn Sie sorgfältig überlegen, wie Ihre Daten dargestellt werden, können Sie die SubstringAnrufe sehr wahrscheinlich loswerden . Die Klammern um das ursprüngliche Array sind nicht erforderlich. Bei größeren Arrays kann es auch sinnvoll sein, ein Trennzeichen zu verwenden -split(unär, -splitwenn das Trennzeichen ein Leerzeichen oder ein Tabulator ist).
Joey
1
Die endgültige foreachSchleife kann beispielsweise als eine Rohrleitung geschrieben werden , wie auch ( ?ist Where-Object): $x|?{$_-match$a-and$_-match$b}|%{$_;exit};0die im wesentlichen sagt »in jedem Element - Filter $xdafür , ob er sowohl übereinstimmt $aund $bund gibt die ersten, danach verläßt. Wenn keine gefunden werden konnte, geben Sie 0 aus. «. Da Sie das Format Ihrer Zeichenfolgen kennen, können Sie es auch einfach verwenden -match"$a$b|$b$a". Weil sie nur in der Reihenfolge in der Zeichenfolge erscheinen müssen. Das bedeutet auch, dass wir hier einen kleinen Trick anwenden können: "$a$b","$b$a"-eq$_Noch ein Byte Golf spielen.
Joey
2

CJam, 64 58 Bytes

lS/$_0=\:+4b256b1>:ca"oM-YtM-mM-^@}gM-^VM-^U8tM-=nM-^MfM-]oM-xgM-)tM-|m@gim{g_"2/&,*

Das Obige verwendet Caret und M-Notation, da der Code nicht druckbare Zeichen enthält.

Auf Kosten von sechs zusätzlichen Bytes können diese Zeichen vermieden werden:

lS/$_0=\:+4b95b1>32f+:c"I8Vyv)2~N{VIEh1$IW32W)B82QBs2G"2/N*\#W>*

Probieren Sie es online aus.

Testlauf

$ base64 -d > worldcup.cjam <<< \
> bFMvJF8wPVw6KzRiMjU2YjE+OmNhIm/ZdO2AfWeWlTh0vW6NZt1v+GepdPxtQGdpbXtnXyIyLyYsKg==
$ wc -c worldcup.cjam
58 worldcup.cjam
$ for A in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> for B in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> [[ $A < $B ]] && echo $A - $B : $(LANG=en_US cjam worldcup.cjam <<< "$A $B")
> done; done | grep ': .'
ALG - ARG : ALG
ALG - BRA : ALG
ALG - FRA : ALG
ALG - GER : ALG
ARG - BEL : ARG
ARG - CRC : ARG
ARG - SUI : ARG
BEL - USA : BEL
BRA - CHI : BRA
BRA - COL : BRA
COL - URU : COL
CRC - GRE : CRC
CRC - MEX : CRC
FRA - NGA : FRA
MEX - NED : MEX

Wie es funktioniert

lS/$    " Read one line from STDIN, split at spaces and sort the resulting array.         ";
_0=\    " Extract the first element of a copy of the array and swap it with the array.    ";
:+      " Concatenate the strings.                                                        ";
4b      " Convert the resulting string into an integer by considering it a base 4 number. ";
256b    " Convert the integer into an array by considering it a base 256 number.          ";
1>:ca   " Drop the first element, convert into a string and create a singleton array.     ";
"…"     " Push a string of all matches encoded as explained above.                        ";
2/      " Split the string into an array of two-character strings.                        ";
&       " Intersect the two arrays. If the array is non-empty, the teams play.            ";
,*      " Multiply the string on the stack by the length of the array.                    ";
Dennis
quelle
Sie sollten die Größe Ihres Bash-Skripts zur Größe des CJam-Programms hinzufügen, um fair zu sein.
David Frank
1
@DavidFrank: Ich habe das Bash-Skript eingefügt, um zu beweisen, dass mein Programm nur für die 15 Übereinstimmungen ausgegeben wird, die stattfinden. Es funktioniert von selbst und erfordert keine externen Programme.
Dennis
2

CJam, 49 48 Bytes

lS/$_0="^\16@&^^/+(^]^W^Y,>O?"{_2%+}3*@{2b91%c}%#1&!*

Oben wird die Caret-Notation verwendet, da der Code nicht druckbare Zeichen enthält.

Auf Kosten von zwei zusätzlichen Bytes können diese Zeichen vermieden werden:

lS/$_0="(=BL2*;74)#%8J[K"{_2%+}3*@{2b91%C+c}%#1&!*

Probieren Sie es online aus.

Testlauf

$ base64 -d > wc.cjam <<< bFMvJF8wPSIcMTZAJh4vKygdFxksPk8/IntfMiUrfTMqQHsyYjkxJWN9JSMxJiEq
$ wc -c wc.cjam
48 wc.cjam
$ for A in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> for B in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> [[ $A < $B ]] && echo $A - $B : $(cjam wc.cjam <<< "$A $B"); done; done | grep ': .'
ALG - ARG : ALG
ALG - BRA : ALG
ALG - FRA : ALG
ALG - GER : ALG
ARG - BEL : ARG
ARG - CRC : ARG
ARG - SUI : ARG
BEL - USA : BEL
BRA - CHI : BRA
BRA - COL : BRA
COL - URU : COL
CRC - GRE : CRC
CRC - MEX : CRC
FRA - NGA : FRA
MEX - NED : MEX

Hintergrund

Wir beginnen damit, jedem Team ein ASCII-Zeichen zuzuweisen, indem wir dessen Namen als Basis-2-Zahl betrachten, die resultierende Ganzzahl modulo 91 nehmen, 12 addieren (um nicht druckbare Zeichen zu vermeiden) und das Zeichen auswählen, das dem resultierenden ASCII-Code entspricht. Im CJam-Code wird dies durch erreicht2b91%c .

Zum Beispiel werden die Zeichencodes ALGsind 65 76 71. Da (4 × 65 + 2 × 76 + 71) = 483, 483 % 91 + 12 = 40und 40 , wenn der Zeichencode( .

Dies ergibt das folgende Mapping:

ALG (    ARG 4    BEL #    BRA 2    CHI *    COL ;    CRC 8    FRA B
GER =    GRE J    MEX [    NED K    NGA L    SUI )    URU 7    USA %

Jetzt können wir die Matches der Achtelfinale wie folgt kodieren:

(=BL2*;74)#%8J[K

Wenn wir davon ausgehen, dass die erste Mannschaft in alphabetischer Reihenfolge immer gewinnt, sind die Spiele des Viertelfinals wie folgt:

(B2;4#8[

Beachten Sie, dass diese Zeichenfolge vom ersten abgerufen werden kann, indem jedes zweite Zeichen beginnend mit dem ersten ausgewählt wird. Im CJam-Code wird dies durch erreicht 2%.

Ausgehend von der gleichen Idee lauten die Spiele des Halbfinals und des Endspiels wie folgt:

(248
(4

Der Code

"(=BL2*;74)#%8J[K"{_2%+}3*

Drückt die Zeichenfolge mit den Übereinstimmungen der Achtelfinale und macht dann dreimal Folgendes: dupliziert die Zeichenfolge, extrahiert jedes zweite Zeichen der Kopie und verkettet sie. Das Ergebnis ist die Zeichenfolge

(=BL2*;74)#%8J[K(B2;4#8[(B2;4#8[(248(B2;4#8[(248(248(4

die alle Übereinstimmungen enthält (einige von ihnen mehr als einmal).

Wie es funktioniert

lS/$        " Read one line from STDIN, split at spaces and sort the resulting array.     ";
_0=         " Extract the first element of a copy of the array.                           ";
"…"         " Push the string containing the matches of the round of 16.                  ";
{_2%+}3*    " Push the remaining matches.                                                 ";
@           " Rotate the input array on top of the stack.                                 ";
{2b91%C+c}% " Perform the mapping for each team in the input array.                       ";
#           " Push the index of the match in the array of all matches (-1 for not found). ";
1&!         " Push 1 if the index is even (valid match) and 0 if it is odd.               ";
,*          " Repeat the string on the stack that many times.                             ";
Dennis
quelle
Es ist erstaunlich, was du mit Cjam machst. Wann immer ich denke, dass Sie eine meiner Ideen ausleihen könnten, fällt Ihnen etwas Besseres ein! Ihr Vorhersagecode "(=BL2*;74)#%8J[K"{_2%+}3*hat die gleiche Länge wie die nicht-palindrome Form meiner Vorhersagezeichenfolge, ist "rRgL j9Ab 35ph tYKO gApK"aber viel einfacher zu handhaben.
Level River St
0

JavaScript 271

t=prompt('Match?').split('-')
x=t[0],y=t[1],T='BRACHICOLURUFRANGAGERALGNEDMEXCRCGREARGSUIBELUSA'
v='\n',R='',W='No Game'
for(z=1;T!='USA';++z,T=n){R+=v+z+v,n='',r=/(...)(...)/g
while(m=r.exec(T))a=m[1],n+=b=m[2],R+=a+'-'+b+v,W=a==x&&b==y||a==y&&b==x?b:W
}
alert(W+'\n'+R)
Wolfhammer
quelle