Membidik sel besar yang sewenang-wenang di Brainf ***


28

Tugas Anda adalah menulis sepotong kode yang nol sel saat ini dalam varian Brainfuck itu, masing-masing sel dapat berisi bilangan bulat yang ditandatangani dari besarnya sewenang-wenang, bukan normal 0 hingga 255.

Anda dapat mengasumsikan ada sel l di sebelah kiri dan sel r di sebelah kanan sel saat ini yang awalnya nol. Program Anda hanya dapat mengakses l + r +1 sel ini. Setelah kode Anda berakhir, ia akan membiarkan sel ekstra l + r nol dan pointer ke sel saat ini di posisi semula.

Anda tidak boleh menggunakan input / output apa pun.

Kode dengan l + r terkecil menang. Jika ada seri, kode terpendek akan menang. Dianjurkan untuk juga menyatakan kompleksitas waktu program Anda untuk referensi, di mana n adalah nilai absolut dari bilangan bulat asli dalam sel saat ini.

Alat yang berguna

Anda dapat menguji program Brainfuck dalam variasi ini menggunakan juru bahasa ini di TIO oleh mbomb007 .

Anda juga dapat menggunakan juru bahasa dalam jawaban ini oleh stan (jawaban Python lain mungkin juga berfungsi, tetapi saya tidak menguji).


Saya telah menandai itu kode-golf karena saya pikir kita akan mencapai l + r yang optimal dengan cepat.
jimmy23013

2
Kedengarannya seperti dari komentar Anda, maksud Anda bilangan bulat besar sewenang-wenang, yang mungkin positif atau negatif. Ini adalah perbedaan dalam dialek bahasa Inggris untuk beberapa orang, jadi mungkin akan membantu untuk mengklarifikasi bahwa itu bisa sangat positif atau sangat negatif.
isaacg

4
@ jimmy23013 Apakah Anda memiliki juru bahasa BF dengan sel yang ditandatangani yang dapat kita gunakan untuk ini?
mbomb007

@ mbomb007 codegolf.stackexchange.com/a/3085/25180 tapi mungkin terlalu golf ...
jimmy23013

1
@Mego Why? Dalam tantangan "nyata", Anda juga harus mendapatkan l + r yang optimal, yang mungkin akan membuatnya lebih sulit untuk mengurangi ukuran kode.
jimmy23013

Jawaban:


17

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

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

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

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

Algoritme saya sendiri. Pointer harus dimulai dari angka yang perlu di-zeroed Kompleksitas waktu adalah O (n ^ 2).

Bagaimana itu bekerja:

  • Kami mulai dengan nomornya n.
  • Kami menambah satu, sehingga jumlahnya menjadi n+1.
  • Kami mengurangi dua, jadi jumlahnya menjadi n+1-2 = n-1
  • Kami menambah tiga, jadi jumlahnya menjadi n-1+3 = n+2.
  • Kami mengurangi empat, jadi jumlahnya menjadi n+2-4 = n-2.

Kami mengulangi prosesnya, meningkatkan in- / decrement setiap langkah, hingga kami mendapatkan nol.


2
Tepatnya algoritma yang saya pikirkan setelah saya melewati tahap "ini bahkan tidak mungkin": P
ETHproduksi

9

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

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

Kompleksitasnya adalah O (n ^ 2).

Berikut ini adalah generator program pengujian saya, sehingga Anda dapat melihat bahwa saya benar-benar mencoba mengujinya jika tidak berfungsi ...

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

Anda dapat mengujinya menggunakan juru bahasa yang baru saja saya buat. Lihat komentar
mbomb007

Sepertinya itu bekerja untuk saya.
mbomb007

2
Ini harus menjadi l + r optimal. Bukti cepat bahwa 1 tidak mungkin: pada setiap titik di mana sel cadangan mencapai nol, Anda hanya dapat menyimpan jumlah data yang terbatas di samping nilai sel asli (dalam posisi kepala kaset dan penunjuk instruksi), yang berarti bahwa Anda terbatas pada seberapa jauh Anda dapat menyesuaikan sel utama dari titik itu setidaknya dalam satu arah.

@ ais523 Mungkin ada yang setara lainnya. Akan menarik jika seseorang membuat l + r = 1 + 1.
mbomb007
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.