เขียนโปรแกรมสแควร์ที่ส่งออกจำนวนครั้งที่ได้รับการ“ unrolled”


22

พิจารณาบล็อกสี่เหลี่ยมของข้อความโดยมีความกว้างไม่เกิน N ตัวสำหรับจำนวนเต็มคี่ N ที่มากกว่า 1

เป็นตัวอย่างให้ N = 5 และข้อความเป็น:

MLKJI
NWVUH
OXYTG
PQRSF
ABCDE

โปรดสังเกตว่านี่คือตัวอักษร (นอกเหนือจาก Z) วนรอบทวนเข็มนาฬิกาจากมุมซ้ายล่าง มันเหมือนกับพรมม้วนขึ้นมา

ตัวอักษรเกลียว

"Unrolling" ข้อความทีละหนึ่งรอบจะหมุนตามเข็มนาฬิกาดังนั้นจึงFGHIอยู่ในระดับเดียวกับABCDEผลลัพธ์ใน:

     PONM
     QXWL
     RYVK
     STUJ
ABCDEFGHI

การคลายออกนี้สามารถทำได้อีก 7 ครั้งจนกว่าข้อความจะเป็นบรรทัดเดียว:

         SRQP
         TYXO
         UVWN
ABCDEFGHIJKLM

             UTS
             VYR
             WXQ
ABCDEFGHIJKLMNOP

                WVU
                XYT
ABCDEFGHIJKLMNOPQRS

                   XW
                   YV
ABCDEFGHIJKLMNOPQRSTU

                     YX
ABCDEFGHIJKLMNOPQRSTUVW

                       Y
ABCDEFGHIJKLMNOPQRSTUVWX

ABCDEFGHIJKLMNOPQRSTUVWXY

ท้าทาย

ความท้าทายคือการเขียนโปรแกรมที่เป็นบล็อก N × N ของข้อความที่ส่งออกจำนวนครั้งที่มันมี "unrolled" โดยการเปิดหนึ่งในสี่เมื่อมีการจัดเรียงใหม่ในรูปแบบการเปิดและเรียกใช้

มีการแข่งขันสองรายการที่นี่: (หวังว่าจะไม่ยุ่งเกินไป)

  1. ทำสิ่งนี้ด้วย N ที่เล็กที่สุด (ลงไปจนถึงขีด จำกัด N = 3)
  2. ทำสิ่งนี้กับ N. ที่ใหญ่ที่สุด (ไม่ จำกัด )

จะไม่มีคำตอบที่ยอมรับ แต่ผู้ชนะในแต่ละหมวดหมู่เหล่านี้จะได้รับตัวแทนอย่างน้อย 50 ค่าหัวจากฉัน ในกรณีที่ผูกคำตอบที่เก่าแก่ที่สุดชนะ

ตัวอย่าง

หากรหัสบล็อกของคุณคือ

MyP
rog
ram

รันตามที่ควรจะเป็นเอาท์พุท 0

วิ่ง

   rM
   oy
ramgP

ควรส่งออก 1

วิ่ง

     or
ramgPyM

ควรส่งออก 2

วิ่ง

       o
ramgPyMr

ควรส่งออก 3

ในที่สุดการรันramgPyMroควรเอาต์พุต 4

รายละเอียด

  • เอาต์พุตควรถูกพิมพ์ไปที่ stdout (หรือตัวเลือกที่ใกล้เคียงที่สุด) ด้วยตัวเอง ไม่มีอินพุต
  • คุณสามารถใช้ASCII ที่พิมพ์ได้ (รหัสเลขฐานสิบหก 20 ถึง 7E ซึ่งมีช่องว่าง) ในรหัสของคุณ
  • ช่องว่างเติมช่องว่างในการเตรียมการ unrolling (นอกเสียจากว่าคุณจะคลี่คลายไปทางซ้าย)
  • เฉพาะการจัดเรียงจากสี่เหลี่ยมจัตุรัสจนถึงแบนราบเท่านั้นจึงจะต้องมีเอาต์พุตที่ถูกต้อง จะไม่มีการจัดการอื่น ๆ
  • คุณไม่สามารถอ่านต้นฉบับของคุณได้
  • คุณสามารถใช้ความคิดเห็น
  • N = 1 ไม่รวมอยู่ในหลาย ๆ ภาษาโปรแกรม0จะทำงาน
  • หากต้องการคุณสามารถคลี่คลายไปทางซ้ายมากกว่าด้านขวา เช่น

    MyP
    rog
    ram
    

    กลายเป็น

    Pg
    yo
    Mrram
    

    และอื่น ๆ ไม่มีการเพิ่มช่องว่างเมื่อหมุนด้วยวิธีนี้ เส้นก็จบลง

(ที่เกี่ยวข้อง: เขียนโปรแกรมรูปสี่เหลี่ยมผืนผ้าที่แสดงจำนวนครั้งที่หมุน )


ก่อนที่ฉันจะอ่านย่อหน้า "ความท้าทาย" ฉันคาดหวังว่าจะมีความท้าทายในการเขียนโปรแกรมที่เอาท์พุทตัวเองโดยไม่ได้ควบคุม
John Dvorak

1
ทำไม N ถึงต้องแปลก
John Dvorak

1
@JanDvorak ฉันคิดว่า N ไม่จำเป็นต้องแปลก แต่มันทำให้เกลียวเป็นมาตรฐานมากขึ้น มันเป็นแบบนั้น แต่อย่าลังเลที่จะโพสต์ N = 2 เป็นความคิดเห็นหากคุณพบ
งานอดิเรกของ Calvin

8
เพียงแค่ความคิด: การปลด "พรม" ไปทางขวาจะสร้างหลาย ๆ บรรทัดเริ่มต้นด้วยช่องว่างโดยกำจัดภาษาเช่น Python หากคุณอนุญาตให้เปิดใช้งานทางซ้ายได้คุณไม่จำเป็นต้องมีช่องว่างเพิ่มเติมและ Python ก็เป็นไปได้ในทางทฤษฎี
Falko

5
คุณมีหนังสือเวทมนต์ที่มีแนวคิดท้าทายที่ยอดเยี่ยมมากมายหรือไม่? คุณคิดยังไงกับความท้าทายที่น่าสนใจเช่นนี้?
Justin

คำตอบ:


27

Golfscript, N <- [5,7 .. ]

.   .
 . . 
 ..  
.  .#
],9\-

unrolled อย่างเต็มที่:

],9\-#  .   .  .  . . ...

คำอธิบาย:

  • . (หลายครั้ง) - ทำซ้ำอินพุต
  • ] - รวบรวมสแต็คเป็นอาร์เรย์เดียว
  • , - ใช้ความยาวของมัน
  • 9\- - ลบออกจาก 9
  • # - ความคิดเห็นบรรทัด

ช่องว่างเป็น NOP แต่ NOP อื่น ๆ ก็ใช้ได้เช่นกัน

รีดจนสุดโดยใช้เก้าสำเนาของอินพุต (ละเว้นเนื้อหา) เป็นสแต็ก 9 - 9 = 0; มันไม่ได้ถูกเปิดออก

แต่ละม้วนกระดาษจะซ่อนอีกหนึ่งจุด (ซ้ำกัน) ด้านหลังความคิดเห็นหดตัวสแต็คหนึ่งครั้งเพื่อเพิ่มเอาต์พุต

unrolled อย่างเต็มที่จะใช้เฉพาะอินพุต (ละเว้นเนื้อหา) เป็นสแต็ค; 9 - 1 = 8; มีการยกเลิกการลงทะเบียน 8 ครั้ง

วิธีการเดียวกันนี้ใช้งานได้กับ N> 4: เปลี่ยน9เป็นค่าที่เหมาะสมเป็น 2 * N + 1 จากนั้นขยายรูปแบบของจุด (ซ้ำกัน) โดยใช้รูปแบบเกลียวที่เหมือนกัน


ถ้าไม่มีใครพบ N = 3 นี่จะเป็นคำตอบที่ชนะในทั้งสองหมวด
งานอดิเรกของ Calvin

3
@ Calvin's งานอดิเรกฉันควรจะเป็นคนที่น่ารังเกียจ :-)
John Dvorak

ทำไมไม่ คำตอบก็ไม่น่าเป็นไปได้เช่นกัน: P
งานอดิเรกของ Calvin

1
ทำไมไม่ไปหาคนที่สามารถเปิดทั้งสองทิศทางได้? :)
เบต้าสลายตัว

@BetaDecay อืม ... :-)
John Dvorak

13

GolfScript, N = 4

อันนี้เป็นม้วนสเป็คเดิม

.. . 
...# 
.#.~
],8-

นี่คือการเปิด:

    ...
    #..
    ..
],8-~#.

       .#.
       ...
],8-~#. ..

          ..
          .#
],8-~#. ....

            ..
],8-~#. ....#.

              .
],8-~#. ....#..

],8-~#. ....#...

ลองที่นี่


คุณคิดอย่างไรกับข้อตกลงนี้?
ภูมิใจ haskeller

3
@proudhaskeller จะดีกว่าถ้าคุณไม่รู้ ...
เครื่องมือเพิ่มประสิทธิภาพ

8
คุณค้นหาวิธีแก้ปัญหาหรือไม่
ภูมิใจ haskeller

ความท้าทายพิเศษ: คุณสามารถแยกออกมา.เป็นคู่#ได้หรือไม่?
John Dvorak

ฉันชอบท้าย~รถ บางทีฉันสามารถขโมยมันเพื่อ N = 3 ได้ไหม?
John Dvorak

9

APL, N = 3

201
340
5|0

คลี่:

   32
   40
5|001

     43
5|00102

       4
5|001023

5|0010234

ลองออนไลน์

โดยจะคำนวณส่วนที่เหลือของจำนวนนั้นหารด้วย 5 จะพิมพ์ผลลัพธ์ของบรรทัดสุดท้ายเท่านั้น

APL, N = 2

⍬∞
≡0

คลี่:

  ⍬
≡0∞

≡0∞⍬

ลองออนไลน์

ส่งคืนความลึก (เพื่อไม่ให้สับสนกับขนาดหรือความยาว) ของอาร์เรย์:

  • 0ไม่ใช่อาร์เรย์ ดังนั้นความลึกคือ 0
  • 0∞เป็นอาร์เรย์ที่มีสองรายการ0และ(อินฟินิตี้) มันมีความลึก 1
  • 0∞⍬มีรายการอื่นซึ่งเป็นอาร์เรย์ว่างที่มีความลึก 1 ดังนั้นจึง0∞⍬มีความลึก 2

โปรแกรมทั้งสองนี้ยังทำงานในล่ามออนไลน์ ฉันไม่แน่ใจว่าอันที่ใหม่กว่านั้นถูกต้องหรือไม่

⍬0
≡∞


⍬¯
≡0

APL สำหรับ N> = 4

สำหรับ N = 4:

∞  ∞
 ∞∞
∞ ∞
⍴1↓∞

unrolled อย่างเต็มที่:

⍴1↓∞  ∞  ∞ ∞ ∞∞∞

สำหรับ N = 5:

∞   ∞
 ∞ ∞
 ∞∞
∞  ∞
⍴1↓ ∞

unrolled อย่างเต็มที่:

⍴1↓ ∞   ∞   ∞  ∞  ∞ ∞ ∞∞∞

1↓ลบรายการในอาร์เรย์ นอกจากนี้ยังส่งกลับอาร์เรย์ว่างถ้าอาร์กิวเมนต์เป็นเซนต์คิตส์และเนวิส รับความยาวของอาร์เรย์


คำอธิบายใด ๆ
ภูมิใจ haskeller

@proudhaskeller แก้ไขแล้ว
jimmy23013

คุณสามารถใช้ตรรกะเชิงลึกที่เหมือนกันสำหรับ N ใด ๆ ขอบคุณ APL
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer มันไม่ง่ายเลย สิ่งต่าง ๆ ก่อนที่บรรทัดสุดท้ายจะยังคงถูกต้องตามหลักไวยากรณ์ ดังนั้นฉันจึงไม่สามารถใช้ฟังก์ชั่นส่วนใหญ่หรืออักขระเครื่องหมายวรรคตอนอื่น ๆ เช่น()[]พวกเขาจะปรากฏในสถานที่ที่ไม่ต้องการ
jimmy23013

ฉันหมายถึงชอบ: `⍬ \ n⍬⍬0 \ n≡∞` (ไม่ใช่อย่างนั้น แต่คุณได้ความคิด)
เครื่องมือเพิ่มประสิทธิภาพ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.