Das Eratosthenes Shuffle

9

Herausforderung

Schreiben Sie eine Funktion oder ein Programm, das eine Eingabezeile akzeptiert, eine sehr spezifische und seltsam vertraute Zufallswiedergabe für ihre Zeichen ausführt und das Ergebnis ausgibt.

Das erforderliche Mischen kann mit dem folgenden Algorithmus beschrieben werden:

  1. Beschriften Sie jedes Zeichen in der Eingabe mit einem 1-basierten Index.
  2. Schreiben Sie das Zeichen Nummer 1 als Ausgabe.
  3. Schreiben Sie beginnend mit Zeichen Nummer 2 alle anderen Zeichen der Reihe nach in die Ausgabe, mit Ausnahme von Zeichen 2 selbst. Mit anderen Worten, schreiben Sie die Zeichen 4, 6, 8, 10 usw. als Ausgabe.
  4. Beginnen Sie mit der nächsten Zeichennummer n, die noch nicht als Ausgabe geschrieben wurde, und schreiben Sie jedes n-te Zeichen in die Ausgabe, ausgenommen Zeichen n selbst und alle anderen Zeichen (mit numerischer Bezeichnung), die Sie möglicherweise bereits in die Ausgabe geschrieben haben.
  5. Wiederholen Sie Schritt 4, solange der Ausgabe weitere Zeichen hinzugefügt werden.
  6. Schreiben Sie die restlichen auszugebenden Zeichen der Reihe nach.

Beispiel

  1. Beschriften Sie die Zeichen.
  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. Schreiben Sie das erste auszugebende Zeichen:

 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. Schreiben Sie alle anderen Zeichen beginnend mit 2, ausgenommen 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. Das nächste noch nicht geschriebene Zeichen ist das Zeichen Nummer 3; Schreiben Sie jedes dritte Zeichen beginnend mit 3, jedoch ohne das Zeichen 3 selbst und alle bereits geschriebenen Zeichen.

 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. Wiederholen Sie Schritt 4 mit dem nächsten Zeichen, Zeichen 5.

4. Das nächste noch nicht geschriebene Zeichen ist das Zeichen Nummer 5; Schreiben Sie jedes fünfte Zeichen, beginnend mit 5, aber ohne das Zeichen 5 selbst und alle bereits geschriebenen Zeichen. (Dies entspricht nur Zeichen 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. Das nächste Zeichen ist 7; Da jedoch 14, 21 bereits geschrieben wurden, werden keine weiteren Zeichen ausgegeben, wenn wir Schritt 4 wiederholen. Damit sind wir mit 5 fertig.

6. Schreiben Sie die restlichen Zeichen der Reihe nach aus.

 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                  

Regeln

Die Eingabe und Ausgabe kann über Standardeingabe / Standardausgabe, Zeichenfolgen oder Arrays von Zeichen erfolgen.

Wenn Sie als Standardeingabe einlesen, können Sie nach Belieben davon ausgehen, dass eine nachgestellte neue Zeile vorhanden ist oder dass die gesamte Eingabe die Zeile enthält. Newline-Zeichen nehmen nicht am Shuffle teil.

Ebenso kann Ihre Ausgabe nach Belieben einen nachgestellten Zeilenumbruch haben oder nicht.

Standardlücken sind nicht zulässig.

Dies ist ein Code-Golf-Wettbewerb. Der kleinste Code in Bytes gewinnt.

Testfälle

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
quelle
Jetzt verstehe ich, warum das so seltsam vertraut ist ... Es ist ein
Hauptsieb
1
Die 4 in Ihren Codeblöcken haben mich wirklich verwirrt. Durchgestrichen 4 ist immer noch regulär 4 ...
Mama Fun Roll
@MamaFunRoll Ja, aber alles ist ziemlich weit auseinander, um die numerischen Beschriftungen anzuzeigen. Aus diesem Grund habe ich die Streikenden erweitert. Jetzt sieht 4 tatsächlich durchgestrichen aus ... besser?
H Walters
1
Ja, es war teilweise ein altes PPCG-Mem: P Danke, danke für die Klarheit!
Mama Fun Roll

Antworten:

4

Gelee , 10 Bytes

JÆfṂ$ÞÆPÞị

TryItOnline

Wie?

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
quelle
5

Mathematica, 61 Bytes

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

Unbenannte Funktion, die eine Liste von Zeichen als Eingabe verwendet und eine Liste von Zeichen zurückgibt.

FactorInteger[#][[1,1]]ergibt den kleinsten Primfaktor von #(und gibt zurück, 1wenn #gleich 1). Daher FactorInteger[#][[1,1]]PrimeQ@#ergibt sich ein seltsamer Ausdruck: [ #'s kleinster Primfaktor] Falsewenn #nicht Primzahl ist und # Truewenn #Primzahl ist (dies sind nicht bewertete Produkte einer Zahl und eines Booleschen Werts).

Range@Length@#liefert eine Liste der Zahlen bis zur Länge der Eingabe. Dann SortBysortiert diese Zahlen durch die lustige Funktion oben beschrieben. Mathematica ist in vielerlei Hinsicht sehr typsensitiv, mischt sie aber fröhlich auf andere Weise: Ausdrücke der Form [Zahl] Falsewerden vor Ausdrücken der Form [Zahl] alphabetisch sortiert True, während Bindungen durch numerisches Sortieren der Zahlen unterbrochen werden. Das erzeugt genau die Permutation, die wir hier wollen, und #[[...]]permutiert die Zeichen der Eingabe entsprechend.

Greg Martin
quelle
2

C 164 Bytes

Dies nimmt die Eingabe als ersten Befehlsparameter und druckt zurück zu stdout. Während wir jedes Zeichen verarbeiten, löschen wir es und erlauben den endgültigen Durchgang.

#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
quelle