La barajadura de Eratóstenes

9

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:

  1. Etiquete cada carácter en la entrada con un índice basado en 1.
  2. Escriba el carácter número 1 como salida.
  3. 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.
  4. 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.
  5. Repita el paso 4 mientras continúe agregando nuevos caracteres a la salida.
  6. Escriba los caracteres restantes para la salida, en orden.

Ejemplo

  1. 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:

 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
  O   LDDOCYAK 'SBEAUTYCORNER
O

3. Escriba todos los demás caracteres comenzando con 2, excepto 2.

 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 
 O   LD    D O   C    Y A   K '   S    B E   A U   T Y     C   O R   N E   R
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.

 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
  O   LD    D O   C Y A   K '   S B E   A U   T Y C   O R   N E R 
OOA «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).

 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
  O   LD    D O   C Y A   K '   S B E   A U   T Y C   O R N E R 
OOA «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.

 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
  O   LD   D O   C Y A   K '   S B E   A U   T Y C   O R N E R 
OOA «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.
H Walters
fuente
Ahora veo por qué esto es tan extrañamente familiar ... Es un excelente tamiz ...
busukxuan
1
Realmente me sorprendieron los 4 en sus bloques de código. Tachado 4 sigue siendo regular 4 ...
Mama Fun Roll
@MamaFunRoll Sí, pero todo está bastante espaciado para mostrar las etiquetas numéricas. Aprovechando esto, extendí los ponches. Ahora 4 realmente parece tachado ... ¿mejor?
H Walters
1
Sí, en parte era un viejo meme de PPCG: P ¡Sin embargo, gracias, aprecio la claridad!
Mama Fun Roll

Respuestas:

4

Jalea , 10 bytes

JÆfṂ$ÞÆPÞị

TryItOnline

¿Cómo?

JÆfṂ$ÞÆPÞị - Main link: theString
J          - range(length), the 1-based indexes of theString
     Þ     - sort these by
    $      -     last two links as a monad
 Æf        -         prime factorization array (e.g. 20 -> [2,2,5])
   Ṃ       -         minimum
        Þ  - sort these by
      ÆP   - isPrime, i.e. move all the primes to the right
         ị - index into theString
Jonathan Allan
fuente
5

Mathematica, 61 bytes

#[[SortBy[Range@Length@#,FactorInteger[#][[1,1]]PrimeQ@#&]]]&

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 devuelve 1si #es igual 1). Por lo tanto, FactorInteger[#][[1,1]]PrimeQ@#produce una expresión extraña: [ #el factor primo más pequeño] Falsesi #no es primo y # Truesi #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. Luego SortByordena 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] Falsese 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.

Greg Martin
fuente
2

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.

#define p putchar
main(c,s,i,j,t)char**s,*t;{c=strlen(t=s[1]);p(*t);for(;j++<c;)if(t[j])for(i=2*j+1;i<=c;i+=j+1)!t[i]?:p(t[i]),t[i]=0;for(j=0;j++<c;)!*++t?:p(*t);}
Seth
fuente