Klein Topololyglots


43

Kleinเป็นภาษา 2D ที่ฉันออกแบบซึ่งสามารถฝังลงบนพื้นผิวทอพอโลยี 12 แบบ โปรแกรม Klein สามารถทำงานบนพื้นผิวที่แตกต่างกันโดยการเปลี่ยนอาร์กิวเมนต์บรรทัดคำสั่ง

โทโพโลยีกำหนดว่าตัวชี้คำสั่งไปที่ใดเมื่อปิดนอกขอบของโปรแกรม เมื่อเคลื่อนออกจากขอบ ip จะกระโดดไปที่ขอบด้วยสีที่เข้าคู่กันและจะรักษาตำแหน่งของมันให้สัมพันธ์กับลูกศรนั่นคือตัวชี้จะประหยัดระยะห่างจากหัวลูกศร

ยกตัวอย่างเช่นโทโพโลยีโทโพโล000ยีที่ใช้โดยภาษา 2D ส่วนใหญ่ทำให้ตัวชี้คำสั่งล้อมรอบไปอีกด้านเมื่อเลื่อนออกจากขอบ

งาน

งานค่อนข้างง่ายเขียนโปรแกรม Klein ว่าเมื่อรันจะส่งออกทอพอโลยีที่จะทำงานระบบตัวเลขแต่ละตัวอาจถูกคั่นด้วยช่องว่าง (เช่น000และ0 0 0เป็นทั้งเอาต์พุตที่อนุญาต) คุณสามารถเลือกที่จะใช้หรือเพิกเฉยต่อการ-Aตั้งค่าบรรทัดคำสั่งซึ่งจะไม่ทำให้คุณต้องเสียค่าใช้จ่ายหากคุณใช้

นี่คือดังนั้นคำตอบที่สั้นที่สุดจะเป็นผู้ชนะ

นี่คือไดร์เวอร์ทดสอบออนไลน์ที่สามารถใช้ในการทดสอบโทโพโลยีทั้งหมดได้ในครั้งเดียว -Aให้ทำงานในโหมดจำนวนเต็มลบ


18
+1 สำหรับตัวอย่างที่ดีของความท้าทายเฉพาะภาษาที่ดี :)
Martin Ender

1
@StephenS ไม่ฉันจะมอบให้คุณฟรี :)
ตัวช่วยสร้างข้าวสาลี

1
การเคลื่อนไหวของ IP กำลังทำร้าย
จิตใจ

2
โปรดแก้ไขภาพ ...
user202729

1
@ โจกิ้งฉันรู้จักมาระยะหนึ่งแล้วและมีความหมายที่จะแก้ไขมัน ฉันลบภาพออกแล้วและหวังว่าฉันจะใช้เวลาสร้างภาพใหม่ในที่สุด ขอบคุณ
ตัวช่วยสร้างข้าวสาลี

คำตอบ:


35

52 48 ไบต์

./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@

ลองออนไลน์!

ทดสอบไดร์เวอร์

คำอธิบาย

ในไคลน์ IP เริ่มต้นที่มุมซ้ายบนไปทางขวา ขั้นตอนแรกที่ฉันต้องการให้โปรแกรมทำคือส่ง IP ออกจากด้านบนของโปรแกรมเพื่อกำหนดบิตที่หนึ่งและสาม IP จะป้อนโปรแกรมดังต่อไปนี้อีกครั้งโดยขึ้นอยู่กับโทโพโลยี:

             ^
            I|P
            ./.....
201, 211 -->.......<-- 100, 110
            .......
            .......
            .......
200, 210 -->.......<-- 101, 111
            .......
             ^   ^
             |   |
            000 001
            010 011

ฉันตัดสินใจว่าโปรแกรมของฉันจะบันทึกบิตที่สามของทอพอโลยีก่อนบิตที่สอง แต่สลับพวกเขา (ใช้$) ก่อนจบ ด้วยเหตุนี้ฉันจึงเพิ่มรหัสเพื่อผลักดันบิตที่หนึ่งและสามของแต่ละทอพอโลยีที่จุดเข้าของ IP ที่อธิบายไว้ข้างต้น

./.....
21...01
.......
.......
.......
20...11
.0...0.

ต่อไปฉันมุ่งเน้นทอพอโลยีด้วย1หรือ2เป็นบิตแรกของพวกเขา ฉันตัดสินใจรวมเข้าด้วยกันอีกครั้งและส่งออกไปทางด้านข้างที่ไม่ได้เชื่อมต่อกับทางด้านทิศเหนือดังนั้นฉันสามารถหาบิตที่สองของพวกเขาได้

                      ./.....
                      21\./01
                      ..>....--> 200, 201, 210, 211
                      .......
100, 101, 110, 111 <--....<..
                      20/.\11
                      .0...0.
                        ^ ^
                        | |
                        / \
                      110 100
                      111 101
                      210 200
                      211 201

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

./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.

หลังจากนั้นฉันแค่ต้องสลับบิตที่สองและสามและให้โปรแกรมหยุดทำงาน

./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.

ตอนนี้ทอพอโลยีที่มี1หรือ2เป็นบิตแรกของพวกเขาทำงานฉันสามารถมุ่งเน้นไปที่การทำทอพอโลยีด้วยการ0ให้ผลลัพธ์ที่ถูกต้อง ขั้นตอนแรกทำการรวมเข้าด้วยกันอีกครั้งเพื่อให้สามารถแยกออกเป็นสองกลุ่มโดยยึดตามบิตที่สอง

                      ./.$...
                      21\./01
                      ..>....<-- 010, 011
                      @......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
                      20//\11
                      .01$00.

ฉันแรกเน้นที่ทอพอโลยีเหล่านั้นด้วย1เป็นบิตที่สองของพวกเขา สิ่งเหล่านี้แสดงให้เห็นถึงความท้าทายเพราะสำหรับพวกเขา IP นั้นอยู่ในบรรทัดที่โทโพโลยีใช้อยู่แล้วซึ่ง2เป็นบิตแรกของพวกเขา เนื่องจากมันเป็นการยากที่จะใส่คำสั่งมากกว่าหนึ่งคำสั่งในบรรทัดนั้น (คำสั่งเดียวสามารถกระโดดได้โดยใช้!คำสั่ง) และฉันมีพื้นที่เหลือน้อยโดยรวมฉันจึงตัดสินใจเปลี่ยนเส้นทาง IP จากบรรทัดนั้นและนำ1คำสั่งที่มีอยู่กลับมาใช้ใหม่เพื่อดันบิตที่สอง

./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.

ตอนนี้สิ่งที่เหลือไว้สำหรับทอพอโลยีที่1เป็นบิตที่สองของพวกเขาคือการแก้ไขคำสั่งของบิตที่สองและสามและยุติ

       ^
       |
 ./.$..$
 21\./01
 ..>..!\
 @......
 .<..<<.
 20//\11
 @01$00@
 ^     ^
 |     |
011   010

สุดท้ายยังคงทอพอโลยี0เป็นบิตที่สองของพวกเขา มีพื้นที่เหลือไม่มากในโปรแกรมที่มีพื้นที่ที่ไม่ได้ใช้มากที่สุดอยู่บนบรรทัดบนสุดดังนั้นจึงมีการเปลี่ยนเส้นทาง IP สำหรับทอพอโลยี0เป็นบิตที่สอง

./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@

ฉันยังต้องกด0บิตที่สองและแก้ไขลำดับของบิตที่สองและสามเช่นเดียวกับการยกเลิกโปรแกรม โชคดีที่ฉันสามารถนำ$คำสั่งที่มีอยู่กลับมาใช้ใหม่เพื่อให้คำสั่ง0และ@คำแนะนำสามารถพอดีกับพื้นที่ที่เหลือ

./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@

ในที่สุดน๊อตสามารถแยกออกจากปลายสายเพื่อรับโปรแกรมสุดท้าย


15

116 88 86 77 69 61 60 59 58 54 53 50 ไบต์

\2..@2
/1\<$00
/>!..>!
0//
@0$10@1
011\.<0
\.<@>1@

ลองออนไลน์!


1
@WeatWizard คุณสร้างมาได้อย่างไรแล้ว 0.o และบางทีคุณควรคิดเกี่ยวกับการสร้างภาพที่เหมือนETH ที่สร้างขึ้นสำหรับ Cubix
สตีเฟ่น

@StephenS หากคุณเรียกใช้ Klein ด้วย-dธงมันจะทำอย่างนั้น น่าเสียดายที่มันไม่ทำงานใน TIO
ข้าวสาลีตัวช่วยสร้าง

15

44 41 40 38 37 ไบต์

\\1.>2
/0./
@./$(\
$>0!>
11$/10
$.@.1

ลองออนไลน์!

ทดสอบไดรเวอร์

ใช้ 6 คูณ 6 สี่เหลี่ยมจัตุรัส ที่สั้นที่สุดที่ฉันสามารถทำได้ด้วย 8 คูณ 8 เป็น38 ไบต์หากใครต้องการลองปรับปรุง

คำอธิบาย:

หนึ่งในคนแรกที่ส่งผ่านรหัสถอดรหัสตัวเลขสองตัวแรกสำหรับคำนำหน้าและ0 1สำหรับ2มันเข้ารหัสหมายเลขที่สามจากนั้นเป็นครั้งแรก

     201  200
     211  210
       |  |
       v  v
   -> \\1.>2
 IP<- /../..  <- 000, 001
      ...$..
      .>0...
      .1..10  <- 010, 011
      ....1.
       ^  ^
       |  |
     100  110
     101  111

จากนั้นเราจะส่ง IPs ผ่านขอบที่สามเพื่อตัดสินหมายเลขสุดท้าย เรารวม IP กับคำนำหน้าเดียวกัน

     201  200
     211  210
       |  |
       v  v
   -> \\1.>2  -> 0,2 or 1,2
 IP<- /../..  <- 000, 001
      ...$..
      .>0!>.  -> 1
      .1./10  <- 010, 011
      ....1.
       ^ |^
       | v|
       | 0|
     100  110
     101  111

สำหรับ0และ1คำนำหน้าพวกเขาทั้งสองออกมาที่ขอบด้านบนเพื่อตัดสินใจหมายเลขที่สาม

     201  200
     211  210
       |  |
       |10|
       vvvv
   -> \\1.>2  -> 2
 IP<- /0./..  <- 000, 001
      @./$..
      .>0!>.  -> 1
      .1./10  <- 010, 011
      ....1.
       ^ |^
       | v|
       | 0|
     100  110
     101  111

สำหรับ2คำนำหน้า IPs จะแสดงมุมจากขอบด้านล่าง

     201  200
     211  210
       |  |
       |10|
       vvvv
   -> \\1.>2  -> 2
 IP<- /0./..  <- 000, 001
      @./$(\
      $>0!>.  -> 1
      11$/10  <- 010, 011
      $.@.1.
      ^^ |^^
      || v||
      1| 0|0
     100  110
     101  111

ขอบทั้งสองสลับหมายเลขที่หนึ่งและที่สามแล้วกดหมายเลขที่สองแล้วสลับกับหมายเลขที่สามเพื่อรับลำดับที่ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.