A volte quando si scrive il codice Brainfuck, si sente la necessità di renderlo più lungo del necessario per incoraggiare il debug. Potresti farlo semplicemente inserendo un ><
, ma che divertimento è? Avrai bisogno di qualcosa di più lungo e di meno NOPey per confondere chiunque legga il tuo codice.
Introduzione rapida a Brainfuck
Brainfuck è un linguaggio di programmazione esoterico creato nel 1993 da Urban Müller, noto per il suo estremo minimalismo. (Wikipedia)
Brainfuck è un linguaggio basato su otto comandi: +-><,.[]
. Il codice viene eseguito su qualcosa di simile a una macchina di Turing: un nastro infinito su cui è possibile modificare i valori. In questa sfida, ci concentreremo sui primi quattro:
+ increment the value at the pointer
- decrement the value at the pointer
> move the pointer right
< move the pointer left
Brainfuck NOPs
Un Brainfuck NOP è una sequenza di personaggi brainfuck che, se eseguiti da qualsiasi stato, non portano a nessun cambiamento nello stato. Sono costituiti dai quattro personaggi sopra menzionati.
La sfida
La sfida è scrivere un programma o una funzione che, una volta eseguito, genera un NOP di brainfuck casuale della lunghezza data.
Ingresso
Riceverai come input un numero intero pari non negativo n
. (I NOP sono impossibili per dispari n
.)
Produzione
Verrà emesso un NOP Brainfuck casuale della lunghezza n
.
Regole
- La definizione di NOP: quando l'output del programma viene inserito in qualsiasi momento in un programma brainfuck, il comportamento di detto programma non deve cambiare in alcun modo. In altre parole, non deve cambiare lo stato dell'interprete.
- Si noti che, ad esempio
+>-<
, non è corretto, poiché modifica i valori delle due celle senza modificarle nuovamente. Si prega di testare la soluzione per questi prima di pubblicare. - Si noti inoltre che
+>-<->+<
è un NOP che non può essere ridotto a nulla semplicemente rimuovendolo><
<>
+-
-+
. Pertanto, non è possibile utilizzare un algoritmo che li inserisce semplicemente uno nell'altro.
- Si noti che, ad esempio
- Ogni NOP valido della lunghezza
n
deve avere una possibilità diversa da zero nell'output. La distribuzione non deve essere uniforme, però. - L'interprete brainfuck in questione ha un nastro doppiamente infinito di celle di precisione arbitrarie. Cioè, puoi andare infinitamente in entrambe le direzioni e incrementare / decrementare ogni cella indefinitamente.
- Il programma deve terminare entro 1 minuto per
n
= 100 sulla mia macchina, quindi non generare tutti i NOP possibili e sceglierne uno. - Se ti viene fornito un input non valido (non intero, negativo, dispari, ecc.) Puoi fare tutto ciò che desideri, incluso l'arresto anomalo.
punteggio
Questo è code-golf , quindi vince la risposta più breve in byte.
Esempi
Ecco tutti gli output validi per n
= 4:
++-- +-+- +--+ --++ -+-+ -++-
>><< ><>< ><<> <<>> <><> <>><
><+- ><-+ <>+- <>-+
>+-< >-+< <+-> <-+>
+><- -><+ +<>- -<>+
+->< -+>< +-<> -+<>
Ecco alcune possibili uscite per n
= 20:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
.
ha un effetto collaterale, ,
sovrascrive un valore che non può essere recuperato senza l'uso di []
. Ma []
finirà per impostare un valore su zero. Questo sovrascrive anche un valore (quindi avremmo bisogno di un altro []
per recuperarlo) a meno che non possiamo essere sicuri che la cella interessata fosse zero per cominciare. Tuttavia, dovremmo cercare una cella simile con qualcosa del genere [>]
ed è impossibile tornare in modo affidabile alla posizione da cui proveniamo.
+-<>
come avevi chiesto:a