การอ่านรหัสใน 8 วิธีในการส่งออก 8 หมายเลข


21

ภาษาอังกฤษและภาษาการเขียนโปรแกรมส่วนใหญ่เขียนและอ่านจากซ้ายไปขวาบนลงล่าง แต่ไม่จำเป็นเลย

ในความเป็นจริงสำหรับบล็อกข้อความ

ABC
DEF

ฉันสามารถคิดถึงวิธีที่เกี่ยวข้องแปดวิธีที่อาจถูกอ่าน:

  1. จากซ้ายไปขวา, จากบนลงล่าง (LTR-TTB): ABCDEF
  2. จากบนลงล่างซ้ายไปขวา (TTB-LTR): ADBECF
  3. จากซ้ายไปขวา, จากบนลงล่าง (LTR-BTT): DEFABC
  4. จากล่างขึ้นบน, จากซ้ายไปขวา (BTT-LTR): DAEBFC
  5. จากขวาไปซ้าย, จากบนลงล่าง (RTL-TTB): CBAFED
  6. จากบนลงล่างขวาไปซ้าย (TTB-RTL): CFBEAD
  7. จากขวาไปซ้าย, จากบนลงล่าง (RTL-BTT): FEDCBA
  8. จากล่างขึ้นบน, จากขวาไปซ้าย (BTT-RTL): FCEBDA

ท้าทาย

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

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

ABC
DEF

แล้วโปรแกรมABCDEFการส่งออกอาจ5และFEDCBAการส่งออกอาจ2และอื่น ๆ หกโปรแกรมที่จะส่งออก1, 3, 4, 6, 7และ8ในการสั่งซื้อบางส่วน

บล็อกข้อความอาจจะมีตัวอักษรใด ๆ ยกเว้นจุดสิ้นสุดบรรทัด

ผลลัพธ์ควรไปที่ stdout หรือทางเลือกอื่นที่คล้ายกันหากภาษาของคุณไม่มี stdout ที่เหมาะสม ไม่มีอินพุต คุณอาจถือว่าโปรแกรมทำงานในสภาพแวดล้อม REPL

Pietu1998เขียนJSFiddle อย่างเอาเป็นเอาตายที่ให้ 8 โปรแกรมบรรทัดเดียวที่แตกต่างกันเมื่อได้รับบล็อกข้อความ ฉันได้ทำให้มันเป็นตัวอย่างสแต็ก:

<script>function f(n){n=n.split("\n");var e=n.map(function(n){return n.length}).sort()[n.length-1];n=n.map(function(n){return(n+Array(e+1).join(" ")).substring(0,e)});var t=n[0].split("").map(function(e,t){return n.map(function(n){return n[t]}).join("")});n=[n.join(""),n.reverse().join(""),t.join(""),t.reverse().join("")],n=n.concat(n.map(function(n){return n.split("").reverse().join("")})),document.getElementById("a").innerHTML=n.map(function(n,e){return document.getElementById("b").checked?n+"   "+"LLTTRRBB"[e]+"T"+"RRBBLLTT"[e]+"-"+"TBLRBTRL"[e]+"T"+"BTRLTBLR"[e]:n}).join("\n")}</script><textarea onkeyup="f(this.value)" id="c" placeholder="Code"></textarea><br/><input type="checkbox" id="b" onchange="f(document.getElementById('c').value)" checked/>&nbsp;<label for="b">Show directions</label><br/><pre id="a"></pre>

คุณยังสามารถหามาร์ตินรุ่น CJam ที่นี่

เกณฑ์การให้คะแนน

คะแนนของคุณคือพื้นที่ของบล็อกข้อความ (ความกว้างคูณความสูง) การส่งที่มีคะแนนต่ำสุดชนะ (โดยพื้นฐานแล้วรหัสที่เล็กที่สุดจะเป็นผู้ชนะดังนั้น tag ) Tiebreaker จะไปยังการส่งที่โพสต์ก่อนหน้านี้

ตัวอย่างคือ 2 โดย 3 ดังนั้นคะแนนของมันคือ 6 คะแนนน้อยกว่า 4 (2 โดย 2) เป็นไปไม่ได้เพราะโปรแกรม 8 โปรแกรมบางโปรแกรมจะเหมือนกันและไม่สามารถแสดงค่าที่แตกต่างกันสองค่า


6
ทำไมกฎ "เฉพาะ ASCII ที่พิมพ์ได้" หมายความว่า APL ไม่สามารถแข่งขันในการแข่งขันนี้ได้ :(
Moris Zucca

3
ฉันทำซอที่แปลงบล็อคโค้ดเป็น 8 โปรแกรม อาจรวมเป็นตัวอย่างต้องการความเห็นของ OP เกี่ยวกับเรื่องนี้แม้ว่า
PurkkaKoodari

3
@ MartinBüttnerเอาล่ะฉันคงไปแล้ว ดูเหมือนว่าString.prototype.repeat()จะยังใหม่อยู่ ยังยืนยันว่าจะทำงานใน IE ทันที ซอใหม่
PurkkaKoodari

@MorisZucca อนุญาตให้ใช้อักขระทั้งหมดนอกเหนือจากตัวยกเลิกบรรทัด
งานอดิเรกของ Calvin

@ Pietu1998 ขอบคุณสำหรับซอฉันได้เพิ่มมันเป็นตัวอย่าง
งานอดิเรกของ Calvin

คำตอบ:


21

J, 3 * 3 = 9

1[2
+2+
2+2

ดำเนินการทุกทิศทาง:

       ". '1[2+2+2+2','2+2+2+1[2','1+2[2+2+2','2+2[2+1+2','2+2+2+2[1','2[1+2+2+2','2+2+2[2+1',:'2+1+2[2+2'
1 7 3 4 8 2 6 5

คำอธิบาย:

  • ในการประมวลผล J ไปจากขวาไปซ้ายและไม่มีตัวดำเนินการที่สำคัญกว่า
  • [( left) ใช้เวลาด้านซ้ายของทั้งสองตัวถูกดำเนินการเพื่อให้เป็นหลักยกเลิกด้านขวาทั้งเช่นการแสดงออกของเรา1+2[2+2+2จะกลายเป็นแล้ว1+2[61+2
  • นิพจน์ทางซ้ายคือส่วนเพิ่มเติมที่มีตัวถูกดำเนินการทั้งหมด 1, 2, 3 และ 4 ตัว มีสองของแต่ละตัวnดำเนินการนิพจน์เดียวที่มีตัวเลข1และอีกอันที่มีเพียง2s การเพิ่มด้วยการ1สร้างตัวเลขคี่และอื่น ๆ สร้างการคู่

5
นี่เป็นสิ่งที่ดีจริงๆ แทนที่[ด้วย;และควรทำงานในสภาพแวดล้อม REPL ภาษาส่วนใหญ่
เครื่องมือเพิ่มประสิทธิภาพ

18

Befunge-98 ,5x5 = 25 5x3 = 15

1+4+2
$.@.$
3+4+4

ฉันเขียนสคริปต์เล็กน้อยที่พบตัวเลขที่ถูกต้องสำหรับฉัน ใช้เวลาสักครู่ แต่เดี๋ยวก่อนฉันเพิ่งเอาชนะ GolfScript! : D

สคริปต์ที่ฉันใช้อยู่ที่นี่และที่นี่แต่ฉันไม่แนะนำให้ดูเพราะสไตล์ของรหัสเป็นสารก่อมะเร็งอย่างยิ่ง

โปรแกรมย่อย

1+4+2$.@.$3+4+4   LTR-TTB   5
3+4+4$.@.$1+4+2   LTR-BTT   7
1$3+.+4@4+.+2$4   TTB-LTR   3
2$4+.+4@4+.+1$3   TTB-RTL   4
4+4+3$.@.$2+4+1   RTL-BTT   8
2+4+1$.@.$4+4+3   RTL-TTB   6
4$2+.+4@4+.+3$1   BTT-RTL   2
3$1+.+4@4+.+4$2   BTT-LTR   1

เวอร์ชั่นเก่า

 1.6
3 @ 4
.@ @.
8 @ 7
 2.5

โปรแกรมย่อย

เอาต์พุตตัวเลข 1-8 ตามลำดับ

 1.6 3 @ 4.@ @.8 @ 7 2.5    LTR-TTB
 2.5 8 @ 7.@ @.3 @ 4 1.6    LTR-BTT
 3.8 1 @ 2.@ @.6 @ 5 4.7    TTB-LTR
 4.7 6 @ 5.@ @.1 @ 2 3.8    TTB-RTL
 5.2 7 @ 8.@ @.4 @ 3 6.1    RTL-BTT
 6.1 4 @ 3.@ @.7 @ 8 5.2    RTL-TTB
 7.4 5 @ 6.@ @.2 @ 1 8.3    BTT-RTL
 8.3 2 @ 1.@ @.5 @ 6 7.4    BTT-LTR

14

Brainfuck $ , 4x3 = 12

Brainfuck $ นั้นคล้ายกับBrainfuckแต่มีคำสั่งเพิ่มเติมรวมถึงคำสั่งเพื่อส่งออกค่าเซลล์ปัจจุบันเป็นเอาต์พุตตัวเลขซึ่งมีประโยชน์มากสำหรับความท้าทายนี้

++:+
  ++
++++

คำสั่งหนึ่งบรรทัด:

++:+  ++++++   LTR-TTB, outputs 2
++++  ++++:+   LTR-BTT, outputs 8
+ ++ +:+++++   TTB-LTR, outputs 4
+++:+++ ++ +   TTB-RTL, outputs 3
++++++  +:++   RTL-BTT, outputs 7
+:++++  ++++   RTL-TTB, outputs 1
+++++:+ ++ +   BTT-RTL, outputs 5
+ ++ +++:+++   BTT-LTR, outputs 6

ฉันจะเถียงว่าคุณไม่ต้องการ Brainfuck $; คำสั่ง ฉันจะพิจารณาใช้เพียง และการส่งออก 0x01-0x08 ที่ถูกต้องสมบูรณ์ มันเป็น Brainfuck เพื่อประโยชน์ของสมอง +1
matega

ฉันจะตกลงกับเอาต์พุตไบนารี
captncraig

7

TECO 3 * 5 = 15

 +4 5
+2=4 
 +1 \

=พิมพ์ค่าของนิพจน์ตัวเลขล่าสุด \ถูกใช้เพื่ออ่านหรือเขียนตัวเลขจากสตริง แต่ฉันใช้มันเป็นเพียงการละทิ้งที่นี่

  • +4 5+2=4 +1 \ 7
  • + +2+4=1 4 5 \ 6
  • + +2+1=4 4 \ 5 3
  • +1 \+2=4 +4 5 2
  • \ 1+ 4=2+5 4+ 5
  • \ 5 4 1=4+2+ + 1
  • 5 \ 4 4=1+2+ + 4
  • 5 4+ 4=2+\ 1+ 8

7

piet - 12x12 = 144

ป้อนคำอธิบายรูปภาพที่นี่

เนื่องจากโปรแกรมหนึ่งบรรทัดไม่สามารถยกเลิกได้ให้ถือว่าโปรแกรมนั้นสิ้นสุดหลังจากเอาต์พุตแรก

8 โปรแกรมย่อยในภาพเดียว:

ป้อนคำอธิบายรูปภาพที่นี่


6

GolfScript, 4x4 = 16

1})7
)  }
}  )
3)}5

ใช้ประโยชน์จาก "ความคิดเห็นสุดยอด" แบบเก่าที่ดี: การที่ไม่มีใครเทียบ}ละเว้นโค้ดที่เหลือ (ในความเป็นจริงในกรณีนี้ความคิดเห็นปกติ#จะทำงานได้ดีเช่นกันเนื่องจากรหัสทั้งหมดทำงานเป็นบรรทัดเดียว) ดังนั้นจากแต่ละมุมมีเพียงตัวเลขเดียวเท่านั้นหรือ (ในอีกทางหนึ่ง) ตัวเลขนั้นเพิ่มขึ้น 1 เนื่องจากการดำเนินการสิ้นสุดลงและเนื้อหาสแต็กจะถูกพิมพ์ 8 โปรแกรมคือ

1})7)  }}  )3)}5  # LTR-TTB
1)}3}  ))  }7})5  # TTB-LTR
3})1)  }}  )5)}7  # BTT-LTR
3)}5}  ))  }1})7  # LTR-BTT
5})3)  }}  )7)}1  # RTL-BTT
5)}7}  ))  }3})1  # BTT-RTL
7})5)  }}  )1)}3  # TTB-RTL
7)}1}  ))  }5})3  # RTL-BTT

5

Haskell, 26x26 = 676

ใช้ความคิดเห็น ( --) เพื่อซ่อนบิตไปทางด้านหลังและด้านข้าง สิ่งนี้ทำให้มันยาวมาก

main=print 1--2 tnirp=niam
a                        a
i                        i
n                        n
=                        =
p                        p
r                        r
i                        i
n                        n
t                        t

3                        4
-                        -
-                        -
5                        6

t                        t
n                        n
i                        i
r                        r
p                        p
=                        =
n                        n
i                        i
a                        a
main=print 7--8 tnirp=niam

2
สำหรับฉันแล้วดูเหมือนว่าสิ่งนี้สามารถขยายไปยังภาษาส่วนใหญ่ด้วยความคิดเห็นแบบอินไลน์
Sp3000

4

โหมโรง 5x3 = 15

12 34
  !  
56 78

นี่ถือว่าPython interpreterซึ่งพิมพ์ค่าเป็นตัวเลขแทนรหัสอักขระ

สิ่งนี้ไม่ชนะ Befunge $ แต่มันเอาชนะการส่ง GolfScript ของฉันและฉันชอบความเรียบง่าย โปรดทราบว่ามันใช้อักขระที่ไม่ใช่ช่องว่างเพียง 9 ตัวเท่านั้นซึ่งน้อยกว่าการส่งอื่น ๆ (การประท้วง J อีกครั้ง :)) ในพรีลูดตัวเลขแต่ละตัวจะถูกผลักลงบนสแต็กเป็นรายบุคคลและขึ้นอยู่กับเส้นทางจะมีตัวเลขที่แตกต่างกันไปด้านหน้า!ซึ่งจะพิมพ์องค์ประกอบสแต็คด้านบน 8 โปรแกรมคือ:

12 34  !  56 78   LTR-TTB   4
56 78  !  12 34   LTR-BTT   8
1 52 6 ! 3 74 8   TTB-LTR   6
4 83 7 ! 2 61 5   TTB-RTL   7
87 65  !  43 21   RTL-BTT   5
43 21  !  87 65   RTL-TTB   1
8 47 3 ! 6 25 1   BTT-RTL   3
5 16 2 ! 7 38 4   BTT-LTR   2

นอกจากนี้ยังมี

 1 3 
1+!+1
 5 7 

ซึ่งจะเพิ่มตัวเลขคี่บนเส้นทางแนวตั้งและเพิ่มขึ้นตาม1เส้นทางแนวนอน:

 1 3 1+!+1 5 7    LTR-TTB   4
 5 7 1+!+1 1 3    LTR-BTT   8
 1 1+5 ! 3+7 1    TTB-LTR   5
 1 3+7 ! 1+5 1    TTB-RTL   7
 7 5 1+!+1 3 1    RTL-BTT   6
 3 1 1+!+1 7 5    RTL-TTB   2
 1 7+3 ! 5+1 1    BTT-RTL   3
 1 5+1 ! 7+3 1    BTT-LTR   1

2

CJam - 7 × 7

ไม่น่าประทับใจ แต่ไม่มีคำตอบจาก CJam และฉันชอบวิธีที่ดู :)

 8;];1 
7     2
;  0  ;
] 0 0 ]
;  0  ;
6     3
 5;];4 

ส่วนใหญ่ใช้ข้อเท็จจริงที่];ล้างสแต็ก

ลองออนไลน์


1

ทับทิม - 7x7

ไม่น่าประทับใจอย่างใดอย่างหนึ่งกลยุทธ์เดียวกันกับคำตอบของ Haskell

p 1#2 p

3     7
#     #
4     8

p 5#6 p

1

R, 9x9

ไม่มีพื้นที่สีขาวไม่มีความคิดเห็น

75%%99299
99%%99699
%%299%%41
%%699%%06
995999997
11%%999%%
99%%799%%
39719%%99
59519%%16

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

75%%9929999%%99699%%299%%41%%699%%0699599999711%%999%%99%%799%%39719%%9959519%%16   LTR-TTB  2
59519%%1639719%%9999%%799%%11%%999%%995999997%%699%%06%%299%%4199%%9969975%%99299   LTR-BTT  3
79%%9193559%%91999%%265%%75%%999%%1199999979999%%999%%26%%999%%99409%%9199167%%96   TTB-LTR  4
99167%%9699409%%9126%%999%%99%%999%%999999799%%999%%11%%265%%7559%%9199979%%91935   TTB-RTL  1
61%%9159599%%91793%%997%%99%%999%%1179999959960%%996%%14%%992%%99699%%9999299%%57   RTL-BTT  5
99299%%5799699%%9914%%992%%60%%996%%799999599%%999%%11%%997%%9999%%9179361%%91595   RTL-TTB  6
69%%7619919%%90499%%999%%62%%999%%9999799999911%%999%%57%%562%%99919%%9553919%%97   BTT-RTL  7
53919%%9799919%%9557%%562%%11%%999%%997999999%%999%%99%%999%%6219%%9049969%%76199   BTT-LTR  8

1

ภาษาโปรแกรมนี้ , 5 * 9 = 45

1i;i2
2   2
+   +
i   i
;   ;
i   i
+   +
2   2
5i;i6

ซึ่งแปลเป็นนี้:

1i;i22   2+   +i   i;   ;i   i+   +2   25i;i6
5i;i62   2+   +i   i;   ;i   i+   +2   21i;i2
12+i;i+25i       i;       ;i       i22+i;i+26
22+i;i+26i       i;       ;i       i12+i;i+25
6i;i52   2+   +i   i;   ;i   i+   +2   22i;i1
2i;i12   2+   +i   i;   ;i   i+   +2   26i;i5
62+i;i+22i       i;       ;i       i52+i;i+21
52+i;i+21i       i;       ;i       i62+i;i+22

ตั้งแต่;สิ้นสุดโปรแกรมโปรแกรมด้านบนแปลเป็น:

1i;   - outputs 1
5i;   - outputs 5
12+i; - outputs 3
22+i; - outputs 4
6i;   - outputs 6
2i;   - outputs 2
62+i; - outputs 8
52+i; - outputs 7

คำอธิบาย:หมายเลขใด ๆ จาก0เพื่อ9กดตัวเลขที่สอดคล้องกันลงบนสแต็ก +ปรากฏด้านบนสองค่าxและyออกมาจาก stack และผลักดันx + yเข้าสู่สแต็ค iส่งออกสแต็กเป็นจำนวนเต็ม

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