Suggerimenti per il golf a Befunge


12

Quali consigli generali hai per giocare a golf in Befunge? Sto cercando idee che possano essere applicate ai problemi del codice golf in generale che siano almeno in qualche modo specifiche per Befunge (ad esempio "rimuovere i commenti" non è una risposta). Si prega di inviare un suggerimento per risposta.


Non sono sicuro che questo debba essere modificato in Befunge in generale, ma Befunge 93 è molto meno ideale per giocare a golf rispetto al 98.
Justin

6
Abbiamo avuto un recente argomento su Befunge 93 , ma penso che sarebbe meglio generalizzare questo argomento. Andrebbe bene? (e forse segnare quali suggerimenti sono buoni per quale versione / e, allo stesso modo in cui i suggerimenti di Python dicono se sono o meno specifici per Python 2 / Python 3)
Sp3000

Risposte:


9

Quando si utilizza un loop multilinea, provare a utilizzarne il più possibile:

>1234....v
^        <

vs

>1234v
^....<

7

Devi eliminare un valore dopo un condizionale (ad es. Perché l'altro percorso dipende dal valore, ma questo non lo fa)? Invece di usare >$o $<, sii avvantaggiato dal fatto che conosci il valore di verità della variabile e usi _invece sia per cambiare direzione che pop stack.

Esempio

'* : v           >$ .. @          Prints number in binary followed by the original
                                  decimal number.
     > :2%\2/ :!#^_ \.

viene trasformato in

'* : v           _  .. @          Since we know that the topmost value on the stack
                                  will be 0, we combine `>$` into `_`.
     > :2%\2/ :!#^_ \.

6

Non dimenticare che 0è sempre in pila. Ad esempio, ciò significa che, con uno stack vuoto, gè equivalente 00ged pè equivalente a 000p.


5

Se devi spingere un numero maggiore di 15, usa 'per recuperare il valore ASCII del carattere successivo:

'*

spingere 42 anziché:

4a*2+

Oppure 67*funziona anche
Maniglia della porta

4
@Doorknob Forse avrei dovuto scegliere un numero primo per ottenere un punto più chiaro, ma 42 è un numero così grande.
Justin,

2
Nota che questo suggerimento si applica solo a Befunge-96 e versioni successive. Befunge-93 non supportava l' 'istruzione.
James Holderness,

4

Invece di usare |, richiedendo un'altra linea (spesso con molti spazi extra), prova ad usare j. Per esempio:

01-`j@more code here

si fermerebbe se il numero in cima alla pila fosse negativo e continuerebbe altrimenti. Se sono necessari più caratteri, utilizzare n*jdov'è nil numero di caratteri necessari quando il valore passato jè 0. Esempio:

01-`4*j01-*more code

che negherebbe un numero negativo.


Nota che questo suggerimento si applica solo a Befunge-96 e versioni successive. Befunge-93 non supportava l' jistruzione.
James Holderness,

4

In Befunge-93, se la prima cosa che stai spingendo in pila è una stringa, puoi spesso cavartela lasciando cadere la citazione di apertura. Ad esempio questo:

"!iH",,,@

potrebbe essere semplificato a questo:

!iH",,,@

Provalo online!

Quello che sta succedendo è che l'interprete tenta innanzitutto di eseguire i caratteri nella stringa non quotata. Le !esegue un innocuo non , e la ie Hnon sono istruzioni valide, quindi sono ignorati (anche se su alcune implementazioni è possibile ottenere un avvertimento).

Quando "viene rilevato, viene considerato l'inizio della stringa, ma poiché non è presente alcuna virgoletta di chiusura, si avvolge completamente attorno al campo di gioco fino a quando non "viene rilevato una seconda volta. Ciò che viene inserito nello stack è quindi questo:

,,,@  ···72 spaces···  !iH

Dal momento che ci preoccupiamo solo degli ultimi personaggi, nessuna di queste cose è importante. Quindi dopo la citazione, possiamo finalmente eseguire i tre ,comandi, scrivere il messaggio e il @comando che esce.

Si noti che questo in genere non funziona in Befunge-98, poiché un'istruzione non riconosciuta farà riflettere l'interprete invece di ignorarlo.


In Befunge-98 puoi invece mettere la stringa richiesta alla fine della linea, in questo modo; ",,,@!iH. Nota che Pyfunge aggiunge uno spazio extra, mentre FBBI no.
Jo King,

@JoKing Non volevo suggerire che, come hai sottolineato, il comportamento differisce da un interprete all'altro. E anche quando sembra funzionare, è incoerente (notare lo spazio aggiuntivo in FBBI in questo caso ), quindi è probabilmente un bug che potrebbe finire per essere risolto ad un certo punto.
James Holderness,

Hmm ... Penso che lo spazio potrebbe effettivamente far parte delle specifiche. Ricordo di aver letto da qualche parte che più spazi verranno saltati e conteggiati come un singolo spazio. Esempio sia in PyFunge che in FBBI. FBBI sembra riempire ogni linea della lunghezza della linea più lunga mentre PyFunge aggiunge implicitamente gli spazi extra.
Jo King

Hai ragione: la specifica dice che più spazi in una stringa dovrebbero essere trattati come un singolo spazio. In effetti, quella regola è stata specificamente proposta per affrontare il problema di avvolgere le stringhe in un campo di gioco infinito (quindi PyFunge è chiaramente AFAIC corretto). Ma la descrizione della specifica dell'algoritmo di wrapping è in qualche modo aperta all'interpretazione, quindi posso capire perché alcune implementazioni potrebbero fare le cose in modo diverso. Ma la linea di fondo è che questo è un problema abbastanza complicato, e penso che sarebbe meglio coprirlo come un suggerimento separato specifico per Befunge-97/98.
James Holderness,

4

In Befunge-93, può spesso essere vantaggioso appiattire un loop in una singola riga, con la sezione loop del codice eseguita in entrambe le direzioni.

Ad esempio, considera il codice seguente, che emette la lettera aotto volte:

"a"9>1-:#v_@
    ^\,:\<

Questo può essere appiattito in un'unica riga intervallando la sequenza del loop con le istruzioni del bridge ( #):

"a"9>1#\-#,:#:>#\_@

Provalo online!

Se stai solo guardando i caratteri non bianchi, potresti avere l'impressione che questo sia più lungo dell'originale. Ma una volta che si tiene conto dell'alimentazione di linea e dell'imbottitura aggiuntiva richiesta nella versione a due righe, si finisce per salvare quattro byte.

In questo caso particolare, il codice può essere compresso ulteriormente notando che quella sequenza :#:può essere semplicemente sostituita con :.

"a"9>1#\-#,:>#\_@

Provalo online!

In effetti, ogni volta che si ripete la stessa istruzione su entrambi i lati di un #comando, è possibile semplificare questa in una sola istruzione, quindi è qualcosa che si dovrebbe sempre fare attenzione quando si appiattisce un ciclo.

Per capire come funziona, può essere utile scrivere due volte la sequenza di loop, una volta con tutti i caratteri che seguono il #rimosso (cioè cosa succede quando si esegue da sinistra a destra) e una volta con i caratteri che precedono il #rimosso (cioè eseguendo da destra a sinistra ).

"a"9>1#\-#,:>#\_@
    >1  -  :>  _      ; executing left to right
    >  \  ,:  \_      ; executing right to left

Ora puoi vedere chiaramente come questo corrisponde alla versione originale a due righe del codice.


3

Output per codice di uscita, dove si tratta di un modulo di output consentito. Se la sfida richiede di stampare un numero, è possibile salvare un byte chiudendo il programma con qinvece di.@


2
Si noti che questo suggerimento si applica solo a Befunge-98 e versioni successive. Nelle versioni precedenti di Befunge l' qistruzione aveva una funzione diversa (modalità coda) o non era supportata.
James Holderness,

3

In Befunge-93, il comando di immissione caratteri ( ~) può spesso essere usato come scorciatoia per -1, poiché questo è il valore che restituisce su EOF.

Ad esempio, il codice seguente mostrerà -1:

~.@

Provalo online!

Questo non è raccomandato nel codice di produzione, poiché quando viene eseguito in un ambiente interattivo, il programma si interrompe e attende l'input dell'utente. E ovviamente se l'utente dovesse inserire qualcosa, il risultato non sarebbe più -1.

Detto questo, la regola su PPCG è che un programma può assumere un flusso di input vuoto , ed è così che verrebbe normalmente eseguito su TIO .

Si noti inoltre che non è necessariamente precluso l'utilizzo di questo trucco solo perché il programma deve leggere qualcosa dal flusso di input. Devi solo assicurarti di elaborare i tuoi input in anticipo, dopodiché tutti gli usi futuri di ~dovrebbero restituire -1.


2

Usa la direzione dell'IP quando hai a che fare con _o |, invece di usare un carattere in più per !.

Esempio reale (da questo post ):

#v~
,>:!#@_

Può essere cambiato in

#v~
:<,_@#

2

Non dimenticare che 0knon esegue l'istruzione successiva. Ciò significa che invece di fare:

;some boolean test;!jv;code if false;
       ;code if true;<

Puoi salvare un personaggio facendo

;some boolean test;kv;code if false;
      ;code if true;<

Si noti che questo suggerimento si applica solo a Befunge-98 e versioni successive. Le versioni precedenti di Befunge non supportavano le kistruzioni.
James Holderness,

1

Non dimenticare l' koperatore. Invece di "!dlroW olleH",,,,,,,,,,,,@, fallo "!dlroW olleH"bk,@. Si noti che kfa l'operazione sulla cella che è in così 9k,sarebbe stampa non 9 volte, ma 10; 9 volte con il k, e una volta con ,.


1
Si noti che questo suggerimento si applica solo a Befunge-98 e versioni successive. Le versioni precedenti di Befunge non supportavano le kistruzioni.
James Holderness,

1

Quando si spingono piccoli numeri in pila, probabilmente si può capire abbastanza facilmente che 45*ti porterà 20e 67*ti prenderà 42. Quando si tratta di numeri più grandi, tuttavia, è davvero necessario un programma in grado di calcolare la rappresentazione più efficiente per te.

L'opzione più semplice per questo è l' interfaccia online di Mike Schwörer per BefunRep . Digiti semplicemente un numero e ne uscirà una rappresentazione Befunge equivalente. Non è sempre il più ottimale, ma è abbastanza vicino, ed è quasi certo di essere migliore di qualsiasi cosa tu possa inventare a mano.

Il sistema online è limitato ai numeri nell'intervallo da 0 a 16777215, quindi se hai bisogno di qualcosa di più grande di quello, ti consigliamo di scaricare l' utilità BefunRep autonoma ed eseguire i calcoli da solo.

Se stai programmando in Befunge-98, un'altra opzione da considerare è Fungify . In generale non è quasi ottimale come BefunRep, ma per alcuni dei numeri più bassi, dove le cifre esadecimali e i caratteri a virgoletta singola sono più efficaci, a volte può produrre risultati migliori.


Quando si spinge piccoli numeri in Befunge 98, si userebbe '. Ad esempio per 42:'*
Giustino il

@Justin L'ho detto nell'ultimo paragrafo, ma il punto centrale di questo suggerimento è che non devi conoscere molti di questi trucchi per generare numeri se usi semplicemente uno strumento per farlo per te.
James Holderness,
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.