Suggerimenti per giocare a golf in INTERCAL


10

Quali consigli generali hai per giocare a golf in INTERCAL ? Sto cercando idee che possano essere applicate alle sfide del code golf e che siano almeno in qualche modo specifiche per INTERCAL (ovvero "rimuovere i commenti" non è una risposta utile).

So che le lingue esotiche possono essere davvero utili per vincere gare di golf, ma non vedo molto codice INTERCAL da queste parti. Hai qualche consiglio che può aiutare le persone a ottenere codici competitivi con INTERCAL? Questa lingua potrebbe mai essere competitiva?

INTERCAL è così sottoutilizzato che non ha nemmeno un tag. Così triste...


La maggior parte delle lingue non ha o ha bisogno dei propri tag qui, poiché le sfide specifiche della lingua sono generalmente scoraggiate.
Alex A.

9
Un suggerimento che questo potrebbe non essere il miglior linguaggio del golf, dalla sua pagina di Wikipedia:Despite the language's intentionally obtuse and wordy syntax,
isaacg

Risposte:


2

La rimozione di spazi bianchi / "rumore" può andare oltre quanto ci si potrebbe aspettare

INTERCAL è un linguaggio insensibile agli spazi bianchi. A differenza della maggior parte dei linguaggi insensibili agli spazi bianchi, tuttavia, l'insensibilità va molto oltre quanto ci si potrebbe aspettare.

Ad esempio, DO NOTsono due token, ma possono essere scritti DONOTsenza lamentarsi del parser (praticamente in qualsiasi implementazione ampiamente utilizzata). (Certo, potresti anche scrivere DON'T, ma non è affatto difficile. Potrebbe essere più facile da leggere, però. PLEASEN'TÈ probabilmente più difficile da leggere di PLEASE NOT, però.) In realtà, c'è qualche dibattito sul fatto che gli spazi facciano qualcosa; almeno un parser INTERCAL lo consente anche all'interno di costanti numeriche (non è molto utile quando si gioca a golf). Una cosa da tenere a mente è che la rimozione di spazi bianchi da DO READ OUTdà che può confondere alcuni parser INTERCAL più vecchi a causa del incorporatoDOREADOUTDO(anche se i loro autori generalmente lo considerano un bug, e quindi al giorno d'oggi in genere funziona in un programma valido, non è consigliabile inserire un codice come questo in prossimità di un errore di sintassi, poiché può essere molto più difficile disambiguare).

Ricorda inoltre che puoi ricoprire i personaggi per risparmiare spazio. In ASCII, puoi davvero farlo solo con '.!, ma questo è un trucco molto utile a sé stante. (Quando non si usano le matrici, non c'è possibilità di una scintilla ambiguità anche quando tutti i personaggi del raggruppamento sono uguali, quindi per le voci sul golf, si consiglia di attenersi solo a 'meno che un abbonamento di matrice non richieda realmente un ".) Un topo di biblioteca può essere rappresentato in un byte usando l' ?abbreviazione (C-INTERCAL) o Latin-1 per ¥(CLC-INTERCAL), anziché i tre necessari per INTERCAL-72.


2

Concentrati sul fare più lavoro possibile in una frase

Gli identificatori delle dichiarazioni di INTERCAL sono piuttosto dettagliati; DOsono due caratteri di disturbo su ogni istruzione, anche il nome dell'istruzione stessa tende a essere piuttosto lungo e devi lanciare un PLEASEogni tanto per rendere felice il parser. (Il meglio che puoi fare è un rapporto di quattro DOa uno PLEASE, il che significa che stai usando 14 caratteri negli identificatori per ogni 5 comandi.) D'altra parte, la sintassi dell'espressione è abbastanza concisa (ridicola, ma concisa). Ciò significa che spesso vale la pena inserire parte del programma in una singola espressione anche quando l'uso di più istruzioni sarebbe un modo più "naturale" di fare le cose.

Per esempio, se si desidera assegnare #1al .1e #2al .2, invece di farlo in evidente INTERCAL-72 modo:

DO.1<-#1DO.2<-#2

vale la pena considerare il sovraccarico di una variabile casuale per consentire di assegnare entrambi contemporaneamente:

DO:1<-#1$#2

( :1/!1$.2'inserito in precedenza da qualche parte nel programma; si noti che questa notazione posticipa INTERCAL-72 in un certo senso, quindi per poter funzionare è necessario utilizzare un INTERCAL moderno). Questo è solo leggermente più lungo anche se si tiene conto dell'installazione e si accorcia se si deve o si può organizzare l'assegnazione simultanea .1e .2più di una volta.

Non è solo calcolare i comandi in cui funziona questo trucco. Se devi riporre una variabile due volte, non farlo in questo modo:

DOSTASH.1DOSTASH.1

ma in questo modo:

DOSTASH.1+.1

(La +notazione funziona per la maggior parte dei comandi in cui potrebbe avere un senso concettualmente.)


2

Utilizzare un singolo RESUME per tutti gli stili INTERCAL-72 se conscuct

Se è necessario scrivere l'equivalente di un'istruzione "if", il metodo normale utilizzando il codice INTERCAL-72 è NEXTdue volte e quindi eseguire un calcolo RESUME. (Nel codice moderno, spesso un calcolo COME FROMsarà migliore, ma questo suggerimento presuppone che il tuo codice preferisca NEXT.) Quasi certamente devi pagare i byte per il primo NEXT, poiché salta da un ramo del "if" all'altro. Anche condividere il secondo non NEXTè banale, a meno che tu non abbia molte affermazioni "if" che vanno nello stesso posto quando vedi un #1. Tuttavia, RESUMEpuò essere ovunque nel programma (perché il controllo lo lascerà immediatamente ovunque).

Esistono due modi per gestirlo. Se hai molte dichiarazioni "if", RESUMEprobabilmente garantisce un numero di riga a una cifra, in modo che la tua seconda NEXTistruzione possa essere il più breve possibile. Se possibile, prova a renderlo un calcolo RESUMEche si verificherebbe naturalmente nel tuo codice (è vero, questo è difficile, poiché è raro che quelli compaiano nel "flusso normale" del codice piuttosto che essere NEXTeditati); quindi, l'unico costo è il numero di riga. Dovrai usare una singola variabile booleana per tutti questi NEXTs; il consenso universale qui è da usare .5, principalmente perché è la variabile che la libreria standard usa per valori di ritorno booleani.

In alternativa, è possibile utilizzare una funzionalità non documentata (tecnicamente non documentata, perché ho notato un suggerimento nella documentazione INTERCAL quando ho notato) della libreria standard. Poiché una posizione centrale per a RESUMEè così utile, la libreria standard ne utilizza una internamente. I numeri di riga in INTERCAL sono globali (con convenzioni di spaziatura dei nomi, ma che possono essere interrotti se sai cosa stai facendo), quindi puoi andare NEXTdirettamente negli interni della libreria standard se vuoi, e in particolare, puoi NEXTnella sua posizione centrale RESUME . Questo è abbastanza popolare nel codice INTERCAL esistente che le sostituzioni di librerie standard tendono a doverle implementare per evitare la rottura dei programmi esistenti.

La linea in questione è (letteralmente o efficacemente, a seconda dell'implementazione):

(1001) DO RESUME .5

Il motivo principale per non utilizzare questo è il suo numero di linea lunga; se devi costruire molto INTERCAL-72 se costruisci, sarà meglio usare il tuo per assegnargli un numero più breve.

Certo, puoi combinare le tecniche, scrivendo qualcosa di simile

(9)DO(1001)NEXT

che è solo leggermente più lungo di

(9)DORESUME.5

e ha il vantaggio che i booleani diventano #2e #3(che è più difficile da leggere, ma normalmente più facile da generare). In realtà, potrebbe anche valere la pena inserire il codice aggiuntivo da gestire #0e #1se hai intenzione di iffing molto (ma calcolato COME FROMprobabilmente funzionerà meglio in questo caso a meno che i tuoi requisiti non siano molto strani).


2

INTERCAL non specifica la precedenza, ma non commette errori su precedenza ambigua

Un'espressione simile

#1$#2~#3

è ambiguo e potrebbe significare

'#1$#2'~#3

o

#1$'#2~#3'

Le specifiche INTERCAL lasciano intenzionalmente poco chiaro il significato, e in generale non esiste uno standard (sebbene C-INTERCAL e CLC-INTERCAL facciano uno sforzo per abbinarsi l'un l'altro nei casi più semplici). Detto questo, l'originale non è errato ; è ambiguo e non consiglierei di usarlo nel codice di produzione (ma poi, non consiglierei di usare INTERCAL stesso nel codice di produzione), ma avrà qualche significato nella maggior parte dei compilatori.

In altre parole, può valere la pena semplicemente rimuovere i caratteri di raggruppamento e sperare che il programma funzioni ancora. La maggior parte degli interpreti analizzerà ogni espressione ambigua in modo coerente, quindi per ogni coppia di caratteri di raggruppamento, c'è una possibilità 1 su 2 che non sia necessaria; che può aggiungere un bel po 'di risparmio. (Sfortunatamente, i parser INTERCAL tendono a confondere sufficientemente il fatto che nessuno sia del tutto sicuro di quali siano effettivamente le regole , ma di solito può essere determinato mediante esperimento. Nei casi più semplici, gli operatori tendono a avere tutti la stessa precedenza e avere una associatività coerente).


2

In C-INTERCAL, considera l'abbreviazione del codice usando CREATE

L' CREATEistruzione consente di creare una nuova sintassi. Ciò è particolarmente utile nel golf perché ti permette di dare nomi più brevi. Puoi anche usarlo per "definire una funzione" efficace creando un nuovo operatore (che ha l'enorme vantaggio che ti consente di chiamare la funzione nel mezzo di un'espressione).

Il costo di installazione qui è piuttosto alto, ma se c'è un costrutto che usi molto, inventare una sintassi più breve per questo probabilmente sarà una buona idea.

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.