N niños, sin que dos compartan su tamaño exacto, están alineados en algún orden. Cada uno solo puede comparar alturas con sus vecinos inmediatos. Cuando el maestro grita "levanta las manos si eres el más alto", lo hacen si son más altos que sus vecinos, y lo hacen simultáneamente. Si solo uno levanta la mano, él gana. Si más de uno levanta la mano, todos son eliminados de la fila (preservando el orden del resto de los niños) y repiten el proceso.
Escriba un programa, que tome una serie de enteros distintos (puede suponer que son estrictamente positivos) y genera el ganador de este juego. Este es el código de golf, por lo que gana el código más corto.
Ejemplos (con etapas intermedias mostradas):
5 3 9 8 7 → 3 8 7 → 8
1 2 9 4 → 9
9 3 8 7 4 12 5 → 3 7 4 5 → 3 4 → 4
Líderes actuales:
- Jalea: 17 bytes [por Dennis ♦]
- MATL: 20 bytes [por Luis Mendo]
- APL: 28 bytes [voidhawk]
- k: 40 bytes [por Paul Kerrigan]
También hay una batalla de pitones en curso. Todavía estoy esperando que aparezcan más idiomas de golf.
Actualmente acepté la respuesta de Dennis ♦: si hay nuevos ganadores, actualizaré la selección.
Respuestas:
Jalea , 17 bytes
La entrada es una cadena de enteros separados por comas.
Pruébalo en línea!
Los créditos van a @Xanderhall, @Sherlock y @ErikGolfer por sentar las bases.
Cómo funciona
fuente
JavaScript (ES6),
787672 bytesGracias a @ edc65 por -4 bytes
Toma una matriz de enteros y genera una matriz que contiene solo el ganador.
Fragmento de prueba
Mostrar fragmento de código
Aquí hay algunos otros intentos, utilizando
.filter
compresiones de matriz:O un doble for-loop, horriblemente largo:
Explicación
La forma en que esto funciona es bastante simple: crea una matriz de aquellos que son relativamente más altos (
r
) y una matriz de aquellos que no lo son (q
), luego regresar
si solo tiene un elemento; si no, se ejecuta soloq
y devuelve el resultado de eso.fuente
q
yr
. Evita&&r
y la expresión de filtro resulta ser un byte más corto también.MATL , 20 bytes
La entrada es un vector de columna, que se usa
;
como separador.Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
Esta es una implementación directa del procedimiento descrito en el desafío. Un
do
...while
bucle sigue eliminando elementos hasta que solo se haya eliminado uno; y ese es el resultado.Los elementos a eliminar se detectan tomando diferencias, signum, luego diferencias nuevamente. Los que dan un valor negativo son los que se eliminarán.
fuente
Python3,
265260248243203121117112111 bytes¡Gracias @ZacharyT, @orion y @mathmandan por ahorrar
545muchos bytes!fuente
Haskell, 85 bytes
Ejemplo de uso:
f [9,3,8,7,4,12,5]
->4
.Cómo funciona:
Una variante, también 85 bytes:
Vincula la lista de
b
(ver arriba) a n y devuelve el elementos
six\\n
es una lista singleton y de lof n
contrario.fuente
f x|y@(_:z)<-x++[0]=(#)=<<(x\\)$[b|(a,b,c)<-zip3(0:y)y z,b<a||b<c]
.\\
todavía necesita la importación. Por cierto,tails
también se puede reemplazar por...|a:b:c:_<-scanr(:)[]$0:x++[0],...
.Mathematica,
107108bytesExplicación
Primero, establecer
x
ey
igual a la entradaList
. El bucle continúa hastaLength@y==1
.x~Split~Less
es la lista de listas de elementos consecutivos y crecientes,Split[x,#>#2&]
es la lista de listas de elementos consecutivos y decrecientes. Tomar la listaMax
de todas las listas en la primera da la lista de niños más altos que el niño a su derecha (junto con el niño más a la derecha). Tomar el primer argumento (#&
) de todas las listas en el último da la lista de niños más altos que el niño a su izquierda (junto con el niño más a la izquierda). La intersección de estos dos será la lista de niños que levantaron la mano. Establezca esto igual ay
.x=DeleteCases[x,#|##&@@y]
elimina dex
cualquier elemento que coincida con un elemento dey
(#|##&
es equivalente aAlternatives
) Una vez que el ciclo termina, regresey
. Si la salida debe ser un número entero (en lugar de una lista que contenga un solo número entero), devuelva#&@@y
(+4 bytes).Gracias a Martin Ender por guardar 2 bytes y hacerme cumplir con las reglas. Abierto a sugerencias.
fuente
!Less
funcione como esperabas, ya que esto en realidad no se evalúa como una función. Probablemente necesites usarGreater
(o#>#2&
) allí. Sin embargo, puede usarlox~Split~Less
para el primeroSplit
y>
para laLength
condición.Clear@y
entre llamadas a funciones, me temo que no es válido . Tendrá que restablecerlo usted mismo, ampliarlo mejor o convertirlo en un programa completo conInput
yPrint
.Perl 6 , 111 bytes
Expandido:
fuente
Python 2,
10098 bytesUtiliza el retorno de cortocircuito como en la respuesta de Yodle (por Zachary T)
fuente
+=b,
lugar de+=[b]
(crédito para mathmandan), usandot=[0]
para usart
para agregarA
, y luego, dado que ahora comenzamos con 0t
, la verificaciónt[-2]<1
es más corta quelen(t)<2
, y usart[1]
como resultado en ese caso.return t[-2]and f(l)or t[1]
.Mathematica, 101 bytes
Función recursiva sin nombre que toma una lista de números como entrada y devuelve una lista con un solo número (el ganador) como salida.
El núcleo del algoritmo es
Max/@Partition[#,3,1,{2,2},0]
, que calcula la matriz de (the-max-of-me-and-my-neighbor) s de la lista de entrada.a=Position[...-#,0]
luego resta la lista original y devuelve donde están los 0; Estos son los niños que crían a mano.If[Equal@@a, #[[Last@a]], #0@Fold[Drop@##&,#,Reverse@a]]&
ramas dependiendo de si todos los elementos dea
son iguales o no (en este caso, serán solo sia
es un singleton); si es así, entonces este niño es el ganador y sacamos su número; si no, entonces llamamos recursivamente a esta función en la lista con todos los elementos en las posicionesa
eliminadas.fuente
Python 2, 99 bytes
fuente
PHP, 131 bytes
Toma números de los argumentos de la línea de comandos. Falla si el nombre de archivo comienza con un número positivo.
Descompostura
fuente
k, 40 bytes
Explicación:
$ es un if-else.
La condición es si 1 es la suma de B, que se define como el mínimo de dos listas generadas al verificar si x es mayor que las posiciones anteriores y posteriores (la tubería es inversa).
Si esto es cierto, devolvemos x donde B es verdadero.
De lo contrario, recurrimos sin las posiciones verdaderas.
fuente
Scala 129 bytes
Golfed
Sin golf
Al rellenar la lista de izquierda a derecha con 0, puede agrupar en conjuntos de 3 y dividir la lista para aquellos en los que la mano está arriba, la mayoría de los elementos izquierdo y derecho se comparan con 0 en el exterior, así que obtenga el número correcto (suponiendo que la altura de nadie es negativo!)
fuente
C ++ 14, 182 bytes
Aprendí que el operador ternario se puede usar con objetos C ++. Requiere la entrada sea un recipiente de acceso aleatorio con
push_back
, comovector
,deque
ylist
.Crea dos contenedores
t
ys
del mismo tipo y agrega el más alto localt
y el resto as
. Si solo hay 1 elemento at
cambio de ese, de lo contrario recursivo se llama a sí mismo cons
.Sin golf:
fuente
R, 83 bytes
Dos versiones diferentes:
Este toma un vector N:
Éste crea una función F definida recursivamente:
fuente
APL (Dyalog Unicode) , SBCS de 28 bytes
Pruébalo en línea!
fuente