The Eratosthenes Shuffle

9

Défi

Écrivez une fonction ou un programme qui accepte une ligne d'entrée, exécute un mélange très spécifique et étrangement familier sur ses caractères et génère le résultat.

Le brassage requis peut être décrit à l'aide de l'algorithme suivant:

  1. Étiquetez chaque caractère dans l'entrée avec un index basé sur 1.
  2. Écrivez le caractère numéro 1 en sortie.
  3. En commençant par le caractère numéro 2, écrivez tous les autres caractères dans la sortie dans l'ordre, à l' exclusion du caractère 2 lui-même. En d'autres termes, écrivez les caractères 4, 6, 8, 10, etc. en sortie.
  4. En commençant par le numéro de caractère suivant n non encore écrit en sortie, écrivez chaque nième caractère dans la sortie, en excluant le caractère n lui-même et en excluant tout autre caractère (par étiquette numérique) que vous avez peut-être déjà écrit dans la sortie.
  5. Répétez l'étape 4 tant qu'elle continue d'ajouter de nouveaux caractères à la sortie.
  6. Écrivez les caractères restants à afficher, dans l'ordre.

Exemple

  1. Étiquetez les caractères.
  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. Écrivez le premier caractère à afficher:

 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. Écrivez tous les autres caractères commençant par 2, à l'exception de 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. Le caractère suivant non encore écrit est le caractère numéro 3; écrire tous les 3 caractères commençant par 3, mais excluant le caractère 3 lui-même et tout caractère déjà écrit.

 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. Répétez l'étape 4 en utilisant le caractère suivant, le caractère 5.

4. Le caractère suivant non encore écrit est le caractère numéro 5; écrire tous les 5 caractères commençant par 5, mais excluant le caractère 5 lui-même et tout caractère déjà écrit. (Cela ne représente que le caractère 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. Le caractère suivant est 7; mais 14, 21 ont déjà été écrits, donc plus de caractères ne seront sortis si nous répétons l'étape 4. Ainsi, nous en avons terminé avec 5.

6. Écrivez les caractères restants dans l'ordre.

 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                  

Règles

L'entrée et la sortie peuvent se faire via une entrée / sortie standard, des chaînes ou des tableaux de caractères.

Si vous lisez en tant qu'entrée standard, vous pouvez, à votre convenance, supposer qu'il y a une nouvelle ligne de fin ou que la totalité de l'entrée contient la ligne. Les caractères de nouvelle ligne ne participent pas au shuffle.

De même, à votre convenance, votre sortie peut avoir une nouvelle ligne de fin ou non.

Les failles standard ne sont pas autorisées.

Il s'agit d'une compétition de golf à code. Le plus petit code en octets gagne.

Cas de test

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
la source
Maintenant, je vois pourquoi c'est si étrangement familier ... C'est un tamis principal ...
busukxuan
1
J'ai été vraiment intrigué par le 4 dans vos blocs de code. 4 barré est toujours régulier 4 ...
Mama Fun Roll
@MamaFunRoll Oui, mais tout est assez espacé pour montrer les étiquettes numériques. Profitant de cela, j'ai prolongé les retraits au bâton. Maintenant, 4 semble en fait barré ... mieux?
H Walters
1
Ouais, c'était en partie un vieux mème de PPCG: P Merci cependant, apprécie la clarté!
Mama Fun Roll

Réponses:

4

Gelée , 10 octets

JÆfṂ$ÞÆPÞị

TryItOnline

Comment?

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
la source
5

Mathematica, 61 octets

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

Fonction sans nom prenant une liste de caractères en entrée et renvoyant une liste de caractères.

FactorInteger[#][[1,1]]donne le plus petit facteur premier de #(et retourne 1si #égal 1). FactorInteger[#][[1,1]]PrimeQ@#Donne donc une expression étrange: [ #le plus petit facteur premier] Falsesi #n'est pas premier, et # Truesi #est premier (ce sont des produits non évalués d'un nombre et d'un booléen).

Range@Length@#donne une liste des nombres jusqu'à la longueur de l'entrée. SortByTrie ensuite ces nombres par la fonction amusante décrite ci-dessus. Mathematica est vraiment sensible au type à bien des égards, mais les mélange joyeusement d'autres façons: les expressions de la forme [nombre] Falsesont triées alphabétiquement avant les expressions de la forme [numéro] True, tandis que les liens sont rompus en triant les nombres numériquement. Cela produit exactement la permutation que nous voulons ici et #[[...]]permute les caractères de l'entrée en conséquence.

Greg Martin
la source
2

C, 164 octets

Cela prend l'entrée comme premier paramètre de commande et réimprime sur stdout. Au fur et à mesure que nous traitons chaque personnage, nous l'effaçons, permettant la passe finale.

#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
la source