Desafío
Escriba una función o programa que acepte una línea de entrada, realice una combinación aleatoria muy específica y extrañamente familiar en sus caracteres, y genere el resultado.
El barajado requerido se puede describir utilizando el siguiente algoritmo:
- Etiquete cada carácter en la entrada con un índice basado en 1.
- Escriba el carácter número 1 como salida.
- Comenzando con el carácter número 2, escriba cada otro carácter en la salida en orden, excluyendo el carácter 2. En otras palabras, escriba los caracteres 4, 6, 8, 10, etc. como salida.
- Comenzando con el siguiente número de caracteres n aún no escrito como salida, escriba cada enésimo carácter en la salida, excluyendo el carácter n mismo y excluyendo cualquier otro carácter (por etiqueta numérica) que ya haya escrito en la salida.
- Repita el paso 4 mientras continúe agregando nuevos caracteres a la salida.
- Escriba los caracteres restantes para la salida, en orden.
Ejemplo
- Rotula los personajes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 OLDDOCYAK 'SBEAUTYCORNER
2. Escriba el primer carácter a la salida:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27OLDDOCYAK 'SBEAUTYCORNER O
3. Escriba todos los demás caracteres comenzando con 2, excepto 2.
12 3456789101112131415161718192021222324252627OLDDOCYAK'SBEAUTYCORNER O OA 'EUYCRE
4. El siguiente carácter aún no escrito es el número 3; escriba cada 3er carácter comenzando con 3, pero excluyendo el carácter 3 en sí, y cualquier carácter ya escrito.
12 3456789101112131415161718192021222324252627OLDDOCYAK'SBEAUTYCORNEROOA «EUYCRE YB R
5. Repita el paso 4 con el siguiente carácter, el carácter 5.
4. El siguiente carácter aún no escrito es el número 5; escriba cada quinto carácter comenzando con 5, pero excluyendo el carácter 5 en sí, y cualquier carácter ya escrito. (Esto equivale solo al personaje 25).
12 3456789101112131415161718192021222324252627OLDDOCYAK'SBEAUTYCORNEROOA «EUYCREYB R N
5. El siguiente personaje es 7; pero 14, 21 ya se han escrito, por lo que no se generarán más caracteres si repetimos el paso 4. Por lo tanto, hemos terminado con 5.
6. Escriba los caracteres restantes en orden.
12 3456789101112131415161718192021222324252627OLD DOCYAK'SBEAUTYCORNEROOA «EUYCREYB RN LDDCKSATO
Reglas
La entrada y salida pueden ser a través de entrada estándar / salida estándar, cadenas o conjuntos de caracteres.
Si lee como entrada estándar, puede, según su conveniencia, asumir que hay una nueva línea final o que toda la entrada contiene la línea. Los personajes de nueva línea no participan en la combinación aleatoria.
Del mismo modo, a su conveniencia, su salida puede tener una nueva línea final o no.
Las lagunas estándar no están permitidas.
Este es un código de competencia de golf. El código más pequeño en bytes gana.
Casos de prueba
123456789ABCDEF -> 1468ACE9F2357BD
OLD DOC YAK'S BEAUTY CORNER -> O O A' EUYCREYB RNLDDCKSATO
Blue boxes use a 2600hz tone to convince telephone switches that use in-band signalling that the caller is actually a telephone operator.
->
Bebxsuea20h oet ovnetlpoesice htuei-adsgaln httecle satal eehn prtre 0ncce ha nng aiuapootnt ihyon atallu o s 6z oi ehwstsnbilt lr clee.
Respuestas:
Jalea , 10 bytes
TryItOnline
¿Cómo?
fuente
Mathematica, 61 bytes
Función sin nombre que toma una lista de caracteres como entrada y devuelve una lista de caracteres.
FactorInteger[#][[1,1]]
produce el factor primo más pequeño de#
(y devuelve1
si#
es igual1
). Por lo tanto,FactorInteger[#][[1,1]]PrimeQ@#
produce una expresión extraña: [#
el factor primo más pequeño]False
si#
no es primo y# True
si#
es primo (estos son productos no evaluados de un número y un booleano).Range@Length@#
produce una lista de los números hasta la longitud de la entrada. LuegoSortBy
ordena esos números por la divertida función descrita anteriormente. Mathematica es realmente sensible al tipo de muchas maneras, pero alegremente las mezcla de otras maneras: las expresiones de la forma [número]False
se ordenan alfabéticamente antes que las expresiones de la forma [número]True
, mientras que los lazos se rompen al ordenar los números numéricamente. Eso produce exactamente la permutación que queremos aquí, y#[[...]]
permuta los caracteres de la entrada en consecuencia.fuente
C, 164 bytes
Esto toma la entrada como el primer parámetro de comando y vuelve a imprimir en stdout. A medida que procesamos cada personaje, lo borramos, permitiendo el pase final.
fuente