La cella alla fine dell'arcobaleno


31

Sappiamo tutti, o almeno ne abbiamo sentito parlare, brainfuck , una delle lingue esoteriche più famose e influenti. Mentre oggigiorno la maggior parte delle implementazioni utilizza un nastro infinito, il compilatore originale di Urban Müller aveva un nastro di 30000 celle. Un fatto poco noto * è che in realtà c'è un valore speciale alla fine del nastro, qualcosa con cui non si interagisce quasi mai in un tipico programma brainfuck.

Sebbene sia possibile stampare questo valore con 29999 se >a ., brainfuck è noto per le sue soluzioni brevi e concise, quindi il tuo obiettivo è stampare questo valore con il numero minimo di caratteri.

* fantascienza

Regole:

  • Un aggiornamento delle istruzioni di Brainfuck:
    • +/ -: Incrementa / decrementa la cella corrente, avvolgendo da 255 a 0 quando 255 viene incrementato e viceversa
    • </ >: Sposta il puntatore a sinistra / a destra sul nastro
    • .: Stampa il valore della cella corrente.
    • [: Passa al corrispondente ]se il valore nella cella è 0
    • ]: Passa al corrispondente [se il valore nella cella non è 0
  • In questo caso ,(Ottieni input) non fa nulla, poiché il compilatore originale lascia invariata la cella su EOF e questo programma non dovrebbe ricevere input.
  • Inizialmente il nastro viene riempito con tutti gli 0, ad eccezione della cella 30000, che contiene un valore sconosciuto
  • Il puntatore inizia alla cella 1 e dovrebbe terminare sulla cella 30000, dopo averlo stampato.
  • Le celle a sinistra di 1 e a destra di 30000 hanno un comportamento indefinito, quindi le soluzioni non dovrebbero visitare queste cellule.
  • Si noti che il valore a 30000 è può essere un 0, così semplicemente loop fino a colpire un non-zero cellule non funzionerà.
  • È necessario stampare solo il valore nella cella 30000
  • Vince la soluzione più breve!
    • Tie-breaker è il programma più efficiente (viene eseguito nei passaggi minimi), seguito dal tempo di invio più veloce.

Suggerimento: Esolanging Fruit suggerisce di utilizzare https://copy.sh/brainfuck per testare il codice. Le specifiche sono come descritte in questa sfida e puoi selezionare l' abortopzione in modo che il tuo programma si interrompa se va oltre i limiti.


Sandbox (cancellato)
Jo King

3
1 byte: .. Io vinco.
Esolanging Fruit

1
@EsolangingFruit Fammi avere le mie delusioni per favore ...
Jo King

1
Suggerisco di cambiare la regola in "inizialmente tutte le celle hanno il valore di 0, tranne l'ultima cella che ha un valore sconosciuto".
user202729

4
Suggerimento per chiunque lo faccia: copy.sh/brainfuck è probabilmente il miglior sito per farlo, poiché implementa BF come descritto in questa sfida e ha un nastro da 30k di default. Spostarsi oltre la fine del nastro provoca l'interruzione dell'interprete.
Esolanging Fruit

Risposte:


17

54 byte

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

119 x 252 = 29988. Anello nidificato semplice.

Ho usato questo strumento per verificare che il puntatore si fermasse a 29999.


12

50 byte

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

Provalo qui!

La prima sezione ( >+[>+[<]>->+]>-<<) imposta il nastro come

0*12 121' 0 110

La sezione successiva ( [>>-------[[>]+[<]>-]<<-]) ripete 121 volte, aggiungendo 1ogni volta 249 s alla fine del nastro. Se sei veloce con la matematica, potresti realizzare questi risultati 121 * 249 in 30129 1s, ma la prima iterazione ha 110 rimanenti da affrontare e aggiunge solo ( 110-7) 103 1s al nastro, il che significa che ci sono solo 29983 1s. Il nastro finale appare come:

0*12 0' 0 0 1*29983 0 ???

E un finale >>>[>]>.per stampare il valore.

Alcuni altri algoritmi di nota:

  • 252 * 119 = 29988 (anche 50 byte)
  • 163 * 184 = 29992 (56 byte)
  • 204 * 147 = 29988 (60 byte)
  • 153 * 196 = 29988 (56 byte)
  • 191 * 157 = 29987 (57 byte)
  • 254 * 118 = 29972 (56 byte)
    • Questo è quello che considero il prossimo più vicino a battere 50, poiché i byte extra stanno praticamente viaggiando solo per la distanza extra. Se potessi trovare un algoritmo che genera 118 e viaggia oltre 14 celle, questo potrebbe batterlo.

3

81

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

Questo si sposta di 150 celle 200 volte.

Questo è molto più lungo di quanto mi piacerebbe che fosse, e c'è un serio ostacolo al golf:

Non so più perché lavoro.

Ciò è disseminato di compensi per quelli fuori dal punto al punto che alcuni di loro potrebbero probabilmente annullarsi. Ho aggiunto ed eliminato vari segmenti così tanto che non ricordo più perché ho messo certe cose dove sono (per esempio, perché la prima parte inizializza le celle a nastro su 199 e 151 anziché su 200 e 150?).

Ecco comunque la mia versione commentata di questa mostruosità, nella speranza che io (o qualcun altro) possa trovarle utile:

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

0 0 0 199' 155

[
  n' k 0
  >[
    n k' j
    ->+[[->+<]<]>
    0' n k-1 j+1 OR
    n 0 0' j+1
    >>
  ]
  0*k n 0 0 k 0'
  <[-<<+>>]<<<-
  0*k n-1' k
]
>-------[[->+<]>-]>.

Questo in realtà non stampa il valore e se il valore è positivo, trabocca. Ma un grande tentativo
Jo King

Quindi aggiungere un ., sarebbe d'aiuto?
user202729

1
@JoKing Risolto questo.
Esolanging Fruit
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.