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
- 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).
- 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
BRA BRA
undHAZ CHEEZBURGER
haben richtig gehandhabt werden?Antworten:
Python 2.x -
368283Interessante 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.
Tipps zur Verkürzung der oben genannten sind willkommen :-).
Verbesserungen dank @TheRare und @MrLemon
Dies führt zu folgenden Ergebnissen:
Beispielanrufe:
quelle
j
(es ist immer Null). 2.for k
kann mit einem;
Trennzeichen in eine Zeile geschrieben werden . 3. Nach Schlüsselwörtern wietry
oder brauchen Sie kein Leerzeichen.except
4. 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,2
6.def f(s):print s in m and m[s]or'no result'
j
, aber es gibt einen leichten Formatierungsfehler mit demj+=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]
.C
182 178133 (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
Wie es funktioniert
Die Eingaben
a
undb
werden vom Ausdruck*a-a[1]%16
auf ein einzelnes Zeichen gehasht (*a
ist ein kürzeres Äquivalent zua[0]
). Die Hash-Ergebnisse für Teamsa
undb
werden in gespeicherth
. Zum Beispiel wird BRA CHI@;
. Die Hash-Werte lauten wie folgt (die bestätigten Semifinalisten und mein vorhergesagter Champion sind mit gekennzeichnet*
.)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
E
verlor GRE in der ersten Gruppe gegen CRC und MEXH
gegen NED. Dadurch wird CRC so eingerichtetA
, dassI
im 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 Positionh
int
AND 2 eingenommen wird . Leider ist diestrstr
Funktion ist nicht der straighforward als es einen Zeiger zurückgibtp
, so dass wir abziehen müssenp
vont
in die aktuelle Position zu bekomment.
Wenn das Spiel ungültig ist (kann nicht gefunden werdent
),p
ist null und der Ausdruckno result
gedruckt 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.
Bra
stattBRA
wie 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 ZuordnungUru
zuspace
einem alternativen Zeichen|
erforderlich ist, um die Gruppen von Teamcodes zu trennen.5 Zeichen werden durch Eliminieren
t
und 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&2
so der Code wird funktionieren , wenn die Adresse durch 4 (Hinweis teilbar ist , dass es nicht zu behandeln Zeiger erlaubt wirdp
direkt als eine ganze Zahl, muss sie von einem anderen Zeiger subtrahiert werden Ich benutze den Zeigera
alsoa
muss 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.quelle
char
und*p
und ersetzta[0]
,b[0]
undh[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 ersetzenputs(...)
mit(p=strstr(t,h))&&puts(p-t&2?a:b)
.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");}
h
sollte nullterminiert sein, so muss es seinh[3]
. 2. Wenn Sie einstellenp=v[1]
, können Siev[i][j]
als zugreifenp[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,h
wenn Sie es in deklarierenmain
: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)]);}
for(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.JavaScript
215 206 120116Viel Raum für Verbesserungen:
ES5 - 215
ES6 - 206
Regex-Ansatz - 116
Danke an toıɐɔuʇǝɥʇs für das Veröffentlichen dieses Links konnte ich den
quelle
split(' ')
nachsplit``
undjoin('')
nach konvertierenjoin``
.Python (
179148139 cq viel zu lang)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:
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.
quelle
re.search
in der Golfversion nichtre.match
. Außerdem sollten Sie in der Lage sein, die Anker^
und fallen zu lassen$
.Scala (150)
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.
Angerufen mit:
quelle
PowerShell (
261221)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)
Original
quelle
return
ist in den meisten Fällen nicht erforderlich.foreach
und die meisten expliziten Schleifen sind überbewertet und unbrauchbar. Methoden wie.Substring
sollten 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.for
Schleife wiefor($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 undForEach-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 dieSubstring
Anrufe 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,-split
wenn das Trennzeichen ein Leerzeichen oder ein Tabulator ist).foreach
Schleife kann beispielsweise als eine Rohrleitung geschrieben werden , wie auch (?
istWhere-Object
):$x|?{$_-match$a-and$_-match$b}|%{$_;exit};0
die im wesentlichen sagt »in jedem Element - Filter$x
dafür , ob er sowohl übereinstimmt$a
und$b
und 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.CJam,
6458 BytesDas 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:
Probieren Sie es online aus.
Testlauf
Wie es funktioniert
quelle
CJam,
4948 BytesOben 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:
Probieren Sie es online aus.
Testlauf
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 erreicht
2b91%c
.Zum Beispiel werden die Zeichencodes
ALG
sind65 76 71
. Da(4 × 65 + 2 × 76 + 71) = 483
,483 % 91 + 12 = 40
und 40 , wenn der Zeichencode(
.Dies ergibt das folgende Mapping:
Jetzt können wir die Matches der Achtelfinale wie folgt kodieren:
Wenn wir davon ausgehen, dass die erste Mannschaft in alphabetischer Reihenfolge immer gewinnt, sind die Spiele des Viertelfinals wie folgt:
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:
Der Code
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
die alle Übereinstimmungen enthält (einige von ihnen mehr als einmal).
Wie es funktioniert
quelle
"(=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.JavaScript 271
quelle