Sarai il mio tessitore?


14

Di recente ho giocato a " The Weaver " e penso che rappresenti una sfida interessante per il .

Premessa:

Il tessitore è un gioco in cui ti viene dato un numero di nastri che provengono da 2 direzioni a 90 gradi di distanza e il tuo obiettivo è quello di scambiarli a determinate intersezioni per ottenere l'output desiderato.

   In questo modo: questo è uno scambio: questo non è:

Come questoscambiarenon uno scambio

Ingresso:

3 matrici:

  • Nastri superiori (da sinistra a destra)
  • Nastri sinistri (dall'alto verso il basso)
  • Le coordinate delle intersezioni da scambiare

Produzione:

2 matrici:

  • Nastri inferiori (da sinistra a destra)
  • Nastri di destra (dall'alto verso il basso)

Esempi:

Userò l'immagine sopra come primo esempio:

Ingresso: [r, y, b], [r, y, b], [(0, 1), (2, 1), (2, 2)]

Che succede:

   r   y   b
   r   y   b
r r r r•y y y y
   r   r   b
y y y y y y y y
   r   r   b
b b b b•r r•b b
   r   b   r
   r   b   r

Dove rappresenta uno scambio.

Produzione: [r, b, r], [y, y, b]


Ingresso: [a, b, c], [d, e, f], [(0, 0), (2, 1)]

Che succede:

   a   b   c
   a   b   c
d d•a a a a a a
   d   b   c
e e e e e e e e
   d   b   c
f f f f•b b b b
   d   f   c
   d   f   c

Produzione: [d, f, c], [a, e, b]


Ingresso: [a, b], [a, b, c], [(0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 1)]

Che succede:

   a   b
   a   b
a a a a•b b
   a   a
b b•a a•a a
   b   a
c c•b b•a a
   c   b
   c   b

Produzione: [c, b], [b, a, a]

Appunti:

  • Gli esempi mostrano le coordinate fornite come (row, column)se potessi prenderle come (column, row).
  • La riga superiore e la colonna sinistra possono avere nastri dello stesso colore
  • La scheda può essere rettangolare
  • Tutte le coordinate saranno non negative ( >=0) (o strettamente positive ( >=1) se si sceglie 1-indicizzazione)
  • Ignora eventuali swap esterni alla scheda
  • Puoi scegliere di lavorare con lettere ( [a-zA-Z]), numeri interi ( [0-9]) o entrambi
  • I nastri nell'output devono corrispondere esattamente ai nastri nell'input ( a -> a)
  • Si può presumere che l'elenco degli swap sia ordinato nel modo desiderato, purché sia ​​coerente (in tal caso, si prega di specificare come deve essere ordinato)
  • È possibile prendere le coordinate di scambio come 0 o 1 indicizzate
  • Sono vietate le scappatoie predefinite

Altri esempi:

Input:
[b], [r], []
Output:
[b], [r]

Input:
[b], [r], [(0, 0)]
Output:
[r], [b]

Input:
[r, p, y], [r, y, p], [(0, 0), (1, 2), (2, 1), (3, 2)]
Output:
[r, p, y], [r, y, p]

Input:
[b, y, o, r],
[r, o, b, y],
[(0, 0), (2, 0), (3, 2)]
Output:
[b, y, y, r],
[b, o, r, o]

L'ultimo esempio riguarda questo caso (se ciò semplifica la visualizzazione):

esempio

Questo è quindi vince la risposta più breve in byte per ogni lingua.


1
Ri " Ignora eventuali swap che si trovano all'esterno della scheda " - ciò significa che non possiamo presumere che tutte le coordinate dello swap siano sulla scheda e che dobbiamo filtrarle per validità (ignorare quelle non valide), o significa che possiamo ignorare il caso in cui le coordinate siano al di fuori del tabellone perché l'input sarà sempre valido?
Bergi,

@Bergi significa che l'input può includere swap all'esterno della scheda e devi filtrarli o ignorarli. (Il terzo esempio include un tale scambio)
Asone Tuhid,

Oh. Penso che la sfida sarebbe stata più interessante se gli swap avessero avuto solo coordinate valide, ma che non potevamo supporre che fossero ordinati in un ordine che si adattava alla nostra soluzione.
Bergi,

1
@Bergi Probabilmente hai ragione, beh, è ​​troppo tardi per cambiare adesso. E no, tutte le coordinate saranno positive, aggiornerò la domanda.
Asone Tuhid,

1
@AsoneTuhid Se i coords sono (riga, colonna), ha più senso inserire i nastri sinistri per primi e i nastri superiori per secondo. È permesso?
ngn,

Risposte:


8

Python 3 , 74 byte

def g(a,b,l):
 for x,y in l:
  if x<len(a)and y<len(b):a[x],b[y]=b[y],a[x]

Provalo online!

Richiede ldi essere ordinati in ordine lessicografico. ae bsono elenchi di caratteri che rappresentano (barra multifunzione sinistra, barra superiore).

Ritorna modificando l'elenco ae b.


3

Gelatina , 37 35 30 byte

ṙ"z0U1¦Zḟ€0ṙ"N}
<Ạ¥ÐfL€}⁹ṭṚç/Y

Provalo online!

Programma diadico, prendi la lista di indicizzazione 0 degli indici di swap come argomento sinistro (ordinato in ordine lessicografico inverso) e (nastro sinistro, nastro superiore) come argomento destro. Restituisce (nastro destro, nastro inferiore).


Jelly è un linguaggio tacito. Non c'è (quasi) nessuna variabile con cui lavorare, quindi fare qualsiasi cosa implica più di due variabili contemporaneamente è un casino.

Il primo collegamento prende [l,t]come argomento sinistro, [x,y](0-indicizzazione) come argomento destro, e torna [l,t]con l[x]e r[y]scambiato.

R "z0U1|Zḟ € 0r" N}
ṙ "Zip con rotazione. Valore corrente:` [l ṙ x, t ṙ y] `
                   (così l [x] e r [x] diventano rispettivamente l [0] e r [0])
  z0 Zip, riempi con 0. Gli elementi nei corrispondenti (nuovi) indici sono
                   accoppiato insieme, con 0 come riempimento.
    U1¦ Invertire la coppia all'indice `1` (primo indice).
       Zḟ € 0 Comprimi di nuovo e filtra gli `0`, annulla effettivamente lo z0.
           ṙ "N} Cerniera con rotazione di quantità di spostamento negativa, retro di" ṙ "`.

Quindi sostanzialmente " U1¦sotto ṙ"z0".


Il secondo link filtra semplicemente gli indici OoB ( <Ạ¥Ðf L€), aggiunge il secondo argomento ( ⁹ṭ), reverse ( ) e riduce over ç(simile a quello di Haskell foldl)


2

Python 2 , 193 byte

def f(t,l,s):
 m=[[x,y]for y in[0]+l for x in[0]+t];L=len(t)+1
 for i in range(len(m)):
  if i%L:m[i]=[m[i-L][0],m[i-1][1]][::[1,-1][(i/L,i%L)in s]]
 s=sum(m,[]);print s[2-L*2::2],s[4*L-1::2*L]

Provalo online!

Accetta le coordinate di swap a 1 indice


2

APL (Dyalog Classic) , 31 30 byte

{⊃{⌽@(0 1,¨⍺)⊢⍵}/(⍵∩,⍳≢¨⍺),⊂⍺}

Provalo online!

L'argomento a sinistra è una coppia di vettori di caratteri: nastri a sinistra e nastri in alto. L'argomento giusto è un vettore di coppie di coordinate: posizioni di scambio. Restituisce una coppia di nastri a destra e nastri in basso. (Notare che, diversamente dagli esempi, uso l'ordine in alto a sinistra e in basso a destra per i nastri per essere coerente con l'ordine degli assi riga-col nelle coordinate.)

Swap devono essere ordinati in modo tale che uno swap a in alto a sinistra di un altro viene prima dopo di esso. Se due swap sono in basso a sinistra / in alto a destra l'uno dell'altro, il loro ordine non ha importanza.

EDIT: salvato un byte ( ) richiedendo l'ordine inverso di swap nell'input


1

Javascript, 87 76 62 byte

(c,r,s)=>{for([i,j]of s)if(r[i]&&c[j])[r[i],c[j]]=[c[j],r[i]]}

Provalo online!

Stesso algoritmo banale della risposta di Python 3. Utilizza matrici come tuple di coordinate. Richiede che i colori del nastro siano indicati da valori veritieri. Richiede che le coordinate siano parzialmente ordinate in modo che vengano x1,y1prima x2,y2se x1 < x2 && y1 = y2o x1 = x2 && y1 < y2. Restituisce modificando le matrici di input.


Sono abbastanza sicuro che puoi eliminarlo ;return[r,c]e chiamarlo un ritorno per modifica
Asone Tuhid,

if(r[i]&&c[j])salverebbe qualche byte in più.
Neil,

So che la mia condizione è troppo forte, ma la tua condizione è contraddittoria. Prendere in considerazione x1=1,x2=2,y1=2,y2=1. Perché x1<x2, (x1,y1)viene prima (x2,y2); ma perché y2<y1, (x2,y2)viene prima (x1,y1). Penso che " x1 < x2e y1 < y2" siano sufficienti.
user202729

@AsoneTuhid Hm, penso che sia barare. La modifica degli oggetti di input non è la stessa dell'output tramite parametri di riferimento.
Bergi,

1
D: "Ciò significa che nelle lingue che lo consentono, i sette caratteri per il ritorno possono essere semplicemente sostituiti con un compito?" A: "Sì, a condizione che il valore modificato sia accessibile nel contesto che ha chiamato la funzione.". Mi sembra piuttosto chiaro.
Solo Tuhid,

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.