Suggerimenti per giocare a golf negli spazi bianchi


14

Quali consigli generali hai per giocare a golf in Whitespace? Sto cercando idee che possano essere applicate ai problemi del code-golf e che siano almeno in qualche modo specifiche per gli spazi bianchi (ad esempio "rimuovere i commenti" non è una risposta).

Si prega di inviare un suggerimento per risposta.


82
Rimuovi gli spazi bianchi non necessari.
KSFT,

1
s / [^ [: space:]] // g
Trauma digitale il

Risposte:


11

Non sono del tutto sicuro se questa sia una domanda scherzosa o no, quindi spero di non essere derisa per prenderla sul serio, ma ...

Suggerimento 1: non terminare il programma

La specifica dice che un programma dovrebbe essere terminato da tre feed di riga [LF][LF][LF], in cui il primo è il controllo di flusso IMP, e i successivi due sono il comando quit, ma molti interpreti eseguiranno il codice senza la fine corretta. Ti salva 3 caratteri in qualsiasi programma.


6

Suggerimento 2: utilizzare l'heap il meno possibile

Usavo molto l'Heap per contare i miei loop e simili, ma mi rendevo conto che in realtà era estremamente inefficiente; prima spingendo un indirizzo, ottenendo il conteggio corrente, prendendo / aggiungendo uno, re-spingendo indirizzo, ecc.

Ora spingo un valore nello stack per agire come contatore di loop, quindi uso il [Space][LF][Tab]comando swap per tornare ad esso quando ne ho bisogno. Ci vuole un sacco di lavoro dentro / intorno, ma quando lo ottieni può davvero ridurre il conteggio dei caratteri.


5

Usa indirizzi heap arbitrari

Molti interpreti ti consentono di leggere / scrivere in indirizzi heap arbitrari invece di iniziare da 0 o 1 e contare. Puoi duplicare un valore di stack esistente (3 byte) da utilizzare come indirizzo invece di inviare un nuovo valore (minimo 4 byte)


+1. Si noti che ciò si applica solo agli indirizzi heap non negativi. Pertanto, se la parte superiore dello stack è un numero intero negativo, non è possibile utilizzarlo come indirizzo heap.
Kevin Cruijssen,


5

Abbassa tutti i caratteri di un importo fisso e aggiungilo subito prima di stampare in un ciclo

Ringraziamo @LukStorms , che utilizza un approccio simile nella sua risposta alla sfida Hello World .

( STNusato rispettivamente per Space, Tab e New-line.)

La spinta dei valori per le lettere è sempre di 11 byte (ovvero spingendo il valore 65 per il carattere 'A' è SSSTSSSSSTN; spingendo il valore 122 per il carattere 'z' èSSSTTTTSTSN ). Quando si desidera produrre grandi quantità di testo, questo può essere costoso. Invece, puoi abbassare i valori di tutti i caratteri che vuoi stampare di un importo fisso, e quindi nel ciclo per stamparli aggiungere questo importo fisso.

Questo può essere fatto con il seguente codice (supponiamo che in questo caso il valore fisso sia 100):

  1. Spingere tutti i valori per i caratteri (meno la quantità fissa 100) in ordine inverso
  2. NSSN (Crea un Label_0; sostanzialmente avvia il ciclo)
    1. SSSTTSSTSSN (Spingere l'importo fisso 100)
    2. TSSS (Aggiungi i primi due valori dello stack insieme)
    3. TNSS (Pop e stampa il valore ora corretto come carattere)
    4. NSNN (Vai a Label_0; vai alla successiva iterazione del loop)

Ciò interromperà il programma con un errore ( che è consentito in base alla meta ) non appena tenta di eseguire l'Add ( TSSS) con nient'altro nello stack. Ho usato questo per giocare a golf questa mia risposta (vedere i punti 5 e 6 delle cose che ho fatto per ridurre il conteggio dei byte ).

Se l'approccio più breve è un numero fisso di 100, dipende da cosa si sta stampando. @LukStorm, ad esempio, ha usato 107 nella sua risposta Hello World.

Si noti che la copia del valore più alto ( SNS) per due degli stessi caratteri adiacenti (come lin Hello) o la copia di valori da un'altra posizione può ancora essere utilizzata in aggiunta a questo per golfare più byte.


4

Saltare a etichette indefinite termina il programma (in alcuni interpreti)

Questo inizia ad entrare nel comportamento specifico dell'implementazione, ma credo che questo sia permesso .

TIO (e forse altri interpreti? Almeno non funziona su ideone) interromperà l'esecuzione quando si tenta di saltare a un'etichetta che non esiste. Se è necessario eseguire un confronto per uscire da un ciclo, ciò consente di salvare byte non dichiarando l'etichetta di interruzione. (Vedi il mio commento su Stampa testo invisibile per un esempio.)


4

Il valore 0 può essere dichiarato come un numero senza cifre binarie

Il tutorial sugli spazi bianchi menziona che i numeri possono avere un numero qualsiasi di bit / cifre binarie. Ciò significa che un numero senza bit (oltre il bit di segno richiesto) è una rappresentazione valida del valore 0.[Space][Space][Space][LF] e [Space][Space][Space][Space][LF]sia spingere il valore 0 per la pila, ma il primo è un byte più breve.


0

La copia di numeri interi precedenti può essere più breve della creazione di nuovi numeri interi

(STNusato rispettivamente per Space, Tab e New-line.)

STS+ L'argomento numerico può essere usato per copiare il file n ° punto all'ordine del pila (proposta dal argomento) sulla parte superiore dello stack . Questo può in alcuni casi essere utilizzato per salvare byte.

Ad esempio, in questa mia risposta ho spiegato nel 4 ° elemento delle cose che ho fatto per ridurre il conteggio dei byte di come copiare il primo valore (indicizzato 0) ( STSSTN) è più breve di premere 12 per creare il carattere 'p' ( SSSTTSSN) nella parte "pop"dell'output. (NOTA: utilizzo il valore 12 anziché 112 per il carattere 'p', perché ho applicato quest'altro suggerimento per abbassare tutti i valori di un importo fisso, che aggiungiamo prima di stampare i caratteri nel ciclo .)

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.