Không có một tế bào lớn tùy ý trong Brainf ***


28

Nhiệm vụ của bạn là viết một đoạn mã làm thay đổi ô hiện tại trong biến thể Brainfuck, mỗi ô có thể chứa một số nguyên có chữ ký có cường độ lớn tùy ý, thay vì 0 đến 255 bình thường.

Bạn có thể giả sử có l tế bào bên trái và r tế bào ở bên phải của ô hiện tại mà ban đầu bằng không. Chương trình của bạn chỉ có thể truy cập các ô l + r +1 này. Sau khi mã của bạn kết thúc, nó sẽ để các ô thêm l + r bằng 0 và con trỏ tới ô hiện tại ở vị trí ban đầu.

Bạn không thể sử dụng bất kỳ đầu vào / đầu ra.

Mã có l + r nhỏ nhất sẽ thắng. Nếu có hòa, mã ngắn nhất sẽ thắng. Bạn cũng nên nêu độ phức tạp thời gian của chương trình để tham khảo, trong đó n là giá trị tuyệt đối của số nguyên ban đầu trong ô hiện tại.

Công cụ hữu ích

Bạn có thể kiểm tra chương trình Brainfuck trong biến thể này bằng trình thông dịch này trên TIO bởi mbomb007 .

Bạn cũng có thể sử dụng trình thông dịch trong câu trả lời này bởi boothby (các câu trả lời Python khác có thể cũng hoạt động, nhưng tôi đã không kiểm tra).


Tôi đã gắn thẻ code-golf bởi vì tôi nghĩ rằng chúng tôi sẽ đạt được l + r tối ưu một cách nhanh chóng.
jimmy23013

2
Có vẻ như từ nhận xét của bạn, bạn có nghĩa là số nguyên cường độ lớn tùy ý, có thể là dương hoặc âm. Đây là một sự khác biệt trong phương ngữ tiếng Anh đối với một số người, vì vậy có thể hữu ích để làm rõ rằng nó có thể rất tích cực hoặc rất tiêu cực.
isaacg

4
@ jimmy23013 Bạn có trình thông dịch BF với các ô đã ký mà chúng ta có thể sử dụng cho việc này không?
mbomb007

@ mbomb007 codegolf.stackexchange.com/a/3085/25180 nhưng có lẽ quá golf ...
jimmy23013

1
@Mego Tại sao? Trong thử thách "thực", bạn cũng phải đạt được l + r tối ưu, điều này có thể sẽ khiến việc giảm kích thước mã trở nên khó khăn hơn.
jimmy23013

Câu trả lời:


17

l + r = 0 + 2 = 2, 55 53 51 byte

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

l + r = 1 + 2 = 3, 46 44 byte

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

Thuật toán của riêng tôi. Con trỏ sẽ bắt đầu ở số cần 0. Độ phức tạp thời gian là O (n ^ 2).

Làm thế nào nó hoạt động:

  • Chúng tôi bắt đầu với số lượng n.
  • Chúng tôi tăng một, vì vậy số lượng trở thành n+1.
  • Chúng tôi giảm hai, vì vậy số trở thành n+1-2 = n-1
  • Chúng tôi tăng ba, vì vậy số lượng trở thành n-1+3 = n+2.
  • Chúng tôi giảm bốn, vì vậy số lượng trở thành n+2-4 = n-2.

Chúng tôi lặp lại quy trình, tăng số lần giảm / giảm cho đến khi chúng tôi nhận được số không.


2
Chính xác là thuật toán tôi nghĩ đến sau khi tôi vượt qua giai đoạn "điều này thậm chí không thể xảy ra": P
Sản xuất ETH

9

l + r = 0 + 2 = 2; 58 byte

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

Độ phức tạp là O (n ^ 2).

Sau đây là trình tạo chương trình thử nghiệm của tôi, vì vậy bạn có thể thấy rằng tôi thực sự đã thử kiểm tra nó trong trường hợp nó không hoạt động ...

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))

Bạn có thể kiểm tra nó bằng trình thông dịch tôi vừa thực hiện. Xem bình luận
mbomb007

Có vẻ như nó hoạt động với tôi.
mbomb007

2
Điều này đã trở thành l + r tối ưu. Bằng chứng nhanh là 1 là không thể: tại mỗi điểm tại đó ô dự phòng bằng 0, bạn chỉ có thể lưu trữ một lượng dữ liệu hữu hạn ngoài giá trị của ô ban đầu (ở vị trí đầu băng và con trỏ lệnh), có nghĩa là bạn bị giới hạn về khoảng cách bạn có thể điều chỉnh ô chính từ điểm đó theo ít nhất một hướng.

@ ais523 Có thể có những cái tương đương khác. Sẽ rất thú vị nếu ai đó tạo ra l + r = 1 + 1.
mbomb007
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.