Suggerimenti per giocare a golf in lingue 2D


18

Quali consigli generali hai per giocare a golf in linguaggi di programmazione bidimensionali? Sto cercando suggerimenti che possono essere applicati a problemi di code-golf e sono specifici per i linguaggi di programmazione 2D, ma non specifici per nessuna lingua (risposte come "rimuovi commenti" e "usa l' Moperazione" non sono risposte).

Si prega di inviare un suggerimento per risposta.


Questa domanda non dovrebbe essere su Meta?
Sig. Lister,

2
C'è una meta domanda correlata qui: qual è la dimensione di un programma 2D? Area coperta? Area dello scafo convesso? Area del rettangolo contenente asse allineato? Tutti potrebbero essere misure migliori di una qualche forma di dimensione ASCII.
Sali

Le domande di @MrLister Tips sono in argomento per il sito principale. Se guardi puoi vedere che abbiamo già molte domande sotto il tag suggerimenti.
Wheat Wizard

@MSalters Proprio come ogni altro linguaggio di programmazione è misurato in byte. Alcuni progettisti di lingue consentono che i linguaggi 2D vengano organizzati in modi diversi, come Hexagony o Cubix, e questo dipende da loro.
Wheat Wizard

Risposte:


19

Evitare spazi vuoti orizzontali

Spesso, il codice lascia grandi spazi vuoti di spazi bianchi sul lato sinistro del programma, in questo modo.

abc
  d
  e

Ciò aggiunge 4 byte, quando ciò potrebbe essere evitato allineando a sinistra.

cde
b
a

Se è necessario utilizzare ampi spazi vuoti, provare a renderli verticali anziché orizzontali.

########
#      #
#      #
#      #

vs

####
#
#
#
#
#
#
####

11

Usa una dimensione quando possibile

In genere, i programmi più semplici possono essere scritti su una sola riga. Ad esempio, il classico programma cat potrebbe essere:

>iv
^o<

Ma si potrebbe abusare del comportamento di avvolgimento e rendere questo:

io

Oppure, in lingue senza tale comportamento di avvolgimento:

> ?oi<

(Supponendo ?che non compaia.) Nel caso di un linguaggio non avvolgente, un ciclo esplicito è spesso migliore.

Con comandi di salto

In linguaggi 2D con comandi di salto e salto condizionato, un programma potrebbe apparire così:

abc >de?v;
    ^hgf<

Questo potrebbe anche essere:

abc de?!;hgf04&

(se !è un trampolino ed &è saltare in posizione)


Il tuo terzo esempio non funziona ioiioiioiecc.?
ASCII

@ Solo ASCII In effetti lo fa. Ops.
Conor O'Brien,

1
Probabilmente dovresti indicare cosa fanno alcuni dei comandi meno regolari. Ad esempio, non so cosa io;fare e tutto quello che so è che ?non si apre. Sembra che questi siano comandi di pesce, ma non penso che siano molto standard.
Wheat Wizard

2
In alcuni linguaggi 2D senza comandi di salto condizionali (come Labyrinth) è anche possibile scrivere spesso programmi a linea singola in loop terminando in modo condizionale il programma con una divisione per zero.
Martin Ender,

10

Anche i ritorni a capo sono byte

Meno 2D puoi farlo, meglio è. Un ritorno a capo è un altro no-op. Senza ignorare i suggerimenti solo da @ATaco e @ ASCII, prova a mantenere la dimensione Y il più piccola possibile.

Questo

###
####
########

è meglio di

###
###
###
##
#
#
#
#

I ritorni a capo non sono sempre byte. \n(avanzamento riga) è un finale di riga regolarmente utilizzato nel testo allineato a sinistra sui sistemi POSIX, sebbene Windows e Mac OS (pre-macOS) utilizzino combinazioni di \n(avanzamento riga) e \r(ritorno a capo).
wizzwizz4,

9

SECCO (non ripetere te stesso)

Mentre astrarre con funzioni è di solito più lungo in Code Golf, può davvero aiutare per i linguaggi 2D. Prova a rielaborare il codice in modo che possa riutilizzare lo stesso frammento, inserendolo / uscendo con due diversi rami di esecuzione.


8

Percorsi interleave

Di solito in un linguaggio 2D c'è un IP che si muove secondo i comandi di direzione. Poiché gli spazi sono sprecati byte, è quasi sempre più efficiente riorganizzare il programma in modo che si avvicini il più spesso possibile a sinistra, risparmiando la necessità di spazi di imbottitura non necessari.


2

Usa gli specchi

A volte gli specchi possono essere utilizzati in due percorsi contemporaneamente (ogni percorso rimbalza su un lato dello specchio). Ciò potrebbe non essere d'aiuto, ma può consentire di riorganizzare il programma o, se si hanno molti cambiamenti di direzione, è possibile sostituirli con meno mirror.


2

Memorizza i modi di dire

Ecco alcuni "modi di dire" che fanno certe cose, a seconda della natura della lingua.

Codice pseudo-lineare

Se è mai richiesta la generazione di codice dinamico, può essere utile utilizzare il modello di codice pseudo-lineare:

v
\"line 1"
\"line 2"
.
.
\"line N"

Supponendo \ev significando ciò che fanno di solito.

Ciclo infinito

In quasi tutti i linguaggi 2D, ><è un ciclo infinito, infrangibile. Se, per qualche motivo, è necessario farlo, questo è il modo migliore, nonostante quanto bello possa sembrare:

>v
^<

In effetti, se rendi il tuo codice un 1-liner , potresti semplicemente usare ^o v, come tale:

i?vo;

Questo v invierà l'IP a se stesso, avvolgendosi. Potresti essere ancora in grado di utilizzare questo approccio in qualsiasi caso in cui un comando direzionale punta a una serie di operazioni (relative).

Quine framework

Di solito, le lingue con un framework string / quote possono avere un quine come questo:

<quote><generate "><output stack><terminate>

Per> <>, questo sarebbe simile a:

":1-r>o<#

Tranne questo si esce con un errore come terminazione. Probabilmente è il più breve > <> quine o, almeno, il più corto che ho trovato.


Questo non sembra davvero un suggerimento.
Wheat Wizard

@WheatWizard Li ho tenuti insieme perché dividerli aveva meno senso per me, essendo tutti modi di dire comuni di layout del programma.
Conor O'Brien,

Perché hai il <in> <> quine?
Jo King,

@JoKing Non sono particolarmente sicuro lol
Conor O'Brien,

Inoltre, "finisce dalla parte sbagliata. Il suggerimento è buono altrimenti, ho usato quel quadro generale in molte delle mie risposte
Jo King,
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.