Introducción
La lluvia finalmente se calmó. La mayoría de la humanidad se ahogó debido a un error en el código de @ user12345 . Los sobrevivientes se encuentran dispersos en un archipiélago mundial. La comunicación por radio ha terminado y la humanidad está lista para prosperar una vez más. Sin ninguna razón, los piratas zombis se han reunido en el Primer Meridiano y están barriendo hacia el oeste. La horda lo devora todo.
Problema
Nuestro escenario del fin del mundo se puede describir con 5 enteros en una sola línea que representan un conjunto de comunidades insulares cooperantes. Se ordenan desde el oeste (entero más a la izquierda) hacia el este (entero más a la derecha).
Comenzando con la isla más al este, los isleños huyen en parejas a la siguiente isla más cercana. Curiosamente, por cada pareja que se embarca, solo uno de ellos sobrevive al viaje. Los isleños solo viajan en parejas. Poblaciones extrañas eligen a un único habitante para quedarse y proporcionar las últimas actualizaciones de radio sobre las travesuras de la horda de zombis piratas. Las poblaciones se niegan a viajar hasta que todas las islas al este de ellas hayan completado sus migraciones o hayan muerto. Cuando la población llega a la isla final más occidental, cesa el viaje.
El gerente de operaciones del fin del mundo necesita un programa que pueda generar los recuentos finales de población de cada aldea.
Entrada de ejemplo
3 8 6 0 2
Salida de ejemplo
8 1 0 1 0
Supuestos
- La entrada se puede proporcionar a través de stdin, leer desde un archivo nombrado arbitrariamente o aceptar como argumento
- Para cada isla, 0 <= población <= 1024
- Las poblaciones nunca saltan una isla
¡La respuesta más corta gana!
Respuestas:
APL, 16 caracteres
La entrada se proporciona como cadena a este bloque:
o un char menos si la entrada se proporciona como argumento para este bloque:
Se basa en la idea de Ilmari Karonen en este comentario .
2⊥⍵
realiza una conversión de base 2 de la entrada.(1e9,4⍴2)⊤
así convierte este número nuevamente en la base 2 (para los cuatro últimos dígitos) y la base 1e9 para el primero, que es suficiente para los rangos de entrada dados anteriormente. (1e9,4⍴2
construye la lista1e9 2 2 2 2
)Tenga en cuenta que la huida del oeste se realiza automáticamente mediante la conversión de base durante este proceso.
fuente
APL
debería ser ilegal ...GolfScript,
2322 caracteresUn enfoque iterativo. La matriz se repite varias veces y cada vez se transfiere un número de pares de derecha a izquierda. Prueba el ejemplo en línea .
Breve explicación del código:
fuente
~]{2base}2*' '*
sería el truco ...GolfScript (25 caracteres)
Demostración en línea
Solución bastante sencilla: hay un enfoque más interesante que define el valor de salida para cada isla en función de los valores de entrada, pero no creo que pueda jugarse tan lejos como seguir el algoritmo de redistribución descrito en la pregunta.
fuente
Javascript / ES6 (69)
Jugando con operadores bit a bit:
x&=1
mantiene el bit más bajo (1 si es impar, 0 si es par)x>>1
es la división por 2 para enterosVersión sin ES6:
Ejemplos:
f("3 8 6 0 2")
devoluciones[8, 1, 0, 1, 0]
f("0 997 998 999 1000")
devoluciones[935, 0, 1, 1, 0]
fuente
f=a=>{a=a.split(' ');for(x=5;--x;a[x]&=1)a[x-1]-=-a[x]/2|0;return a}
68 caracteres.Python - 96 caracteres
Primera vez jugando al golf! Entrada de stdin.
fuente
' '
de la división, reduciéndolo a 96 y superando las otras soluciones de python2.J (26 caracteres)
Aquí está mi solución en J:
((<.@-:@}.,0:)+{.,2|}.)^:_
Esta solución general debería funcionar con cualquier número de islas.
fuente
Rubí,
97907472Versión en línea
Lo jugué un poco más, ya no invirtió la matriz ...
fuente
C - 121 caracteres
La entrada se toma de stdin.
fuente
Python2 - 98 caracteres
Entrada de stdin.
Python3 - 79 caracteres
Entrada de stdin.
fuente
Python 2,
8580 bytesX personas que comienzan en cualquier isla son equivalentes a X * 2 personas que comienzan una isla a la derecha. Este código convierte a todos en la configuración inicial a su equivalente en los isleños de extrema derecha, luego usa la representación binaria del resultado para determinar cuántas personas terminan en cada isla.
EDITAR: acortó el código inicializando
b
a 1 en lugar de 0, permitiendo el uso de enbin
lugar de una cadena de formato.fuente
Pitón (101)
Recorremos la lista de atrás hacia adelante y movemos las poblaciones según la especificación, luego imprimimos la lista. Aquí hay una prueba rápida:
fuente
Mathematica 105
Esto debería funcionar con cualquier número de islas.
Ejemplos
5 islas
25 islas
fuente
270, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0
para sus datos de prueba largos. Creo que he confirmado que estoy en lo correcto.Java -
647533 pero esperando algunos puntos de brownie para Java 8 Streams.La forma sin comprimir:
Con una asistencia de:
Ligeramente preocupado de que la prueba de @ DavidCarraher:
genera
fuente
Java -
196195Me dije a mí mismo que no lo publicaría si no podía obtenerlo por debajo de 200 ... Sinceramente, no creo que pueda deshacerme de nada más, es bastante delgado para Java.
Saltos de línea:
Muestra de entrada y salida:
fuente
Java - 179 caracteres
Comprimido:
Normal:
Salida de muestra:
fuente
Emacs Lisp 144 caracteres
No es pequeño, pero funciona.
fuente
awk - 44 caracteres
fuente
Java - 116 caracteres
Por ejemplo
int[] i = {2, 33, 16, 5};
(supongo que esos no se suman al recuento, ya que cada número puede variar) generaría23 0 0 1
fuente