The Eratosthenes Shuffle


9

ท้าทาย

เขียนฟังก์ชั่นหรือโปรแกรมที่รับสายอินพุตดำเนินการสลับอย่างเฉพาะเจาะจงและคุ้นเคยอย่างมากกับตัวอักขระและส่งผลลัพธ์ออกมา

การสับที่ต้องการสามารถอธิบายได้โดยใช้อัลกอริทึมต่อไปนี้:

  1. ติดป้ายอักขระแต่ละตัวในอินพุตด้วยดัชนี 1 ฐาน
  2. เขียนอักขระหมายเลข 1 เป็นเอาต์พุต
  3. เริ่มต้นด้วยหมายเลขอักขระ 2 เขียนอักขระอื่น ๆ ไปยังเอาต์พุตตามลำดับยกเว้นอักขระ 2 เอง กล่าวอีกนัยหนึ่งเขียนอักขระ 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
  SBEAUTYCORNER OLDDOCYAK

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   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  K '   S  B E U   T Y C   O R   N E   R      
O โอ' 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   K '   S B E U   T Y C   O R   N E R 
OOA 'EUYCRE YB R             

5. ทำซ้ำขั้นตอนที่ 4 โดยใช้อักขระถัดไปตัวละคร 5

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   K '   S B E 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   K '   S B E 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

1
ผมงงงวยกับ 4 ในบล็อคโค้ดของคุณ ข้ามไป 4 ยังคงเป็นปกติ 4 ...
Mama Fun Roll

@MamaFunRoll ใช่ แต่ทุกอย่างเว้นระยะออกไปเล็กน้อยเพื่อแสดงป้ายกำกับตัวเลข จากการใช้ประโยชน์จากสิ่งนี้ฉันได้ขยายขีดฆ่า 4 ตอนนี้ดูเหมือนจริง ๆ แล้ว ... ดีกว่าเหรอ?
H Walters

1
ใช่มันเป็นส่วนหนึ่งของ PPCG meme เก่า: P ขอบคุณแม้ว่าขอบคุณความชัดเจน!
Mama Fun Roll

คำตอบ:


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@#ให้ผลลัพธ์ที่แปลกประหลาด: [ #ปัจจัยสำคัญที่สุดที่เล็กที่สุด] 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.