Zero una cella arbitrariamente grande in Brainf ***


28

Il vostro compito è quello di scrivere un pezzo di codice che zeri la cella corrente nella variante Brainfuck che, ogni cella può contenere una firma intero di arbitrariamente grande ampiezza, al posto del normale 0 a 255.

Si può presumere che ci siano 1 celle a sinistra e r celle a destra della cella corrente che inizialmente sono zero. Il programma può accedere solo a queste celle l + r +1. Al termine, il codice dovrebbe lasciare zero le celle extra l + r e il puntatore sulla cella corrente nella posizione originale.

Non è possibile utilizzare alcun input / output.

Vince il codice con il più piccolo l + r . Se c'è un pareggio, vince il codice più corto. Si consiglia di indicare anche la complessità temporale del programma come riferimento, dove n è il valore assoluto dell'intero originale nella cella corrente.

Strumenti utili

Puoi testare un programma Brainfuck in questa variante usando questo interprete su TIO di mbomb007 .

Puoi anche usare l'interprete in questa risposta di boothby (probabilmente anche altre risposte di Python funzionano, ma non ho testato).


L'ho taggato code-golf perché penso che raggiungeremo l'ottimale l + r rapidamente.
jimmy23013,

2
Sembra che dal tuo commento, intendevi un intero di grandezza arbitrariamente grande, che può essere positivo o negativo. Questa è una differenza nel dialetto inglese per alcune persone, quindi potrebbe essere utile chiarire che può essere molto positivo o molto negativo.
isaacg,

4
@ jimmy23013 Hai un interprete BF con celle firmate che possiamo usare per questo?
mbomb007,

@ mbomb007 codegolf.stackexchange.com/a/3085/25180 ma probabilmente troppo da golf ...
jimmy23013

1
@Mego Why? Nella sfida "reale", devi anche ottenere l + r ottimale, che probabilmente renderà più difficile ridurre la dimensione del codice.
jimmy23013,

Risposte:


17

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

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

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

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

Il mio algoritmo. Il puntatore dovrebbe iniziare dal numero che deve essere azzerato. La complessità temporale è O (n ^ 2).

Come funziona:

  • Iniziamo con il numero n.
  • Ne aumentiamo uno, quindi il numero diventa n+1.
  • Diminuiamo due, quindi il numero diventa n+1-2 = n-1
  • Ne aumentiamo tre, quindi il numero diventa n-1+3 = n+2.
  • Diminuiamo quattro, quindi il numero diventa n+2-4 = n-2.

Ripetiamo il processo, aumentando l'incremento / decremento di ogni passaggio, fino a ottenere zero.


2
Esattamente l'algoritmo che ho pensato dopo aver superato la fase "questo non è nemmeno possibile": P
ETHproductions

9

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

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

La complessità è O (n ^ 2).

Quello che segue è il mio generatore di programmi di test, quindi puoi vedere che ho effettivamente provato a testarlo nel caso in cui non funzionasse ...

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

Puoi provarlo usando l'interprete che ho appena creato. Vedi commento
mbomb007,

Sembra che funzioni per me.
mbomb007,

2
Questo deve essere il l + r ottimale. Prova rapida che 1 è impossibile: in ogni punto in cui la cella di riserva raggiunge lo zero, è possibile memorizzare solo una quantità finita di dati oltre al valore della cella originale (nella posizione della testina del nastro e nel puntatore dell'istruzione), il che significa che sei limitato nella misura in cui puoi regolare la cella principale da quel punto in almeno una direzione.

@ ais523 Potrebbero essercene altri equivalenti. Sarebbe interessante se qualcuno crea l + r = 1 + 1.
mbomb007,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.