Comprovato ottimale!
((([()][()][()])))
Provalo online!
Spiegazione
Brain-Flak, Brain-Flueue, Miniflak e Fλak
([()][()][()]) Push -3
( ) Copy
( ) Copy
Questo stampa:
-3
-3
-3
(C'è una nuova riga finale)
Brain-Flak Classic
Brain-Flak Classic è la versione originale di Brain-Flak e presenta alcune importanti differenze rispetto al moderno Brain-Flak. In BFC [...]
stampa il suo contenuto anziché negarlo.
[()] Print 1
[()] Print 1
[()] Print 1
( ) Push 3
( ) Push 3
( ) Push 3
Alla fine dell'esecuzione 3 3 3
viene stampato il contenuto dello stack ( ).
Questo stampa:
1
1
1
3
3
3
(C'è una nuova riga finale)
Flakcats
Flakcats è abbastanza diverso dagli altri 4 fiocchi e sono sorpreso che questo funzioni in Flakcats. I tre operatori qui sono quasi gli stessi di quelli utilizzati da Brain-Flak.
La principale differenza in questo particolare programma tra Flakcats è l' (...)
operatore che in Flakcats equivale a ([{}]...)
Brain-Flak. Questo, tuttavia, non fa differenza per noi perché raccoglie zeri e quindi funziona in modo molto simile a Brain-Flak.
Ecco quel programma compilato in Brian-Flak:
([{}]([{}]([{}][()][()][()])))
Questo stampa:
-3
-3
-3
(C'è una nuova riga finale)
Prova di ottimalità in Brain-Flak e Miniflak
Questa non è una prova formale, ma piuttosto una prova informale che dovrebbe essere ampliata per essere resa più rigorosa
A causa delle restrizioni secondo cui i programmi Brain-Flak devono essere una stringa bilanciata e la lunghezza del programma deve essere un multiplo di 3 qualsiasi invio valido deve essere un multiplo di 6 di lunghezza. Ciò significa che qualsiasi soluzione inferiore a 18 deve essere di lunghezza 12.
A causa degli output che seguono newline, l'altezza finale dello stack deve essere un multiplo di tre o infrangeremo le restrizioni sull'output.
Qualsiasi invio valido di lunghezza 12 deve avere 2 tipi di parentesi graffe (avere meno infrange le restrizioni sul numero di caratteri distinti e più significherebbe più di 12 caratteri). Poiché il programma produce output, deve avere una spinta.
Questo ci lascia selezionare l'altro nostro set di parentesi graffe. Le opzioni sono:
<...>/<>
Questo fallisce perché abbiamo bisogno di generare "valore" per creare un numero diverso da zero, dobbiamo rinunciare a ()
per crearne uno che rende impossibile spingere più di due volte.
[...]/[]
Questo non riesce per lo stesso motivo per cui l'ultimo fallito. Le parentesi quadre sono davvero pessime nel valorizzare. La []
monade può creare valore ma prima dobbiamo spingere i numeri e poi non ci sono abbastanza parentesi da spingere tre volte.
{...}/{}
Questo è promettente, potremmo creare un loop e usarne uno ()
per spingere più volte, ma purtroppo non è possibile.
Affinché il loop finisca ci deve essere uno zero nello stack ad un certo punto e per poter avere l'output corretto dobbiamo avere qualcosa di diverso da zero nello stack alla fine del programma. Poiché non abbiamo []
né <>
lo zero alla fine del loop, dobbiamo essere uno zero implicito dal fondo dello stack. Ciò significa che il loop non può aggiungere nuovi numeri allo stack rendendolo inutile.
Poiché nessuna delle opzioni di controvento può creare un programma di lunghezza 12, non può esistere nessuno.
Poiché Miniflak è un sottoinsieme di Brain-Flak, qualsiasi programma Miniflak più breve sarebbe anche un programma Brain-Flak più breve e quindi non esiste.
Brain-Flueue è un linguaggio scherzoso basato su Brain-Flak. I due sono così simili che i loro interpreti sono identici ovunque tranne che in due righe. La differenza tra i due è, come suggeriscono i loro nomi, Brain-Flueue archivia i suoi dati in coda mentre Brain-Flak archivia i suoi dati in stack.
Per iniziare abbiamo le stesse restrizioni sulla dimensione del programma creata da Brain-Flak, quindi stiamo cercando un programma di dimensione 12. Inoltre avremo bisogno di un (...)
per creare qualsiasi output e un'altra coppia. le coppie <>
e []
non funzionano in Brain-Flueue per la stessa identica ragione per cui non funzionano in Brain-Flak.
Ora sappiamo che il nostro programma deve essere composto da personaggi ((())){{{}}}
.
Tramite gli stessi metodi usati nella prova precedente possiamo dimostrare che ci deve essere un ciclo nel programma finale.
Ora qui è dove le prove differiscono, perché Brain-Flueue opera attraverso le code anziché impilare il programma può uscire da un ciclo con i valori sulla coda.
Per uscire dal ciclo avremo bisogno di uno zero nella coda (o di una coda vuota ma se la coda è vuota avremo lo stesso problema di Brain-Flak) questo significa che dovremo aprire il nostro programma ({})
per creare il zero. Avremo bisogno di un push all'interno del loop per spingere il numero necessario di elementi in coda. Dovremo anche spingere un numero diverso da zero prima del loop in modo da poter entrare nel loop; questo ci costerà al minimo assoluto (())
. Ora abbiamo usato più genitori di noi.
Pertanto, non esiste alcun programma Brain-Flueue per eseguire l'attività di 12 byte, e inoltre il nostro programma è ottimale.
La seguente soluzione è ottimale in Flakcats e Brain-Flak Classic.
((([][][])))
Spiegazione
[][][] -3
((( ))) push 3 times
Soluzioni alternative Brain-Flak a 24 byte
(<((<((<(())>)())>)())>)
Provalo online!
((<((<((<>)())>)())>)())
Provalo online!
((((((()()()){}){}){})))
Provalo online!