ศูนย์เซลล์ขนาดใหญ่ที่ไม่มีกฎเกณฑ์ใน Brainf ***


28

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

คุณอาจสมมติว่ามีเซลล์lทางด้านซ้ายและเซลล์rทางด้านขวาของเซลล์ปัจจุบันที่เริ่มต้นเป็นศูนย์ โปรแกรมของคุณสามารถเข้าถึงเซลล์l + r +1 เหล่านี้เท่านั้น หลังจากรหัสของคุณสิ้นสุดลงควรปล่อยให้เซลล์พิเศษl + rเป็นศูนย์และตัวชี้ไปยังเซลล์ปัจจุบันที่ตำแหน่งเดิม

คุณไม่สามารถใช้อินพุต / เอาต์พุตใด ๆ

รหัสที่มีl + rน้อยที่สุดชนะ หากมีการเสมอกันรหัสที่สั้นที่สุดจะชนะ ขอแนะนำให้ระบุความซับซ้อนของเวลาของโปรแกรมของคุณสำหรับการอ้างอิงโดยที่nคือค่าสัมบูรณ์ของจำนวนเต็มดั้งเดิมในเซลล์ปัจจุบัน

เครื่องมือที่มีประโยชน์

คุณสามารถทดสอบโปรแกรม brainfuck ในรูปแบบนี้ใช้ล่ามนี้ใน TIO โดย mbomb007

คุณยังสามารถใช้ล่ามในคำตอบนี้ได้โดยบูธโดย (คำตอบอื่น ๆ ของ Python อาจใช้ได้เช่นกัน แต่ฉันไม่ได้ทดสอบ)


ฉันติดแท็กมันเป็นรหัสกอล์ฟเพราะฉันคิดว่าเราจะไปถึง l + r ที่ดีที่สุดอย่างรวดเร็ว
jimmy23013

2
ดูเหมือนว่าจากความคิดเห็นของคุณคุณหมายถึงจำนวนเต็มขนาดใหญ่โดยพลการซึ่งอาจเป็นบวกหรือลบ นี่เป็นความแตกต่างในภาษาอังกฤษสำหรับบางคนดังนั้นจึงอาจเป็นประโยชน์ในการชี้แจงว่ามันอาจจะเป็นบวกหรือลบมาก
isaacg

4
@ jimmy23013 คุณมีล่าม BF ที่มีเซลล์ที่เซ็นชื่อซึ่งเราสามารถใช้ได้หรือไม่?
mbomb007

@ mbomb007 codegolf.stackexchange.com/a/3085/25180แต่อาจจะกอล์ฟเกินไป ...
jimmy23013

1
@Mego ทำไม ในการท้าทาย "ของจริง" คุณต้องได้รับ l + r ที่ดีที่สุดซึ่งอาจทำให้ยากต่อการลดขนาดรหัส
jimmy23013

คำตอบ:


17

l + r = 0 + 2 = 2, 55 53 51 ไบต์

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

l + r = 1 + 2 = 3, 46 44 ไบต์

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

อัลกอริทึมของฉันเอง ตัวชี้ควรเริ่มต้นที่หมายเลขที่จำเป็นต้องมีศูนย์ ความซับซ้อนของเวลาคือ O (n ^ 2)

มันทำงานอย่างไร:

  • nเราเริ่มต้นด้วยหมายเลข
  • n+1เราเพิ่มหนึ่งดังนั้นจำนวนจะกลายเป็น
  • เราลดทอนสองดังนั้นจำนวนกลายเป็น n+1-2 = n-1
  • n-1+3 = n+2เราเพิ่มสามดังนั้นจำนวนจะกลายเป็น
  • n+2-4 = n-2เราพร่องสี่ดังนั้นจำนวนจะกลายเป็น

เราทำซ้ำกระบวนการเพิ่ม / - ลดลงในแต่ละขั้นตอนจนกว่าเราจะได้รับศูนย์


2
อัลกอริทึมที่ฉันคิดหลังจากผ่านขั้นตอน "ไม่เป็นไปได้": P
ETHproductions

9

l + r = 0 + 2 = 2; 58 ไบต์

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

ความซับซ้อนคือ O (n ^ 2)

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

p='''
>+<
[
>
[<->>+<-]
>+<
<[>]>
[<<+>+>-]
<
[->+<]
>[<]>
+ [-<+>]
<<
]
> [-] <
'''

p = ''.join(p.split())

cpp = '''
#include <bits/stdc++.h>
using namespace std;
void test(int q) {
long long t[3] = {q, 0, 0};
int i = 0;
ZZZ
printf("q=%d %lld %lld %lld\\n", q, t[0], t[1], t[2]);
}
int main() {
while(true) {
    int q; cin >> q; test(q);
}
}
'''

d = {
'>': '++i; assert(i<3);',
'<': '--i; assert(i>=0);',
'+': '++t[i];',
'-': '--t[i];',
'[': 'while(t[i]){',
']': '}',
}

print cpp.replace('ZZZ', ''.join(d[c] for c in p))

คุณสามารถทดสอบโดยใช้ล่ามที่ฉันทำ ดูความคิดเห็น
mbomb007

ดูเหมือนว่าจะทำงานกับฉัน
mbomb007

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

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