The Eratosthenes Shuffle

9

Tantangan

Tulis fungsi atau program yang menerima jalur input, melakukan pengocokan yang sangat spesifik dan aneh pada karakternya, dan menampilkan hasilnya.

Pengocokan yang diperlukan dapat dijelaskan menggunakan algoritma berikut:

  1. Labeli setiap karakter dalam input dengan indeks berbasis 1.
  2. Tulis karakter nomor 1 sebagai output.
  3. Dimulai dengan karakter nomor 2, tulis setiap karakter lainnya ke dalam urutan, tidak termasuk karakter 2 itu sendiri. Dengan kata lain, tulis karakter 4, 6, 8, 10, dan seterusnya sebagai output.
  4. Dimulai dengan nomor karakter berikutnya dan belum ditulis sebagai output, tulis setiap karakter ke output, tidak termasuk karakter itu sendiri, dan tidak termasuk karakter lain (dengan label numerik), Anda mungkin sudah menulis ke output.
  5. Ulangi langkah 4 selama terus menambahkan karakter baru ke output.
  6. Tulis karakter yang tersisa untuk ditampilkan, secara berurutan.

Contoh

  1. Beri label karakter.
  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
  SBEAUTYCORNER OLDDOCYAK

2. Tulis karakter pertama ke output:

 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. Tulis setiap karakter lain mulai dengan 2, tidak termasuk 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 OY 'EUYCRE

4. Karakter selanjutnya yang belum ditulis adalah karakter nomor 3; tulis setiap karakter ke-3 dimulai dengan 3, tetapi tidak termasuk karakter 3 itu sendiri, dan setiap karakter yang sudah ditulis.

 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. Ulangi langkah 4 menggunakan karakter berikutnya, karakter 5.

4. Karakter selanjutnya yang belum ditulis adalah karakter nomor 5; tulis setiap karakter ke-5 dimulai dengan 5, tetapi tidak termasuk karakter 5 itu sendiri, dan setiap karakter sudah ditulis. (Jumlah ini hanya karakter 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. Karakter selanjutnya adalah 7; tetapi 14, 21 sudah ditulis, jadi tidak ada lagi karakter yang akan dihasilkan jika kita mengulangi langkah 4. Jadi, kita selesai dengan 5.

6. Tuliskan karakter yang tersisa secara berurutan.

 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                  

Aturan

Input dan output dapat melalui input standar / output standar, string, atau array karakter.

Jika membaca sebagai input standar, Anda dapat dengan nyaman menganggap bahwa ada baris baru yang tertinggal, atau bahwa seluruh input berisi baris. Karakter baris baru tidak berpartisipasi dalam acak.

Demikian juga, pada kenyamanan Anda, output Anda mungkin memiliki baris baru atau tidak.

Celah standar tidak diijinkan.

Ini adalah kompetisi kode golf. Kode terkecil dalam byte menang.

Uji Kasus

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
sumber
Sekarang saya mengerti mengapa ini sangat aneh ... Saringan utama ...
busukxuan
1
Saya benar-benar bingung dengan angka 4 di blok kode Anda. Dicoret 4 masih teratur 4 ...
Mama Fun Roll
@MamaFunRoll Ya, tapi semuanya diberi spasi cukup untuk menunjukkan label numerik. Mengambil keuntungan dari ini, saya memperpanjang serangan. Sekarang 4 sebenarnya terlihat dicoret ... lebih baik?
H Walters
1
Ya, itu sebagian meme PPCG lama: P Terima kasih, hargai kejelasannya!
Mama Fun Roll

Jawaban:

4

Jelly , 10 byte

JÆfṂ$ÞÆPÞị

TryItOnline

Bagaimana?

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

Mathematica, 61 byte

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

Fungsi yang tidak disebutkan namanya mengambil daftar karakter sebagai input dan mengembalikan daftar karakter.

FactorInteger[#][[1,1]]menghasilkan faktor prima terkecil #(dan kembali 1jika #sama 1). Oleh karena itu FactorInteger[#][[1,1]]PrimeQ@#menghasilkan ekspresi yang aneh: [ #faktor prima terkecil] Falsejika #tidak prima, dan # Truejika #prima (ini adalah produk yang tidak dievaluasi dari angka dan boolean).

Range@Length@#menghasilkan daftar angka hingga panjang input. Kemudian SortByurutkan angka-angka itu dengan fungsi lucu yang dijelaskan di atas. Mathematica benar-benar tipe-sensitif dalam banyak hal, tetapi dengan riang mencampurkannya dengan cara lain: ekspresi bentuk [angka] Falsediurutkan berdasarkan abjad sebelum ekspresi bentuk [angka] True, sementara ikatan diputuskan dengan mengurutkan angka-angka. Itu menghasilkan permutasi tepat yang kita inginkan di sini, dan #[[...]]memungkinkan karakter dari input sesuai.

Greg Martin
sumber
2

C, 164 byte

Ini mengambil input sebagai parameter perintah pertama dan mencetak kembali ke stdout. Saat kami memproses setiap karakter, kami menghapusnya, memungkinkan umpan terakhir.

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