Como saben, la fase de grupos de la Copa del Mundo terminó y, a partir de mañana, los 16 mejores equipos comenzarán la fase eliminatoria:
- Brasil (BRA)
- México (mex)
- Países Bajos (NED)
- Chile (CHI)
- Colombia (COL)
- Grecia (GRE)
- Costa Rica (CRC)
- Uruguay (URU)
- Francia (FRA)
- Suiza (SUI)
- Argentina (ARG)
- Nigeria (NGA)
- Alemania (GER)
- Estados Unidos (USA)
- Bélgica (BEL)
- Argelia (ALG)
En la etapa eliminatoria, después de cada partido, el ganador pasa a la siguiente ronda y el perdedor se va a casa (no hay empates). Haga clic aquí para ver más sobre la etapa eliminatoria.
Golfbet.com, un nuevo sitio web de apuestas, lo ha contratado porque se sabe que es bueno tanto en programación como en apuestas deportivas. Su tarea es escribir un programa o función que pueda adivinar el ganador de un partido. Por supuesto, todos hacen conjeturas diferentes, no importa siempre y cuando sus conjeturas sean consistentes.
Si no quieres adivinar, puedes usar las siguientes conjeturas:
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
- El programa debe generar el mismo ganador independientemente del orden de los equipos (el ganador del partido BRA-CHI debe ser el mismo que el del partido CHI-BRA)
- Si un equipo pierde, no puede jugar más partidos. Esto significa que para los partidos que no tienen lugar, debe indicarlo. Por ejemplo, si su programa adivina que Brasil ganará el partido BRA-CHI, entonces CHI-GER tiene que devolver "ningún resultado", porque Chile no jugará contra Alemania. Vea el enlace de arriba para el horario.
En aras de la simplicidad, no tiene que lidiar con el partido de bronce (pero puede, por supuesto).
Su programa o función toma dos cadenas como entrada: el código de país de 3 letras de los dos equipos y devuelve el código de país del equipo ganador (puede usar la entrada / salida estándar, o dos parámetros de función / valor de retorno). Si los dos equipos dados no jugarán de acuerdo con sus conjeturas, debe devolver algo más (esto puede ser cualquier cosa menos los códigos de país, por ejemplo, cadena vacía, nulo, mensaje de error). Puede suponer que la entrada es correcta (dos códigos de país diferentes que están en la lista).
Este es principalmente un código de golf, por lo que gana el programa más corto en bytes. Sin embargo, las soluciones agradables y difíciles también son valiosas.
Ejemplo (por supuesto, puedes hacer tus propias conjeturas):
entrada: BRA CHI salida: BRA
entrada: CHI BRA salida: BRA
entrada: salida CHI GER: sin resultado
BRA BRA
yHAZ CHEEZBURGER
tiene que ser manejada adecuadamente?Respuestas:
Python 2.x -
368283Interesante reto. Por supuesto, necesitamos obtener clasificaciones actuales de la FIFA . Brasil tiene el llamado "duodécimo hombre", ya que tiene la ventaja de casa, por lo tanto, la ponderación 12/11.
Consejos para acortar lo anterior son bienvenidos :-).
Mejoras gracias a @TheRare y @MrLemon
Esto lleva a los siguientes resultados:
Llamadas de ejemplo:
fuente
j
(siempre es cero). 2.for k
se puede escribir en una línea usando;
delimitador. 3. No necesita espacio después de palabras clave comotry
oexcept
4. Puede eliminar espacios entre corchetes y palabras clave (a[k]if d[k]>d[k+1]else a[k+1]
es válido) 5.for n in 16,8,4,2
6.def f(s):print s in m and m[s]or'no result'
j
, pero hay un pequeño error de formato con elj+=1
. Y puedes guardar muchos personajes volviendo a codificar los datos de FIFA[15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7]
, por supuesto.C,
182 178133 (o 126)No es el programa más corto aquí, pero es el más corto en el que la predicción se puede cambiar fácilmente. Ahora que todos los semifinalistas son conocidos, estoy actualizando.
También hay algunos cambios en el código. Además de las sugerencias de Dennis en los comentarios, el programa se ha convertido en una función (como en la relectura, esto está permitido por las reglas) y el hash se ha acortado.
Código 133
Cómo funciona
las entradas
a
yb
se combinan con la expresión*a-a[1]%16
en un solo carácter (*a
es un equivalente más corto aa[0]
). Los resultados de hash para equiposa
yb
se almacenan enh
. Por ejemplo BRA CHI se convierte@;
. Los valores hash son los siguientes (los semifinalistas confirmados y mi campeón predicho están marcados con*
).t[]
almacena mis predicciones Ahora se conocen los resultados de la ronda de 16 y cuartos de final. Cada grupo de 4 equipos está ordenado de tal manera que el primero y el cuarto fueron eliminados, y el tercero es el semifinalista. De manera similar a los semifinalistas, pronostico que el 1 ° y 4 ° serán eliminados y el 3 ° semifinalista será el ganador general. Si no está de acuerdo con mis predicciones, simplemente vuelva a ordenar la tabla.Las predicciones se almacenan en bloques palindrómicos para acomodar la posibilidad de que el usuario ingrese a los equipos en cualquier orden posible. El orden pone a los equipos ganadores de cada conjunto de 4 juntos para jugar un tercer partido. Así, en el primer grupo, GRE
E
perdió con CRC y MEXH
perdió con NED. Esto configura CRCA
para jugar NEDI
en los cuartos de final sin tener que repetir el tipeo. La cadena se rellena con un espacio entre cada grupo de 4 equipos / 7 caracteres para ayudar a garantizar que no haya salida para los equipos que no jugarán entre sí.El ganador de cada posible coincidencia en cada grupo de 8 caracteres es el siguiente:
invalid,b,a,a,b,b,a,invalid
. Por lo tanto, la elección correcta del ganador se puede hacer tomando la posición deh
int
AND 2 . Por desgracia, lastrstr
función no es el más directo conducir, ya que devuelve un punterop
, por lo que hay que restarp
det
obtener la posición real ent.
Si el partido no es válido (no se pueden encontrar ent
),p
es cero y la fraseno result
se imprime.Algunas mejoras dudosas, 126
2 caracteres guardados por una expresión hash mejorada. Desafortunadamente, esto requiere que el caso de los equipos sea como se muestra en el programa de prueba debajo de la función (por ejemplo, en
Bra
lugar deBRA
como se usa en el programa anterior). Me he convencido de que no hay forma de hacerlo con un solo operador, así que 2 operadores y una constante de un solo carácter es tan bueno como parece. Tenga en cuenta también que se necesita unUru
mapaspace
alternativo|
para separar los grupos de códigos de equipo.5 caracteres guardados al eliminar
t
y tratar la cadena de predicción como un literal. Esto significa que es imposible saber la dirección donde se almacena la cadena. Sin embargo, siempre que no esté almacenado en cero, solo nos interesa, porp&2
lo que el código funcionará si la dirección es divisible por 4. (Tenga en cuenta que no está permitido tratar el punterop
directamente como un entero, debe restarse de otro puntero Uso el puntero,a
por loa
que también debe ser divisible por 4.) Uno puede estar bastante seguro de que un compilador de 32 o 64 bits / cadenas de arquitectura se almacenarán de esta manera. Esto me ha funcionado bien en GCC / cygwin, aunque se niega a compilar en Visual Studio / Windows.fuente
char
y*p
y reemplazandoa[0]
,b[0]
yh[0]
con*a
, b` y*h
. Además, la pregunta dice que * si los dados dos equipos no jugarán de acuerdo a sus conjeturas, debe devolver algo más (esto puede ser otra cosa que los códigos de país, por ejemplo, una cadena vacía, null, mensaje de error) , por lo imprimiendo ningún resultado es no es obligatorio y puede reemplazarloputs(...)
por(p=strstr(t,h))&&puts(p-t&2?a:b)
.a[0]->*a
! Se actualizará pronto. Solo me pregunto, ¿hay alguna forma de acceder a una matriz multidimensional con un solo número? Escribí esta versión de línea de comandos de longitud idéntica (puede guardar 1 byte con a#define
.) Sería bueno evitar los subíndices dobles en este y otros casos similares: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
debe tener terminación nula, por lo que tiene que serloh[3]
. 2. Si configurap=v[1]
, puede accederv[i][j]
comop[4*(i-1)+j]
. Funciona en mi máquina, pero no sé si es portátil ... 3. Debería poder inicializarh
si lo declara dentromain
: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])
hace eco de todos los caracteres imprimibles de la línea de comando en VS, pero en GCC el nombre del programa está en 0, el primer argumento está en 40 y el segundo argumento no se ve por ninguna parte (subí a 1000). Curioso. De todos modos, cambié a una función que está dentro de las reglas, además de actualizar mis predicciones (solo estaba esperando el resultado de esta noche para confirmarlas antes de publicar). Gracias de nuevo y buena suerte contra Brasil el martes.JavaScript
215 206 120116Mucho margen de mejora:
ES5 - 215
ES6 - 206
Enfoque Regex - 116
Gracias a ɐɔıʇǝɥʇuʎs por publicar este enlace , me ayudó a hacer la expresión regular
fuente
split(' ')
asplit``
yjoin('')
ajoin``
.Python (
179148139 cq demasiado tiempo)Todos saben que el país con el nombre que aparece primero en el alfabeto va a ganar. (Esta respuesta solo existe para comenzar)
Gracias a la caridad de los chicos de aquí , pude acortar un poco mi respuesta:
Esto asume equipos válidos, pero no necesita una alineación válida (
f('BRA','NED')
devolvería 0 (partido no válido), perof('XNE')
regresaría'XNE'
. No entiendo de su pregunta que sin embargo esto es un problema. Siéntase libre de volver a abusar) esta expresión regular como mejor le parezca.Gracias @Ventero, no sé nada sobre expresiones regulares.
fuente
re.search
en la versión de golf, nore.match
. Además, debe poder soltar^
y$
anclajes .Scala (150)
Aquí hay coincidencias entre "foo" y "bar" posibles, también los equipos que no jugarán entre sí en la primera ronda tendrán un resultado (por ejemplo, comenzando con BRA, ARG)
Es solo grabar equipos que pierden.
Llamado con:
fuente
PowerShell (
261221)Como un usuario relativamente nuevo de PowerShell, encuentro la tubería absolutamente increíble. Creo que el siguiente paso podría ser tratar de manipular la matriz para eliminar todas estas llamadas de subcadenas. (Tuve que agregar una llamada al final o de lo contrario salieron los dos equipos)
Original
fuente
return
es innecesario en la mayoría de los casos.foreach
y la mayoría de los bucles explícitos están sobrevalorados e inútiles. Los métodos como.Substring
deberían usarse solo en circunstancias extremas (y aunque la utilidad del fútbol podría debatirse, no es un deporte extremo). En general, desea utilizar la tubería tanto como sea posible.for
bucle comofor($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}
sólo puede utilizar una tubería con un rango yForEach-Object
(alias%
):0..($x.Length/2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)}
. Al considerar cuidadosamente cómo se representan sus datos, es muy probable que pueda deshacerse de lasSubstring
llamadas. Los paréntesis alrededor de la matriz inicial son innecesarios. Para matrices más grandes también puede tener sentido usar un carácter separador y usar-split
(unario-split
en el caso de que el separador sea espacio o tabulación).foreach
del bucle, por ejemplo, se puede escribir como un oleoducto, así (?
esWhere-Object
):$x|?{$_-match$a-and$_-match$b}|%{$_;exit};0
que en esencia dice »Filtro de cada elemento en$x
por si coincide con ambos$a
y$b
y la salida de la primera, que sale después. Si no se puede encontrar ninguno, salida 0. «.-match"$a$b|$b$a"
Supongo que, dado que conoce el formato de sus cadenas, también puede usarlas . Porque solo tienen que aparecer en cualquier orden en la cadena. Lo que también significa que podemos usar un pequeño truco aquí:"$a$b","$b$a"-eq$_
jugar al golf otro byte.CJam,
6458 bytesLo anterior usa notación M y M, ya que el código contiene caracteres no imprimibles.
Al costo de seis bytes adicionales, esos caracteres se pueden evitar:
Pruébalo en línea.
Prueba de funcionamiento
Cómo funciona
fuente
CJam,
4948 bytesLo anterior usa notación de intercalación, ya que el código contiene caracteres no imprimibles.
A costa de dos bytes adicionales, esos caracteres se pueden evitar:
Pruébalo en línea.
Prueba de funcionamiento
Antecedentes
Comenzamos asignando un carácter ASCII a cada equipo considerando su nombre como un número base 2, tomando el módulo entero 91 resultante, agregando 12 (para evitar caracteres no imprimibles) y seleccionando el carácter correspondiente al código ASCII resultante. En el código CJam, esto se logra mediante
2b91%c
.Por ejemplo, los códigos de caracteres de
ALG
are65 76 71
. Desde(4 × 65 + 2 × 76 + 71) = 483
,483 % 91 + 12 = 40
y 40 si el código de caracteres de(
.Esto proporciona la siguiente asignación:
Ahora, podemos codificar los partidos de la ronda de 16 de la siguiente manera:
Si suponemos que el primer equipo en orden alfabético siempre gana, los partidos de los cuartos de final son los siguientes:
Tenga en cuenta que esta cadena se puede obtener del primero seleccionando cada segundo carácter, comenzando por el primero. En el código CJam, esto se logra mediante
2%
.Usando la misma idea, los partidos de las semifinales y el partido final son los siguientes:
El código
empuja la cadena que contiene las coincidencias de la ronda de 16, luego hace lo siguiente tres veces: duplica la cadena, extrae cada segundo carácter de la copia, concatena. El resultado es la cadena.
que contiene todas las coincidencias (algunas de ellas más de una vez).
Cómo funciona
fuente
"(=BL2*;74)#%8J[K"{_2%+}3*
tiene la misma longitud que la forma nopalindrómica de mi cadena de predicción,"rRgL j9Ab 35ph tYKO gApK"
pero es mucho más fácil de manejar.JavaScript 271
fuente