บางครั้งเมื่อเขียนโค้ด brainfuck คุณรู้สึกว่าจำเป็นที่จะต้องทำให้มันนานเกินความจำเป็นเพื่อกระตุ้นการดีบั๊ก คุณสามารถทำได้โดยการ plopping ที่><
นั่น แต่ความสนุกคืออะไร คุณจะต้องมีสิ่งที่ยาวและน้อยกว่า NOPey เพื่อสร้างความสับสนให้ใครก็ตามที่อ่านรหัสของคุณ
บทนำสู่ Brainfuck อย่างรวดเร็ว
Brainfuckเป็นภาษาโปรแกรมลับที่สร้างขึ้นในปี 1993 โดย Urban Müllerและมีชื่อเสียงในเรื่องความเรียบง่ายแบบสุดขั้ว (วิกิพีเดีย)
Brainfuck เป็นภาษาที่ใช้คำสั่งแปดคำ: +-><,.[]
. รหัสนี้ทำงานบนเครื่องทัวริง: เทปที่ไม่มีที่สิ้นสุดซึ่งสามารถเปลี่ยนค่าได้ ในการท้าทายนี้เราจะเน้นไปที่สี่ข้อแรก:
+ increment the value at the pointer
- decrement the value at the pointer
> move the pointer right
< move the pointer left
Brainfuck NOPs
brainfuck NOP เป็นลำดับของตัวละครในสมองที่เมื่อดำเนินการจากรัฐใด ๆ จะไม่มีการเปลี่ยนแปลงในรัฐ ประกอบด้วยอักขระสี่ตัวที่กล่าวถึงข้างต้น
ความท้าทาย
ความท้าทายคือการเขียนโปรแกรมหรือฟังก์ชั่นซึ่งเมื่อประมวลผลแล้วจะสร้าง brainfuck แบบสุ่ม NOP ตามความยาวที่กำหนด
อินพุต
คุณจะได้รับการป้อนข้อมูลเป็นจำนวนเต็มคู่ที่n
ไม่จำเป็น (NOPs เป็นไปไม่ได้สำหรับคี่n
)
เอาท์พุต
คุณจะเอาท์พุท NOP brainfuck n
สุ่มของความยาว
กฎระเบียบ
- คำจำกัดความของ NOP: เมื่อแทรกเอาท์พุทของโปรแกรม ณ จุดใด ๆ ในโปรแกรม brainfuck พฤติกรรมของโปรแกรมดังกล่าวจะต้องไม่เปลี่ยนแปลง แต่อย่างใด กล่าวอีกนัยหนึ่งมันจะต้องไม่เปลี่ยนสถานะของล่าม
- โปรดทราบว่าตัวอย่าง
+>-<
ไม่ถูกต้องเนื่องจากจะเปลี่ยนค่าของเซลล์ทั้งสองโดยไม่เปลี่ยนกลับ โปรดทดสอบวิธีแก้ปัญหาของคุณก่อนทำการโพสต์ - นอกจากนี้ทราบว่า
+>-<->+<
เป็น NOP><
<>
+-
-+
ที่ไม่สามารถลดลงไปไม่มีอะไรเพียงแค่ลบ ดังนั้นคุณไม่สามารถใช้อัลกอริทึมที่เพิ่งแทรกสิ่งเหล่านี้เข้าด้วยกัน
- โปรดทราบว่าตัวอย่าง
- NOP ที่ถูกต้องทุกตัวของความยาว
n
จะต้องมีโอกาสที่ไม่เป็นศูนย์ในการแสดงผล การกระจายไม่จำเป็นต้องเหมือนกัน - ล่าม brainfuck ที่เป็นปัญหามีเทปที่ไม่ จำกัด สองเท่าของเซลล์ความแม่นยำตามอำเภอใจ นั่นคือคุณสามารถไปยังทั้งสองทิศทางได้อย่างไม่ จำกัด และเพิ่ม / ลดเซลล์แต่ละเซลล์ไปเรื่อย ๆ
- โปรแกรมจะต้องเสร็จสิ้นภายใน 1 นาทีสำหรับ
n
= 100ในเครื่องของฉันดังนั้นจึงไม่มีการสร้าง NOP ที่เป็นไปได้ทั้งหมดและเลือกหนึ่งรายการ - หากได้รับการป้อนข้อมูลที่ไม่ถูกต้อง (ไม่ใช่จำนวนเต็มลบคี่และอื่น ๆ ) คุณสามารถทำสิ่งที่คุณต้องการรวมถึงความผิดพลาด
เกณฑ์การให้คะแนน
นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
ตัวอย่าง
นี่คือผลลัพธ์ที่ถูกต้องทั้งหมดสำหรับn
= 4:
++-- +-+- +--+ --++ -+-+ -++-
>><< ><>< ><<> <<>> <><> <>><
><+- ><-+ <>+- <>-+
>+-< >-+< <+-> <-+>
+><- -><+ +<>- -<>+
+->< -+>< +-<> -+<>
นี่เป็นผลลัพธ์ที่เป็นไปได้บางอย่างสำหรับn
= 20:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
.
มีผลข้างเคียง, เขียนทับค่าที่ไม่สามารถกู้คืนได้โดยไม่ต้องใช้ที่,
[]
แต่[]
จะสิ้นสุดการตั้งค่าเป็นศูนย์ สิ่งนี้จะเขียนทับค่าด้วย (ดังนั้นเราจึงต้องการค่าอื่น[]
ในการกู้คืน) เว้นแต่เราจะมั่นใจได้ว่าเซลล์ที่ได้รับผลกระทบนั้นจะเริ่มต้นที่ศูนย์ อย่างไรก็ตามเราต้องค้นหาเซลล์ดังกล่าวด้วยสิ่งที่ต้องการ[>]
และมันเป็นไปไม่ได้ที่จะกลับไปยังตำแหน่งที่เราเชื่อถือได้อย่างน่าเชื่อถือ
+-<>
อย่างที่คุณขอ:a