Comme vous le savez, la phase de groupes de la Coupe du monde est terminée et à partir de demain, les 16 meilleures équipes entameront la phase à élimination directe:
- Brésil (BRA)
- Mexique (MEX)
- Pays-Bas (NED)
- Chili (CHI)
- Colombie (COL)
- Grèce (GRE)
- Costa Rica (CRC)
- Uruguay (URU)
- France (FRA)
- Suisse (SUI)
- Argentine (ARG)
- Nigéria (NGA)
- Allemagne (GER)
- États-Unis (USA)
- Belgique (BEL)
- Algérie (ALG)
Dans la phase à élimination directe, après chaque match, le vainqueur passe au tour suivant et le perdant rentre à la maison (il n'y a pas de match nul). Cliquez ici pour en savoir plus sur la phase à élimination directe.
Vous avez été embauché par golfbet.com, un nouveau site de paris, car vous êtes connu pour être bon en programmation et en paris sportifs. Votre tâche consiste à écrire un programme ou une fonction qui peut deviner le vainqueur d'un match. Bien sûr, tout le monde fait des suppositions différentes, cela n'a pas d'importance tant que vos suppositions sont cohérentes.
Si vous ne voulez pas deviner, vous pouvez utiliser les suppositions suivantes:
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
- Le programme doit sortir le même vainqueur quel que soit l'ordre des équipes (le vainqueur du match BRA-CHI doit être le même que celui du match CHI-BRA)
- Si une équipe perd, elle ne peut plus jouer de matchs. Cela signifie que pour les matchs qui n'ont pas lieu, vous devez l'indiquer. Par exemple, si votre programme devine le Brésil pour gagner le match BRA-CHI, alors CHI-GER doit retourner "aucun résultat", car le Chili ne jouera pas contre l'Allemagne. Voir le lien ci-dessus pour l'horaire.
Par souci de simplicité, vous n'avez pas à gérer le match de bronze (mais vous pouvez bien sûr).
Votre programme ou fonction prend deux chaînes en entrée: le code de pays à 3 lettres des deux équipes et renvoie le code de pays de l'équipe gagnante (vous pouvez utiliser une entrée / sortie standard ou deux paramètres de fonction / valeur de retour). Si les deux équipes données ne joueront pas selon vos suppositions, vous devez renvoyer autre chose (cela peut être tout sauf les codes de pays, par exemple une chaîne vide, null, un message d'erreur). Vous pouvez supposer que l'entrée est correcte (deux codes de pays différents qui sont dans la liste).
Il s'agit principalement d'un code-golf, donc le programme le plus court en octets gagne. Cependant, des solutions agréables et délicates sont également précieuses.
Exemple (bien sûr, vous pouvez faire vos propres suppositions):
entrée: BRA CHI sortie: BRA
entrée: CHI BRA sortie: BRA
entrée: CHI GER sortie: aucun résultat
BRA BRA
etHAZ CHEEZBURGER
doit être gérée correctement?Réponses:
Python 2.x -
368283Défi intéressant. Bien sûr, nous devons obtenir le classement actuel de la FIFA . Le Brésil a le soi-disant "12ème homme" car il a l'avantage de la maison donc la pondération 12/11.
Les conseils pour raccourcir ce qui précède sont les bienvenus :-).
Améliorations grâce à @TheRare et @MrLemon
Cela conduit aux résultats suivants:
Exemples d'appels:
la source
j
(c'est toujours zéro). 2.for k
peut être écrit sur une seule ligne à l'aide du;
délimiteur. 3. Vous n'avez pas besoin d'espace après des mots clés commetry
ouexcept
4. Vous pouvez supprimer des espaces entre crochets et mots clés (a[k]if d[k]>d[k+1]else a[k+1]
est valide) 5.for n in 16,8,4,2
6.def f(s):print s in m and m[s]or'no result'
j
, mais il y a une légère erreur de formatage avec lej+=1
. Et vous pouvez enregistrer de nombreux personnages en réencodant les données FIFA[15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7]
, bien sûr.C,
182 178133 (ou 126)Ce n'est pas le programme le plus court ici, mais c'est le plus court dans lequel la prédiction peut être modifiée facilement. Maintenant que tous les demi-finalistes sont connus, je mets à jour.
Il y a aussi quelques changements au code. Hormis les suggestions de Dennis dans les commentaires, le programme a été converti en fonction (comme en relisant cela est autorisé par les règles) et le hachage a été raccourci.
Code, 133
Comment ça fonctionne
les entrées
a
etb
sont hachées par l'expression*a-a[1]%16
à un seul caractère (*a
est un équivalent plus court àa[0]
). Le hachage résulte pour les équipesa
etb
est stocké dansh
. Par exemple, BRA CHI devient@;
. Les valeurs hachées sont les suivantes (les demi-finalistes confirmés et mon champion prédit sont marqués d'un*
.)t[]
stocke mes prédictions. Les résultats des huitièmes de finale et des quarts de finale sont désormais connus. Chaque groupe de 4 équipes est ordonné de telle sorte que les 1er et 4e ont été éliminés, et le 3e est le demi-finaliste. De même pour les demi-finalistes, je prédis que les 1er et 4e seront éliminés et que le 3e demi-finaliste sera le vainqueur général. Si vous n'êtes pas d'accord avec mes prévisions, réorganisez simplement la table.Les prédictions sont stockées dans des blocs palindromiques pour tenir compte de la possibilité que l'utilisateur entre dans les équipes dans l'un ou l'autre ordre possible. La commande rassemble les équipes gagnantes de chaque série de 4 pour disputer un troisième match. Ainsi, dans le premier groupe, GRE a
E
perdu contre CRC et MEX aH
perdu contre NED. Cela configure CRCA
pour jouer NEDI
en quart de finale sans avoir à répéter la frappe. La chaîne est rembourrée avec un espace entre chaque groupe de 4 équipes / 7 personnages pour garantir qu'il n'y a pas de sortie pour les équipes qui ne se joueront pas.Le vainqueur de chaque match possible dans chaque groupe de 8 caractères est la suivante:
invalid,b,a,a,b,b,a,invalid
. Ainsi, le bon choix du gagnant peut être fait en prenant la position deh
danst
AND 2 . Malheureusement, lastrstr
fonction n'est pas la plus directe car elle renvoie un pointeurp
, nous devons donc soustrairep
det
pour obtenir la position réelle danst.
Si la correspondance n'est pas valide (introuvable danst
),p
est zéro et la phraseno result
est imprimée.Quelques améliorations douteuses, 126
2 caractères enregistrés par une expression de hachage améliorée. Malheureusement, cela nécessite que le cas des équipes soit comme indiqué dans le programme de test sous la fonction (par exemple
Bra
au lieu deBRA
celui utilisé dans le programme ci-dessus). Je me suis assuré qu'il n'y avait aucun moyen de le faire avec un seul opérateur, donc 2 opérateurs et une constante à un seul caractère est aussi bon que possible. Notez également que laUru
correspondance avecspace
un autre caractère|
est nécessaire pour séparer les groupes de codes d'équipe.5 caractères enregistrés en éliminant
t
et en traitant la chaîne de prédiction comme un littéral. Cela signifie qu'il est impossible de connaître l'adresse où la chaîne est stockée. Cependant, à condition qu'il ne soit pas stocké à zéro, nous ne sommes intéressés quep&2
si le code fonctionnera si l'adresse est divisible par 4. (Notez qu'il n'est pas autorisé de traiter le pointeurp
directement comme un entier, il doit être soustrait d'un autre pointeur . J'utilise le pointeura
donca
doit aussi être divisible par 4.) On peut être assez confiant sur un compilateur / architecture de 32 ou 64 bits les chaînes seront stockées de cette façon. Cela a bien fonctionné pour moi sur GCC / cygwin, bien qu'il refuse de compiler sur visual studio / windows.la source
char
et*p
et en remplaçanta[0]
,b[0]
eth[0]
par*a
, b` et*h
. En outre, la question dit que * si les deux équipes données ne joueront pas selon vos suppositions, vous devez renvoyer autre chose (cela peut être autre que les codes de pays, par exemple une chaîne vide, null, un message d'erreur) , donc l'impression aucun résultat n'est pas requis et vous pouvez remplacerputs(...)
par(p=strstr(t,h))&&puts(p-t&2?a:b)
.a[0]->*a
! Mettra à jour bientôt. Je me demande simplement, existe-t-il un moyen d'accéder à un tableau multidimensionnel avec un seul numéro? J'ai écrit cette version en ligne de commande de longueur identique (peut économiser 1 octet avec a#define
.) Ce serait bien d'éviter les doubles indices dans ce cas et dans des cas similaires: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
doit être terminé par un caractère nul, il doit donc l'êtreh[3]
. 2. Si vous définissezp=v[1]
, vous pouvez accéder env[i][j]
tant quep[4*(i-1)+j]
. Il fonctionne sur ma machine, mais je ne sais pas s'il est portable ... 3. Vous devriez pouvoir l'initialiserh
si vous le déclarez à l'intérieurmain
: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])
Fait également écho à chaque caractère imprimable de la ligne de commande sur VS, mais sur GCC, le nom du programme est à 0, le premier argument est à 40 et le deuxième argument est introuvable (je suis allé jusqu'à 1000). Curieux. Quoi qu'il en soit, j'ai changé pour une fonction qui est dans les règles, en plus de mettre à jour mes prédictions (j'attendais juste le résultat de ce soir pour les confirmer avant de poster.) Merci encore et bonne chance contre le Brésil mardi.JavaScript
215 206 120116Beaucoup de place pour l'amélioration:
ES5 - 215
ES6 - 206
Approche regex - 116
Merci à ɐɔıʇǝɥʇuʎs d' avoir posté ce lien , cela m'a aidé à créer l'expression régulière
la source
split(' ')
ensplit``
etjoin('')
versjoin``
.Python (
179148139 manière cq trop long)Tout le monde sait que le pays dont le nom vient en premier dans l'alphabet va gagner. (Cette réponse existe juste pour commencer)
Grâce à la charité du ou des gars ici , j'ai pu raccourcir un peu ma réponse:
Cela suppose des équipes valides, mais n'a pas besoin d'une composition valide (
f('BRA','NED')
retournerait 0 (match invalide), maisf('XNE')
retournerait'XNE'
. Je ne comprends pas de votre question que c'est un problème cependant. N'hésitez pas à ré-abuser cette expression régulière comme bon vous semble.Merci @Ventero, je ne connais rien aux regex.
la source
re.search
dans la version golfée, nonre.match
. De plus, vous devriez être en mesure de larguer les ancres^
et$
.Scala (150)
Voici des matchs entre "foo" et "bar" possibles, aussi les équipes qui ne joueront pas en réel les unes contre les autres au premier tour auront un résultat (par exemple en commençant par BRA, ARG)
Il s'agit simplement d'enregistrer des équipes perdantes.
Appelé avec:
la source
PowerShell (
261221)En tant qu'utilisateur PowerShell relativement nouveau, je trouve le pipeline absolument incroyable. Je pense que la prochaine étape pourrait être d'essayer de jouer avec le tableau pour, espérons-le, éliminer tous ces appels de sous-chaîne. (J'ai dû ajouter un appel à la fin, sinon il a généré les deux équipes)
Original
la source
return
n'est pas nécessaire dans la plupart des cas.foreach
et la plupart des boucles explicites sont surévaluées et inutiles. Des méthodes comme celles-ci.Substring
ne devraient être utilisées que dans des circonstances extrêmes (et même si l'utilité du football peut être débattue, ce n'est pas un sport extrême). En règle générale, vous souhaitez utiliser le pipeline autant que possible.for
boucle commefor($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}
vous pouvez simplement utiliser un pipeline avec une gamme etForEach-Object
(crénelage%
):0..($x.Length/2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)}
. En examinant attentivement la façon dont vos données sont représentées, vous pouvez très probablement vous débarrasser desSubstring
appels. Les parenthèses autour du tableau initial sont inutiles. Pour les tableaux plus grands, il peut également être judicieux d'utiliser un caractère de séparation et d'utiliser-split
(unaire-split
dans le cas où le séparateur est un espace ou une tabulation).foreach
boucle finale par exemple peut également être écrite comme un pipeline (qui?
estWhere-Object
):$x|?{$_-match$a-and$_-match$b}|%{$_;exit};0
qui dit essentiellement »Filtrer chaque élément$x
pour savoir s'il correspond aux deux$a
et$b
et afficher le premier, en sortant ensuite. Si aucun n'a pu être trouvé, affichez 0. «. Puisque vous connaissez le format de vos cordes, vous pouvez aussi simplement l'utiliser-match"$a$b|$b$a"
, je suppose. Parce qu'ils doivent simplement apparaître dans l'un ou l'autre ordre dans la chaîne. Ce qui signifie également que nous pouvons utiliser un petit truc ici:"$a$b","$b$a"-eq$_
jouer au golf encore un autre octet.CJam,
6458 octetsCe qui précède utilise le signe d'insertion et la notation M, car le code contient des caractères non imprimables.
Au prix de six octets supplémentaires, ces caractères peuvent être évités:
Essayez-le en ligne.
Essai
Comment ça fonctionne
la source
CJam,
4948 octetsCe qui précède utilise la notation caret, car le code contient des caractères non imprimables.
Au prix de deux octets supplémentaires, ces caractères peuvent être évités:
Essayez-le en ligne.
Essai
Contexte
Nous commençons par attribuer un caractère ASCII à chaque équipe en considérant son nom comme un nombre de base 2, en prenant le modulo entier résultant 91, en ajoutant 12 (pour éviter les caractères non imprimables) et en sélectionnant le caractère correspondant au code ASCII résultant. Dans le code CJam, ceci est réalisé par
2b91%c
.Par exemple, les codes de caractères de
ALG
sont65 76 71
. Depuis(4 × 65 + 2 × 76 + 71) = 483
,483 % 91 + 12 = 40
et 40 si le code de caractère de(
.Cela donne le mappage suivant:
Maintenant, nous pouvons encoder les matchs des huitièmes de finale comme suit:
Si nous supposons que la première équipe par ordre alphabétique gagne toujours, les matchs des quarts de finale sont les suivants:
Notez que cette chaîne peut être obtenue à partir du premier en sélectionnant chaque deuxième caractère, en commençant par le premier. Dans le code CJam, ceci est réalisé par
2%
.Partant de la même idée, les matchs des demi-finales et du match final sont les suivants:
Le code
pousse la chaîne contenant les correspondances des huitièmes de finale, puis effectue les opérations suivantes trois fois: dupliquer la chaîne, extraire chaque deuxième caractère de la copie, concaténer. Le résultat est la chaîne
qui contient toutes les correspondances (certaines d'entre elles plus d'une fois).
Comment ça fonctionne
la source
"(=BL2*;74)#%8J[K"{_2%+}3*
est de la même longueur que la forme non palindromique de ma chaîne de prédiction"rRgL j9Ab 35ph tYKO gApK"
mais beaucoup plus facile à gérer.JavaScript 271
la source