Hay una pregunta en este sitio que es similar a esta pregunta, pero he agregado un giro.
Tiene tres entradas, el número de personas en el círculo n , la k -ésima persona contada en cada paso y la q -ésima persona que sobrevive. Las personas en el círculo están numeradas del 1 al n .
Por ejemplo, en un círculo de 20 personas, la vigésima persona que sobrevive es la primera persona eliminada, el sobreviviente 19 es la segunda persona eliminada y así sucesivamente. Normalmente, el problema de Josephus es determinar la última persona eliminada, aquí llamada el primer sobreviviente.
Escribir el programa más corto o función que, con esos tres entradas, devuelve el número de la q persona -ésimo para sobrevivir.
Si hay algún problema con la claridad, hágamelo saber.
Algunos ejemplos:
>>> josephus(20, 3, 9)
4
>>> josephus(4, 3, 1)
1
>>> josephus(100, 9, 12)
46
Editar: suponga que todas las entradas son válidas. Es decir, nadie pedirá 0 o cualquier número negativo y nadie preguntará por el vigésimo sobreviviente en un círculo de 5 personas (es decir, 1 ≤ q ≤ n)
Editar: aceptaré una respuesta a la medianoche UTC + 7 al comienzo del 2 de diciembre.
q=1
esto es exactamente lo mismo que la pregunta de Josefo vinculada, ¿verdad?Respuestas:
Pyth, 16 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
La entrada es de la forma
k<newline>n<newline>q
.Explicación:
fuente
Piet,
280273 codelesEditar: He jugado un poco más en este campo, y creo que puedo jugarlo aún más, pero eso está por venir. Por ahora, me alegro de que funcione, y de que tuviera espacio para firmarlo en la esquina inferior izquierda. Dos ideas que tengo para guardar más codeles son a) para cambiar las instrucciones finales ser
pop, push 1, add, out num
(pop n, salida r + 1) yb) duplicar nuevamente en la esquina inferior izquierda para guardar codeles en la manipulación de la pila más adelante en el ciclo.La imagen de arriba es mi código a 8 píxeles por codel. En general, es el mismo algoritmo que mi respuesta de Python, pero con las entradas en el orden de k , q , n . En la práctica, también existe una gran cantidad de manipulación de la pila. Puede probarlo aquí abriendo la imagen allí y ejecutando el código con él.
Explicación
Este es un paso a paso ungolfing de la solución.
fuente
CJam,
222019 bytesEsto lee la entrada como
q k n
. Pruébelo en línea en el intérprete de CJam .Cómo funciona
fuente
Golfscript,
585655353130 bytesSuponiendo que las tres entradas ya están en la pila, en el orden n , k , q
Esa solución supone que necesito deshacerme de todo excepto la respuesta final.
Cómo funciona
Vea
j(n,k,q)
en mi solución Python 3 para más detalles.Edición 1: Utilicé la sugerencia de @ Doorknob (Se agregó un + para obtener todas las entradas en la matriz)
Antes,
Edición 2: Agregado ~, según las reglas de la wiki, y acortado el código. Gracias @Dennis
Antes,
Edición 3: implementado un algoritmo más corto.
Antes,
Edición 4: descubrí que podría usarlo
%
como mapa.Antes,
Edición 5: Edición menor. Cambiado
2$
a@
hacer[0..q-1]
y3$
a2$
recuperark
. Guardado un bocadoAntes,
fuente
\;\;\;\;
se puede reemplazar con])\;
(wrap in array, right-uncons, swap y pop).JavaScript (ES6), 56 bytes
Sin golf
Básicamente, una adaptación de JavaScript de la respuesta Python de @ Sherlock9 .
Prueba
fuente
Mathematica, 50 bytes
Una función anónima. Toma entradas en el orden
q,n,k
.fuente
C,
8173 bytesBasado en la implementación Javascript de @ user81655 de mi respuesta de Python.
Editar: eliminado i
Prueba
fuente
int
antes de los nombres de los parámetros.Python 3,
726662 bytesUna función de programación dinámica en 62 bytes. Adaptado del algoritmo en Wikipedia. Solía haber una implementación directa de este algoritmo cuando q = 1 (es decir, i = 1, r = 0) en esa página, pero veo que se ha eliminado ahora.
Edición 1: eliminé
i
para guardar 4 bytes. La explicación permanece sin cambios.Edición 2: Error de cálculo en el recuento de bytes. Estaba usando
\r\n
para EOL y no me di cuenta cuando eso agregó 3 bytes. He bajado mi recuento de bytes en consecuencia.Como funciona esto
Gracias a @Dennis por recordarme que debería explicar mi código (aunque sea implícitamente, porque incluyó uno en su respuesta). Si algo no está claro, hágamelo saber.
Editar:
Antes,
Una función iterativa adaptada de Concrete Mathematics por Graham, Knuth y Patashnik. Aunque este algoritmo es más largo, es más rápido para n grande y k pequeña .
fuente
+
.PHP, 71 bytes
Basado en las respuestas de @ Sherlock9. Vea su respuesta de Python para el algoritmo.
Alternativamente, aquí está mi enfoque ingenuo original sin el algoritmo. Esto utiliza una matriz para marcar qué personas se encuentran.
91 bytes
fuente
Haskell,
484743 bytesBasado en un algoritmo de Haskell en la página de Rosetta Code de la función Josephus con dos entradas. Sugerencias de golf son bienvenidas.
Editar: Mi agradecimiento a nimi por ayudarme a jugar al golf con el primer algoritmo sugiriendo una versión libre de puntos, y por ayudarme a jugar al golf con el segundo algoritmo haciéndome saber que la
until
palabra clave existe.Una versión del algoritmo al final de mi respuesta de Python adaptada de Concrete Mathematics por Graham, Knuth y Patashnik. Aunque este algoritmo es más largo a 62 bytes, y no se ha reducido tanto como el primero, es más rápido para grandes
n
y pequeñosk
.Sin golf:
Primer algoritmo
Segundo algoritmo
fuente
until
para una traducción (más o menos) directa de la versión Python del segundo algoritmo:(n#k)q|m<-k-1=1+n*k-until(>n*m)(\z-> -div(-z*k)m)(q*k-mod m q)
.foldl
e infinitas listas y todo tipo de cosas. ¡Gracias por tu ayuda!GameMaker Language (GML), 88 bytes
Basado en la respuesta de @ user81655
fuente
Jalea ,
1413 bytesTryItOnline!
¿Cómo?
fuente
Ruby,
5348 bytesUna lambda
Cómo funciona
fuente