Golf Paterson's Worms


11

I vermi di Paterson sono una specie di automa cellulare che esiste su una griglia triangolare infinita e, ad ogni passo, ruotano in una direzione e muovono di un'unità. Le loro proprietà distintive sono che non possono mai andare nello stesso punto due volte e ogni volta che incontrano gli stessi dintorni, prendono la stessa decisione. Un verme "vede" sempre dalla propria prospettiva con la coda posizionata a 3 e la testa situata al centro di questo esagono:

Immagine da Wikipedia

Ad esempio, considera il worm con le regole:

  1. Se 0, 1, 2, 4 e 5 sono tutti vuoti, spostati nella direzione 2
  2. Se 0, 1, 4 e 5 sono vuoti e 2 è pieno, spostarsi nella direzione 0
  3. Se 0, 1 e 5 sono vuoti e 2 e 4 sono pieni, spostarsi nella direzione 0

Ciò si traduce nel seguente percorso (da Wikipedia):

Percorso del verme

Se il worm si trova in una situazione in cui tutti i dintorni sono pieni, termina.

Ingresso

Un elenco di numeri. L'ennesimo numero indica quale decisione dovrebbe prendere il worm sull'ennesima situazione in cui si trova dove deve prendere una decisione. Notare che se tutti i suoi dintorni tranne uno sono pieni, deve muoversi nella sola direzione vuota. Questo non conta come una "decisione" e non consuma un numero. Per generare il worm di esempio mostrato sopra, l'input sarebbe [2, 0, 0]. L'input è garantito per produrre un worm che termina e non ripercorre il suo percorso, e l'input non sarà mai troppo breve.

Produzione

Emette un elenco di coordinate che indicano dove si trova la testa del worm, a partire da (1, 0). Considereremo lo spostamento verso l'alto e verso destra come una diminuzione del solo valore y, ma lo spostamento verso l'alto e verso sinistra come una diminuzione del valore x e una diminuzione del valore y. Ad esempio, l'output del percorso per l'input di esempio è

(1, 0), (1, 1), (0, 0), (-1, -1), (0, -1), (0, 0), (0, 1), (-1, 0), (0, 0)

Casi test

Puoi utilizzare lo snippet javascript anche per eseguire i test.

[2,0,0]: (1,0),(1,1),(0,0),(-1,-1),(0,-1),(0,0),(0,1),(-1,0),(0,0)
[1,0,4,0,1,5]: (1,0),(2,1),(2,2),(1,2),(0,1),(0,0),(0,-1),(1,-1),(2,0),(2,1),(3,1),(4,2),(4,3),(3,3),(2,2),(1,1),(1,0),(2,0),(3,1),(3,0),(4,0),(5,1),(5,2),(4,2),(3,2),(2,1),(1,1),(0,0),(-1,0),(-2,-1),(-2,-2),(-1,-2),(0,-1),(1,0),(1,-1),(2,-1),(3,0),(4,1),(4,2),(5,3),(5,4),(4,4),(3,3),(3,4),(2,4),(1,3),(1,2),(1,1),(0,1),(-1,0),(-1,1),(-2,1),(-3,0),(-3,-1),(-2,-1),(-1,-1),(0,0)
[1,0,5,1]: (1,0),(2,1),(2,2),(1,2),(0,1),(0,0),(0,-1),(1,-1),(2,0),(2,1),(3,2),(3,3),(2,3),(1,2),(0,2),(-1,1),(-1,0),(0,0),(1,1),(1,2),(1,3),(0,3),(-1,2),(-1,1),(-2,0),(-2,-1),(-1,-1),(0,0)
[2,0,1,0]: (1,0),(1,1),(0,0),(-1,-1),(0,-1),(0,0),(-1,0),(-1,-1),(-1,-2),(0,-1),(1,0),(2,1),(1,1),(0,1),(0,0)

Il seguente programma assemblato in fretta (possibilmente con errori) mostrerà i worm:


2
Caso di prova suggerito : p (Questo è [1,0,4,2,0,1,5].)
Arnauld

Possiamo prendere l'input in ordine inverso?
Arnauld,

1
@Arnauld sicuro che sembra ok
soktinpk l'

Risposte:


4

JavaScript (ES6),  261 250  249 byte

[x,y]

a=>(G=[[[x=1]]],v=[0,1,1,0,-1,-1],F=y=>[[x,y],...v.every((_,i)=>k^=g(o+i)[q%3]<<i,k=63,g=o=>(r=G[Y=y-o%2*v[q=(o+3)%6]]=G[Y]||[])[X=x-o%2*v[-~q%6]]=r[X]||[])?F(y+v[g(o+=F[k]|=1/F[k]?0:k&~-k?a.pop():31-Math.clz32(k))[q%3]=1,o%6],x+=v[-~o%6]):[]])(o=0)

Provalo online!

Questa è essenzialmente una porta dello snippet demo.


4

K (ngn / k) , 115 byte

D,:-D:2\6 3;f:{d::0;m::2/=6;X::(!6),x;{m::?m,p:2/^(+':x)?(2*h:*|x)+/:D 6!d+!6;$[(~p)|^c:X m?p;x;x,,h+D 6!d+:c]}/,1 0}

(senza contare la parte di denominazione della funzione, f:)

Provalo online!

D,:-D:2\6 3 genera le sei direzioni cardinali (1 0;1 1;0 1;-1 0;-1 -1;0 -1)

d::0 è la direzione corrente, utilizzata come indice mod 6 pollici D

m::2/=6genera la memoria worm iniziale 32 16 8 4 2 1. i bit di ciascun numero codificano l'ambiente circostante (0 = segmento visitato; 1 = non visitato). inizialmente mcontiene solo ambienti non ambigui, quelli in cui è disponibile un'unica uscita.

X::(!6),xsono le regole del worm. ci prefiggiamo 0 1 2 3 4 5di abbinare l'ambiente inequivocabile iniziale in m.

{... }/,1 0applica fino alla convergenza la funzione che { }inizia con un elenco di 1 elemento contenente 1 0. l'elenco conterrà coppie di coordinate visitate dal worm.

D 6!d+!6le sei direzioni cardinali che iniziano de vanno in senso orario

h:*|x ultimo argomento, ovvero la posizione della testa del verme

(2*h:*|x)+/:D 6!d+!6moltiplica le coordinate della testa per 2 e aggiungi le direzioni cardinali. questo è il nostro modo di rappresentare i segmenti tra i punti.

+':x aggiungere coppie di punti visitati adiacenti - questo ci dà le rappresentazioni dei segmenti tra di loro

^(... )?... scopri quali dei segmenti circostanti della testa non sono ancora stati visitati

p:2/ codifica binaria e assegnazione a p

m::?m,paccodamento per me mantenere il distinto, cioè accodamento pa msolo se pnon si verifica inm

$[... ;... ;... ]if-then-else

c:X m?ptrova l'indice di pin me usalo come indice in X. i risultati dell'indicizzazione fuori limite in 0N("null")

$[(~p)|^c:X m?p;x;... ]se pè 0 (nessun percorso di uscita) o cè 0N, quindi torna xche forza la convergenza e interrompe il ciclo

x,,h+D 6!d+:caltrimenti aggiungi la nuova testa xe ripeti

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.