Xáo trộn Eratosthenes


9

Thử thách

Viết một hàm hoặc chương trình chấp nhận một dòng đầu vào, thực hiện một shuffle rất cụ thể và kỳ lạ quen thuộc trên các ký tự của nó và đưa ra kết quả.

Việc xáo trộn cần thiết có thể được mô tả bằng thuật toán sau:

  1. Dán nhãn cho mỗi ký tự trong đầu vào với chỉ số dựa trên 1.
  2. Viết ký tự số 1 làm đầu ra.
  3. Bắt đầu với ký tự số 2, viết mọi ký tự khác vào đầu ra theo thứ tự, ngoại trừ ký tự 2. Nói cách khác, viết các ký tự 4, 6, 8, 10, v.v. làm đầu ra.
  4. Bắt đầu với số ký tự tiếp theo n chưa được viết là đầu ra, hãy viết mọi ký tự thứ n vào đầu ra, ngoại trừ chính ký tự n và loại trừ bất kỳ ký tự nào khác (bằng nhãn số) mà bạn có thể đã ghi vào đầu ra.
  5. Lặp lại bước 4 miễn là nó tiếp tục thêm ký tự mới vào đầu ra.
  6. Viết các ký tự còn lại vào đầu ra, theo thứ tự.

Thí dụ

  1. Dán nhãn cho các nhân vật.
  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
  OLDOCYAK 'SBEAUTYCORNER

2. Viết ký tự đầu tiên xuất ra:

 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. Viết mọi ký tự khác bắt đầu bằng 2, ngoại trừ 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 EUYCRE OA'

4. Ký tự tiếp theo chưa được viết là ký tự số 3; viết mỗi ký tự thứ 3 bắt đầu bằng 3, nhưng không bao gồm ký tự 3 và bất kỳ ký tự nào đã được viết.

 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. Lặp lại bước 4 bằng ký tự tiếp theo, ký tự 5.

4. Ký tự tiếp theo chưa được viết là ký tự số 5; viết mỗi ký tự thứ 5 bắt đầu bằng 5, nhưng không bao gồm ký tự 5 và bất kỳ ký tự nào đã được viết. (Số tiền này chỉ bằng ký tự 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. Nhân vật tiếp theo là 7; nhưng 14, 21 đã được viết, vì vậy sẽ không còn ký tự nào được xuất nếu chúng ta lặp lại bước 4. Như vậy, chúng ta đã hoàn thành 5.

6. Viết các ký tự còn lại ra theo thứ tự.

 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                  

Quy tắc

Đầu vào và đầu ra có thể thông qua đầu vào tiêu chuẩn / đầu ra tiêu chuẩn, chuỗi hoặc mảng ký tự.

Nếu đọc dưới dạng đầu vào tiêu chuẩn, bạn có thể thuận tiện cho rằng có một dòng mới, hoặc toàn bộ đầu vào có chứa dòng. Nhân vật dòng mới không tham gia vào shuffle.

Tương tự như vậy, để thuận tiện, đầu ra của bạn có thể có một dòng mới hoặc không.

Sơ hở tiêu chuẩn là không được phép.

Đây là một cuộc thi golf mã. Mã nhỏ nhất trong byte thắng.

Các trường hợp thử nghiệm

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.

Bây giờ tôi mới hiểu tại sao điều này lại quen thuộc đến kỳ lạ ... Đó là một cái rây chính ...
busukxuan

1
Tôi thực sự bối rối bởi 4 trong khối mã của bạn. Crossed out 4 vẫn là 4 ...
Mama Fun Roll

@MamaFunRoll Vâng, nhưng mọi thứ được đặt cách nhau khá nhiều để hiển thị nhãn số. Lợi dụng điều này, tôi mở rộng các cuộc đình công. Bây giờ 4 thực sự trông ra ... tốt hơn?
H Walters

1
Vâng, đó là một phần của một meme PPCG cũ: P Cảm ơn, mặc dù vậy, đánh giá cao sự rõ ràng!
Mama Fun Roll

Câu trả lời:


4

Thạch , 10 byte

JÆfṂ$ÞÆPÞị

Dùng thử

Làm sao?

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

Toán học, 61 byte

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

Hàm không tên lấy danh sách các ký tự làm đầu vào và trả về danh sách các ký tự.

FactorInteger[#][[1,1]]mang lại hệ số nguyên tố nhỏ nhất của #(và trả về 1nếu #bằng 1). Do đó FactorInteger[#][[1,1]]PrimeQ@#mang lại một biểu thức lạ: [ #là thừa số nguyên tố nhỏ nhất] Falsenếu #không phải là số nguyên tố và # Truenếu #là số nguyên tố (đây là các sản phẩm không được đánh giá của một số và một boolean).

Range@Length@#mang lại một danh sách các số lên đến độ dài của đầu vào. Sau đó SortBysắp xếp những con số đó bằng chức năng vui nhộn được mô tả ở trên. Mathematica thực sự nhạy cảm theo nhiều cách, nhưng vui vẻ trộn chúng theo các cách khác: các biểu thức có dạng [số] Falseđược sắp xếp theo thứ tự abc trước các biểu thức của mẫu [số] True, trong khi các mối quan hệ bị phá vỡ bằng cách sắp xếp các số. Điều đó tạo ra chính xác hoán vị mà chúng ta muốn ở đây và hoán vị #[[...]]các ký tự của đầu vào tương ứng.


2

C, 164 byte

Điều này nhận đầu vào là tham số lệnh đầu tiên và in trở lại thiết bị xuất chuẩn. Khi chúng tôi xử lý từng nhân vật, chúng tôi xóa nó, cho phép vượt qua cuối cùng.

#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);}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.