Braver Beaver occupato


13

Scrivi un programma Brainfuck di non più di 256 caratteri che esegua il maggior numero di passaggi possibile, ma non esegua il ciclo all'infinito. Il programma potrebbe non accettare alcun input.

Più specificamente:

  • Supponi un numero infinito di celle a destra.
  • Un <quando nella cella più a sinistra non fa nulla.
  • A -quando il valore della cella è zero imposta la cella su 255.
  • Le istruzioni +-<>.contano tutte come un passo quando eseguite.
  • Quando si incontra un [o ], conta come un passo. Tuttavia, se la condizione è vera e flusso di controllo salta, il corrispondente ]o [fa non ancora conta come un passo.
  • Vince la soluzione che compie più passaggi.
  • Se esiste una sorta di modello nella soluzione, nè gradita ma non obbligatoria fornire una funzione per quanti passi richiederebbe un programma simile di lunghezza .
  • Per contare le istruzioni, puoi usare questo interprete modificato :

Esempio:

++[-]

Le istruzioni rilevate sono ++[-]-]e il programma è stato eseguito per 7 passaggi.


6
Sarei sorpreso se il vincitore termina senza traboccare il conteggio dell'interprete. Tieni presente che il castoro occupato a 6 stati TM compie almeno 10 ** 36534 passi.
Peter Taylor,

Sono d'accordo. Sembra molto probabile che tu possa scrivere un programma BF <50 caratteri che potrebbe funzionare per anni. Inizierò.
captncraig,

Firmato. La pagina per la ricerca Beaver Occupato a drb.insel.de/~heiner/BB è molto interessante, soprattutto il fatto che i programmi di registrazione gestito estremamente lungo e hanno ancora risultati esatti (vedi drb.insel.de/~heiner/BB/bb -xlist.txt ) - le simulazioni ricordano gli stati, costruiscono "macro" per salvare i passaggi della simulazione, ecc.
schnaader,

4
@AntonGolov: purtroppo, in questo universo, RAM e HDS non convertire in dispositivi di archiviazione infinito quando si tenta di memorizzare bignum più grandi di 256 ^ dimensione in byte su di loro ...
cessato di girare counterclockwis

1
@boothby È perfettamente possibile eseguire calcoli esatti che coinvolgono trascendentali su computer attuali. I componenti dei valori devono essere archiviati in una rappresentazione più astratta rispetto ai normali floato ai doubleprimitivi utilizzati per il calcolo generale di tutti i giorni. (A quel punto il computer sta principalmente manipolando stringhe che rappresentano l'equazione)
AJMansfield

Risposte:


15

Ecco un programma di 41 caratteri che alla fine si ferma, lasciando più di 10 ↑ (10 ↑ 28) celle contigue impostate pari a 1 (quindi il numero di istruzioni eseguite è molto maggiore di quello):

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

Se non sbaglio, questa è una traduzione corretta del seguente programma nel linguaggio variante BF che utilizza un singolo bit per ogni cella di memoria (vale a dire, contenuto della cella 0..1 invece di 0..255, quindi '+' agisce semplicemente per capovolgere il valore bit):

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

Il valore esatto (il numero di 1 bit adiacenti) prodotto da quest'ultimo programma è

3 * (2 ↑ 118842243771396506390315925503 - 1) + 1.


Il programma sopra inizializza e calcola una funzione che cresce come 2 ↑↑ x (nella notazione con la freccia su di Knuth ). La conversione simile di un programma variante BF che inizializza e calcola una funzione che cresce come 2 ↑ 23 x fornisce il seguente programma di 256 caratteri:

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

che alla fine si ferma, lasciando più di 2 ↑ 23 6 celle adiacenti impostate pari a 1 (quindi il numero di passaggi è enormemente più di quello).

NB-1 : 2 ↑ 23 6 è un numero "inconcepibilmente grande"; per esempio, anche 2 ↑ 4 6 = 2 ↑↑↑↑ 6 supera già il primo termine (3 ↑↑↑↑ 3) nella sequenza utilizzata per calcolare il numero di Graham .

NB-2 : Penso che sia probabile che 256 caratteri siano sufficienti per un programma BF per inizializzare e calcolare una funzione con output molto più grande del numero di Graham - se trovo il tempo, forse proverò a scriverne uno.

NB-3 : Nel caso qualcuno fosse interessato all'origine dei programmi di cui sopra, ecco alcune risorse di programmazione per "Brainf * ck F" , con vari programmi scritti in Python. ("Brainf * ck F", o semplicemente "F", è ciò che ho chiamato una variante completa di Turing dell'esolanguage Smallf * ck .) Ho appena caricato questi file, che sono stati offline per diversi anni, e per ora il la pagina web collegata è solo un "file cabinet" - vedere il file Busy_Beavers.txt per una discussione dettagliata relativa ai programmi sopra.


Questo è un chiaro vincitore al momento (a meno che non stia solo sottovalutando gli altri). Altri suggerimenti sono i benvenuti, ma lo contrassegnerò come accettato per ora. Se qualcuno non è d'accordo, si prega di commentare.
Anton Golov,

Quando arrivi a questo livello, diventa irrealistico supporre di avere un interprete con memoria infinita. Sto iniziando a pensare che questa sarebbe una sfida migliore con una memoria a capo finito, in modo da poter effettivamente eseguire le risposte.
captncraig,

9

Ecco un bel personaggio di 39 caratteri:

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

Fondamentalmente crea una 'slitta' di 3 spazi che si sposta a destra e diminuisce di uno. Completato in 31.919.535.558 istruzioni, con il ciclo più interno eseguito 256 ^ 3 volte. Ho ancora un sacco di spazio per estendere abbastanza lontano ad una velocità di 14 caratteri ad un altro ordine di grandezza per il tempo di esecuzione.

Funziona su qualsiasi interprete con memoria illimitata o con memoria a capo.

Lascio un esercizio al lettore per determinare quando finirà la versione migliorata di 2 loop:

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

Ora è stato eseguito durante la notte ed è oltre 3.000.000.000 di passi. Non ha ancora superato una singola iterazione del ciclo esterno. È appena riuscito a superare il 15% del secondo loop.


2

Questo programma funziona in numero infinito di celle. Due valori sono inizializzati all'inizio con valori ascii 255. Il primo valore alla prima rotazione dell'anello principale è diviso in 255 celle e sono inizializzati con 255 ciascuno, alla seconda rotazione dell'anello principale ogni valore in 255 celle si divide nuovamente fino a 255 * 255 celle, allo stesso modo per 255 rotazione dell'anello principale le celle totali inizializzate saranno 255 ^ 255. Il secondo valore determina quante volte il loop principale deve essere ripetuto.

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

2

Questo programma è quasi uguale al mio programma precedente, la differenza è che il valore che determina il loop esterno rimane fisso in una particolare cella, quindi è possibile aumentare sia il numero di celle inizializzate sia i passi totali alla fine del programma

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

celle inizializzate alla fine del programma 255 ^ 255

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

celle inizializzate alla fine del programma 255 ^ 255 ^ 3

L'ho modificato ulteriormente per eseguire ancora più numero di passaggi.

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

inizializza 255 ^ 255 celle durante la prima rotazione delle celle principali 255 ^ (255 ^ 255 * 255) durante la seconda rotazione dell'anello principale 255 ^ {255 ^ (255 ^ 255 * 255) * 255} celle durante la terza rotazione dell'anello principale in in questo modo il loop si ripete 255 volte


Sembra fantastico! Ci scusiamo per non aver ancora accettato una risposta - Devo prendere un po 'di tempo per guardarli e capire l'ordine di crescita. Quando dici "255 ^ 255 * 255", intendi "255 ^ (255 * 255)"? (Mi aspetterei "255 ^ 256" altrimenti.)
Anton Golov,
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.