โปรแกรมย่อย Brainf *** ที่มีเอาท์พุตเฉพาะ


19

คุณควรเขียนโปรแกรม brainfuck (BF) ยาว 100 ไบต์

ตัวละครตัวหนึ่งจะถูกลบออกจากมันในทุกวิถีทางที่เป็นไปได้โปรแกรม 100 ใหม่ (ยาว 99- ไบต์) เช่นสำหรับโปรแกรม++.>.5 โปรแกรมย่อยมี+.>., +.>., ++>., และ++..++.>

คะแนนของคุณจะเป็นจำนวนผลลัพธ์ที่ไม่ซ้ำใครที่โปรแกรม 100 รายการสร้างขึ้น คะแนนที่สูงขึ้นจะดีกว่า

รายละเอียด

  • โปรแกรมของคุณจะถูกยกเลิกหลังจากแสดงอักขระตัวแรก
  • โปรแกรมและโปรแกรมที่ไม่ถูกต้องหรือไม่ได้สร้างผลลัพธ์ที่ว่างเปล่าจะไม่ถูกนับรวมกับคะแนน
  • เซลล์ BF เป็นตัวห่อ 8 บิต (255 + 1 = 0, 0-1 = 255)
  • โปรแกรมของคุณไม่มีการป้อนข้อมูล ถ้าคุณใช้ในรหัสที่มันตั้งเป็นเซลล์ปัจจุบัน,0
  • ไม่มีเซลล์ทางด้านซ้ายของตำแหน่งเริ่มต้น เช่น<.ไม่ถูกต้อง แต่เป็นที่ถูกต้องเป็นการดำเนินการที่ถูกยกเลิก.< .เทปไม่มีขอบเขตในทิศทางอื่น
  • โปรแกรมที่มีวงเล็บไม่สมดุล ( [และ]) ไม่ถูกต้อง
  • โปรแกรมดั้งเดิมของคุณสามารถสั้นกว่า 100 ไบต์ได้อย่างง่ายดายเพราะมันขยายได้ถึง 100 ไบต์โดยไม่เปลี่ยนคะแนน
  • โปรแกรมต้นฉบับของคุณไม่จำเป็นต้องเป็นรหัส BF ที่ถูกต้อง

คุณสามารถใช้โปรแกรม python3 นี้ (ลิงค์ ideone)เพื่อกำหนดคะแนนคำตอบของคุณ (สำหรับโปรแกรมที่ใช้เวลานานคุณอาจต้องแก้ไขmaxstepตัวแปร)

ตัวอย่าง

(เพื่อความง่ายโปรแกรมนี้สั้นกว่า 100 ไบต์)

Solution: ++,+[-]+><.-,-.

Score: 3

Explanation:

Subprogram     => Output

+,+[-]+><.-,-. => 1
+,+[-]+><.-,-. => 1
+++[-]+><.-,-. => 1
++,[-]+><.-,-. => 1
++,+-]+><.-,-. => None
++,+[]+><.-,-. => None
++,+[-+><.-,-. => None
++,+[-]><.-,-. => 0
++,+[-]+<.-,-. => None
++,+[-]+>.-,-. => 0
++,+[-]+><-,-. => 255
++,+[-]+><.,-. => 1
++,+[-]+><.--. => 1
++,+[-]+><.-,. => 1
++,+[-]+><.-,- => 1

Unique outputs are [0, 1, 255]    
Score is 3 for ++,+[-]+><.-,-. (length = 15)

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

ตัวต่อโบนัส: ไม่มีข้อ จำกัด อย่างกล้าหาญคุณสามารถหาโปรแกรมที่มีคะแนน 100 ได้หรือไม่?


ฉันไขปริศนาโบนัส; คำตอบคือ (เซ็นเซอร์)
AJMansfield

@AJMansfield คุณช่วยแก้ไขความคิดเห็นของคุณเพื่อให้คนอื่นคิดเกี่ยวกับตัวต่อได้ไหม เช่นเปลี่ยนโซลูชันของคุณเป็นลิงก์pastebin.comซึ่งมีคำตอบ
randomra

3
อืมมม ฉันเขียนเครื่องมือเพิ่มประสิทธิภาพเชิงพันธุกรรมสำหรับคำถามนี้เพื่อพยายามหาคำตอบที่มีอยู่แล้ว แต่ไม่ประสบความสำเร็จเท่าที่ควร พวกเขาติดอยู่ที่ 79 และ 43 ตามลำดับ อ่า - มันคุ้มค่ากับการยิง!
wchargin

คำตอบ:


12

คะแนน: 35 41 69 78 79 83

(ลบ newline)

-->+>->+>->+>->+>->+>->+>->+>->+>->+>->+>->+>->+>-
>+>->+>->+>->+>->+>->+>->+>->+>++[>[-<+++>]<<++]>.

ลองออนไลน์!

ฉันไม่แน่ใจว่าทำไมมันทำงาน ...

คะแนน: 79

X->>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>
+>+>+>+>+>+>+>+>+>+>+>+[>[-<+>>+<]+>[-<+>]<<<+]>>.

ลองออนไลน์!

มันควรจะรวม 2 * mem [i] * i และเพิ่มจำนวนของเซลล์ (+ const) ที่อยู่จะถูกนับจากทางด้านขวาไปทางซ้าย ตัวคูณ 2 และจำนวนเซลล์สามารถทำการลบ + และ> ที่มีพาริตีต่างกัน

มันใช้งานได้จริงในรุ่น 69 คะแนน แต่เวอร์ชันล่าสุดได้ทำลายสิ่งนั้นและได้รับสิ่งอื่นโดยบังเอิญ มันคำนวณผลรวม (mem [i] * i + i + 1) และการลบ + และ> เกือบจะเหมือนกันยกเว้นผลรวม (i) ซึ่งมีความแตกต่างของจำนวนเซลล์ซึ่งเป็นจำนวนเอาต์พุตต่างกัน สำหรับการลบ + และ>

สำหรับโบนัส:

+. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. + +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +


หมายเหตุ: หากคุณทดสอบสิ่งนี้ด้วยโปรแกรมผู้ทำประตูที่ให้มาตรวจสอบให้แน่ใจว่าได้เพิ่มmaxstepค่า ( def evaluate(r,maxstep=20000):เป็น) ในขณะที่บางโปรแกรมย่อยทำงานเป็นเวลานาน
randomra

1
คะแนนสามารถเพิ่มเป็นจริงได้79โดยแทนที่->+>+> ...ด้วย->,>+> ...
BrainSteel

@BrainSteel ฉันเพิ่งเปลี่ยนเป็นไม่มี op
jimmy23013

9

คะแนน: 37 43

+>-,->,+-><->-[>---+-+<[--->>+><,+>>>++<><<<+<[>--]]><><+-+>+<<+<><+++<[[<[---->-<-]>++>],>,]<,]<+-.

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

สิ่งนี้สร้างขึ้นโดยโปรแกรมที่ฉันเขียนในซี

สำหรับการNลบตัวอักษร th ทุกตัวนี่คือผลลัพธ์:

N = 0 => 158
N = 1 => 158
N = 2 => 158
N = 3 => 187
N = 4 => 129
N = 5 => 100
N = 6 => 158
N = 7 => 13
N = 8 => 1
N = 9 => 211
N = 10 => 129
N = 11 => 1
N = 12 => 57
N = 13 => 255
N = 14 => Mismatched Braces
N = 15 => 59
N = 16 => 11
N = 17 => 11
N = 18 => 11
N = 19 => 117
N = 20 => 11
N = 21 => 117
N = 22 => 166
N = 23 => Mismatched Braces
N = 24 => 206
N = 25 => 206
N = 26 => 206
N = 27 => 147
N = 28 => 147
N = 29 => 158
N = 30 => 148
N = 31 => 188
N = 32 => 51
N = 33 => 17
N = 34 => 84
N = 35 => 84
N = 36 => 84
N = 37 => 158
N = 38 => 158
N = 39 => 94
N = 40 => 46
N = 41 => 94
N = 42 => 94
N = 43 => 94
N = 44 => 17
N = 45 => 196
N = 46 => Mismatched Braces
N = 47 => 149
N = 48 => No Termination
N = 49 => No Termination
N = 50 => Mismatched Braces
N = 51 => Mismatched Braces
N = 52 => 45
N = 53 => 77
N = 54 => 45
N = 55 => 77
N = 56 => 50
N = 57 => 209
N = 58 => 50
N = 59 => 251
N = 60 => 249
N = 61 => 99
N = 62 => 99
N = 63 => 117
N = 64 => 89
N = 65 => 207
N = 66 => 89
N = 67 => 115
N = 68 => 115
N = 69 => 115
N = 70 => 95
N = 71 => Mismatched Braces
N = 72 => Mismatched Braces
N = 73 => 104
N = 74 => Mismatched Braces
N = 75 => No Termination
N = 76 => No Termination
N = 77 => No Termination
N = 78 => No Termination
N = 79 => Left Overflow
N = 80 => 3
N = 81 => 2
N = 82 => No Termination
N = 83 => Mismatched Braces
N = 84 => No Termination
N = 85 => 133
N = 86 => 133
N = 87 => 0
N = 88 => Mismatched Braces
N = 89 => 158
N = 90 => 0
N = 91 => 4
N = 92 => Mismatched Braces
N = 93 => 0
N = 94 => 158
N = 95 => Mismatched Braces
N = 96 => 0
N = 97 => 157
N = 98 => 159
N = 99 => None

มีเอาต์พุตเฉพาะ 37 รายการซึ่งเป็น (ตามลำดับตัวเลข):

0, 1, 2, 3, 4, 11, 13, 17, 45, 46, 50, 51, 57, 59, 77, 84, 89, 94, 95, 99,
100, 104, 115, 117, 129, 133, 147, 148, 149, 157, 158, 159, 166, 187, 188, 
196, 206, 207, 209, 211, 249, 251, 255

ผม90% 100% บางวิธีนี้คือไม่ดีที่สุดแต่สามารถพิสูจน์ได้ว่าอาจจะยากเหลือเกิน มีบางสิ่งที่ชัดเจน ไม่มี.สัญลักษณ์จนตัวอักษรที่ผ่านมาดูเหมือนว่าจะเป็นวิธีการที่จะไปและวงเล็บ ( []) ดูเหมือนจะค่อนข้างไร้ประโยชน์ ฉันคิดเล็กน้อยที่นี่ซึ่งฉันอยากจะร่าง:

อนุญาตLเป็นความยาวของโค้ดในหน่วยไบต์ (ในการท้าทาย, 100) และnเป็นจำนวนเอาต์พุตเฉพาะของโปรแกรมย่อย

สำหรับการL=3มีโซลูชั่นที่ดีที่สุดหลายรูปแบบ+-.ที่n=2(ในกรณีนี้ผลลัพธ์ที่ได้คือ 1 และ 255 +.และ-.ตามลำดับ.) ทำให้นี้อัตราส่วนที่ดีที่สุดสำหรับการที่L = 3 โปรดทราบว่าอัตราส่วนนี้ไม่สามารถตีเป็นเวลาอย่างน้อยn/L = 66.67%L<10

สำหรับL=10การแก้ปัญหานั้นง่ายพอที่จะทำให้ดีขึ้น นี่คือโซลูชันที่ดีที่สุดทั้งหมดที่n = 6:

++>-->+<+. => 6
++>-->+<+. => 6
+++>->+<+. => 6
--->->+<+. => 6
++>---><+. => 6
+++>--><+. => 6
-->++>-<-. => 6
+++>+>-<-. => 6
--->+>-<-. => 6
-->+++><-. => 6
--->++><-. => 6

n/L = 60%ที่ทำให้อัตราส่วนคะแนน

ในฐานะที่L->infinityมันเป็นที่ชัดเจนว่าอัตราส่วนจะต้องเข้าใกล้ 0 เนื่องจากมีเพียง 255 Lผลเป็นไปได้สำหรับอนันต์ที่อาจเกิดขึ้น

อย่างไรก็ตามอัตราส่วนดังกล่าวไม่ได้ลดลงอย่างสม่ำเสมอ มันเป็นไปไม่ได้ที่จะสร้างวิธีการแก้ปัญหาสำหรับn=6, L=9ดังนั้นอัตราส่วนที่ดีที่สุดสำหรับการมีL=95/9 = 55.56% < 60%

สิ่งนี้ทำให้เกิดคำถามว่าเร็วแค่ไหนและอัตราส่วนนี้ลดลงได้อย่างไร? สำหรับL = 100และที่10^9 checks/secondมันจะใช้เวลาหลายขนาดของคำสั่งนานกว่าอายุการใช้งานของจักรวาลเพื่อ bruteforce ทางออกที่ดีที่สุด มีวิธีที่สง่างามที่จะไปเกี่ยวกับเรื่องนี้? ผมสงสัยมากว่ามันจะลงไปสำหรับ37%L = 100

L=100อัตราส่วนจริงเพิ่มขึ้นถึง ดูคำตอบอื่น ๆ เพื่อยืนยัน

ฉันชอบที่จะได้ยินการประเมินของคุณจากด้านบน ฉันอาจจะผิดอย่างทารุณหลังจากทั้งหมด

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