Code a Code Slidey Puzzle!


12

Il puzzle scorrevole più riconoscibile è il quindici puzzle . Ha una griglia 4 per 4, 15 tessere e uno spazio griglia vuoto. Le tessere possono muoversi solo nello spazio vuoto e devono essere sempre in linea con la griglia.

Definiamo un puzzle a scorrimento generalizzato come una griglia W bidimensionale per H alta ( W , H entrambi interi positivi) che contiene un numero di tessere identiche non marcate (tra 0 e W × H di esse) agganciate alla griglia, disposte in in ogni caso (senza sovrapposizioni), con spazi della griglia vuoti che riempiono il resto dell'area.

Ad esempio, se W e H sono 3 e una tessera è Te uno spazio vuoto è Euna delle molte possibili disposizioni di puzzle schierandosi

TTT
TET
EET

Per questi puzzle ci sono 4 possibili mosse: spingere tutto in alto , spingere tutto in basso , spingere tutto a sinistra o spingere tutto a destra . La "spinta" in una direzione fa avanzare il più possibile tutte le tessere in quella direzione fino a quando non colpiscono un'altra tessera o il limite della griglia. A volte spingere non cambia il layout della griglia,

Se la griglia di esempio viene spostata correttamente, il risultato è

TTT
ETT
EET

Spinto a sinistra il risultato è

TTT
TTE
TEE

Spinto in basso il risultato è

EET
TET
TTT

(nota che entrambi Tsono spostati all'estrema sinistra )

Spingere in alto non cambia il layout della griglia in questo caso.

Nota che, poiché le tessere sono indistinguibili, questi puzzle non hanno stati "risolti". Si noti inoltre che un puzzle può iniziare in un layout a cui è impossibile tornare dopo che è stata effettuata una spinta (ad esempio una tessera nel mezzo di una griglia 3 per 3).

Sfida

Usando solo ASCII stampabile scrivi due blocchi rettangolari di codice, entrambi caratteri M larghi e N caratteri alti (per qualsiasi numero intero positivo M , N ). Un blocco di codice rappresenterà una tessera di un puzzle scorrevole, l'altro blocco di codice rappresenterà uno spazio di griglia vuoto.

Disporre questi due blocchi di codice in una griglia W per H creerà un puzzle scorrevole rappresentato da codice che può essere salvato come file di testo ed eseguito come un normale programma. Durante l'esecuzione, questo tipo di programmi dovrebbe richiedere all'utente tramite stdin un numero compreso tra 1 e 4; 1 è per su, 2 in basso, 3 a sinistra, 4 a destra . Quando l'utente digita il suo numero e inserisce i risultati, il programma calcola come spostare i riquadri del codice sorgente in quella direzione e salva il nuovo layout del puzzle in un file (un nuovo file o nello stesso file), quindi termina.

Questo processo può essere ripetuto indefinitamente con il nuovo file di codice a scorrimento scorrevole generato dopo ogni spinta.

Esempio

Supponiamo che il mio blocco di codice del riquadro sia simile a questo

//   my
// tile

e il mio blocco di codice dello spazio griglia vuoto è simile al seguente

//empty
//space

( M = 7, N = 2, questo ovviamente non è un codice reale)

Qualsiasi disposizione di puzzle scorrevole valida di questi due blocchi dovrebbe creare un programma nella lingua che sto usando che può essere eseguito per consentire all'utente di spostarsi in una certa direzione.

La rappresentazione del codice della griglia di esempio è:

//   my//   my//   my
// tile// tile// tile
//   my//empty//   my
// tile//space// tile
//empty//empty//   my
//space//space// tile

Quindi eseguendolo e premendo 2 (per il basso), quindi Invio scriverlo su un altro file (o sullo stesso file):

//empty//empty//   my
//space//space// tile
//   my//empty//   my
// tile//space// tile
//   my//   my//   my
// tile// tile// tile

Il file potrebbe quindi essere eseguito e inserito nello stesso esatto modo.

Appunti

  • Qualsiasi rappresentazione in codice di un puzzle scorrevole W by H dovrebbe essere eseguibile e essere in grado di inserirsi correttamente. Questo include tutti i formati di griglia da 1 da 1 a un valore massimo ragionevole (2 16 da 2 a 16 o più).

  • Un programma può leggere il proprio codice sorgente. Non ci sono restrizioni basate su quine. Anche i commenti di qualsiasi tipo vanno bene.

  • Il programma deve richiedere una direzione in cui spingere anche se non ci sono tessere da spingere o nessuna tessera può essere spinta. Il prompt è semplicemente un posto dove digitare un numero, non è richiesto alcun messaggio.

  • È possibile supporre che l'input sia sempre valido (1, 2, 3 o 4).

  • Riempire i blocchi di codice con spazi va bene. Ricorda che possono essere solo ASCII stampabili, questo significa nessuna scheda e nessuna nuova riga (oltre alle nuove righe che aiutano a formare i blocchi di codice).

  • Se la tua lingua non supporta stdin, utilizza il metodo di input più vicino.

  • Puoi richiedere che una nuova riga sia alla fine dei tuoi file di puzzle di codice. (O richiede che non sia lì.)

  • Il modo in cui assegni nuovi file non è importante. f.txto semplicemente fva bene.

  • I due blocchi di codice potrebbero non essere identici.

punteggio

L'obiettivo è farlo con la dimensione del codice più piccola (motivo per cui questo è taggato code-golf). La presentazione con l'area del blocco di codice più piccola ( M × N ) è il vincitore. Il demolitore va alla risposta più votata.

Correlati: Codice che esegue il Gioco della vita su se stesso


Quindi il programma deve funzionare quando ci sono solo spazi vuoti e nessun blocco di tessere (e viceversa)?
GRC

@grc Sì alla tua prima domanda e ricorda che deve ancora richiedere un valore di spinta anche se completamente vuoto o pieno. No, i blocchi non possono essere identici. Immagino che se lo fossero, potresti affermare di avere una risposta abbastanza banale. Quindi lo menzionerò.
Hobby di Calvin il

Posso specificare il nome del file sorgente originale?
feersum

@feersum Come puoi supporre che sia sempre f.txt? Sì.
Hobby di Calvin il

I blocchi di codice non saranno sempre 1 riga? I blocchi di codice multilinea mi sembrano davvero complessi e gli esolanguages ​​2D probabilmente non hanno il supporto per la scrittura di file.
Def

Risposte:


5

TECO , 153

Blocco vuoto:

0T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Blocco di piastrelle:

1T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Il programma, che si modifica da solo, deve essere salvato in un file denominato x. Può essere eseguito tramite il comando tecoc mung x.. Il punto è importante; senza di essa, TECO ha tentato di trovare un file denominato x.tec. La nuova riga finale deve essere presente.

La restrizione ASCII stampabile è stata un po 'una seccatura per questo, poiché il linguaggio utilizza molti caratteri non stampabili. Molti di essi possono essere sostituiti da una sequenza di due byte che inizia con un punto di inserimento, ma "Escape" (ASCII 27) è l'unico carattere "inevitabile", quindi per ottenerlo ho dovuto inserire il suo valore ASCII in una stringa e eseguilo. Pertanto, il 4 byte è EBx<Esc>esploso in @^Ux#EBx#27@:^UX##Mx.

Ciò potrebbe essere notevolmente ridotto, in particolare suddividendo il programma in due parti, memorizzandole come stringhe ed eseguendole solo se entrambe sono presenti.

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.