สร้างโปรแกรม Brainf_ck ที่ส่งออกสตริงตามความยาวที่กำหนด


11

เพื่อนของคุณกำลังพยายามบุกเข้าไปในหลุมฝังศพที่มีระบบล็อคที่แปลกประหลาด: มันต้องมีการเคาะที่อ่อนโยนจำนวนหนึ่งในบางจุด เพื่อนของคุณค้นพบหมายเลข (ซึ่งอยู่ในช่วงที่ 1 ... 99999) และมีแกดเจ็ตที่ทำให้เกิดการเคาะที่ต้องการ อย่างไรก็ตามแกดเจ็ตเป็นล่าม Brainfuck! ดังนั้นเพื่อนของคุณต้องป้อนโปรแกรม Brainfuck ซึ่งควรจะสั้นที่สุดเท่าที่จะเป็นไปได้ (I / O ของอุปกรณ์ช้า)

งานของคุณคือช่วยเขา! เขียนโปรแกรมหรือรูทีนย่อยในภาษาใด ๆ ที่ยอมรับว่าเป็นตัวเลขป้อนเข้าNและส่งออกโปรแกรม Brainfuck ซึ่งจะไม่มีอินพุตและเอาต์พุตสตริงของอักขระ ASCII ที่พิมพ์ได้ (ยกเว้นอักขระเว้นวรรค - รหัสในช่วง 33 ... 126) Nที่มีความยาว

ตัวอย่าง: สำหรับอินพุต10เอาต์พุตอาจเป็น

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

(แต่ฉันแน่ใจว่ามันจะสั้นลง!)

คะแนนของคุณจะเป็นผลรวมของความยาวของผลลัพธ์ของคุณสำหรับค่าต่อไปนี้ของN(พวกเขาเป็นตัวเลขสุ่ม):

55
68
15
28
841
838
522
846
4898
9004
9363
3810
13230
67175
37231
44701

โอ้และคุณจะส่งรหัสของคุณ (โปรแกรมสร้าง) ไปยังเพื่อนของคุณทาง Twitter ดังนั้นตรวจสอบให้แน่ใจว่ามี140 ตัวอักษรหรือน้อยกว่า!


PS ภาษา Brainfuck มีหลายรูปแบบ สมมติว่าเทปไม่มีที่สิ้นสุดในทั้งสองทิศทาง (หรือ "วงกลมและใหญ่พอ") และเซลล์มีความจุ int 32- บิต (จำกัด และสามารถเก็บตัวเลขได้สูงสุด 99999) นอกจากนี้ไม่มีการห่อหุ้ม: เมื่อเซลล์มีมากเกินไปเครื่องจะทำลายตัวเอง!


2
"ค่าต่อไปนี้ของ N (เป็นตัวเลขสุ่ม)" ทำให้ฉันนึกถึงxkcd.com/221
cirpis

สำหรับการอ้างอิงอักขระช่องว่าง (รหัสอักขระ 32) มักจะรวมอยู่ในช่วง ASCII ที่พิมพ์ได้ มันไม่ได้สร้างความแตกต่างให้กับความท้าทายอย่างแท้จริงเนื่องจากคุณได้กำหนดช่วงอย่างชัดเจน
Martin Ender

3
เราสามารถสมมติให้เซลล์ใน brainfuck เป็นจำนวนเต็มความกว้างโดยพลการได้หรือไม่? ถ้าไม่พวกเขาห่ออย่างไรและเมื่อไหร่?
orlp

1
มันจะเป็นการดีถ้าสมมติอย่างน้อยความสามารถในการมี 67175 + ไม่กี่อย่าง
orlp

@anatolyg ฉันรู้ว่าในภายหลัง ขอโทษ
แยกผลไม้

คำตอบ:


3

Python 2 คะแนน: 1021

ฉันเพิ่งรู้ว่าการประกวดครั้งนี้ค่อนข้างเก่า แต่ก็ยังคงมีตั้งแต่ฉันมาด้วยวิธีการแก้ปัญหาที่ดีกว่าการโพสต์ที่ฉันโพสต์มันเช่นกัน

นี่คือสคริปต์ python 102 ไบต์ที่ทำงาน:

n=input()
s='>'
while n:
    s+='>'+'+'*(n%5+1);n/=5
print s+'[->[-<+++++>]<<]<+++++++[>+++++<-]>>[-<.>]'

ความคิดคือการใช้การเข้ารหัสฐาน 5 สำหรับ N (ฐานที่ดีที่สุดอย่างน้อยสำหรับอินพุตปัจจุบันซึ่งดูเหมือนจะไม่ "สุ่ม" มากดูเหมือนว่าพวกมันถูกเลือกโดยพลการโดยพลการ) และเขียนอัลกอริธึม Brainfuck ทั่วไปให้ ถอดรหัสจำนวนความยาวโดยพลการ (จำนวนจะถูกเข้ารหัสด้วยตัวเลขแต่ละหลักเพิ่มขึ้นหนึ่งหลักเพื่อตรวจหาจุดสิ้นสุดของการแปลง) ฉันเลือกพิมพ์ตัวอักษร 35 #ตัวละคร 36 $เทียบเท่า

คุณสามารถเรียกใช้สคริปต์ทุบตีต่อไปนี้เพื่อรับคะแนน:

i=0
while read p; do
  i=$((i+`echo $p | python convert.py | wc -m`))
done
echo $i

ด้วยโปรแกรมขั้นสูงที่เข้ามาแทนที่การเข้ารหัสด้วยการคูณสำหรับตัวเลขขนาดเล็กและเลือกฐานที่ดีที่สุดสำหรับการเข้ารหัสแต่ละตัวเลขฉันสามารถเข้าถึงตัวละคร Brainfuck ได้ถึง 958 ตัว แต่ Python นั้นละเอียดเกินไป (และฉันเป็นนักกอล์ฟที่แย่ / ขี้เกียจ) รับแปลงเป็น 144 ไบต์!


นี่เป็นความคิดที่ยอดเยี่ยม! บางทีฉันอาจใช้เพื่อปรับปรุงคำตอบนี้ (เขียนสคริปต์ใน Python เพื่อให้ได้คะแนนน้อยกว่า 950 แต่ฉันไม่รู้ภาษากอล์ฟใด ๆ ที่จะทำให้สั้นพอ)
anatolyg

8

BrainF *** คะแนน: 193,313

มันไม่ต่ำกว่า 140 ตัวอักษร (คือ 147 ใกล้มาก !!) ดังนั้นมันจึงไม่สามารถชนะได้ แต่ฉันคิดว่ามันเท่ห์

พิมพ์ 43 เครื่องหมายบวกตามด้วยเครื่องหมายNจุด ไม่ดีที่สุด

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

หากใครสามารถช่วยย่อเรื่องนี้ฉันก็จะชอบมัน


ฉันเดาด้วย Brainfuck มันคงจะเพียงพอที่จะสร้าง "รูทีนย่อย" ที่ได้รับอินพุตบนเทป - ไม่จำเป็นต้องอ่านจาก "อุปกรณ์อินพุตมาตรฐาน"
anatolyg

@anatolyg นั้นทำให้ง่ายขึ้นมาก - อาจจะประมาณ 80 หรือ 90 ตัวอักษร ฉันควรเปลี่ยนหรือไม่
mdc32

5

J, คะแนนรวม = 1481

(สำหรับรายการก่อนหน้าของฉันและคำอธิบายประวัติการแก้ไขตรวจสอบ)

f10=.('>++++++++++<';'')rplc~;@([:(<@('+++++[>+++++++<-]>>+',;@((<'[>++++++++++')#~#)),[<@(']',~'<-','<.>'#~],[,])"0 #-i.@# )10#.inv])

ฟังก์ชั่นนี้สร้างลูป BF ซ้อนกันขึ้นอยู่กับฐาน 10 หลักของหมายเลขอินพุต การตรวจสอบฐานที่เหมาะสมทั้งหมดและการเลือกรหัส BF ที่เล็กที่สุดจะปรับปรุงคะแนนด้วยจำนวนเล็กน้อย

โปรแกรม BF สำหรับชุดทดสอบ:

   f10 every 55 68 15 28 841 838 522 846 4898 9004 9363 3810 13230 67175 37231 44701
+++++[>+++++++<-]>>+[>++++++++++[-<<.....>>]<-<.....>]                                                                                     
+++++[>+++++++<-]>>+[>++++++++++[-<<......>>]<-<........>]                                                                                 
+++++[>+++++++<-]>>+[>++++++++++[-<<.>>]<-<.....>]                                                                                         
+++++[>+++++++<-]>>+[>++++++++++[-<<..>>]<-<........>]                                                                                     
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<....>>]<-<.>]                                                             
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<...>>]<-<........>]                                                       
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<.....>>>]<-<<..>>]<-<..>]                                                                 
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<....>>]<-<......>]                                                        
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<....>>>>]<-<<<........>>>]<-<<.........>>]<-<........>]                      
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<.........>>>>]<-<<<>>>]<-<<>>]<-<....>]                                      
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<.........>>>>]<-<<<...>>>]<-<<......>>]<-<...>]                              
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<...>>>>]<-<<<........>>>]<-<<.>>]<-<>]                                       
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<.>>>>>]<-<<<<...>>>>]<-<<<..>>>]<-<<...>>]<-<>]                 
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<......>>>>>]<-<<<<.......>>>>]<-<<<.>>>]<-<<.......>>]<-<.....>]
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<...>>>>>]<-<<<<.......>>>>]<-<<<..>>>]<-<<...>>]<-<.>]          
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<....>>>>>]<-<<<<....>>>>]<-<<<.......>>>]<-<<>>]<-<.>]          

คะแนนคอมพิวเตอร์ในชุดทดสอบ:

   +/#@> f10 each 55 68 15 28 841 838 522 846 4898 9004 9363 3810 13230 67175 37231 44701
1481

3

Pyth, 1702

สร้างหมายเลขใหม่โดยใช้ปัจจัยของ N + x

+holN+]++">>"*"+"Q"<<"mjk(">>"j">"m*"+"kP+Qd"<[[->[->+>+<<]>>[-<<+>>]<<<]>[-]>[-<<+>>]<<<]>"*"-"d"<<")50"++++++[>++++++<-]>>[<.>-]"

สำหรับ2ผลลัพธ์++นี้ ตอนนี้ที่ไม่พิมพ์อะไรใน BF
randomra

@randomra จับดีสิ่งนี้เกิดขึ้นขณะอัพเดตฉันจะแก้ไขให้ฉันหน่อย
orlp

@randomra ควรได้รับการแก้ไขทำให้คะแนนสูงขึ้นเล็กน้อย (แน่นอน)
orlp

3

CJam, 52 74 108 bytes, total = 1304 1244 1210

ri5b_,1>{(_3<{\(@5*+}*\+}*W%)\{T+_2>:T5*-_0>"-+"=\z*}%\T+'+*a+W%{"[->+++++<]>"\}*">x[>x<-]<[->>.<<]"'x/'+6**

สคริปต์ทดสอบ (ช้าในล่ามออนไลน์):

q~]
{
_[0:T;
5b_,1>{(_3<{\(@5*+}*\+}*W%)\{T+_2>:T5*-_0>"-+"=\z*}%\T+'+*a+W%{"[->+++++<]>"\}*">x[>x<-]<[->>.<<]"'x/'+6**
]s
_[L:RL@0\
"-+><.]"['('){+\_{)}0?@\}{@\+\_{)}0?}{R1$c+:R;}]:`"]a"{{_aa+1$4G#%{:~~1}{;0}?}g}`+a+er:~:~
];R,@=!"Error."N+*o
}%s,

ฉันไม่เห็นส่วนที่เกี่ยวกับการทำลายตนเอง แต่มันจะไม่ล้น
jimmy23013

มันทำงานยังไง?
anatolyg

@anatolyg รุ่นแรกเพียงสร้างตัวเลขในฐาน 5 รุ่นต่อมาเพิ่มกรณีพิเศษสำหรับตัวเลขสองหลักแรกและยังใช้การลดลง
jimmy23013

@ user23013 โอ้ขอโทษที่ยังไม่เห็นการเปลี่ยนแปลงข้อมูลจำเพาะ (อัปเดตคำตอบของฉันตามนั้น)
random

2

Befunge-98, N + 41, total = 193281

&>'+\:v
v^-1,\_
' >1-:v
>v^,+'_
,'    :
>ff3++^
>2f*+v
^>/9+:,
>'>,61v
, v*6+<
^/2,:<@
v >+2+,
>'<,']^

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

ใช้อัลกอริทึมที่คล้ายกับคำตอบ CJamของ Martin Büttner :

(N +'s)>+++++++++++++++++++++++++++++++++<[->.<]


1

Befunge-93 - 24 + N, รวม = 193009

&>">>]-<]-<++++>[++++>[+++"v
v  ,,,,,,,,,,,,,,,,,,,,,,, <
>:v
,v_@
"1
.-
"
^<

สิ่งนี้ใช้ส่วนนำหน้าของ+++[>++++[>++++<-]<-]>>เพื่อตั้งค่าดัชนีเทปแรกเป็น '0' ที่มี 24 อักขระ โปรแกรม Befunge นั้นเรียบง่ายและมีเอาต์พุตพร้อมกับ N '' ตัวละคร


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