Brainf *** 'da keyfi olarak büyük bir hücreyi sıfırlayın


28

Göreviniz, Brainfuck varyantındaki mevcut hücreyi sıfırlayan, her bir hücrenin 0 ila 255 normal yerine, keyfi olarak büyük boyutta işaretli bir tamsayı içerebileceği bir kod parçası yazmaktır .

Başlangıçta sıfır olan mevcut hücrenin sağında r ve solda 1 hücre olduğunu varsayalım . Sadece bu erişebilir Program l + r + 1 hücreleri. Kodunuzu sona erdikten sonra onu terk etmesi l + r sıfır ekstra hücreleri ve orijinal konumunda geçerli hücreye işaretçi.

Herhangi bir giriş / çıkış kullanamazsınız.

En küçük l + r kodunu kazanır. Bir kravat varsa, en kısa kod kazanır. Ayrıca referans için programınızın zaman karmaşıklığını belirtmeniz önerilir, burada n , mevcut hücrede orijinal tamsayının mutlak değeridir.

Kullanışlı araçlar

Brainfuck programını bu varyasyonda , TIO'daki mbomb007 tercümanını kullanarak test edebilirsiniz .

Tercümanı bu cevapta standında da kullanabilirsiniz (diğer Python cevapları da işe yarar , ama test etmedim).


Kod-golf olarak etiketledim çünkü hızlı bir şekilde optimal l + r'ye ulaşacağımızı düşünüyorum.
jimmy23013

2
Yorumunuzdan anlaşılıyor ki, keyfi ya da pozitif olabilen keyfi büyük bir tamsayı demek istediniz. Bu, bazı insanlar için ingilizce lehçesinde bir fark, bu yüzden çok olumlu ya da çok olumsuz olabileceğini netleştirmek için yardımcı olabilir.
isaacg

4
@ jimmy23013 Bunun için kullanabileceğimiz imzalı hücrelere sahip bir BF yorumlayıcınız var mı?
mbomb007

@ mbomb007 codegolf.stackexchange.com/a/3085/25180 ama muhtemelen çok golfy ...
jimmy23013

1
@Mego Neden? "Gerçek" mücadelede, kod boyutunu küçültmeyi zorlaştıracak en iyi l + r'ye sahip olmalısınız.
jimmy23013

Yanıtlar:


17

L + R = 0 + 2 = 2, 55 53 51 bayt

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

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

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

Kendi algoritmam. İşaretçi, sıfırlanması gereken numaradan başlamalıdır. Zaman karmaşıklığı O (n ^ 2) 'dir.

Nasıl çalışır:

  • Numara ile başlıyoruz n.
  • Biri artırırız, böylece sayı olur n+1.
  • İkiyi düşürdük, böylece sayı n+1-2 = n-1
  • Üçü artırırız, böylece sayı olur n-1+3 = n+2.
  • Dördüncü değeri düşürdük, sayımız yükseldi n+2-4 = n-2.

Sıfır elde edene kadar her adımın giriş / çıkışını artırarak işlemi tekrarlıyoruz.


2
Tam olarak "bu mümkün bile değil" aşamasını geçtikten sonra düşündüğüm algoritma: P
ETHproductions

9

1 + r = 0 + 2 = 2; 58 bayt

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

Karmaşıklık O (n ^ 2) 'dir.

Aşağıdaki benim test programı jeneratör, bu yüzden işe yaramazsa test etmeye çalıştığımı görebilirsiniz ...

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

Yaptığım tercümanı kullanarak test edebilirsiniz.
Yoruma

Bana işe yarıyor gibi görünüyor.
mbomb007

2
Bu optimal l + r olmalı. 1'in imkansız olduğunu hızlı bir şekilde kanıtlayın: yedek hücrenin sıfıra geldiği her noktada, orijinal hücrenin değerine ek olarak yalnızca sınırlı miktarda veri depolayabilirsiniz (bu, kaset pozisyonu ve komut göstergesinde). Ana hücreyi bu noktadan en az bir yönde ne kadar uzağa ayarlayabileceğiniz konusunda kısıtlısınız.

@ ais523 Başka eşdeğerler olabilir. Birisinin l + r = 1 + 1 oluşturması ilginç olurdu.
mbomb007
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.