エラトステネスシャッフル


9

チャレンジ

1行の入力を受け入れ、その文字に対して非常に具体的で奇妙に馴染みのあるシャッフルを実行し、結果を出力する関数またはプログラムを記述します。

必要なシャッフルは、次のアルゴリズムを使用して説明できます。

  1. 入力の各文字に1ベースのインデックスでラベルを付けます。
  2. 文字番号1を出力として書き込みます。
  3. 文字番号2から始めて、文字2自体を除いて、1文字おきに順番に出力に書き込みます。つまり、4、6、8、10などの文字を出力として書き込みます。
  4. 、nはまだ出力として書かれていない次の文字番号で始まる出力にすべてのn番目の文字を書き、除く文字nは自分自身を、あなたはすでに出力に書き込まれている可能性(数値ラベルで)他の文字を除きます。
  5. 出力に新しい文字を追加し続ける限り、手順4を繰り返します。
  6. 残りの文字を順に出力に書き込みます。

例

  1. 文字にラベルを付けます。
  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.出力する最初の文字を書き込みます。

 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. 2を除く、2から始まる1文字おきに文字を書きます。

 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.まだ書かれていない次の文字は文字番号3です。3から始まる3番目の文字ごとに書き込みますが、文字3自体、および既に書き込まれている文字は除きます。

 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.次の文字5を使用して、手順4を繰り返します。

4.まだ書かれていない次の文字は文字番号5です。5から始まる5文字ごとに書き込みますが、文字5自体、および既に書き込まれている文字は除きます。(これは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.次の文字は7です。しかし、14、21は既に書き込まれているので、手順4を繰り返しても文字は出力されません。したがって、5で完了です。

6.残りの文字を順番に書きます。

 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                  

ルール

入力と出力は、標準入力/標準出力、文字列、または文字の配列を介して行うことができます。

標準入力として読み込む場合は、都合のよいときに末尾に改行があるか、入力全体に行が含まれていると想定します。改行文字はシャッフルに参加しません。

同様に、あなたの都合で、あなたの出力は末尾の改行を持っているか、持っていないかもしれません。

標準の抜け穴は許可されていません。

これはコードゴルフ大会です。バイト単位の最小コードが優先されます。

テストケース

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.

これが奇妙によく知られている理由がわかります...それは最高のふるいです...
— busukxuan 2017年

1
コードブロックの4には本当に戸惑いました。取り消し線4はまだ通常の4 ...
— ママファンロール

@MamaFunRollええ、でも数値ラベルを表示するためにすべてがかなり間隔を空けています。これを利用して、ストライキを延長しました。現在、4は実際には取り消し線で表示されています...
— Hウォルターズ

1
ええ、それは部分的に古いPPCGのミームでした:Pありがとう、明快さを感謝します!
— ママファンロール

回答:


4

ゼリー、10 バイト

JÆfṂ$ÞÆPÞị

TryItOnline

どうやって?

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

5

Mathematica、61バイト

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

入力として文字のリストを取り、文字のリストを返す名前のない関数。

FactorInteger[#][[1,1]]の最小素因数を生成し#ます(およびに等しい1場合#は返します1)。従ってFactorInteger[#][[1,1]]PrimeQ@#【:奇妙な発現をもたらす#「最小素因数s]でFalseあれば#素数ではなく、# True場合に#素数である(これらの数とブールの未評価の製品です)。

Range@Length@#入力の長さまでの数値のリストを生成します。次にSortBy、上記の面白い関数でそれらの数値を並べ替えます。Mathematicaは多くの点で実際に型依存ですが、他の方法で陽気にそれらを混合します:[number] Falseの形式の式は[number]の形式の式の前にアルファベット順に並べ替えTrueられます。これにより、ここで必要な置換が正確に生成され、#[[...]]それに応じて入力の文字が置換されます。


2

C、164バイト

これは最初のコマンドパラメータとして入力を取り、stdoutに出力します。各キャラクターを処理するとき、それをクリアして最終パスを許可します。

#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);}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.