Wirst du mein Weber sein?

14

Ich habe kürzlich ' The Weaver ' durchgespielt und ich denke, es ist eine interessante Herausforderung für .

Prämisse:

Der Weaver ist ein Spiel, bei dem Sie eine Reihe von Bändern aus zwei Richtungen erhalten, die um 90 Grad voneinander entfernt sind. Ihr Ziel ist es, diese an bestimmten Kreuzungen zu vertauschen, um die gewünschte Ausgabe zu erzielen.

   So: Dies ist ein Tausch: Dies ist nicht:

So wasTauschenkein Tausch

Eingang:

3 Arrays:

  • Obere Bänder (von links nach rechts)
  • Linke Bänder (von oben nach unten)
  • Die Koordinaten der zu tauschenden Kreuzungen

Ausgabe:

2 Arrays:

  • Untere Bänder (von links nach rechts)
  • Rechte Bänder (von oben nach unten)

Beispiele:

Ich werde das obige Bild als erstes Beispiel verwenden:

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

Was geschieht:

   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

Wo steht ein Swap.

Ausgabe: [r, b, r], [y, y, b]


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

Was geschieht:

   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

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


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

Was geschieht:

   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

Ausgabe: [c, b], [b, a, a]

Anmerkungen:

  • Die Beispiele zeigen die angegebenen Koordinaten, als (row, column)ob Sie sie als annehmen könnten (column, row).
  • Die obere Reihe und die linke Spalte können Bänder derselben Farbe aufweisen
  • Die Platte kann rechteckig sein
  • Alle Koordinaten sind nicht negativ ( >=0) (oder streng positiv ( >=1), wenn Sie 1-Indizierung wählen)
  • Ignorieren Sie alle Swaps, die sich außerhalb des Boards befinden
  • Sie können wählen, ob Sie mit Buchstaben ( [a-zA-Z]), ganzen Zahlen ( [0-9]) oder beidem arbeiten möchten
  • Die Bänder in Ihrer Ausgabe müssen genau mit den Bändern in der Eingabe übereinstimmen ( a -> a)
  • Sie können davon ausgehen, dass die Liste der Swaps nach Belieben sortiert ist, solange sie konsistent ist (wenn ja, geben Sie bitte an, wie sie sortiert werden soll).
  • Sie können die Swap-Koordinaten als 0 oder 1-indiziert annehmen
  • Standardlücken sind verboten

Mehr Beispiele:

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]

Das letzte Beispiel bezieht sich auf diesen Fall (falls dies die Visualisierung erleichtert):

Beispiel

Dies ist daher gewinnt die kürzeste Antwort in Bytes für jede Sprache.

Asone Tuhid
quelle
1
Re " Ignoriere alle Swaps, die sich außerhalb des Boards befinden " - bedeutet das, dass wir nicht davon ausgehen können, dass sich alle Swap-Koordinaten auf dem Board befinden, und dass wir sie nach Gültigkeit filtern müssen (ignoriere die ungültigen), oder bedeutet das, dass wir ignorieren können Befinden sich Koordinaten außerhalb der Tabelle, weil die Eingabe immer gültig ist?
Bergi
@Bergi bedeutet, dass der Eingang Swaps außerhalb des Boards enthalten kann und Sie diese filtern oder ignorieren müssen. (Das dritte Beispiel enthält einen solchen Tausch)
Asone Tuhid
Oh. Ich denke, die Herausforderung wäre interessanter gewesen, wenn die Tauschgeschäfte nur gültige Koordinaten gehabt hätten, aber wir konnten nicht davon ausgehen, dass sie in einer Reihenfolge sortiert waren, die zu unserer Lösung passt.
Bergi
1
@Bergi Sie haben wahrscheinlich Recht, nun, es ist zu spät, um sich jetzt zu ändern. Und nein, alle Koordinaten werden positiv sein, ich werde die Frage aktualisieren.
Asone Tuhid
1
@AsoneTuhid Wenn die Koordinaten (row, col) sind, ist es sinnvoller, zuerst die linken und dann die oberen Bänder zu verwenden. Ist das erlaubt
Ngn

Antworten:

8

Python 3 , 74 Bytes

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]

Probieren Sie es online!

Muss lin lexikografischer Reihenfolge sortiert werden. aundb sind Listen von Zeichen, die (linkes Band, oberes Band) darstellen.

Rückkehr durch Ändern der Liste aund b.

user202729
quelle
3

Jelly , 37 35 30 Bytes

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

Probieren Sie es online!

Dyadic-Programm, 0-indexierende Liste von Swap-Indizes als linkes Argument (in umgekehrter lexikografischer Reihenfolge sortiert) und (linkes Band, oberes Band) als rechtes Argument. Rückgabe (rechtes Farbband, unteres Farbband).


Gelee ist eine stillschweigende Sprache. Es gibt (fast) keine Variable, mit der gearbeitet werden kann. Wenn Sie also etwas tun, das mehr als zwei Variablen gleichzeitig umfasst, ist das ein Durcheinander.

Der erste Link verwendet [l,t]als linkes Argument [x,y](0-Indexierung) als rechtes Argument und gibt [l,t]mit l[x]und zurückr[y] ausgetauscht zurück.

ṙ "z0U1¦Zḟ € 0ṙ" N}
ṙ "Zipwith drehen. Aktueller Wert:` [l ṙ x, t ṙ y] `
                   (so werden l [x] und r [x] zu l [0] und r [0])
  z0 Zip, füllen mit 0. Elemente an entsprechenden (neuen) Indizes sind
                   gepaart mit 0 als Füllstoff.
    U1 ... Kehren Sie das Paar bei Index "1" (erster Index) um.
       Zḟ € 0 Zippen Sie erneut und filtern Sie die `0`s heraus. Machen Sie das z0 effektiv rückgängig.
           ṙ "N} Zipwith drehen sich um den negativen Verschiebungsbetrag, umgekehrt zu" `".

Also im Grunde " U1¦unter ṙ"z0".


Der zweite Link filtert einfach OoB-Indizes heraus ( <Ạ¥Ðf L€), hängt das zweite Argument an ( ⁹ṭ), kehrt es um ( ) und verkleinert es ç(ähnlich wie bei Haskell foldl).

user202729
quelle
2

Python 2 , 193 Bytes

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]

Probieren Sie es online!

Nimmt 1-indizierte Swap-Koordinaten auf

TFeld
quelle
2

APL (Dyalog Classic) , 31 30 Bytes

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

Probieren Sie es online!

Das linke Argument ist ein Paar von Zeichenvektoren - linke Bänder und obere Bänder. Das richtige Argument ist ein Vektor von Koordinatenpaaren - Orte tauschen. Gibt ein Paar rechter Bänder und unterer Bänder zurück. (Beachten Sie, dass ich im Gegensatz zu den Beispielen die Reihenfolge links oben und rechts unten für die Bänder verwende, um mit der Reihenfolge der Zeilen-Spalten-Achsen in den Koordinaten übereinzustimmen.)

Swaps müssen so sortiert werden , dass eine Swap auf die oben links ein anderer kommt vor , nachdem es. Wenn zwei Swaps links unten / rechts oben liegen, spielt ihre Reihenfolge keine Rolle.

BEARBEITEN: Ein Byte ( ) wurde gespeichert, indem die Reihenfolge der Swap-Operationen in der Eingabe umgekehrt werden musste

ngn
quelle
1

Javascript, 87 76 62 Bytes

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

Probieren Sie es online!

Gleicher trivialer Algorithmus wie die Python 3-Antwort. Verwendet Arrays als Koordinatentupel. Erfordert, dass die Bandfarben durch die Wahrheitswerte gekennzeichnet werden. Benötigt Koordinaten, um teilweise bestellt zu werden, damit x1,y1vorher kommt, x2,y2wenn entweder x1 < x2 && y1 = y2oder x1 = x2 && y1 < y2. Gibt zurück, indem Eingabearrays geändert werden.

Bergi
quelle
Ich bin mir ziemlich sicher, dass Sie löschen ;return[r,c]und es eine Rückkehr durch Änderung nennen können
Asone Tuhid
if(r[i]&&c[j])würde etwas mehr Bytes sparen.
Neil
Ich weiß, dass mein Zustand zu stark ist, aber Ihr Zustand ist widersprüchlich. Überlegen Sie x1=1,x2=2,y1=2,y2=1. Weil x1<x2, (x1,y1)kommt vor (x2,y2); sondern weil y2<y1, (x2,y2)kommt vor (x1,y1). Ich denke " x1 < x2und y1 < y2" reicht aus.
user202729
@AsoneTuhid Hm, ich denke das ist Betrug. Das Ändern der Eingabeobjekte ist nicht dasselbe wie das Ausgeben durch Referenzparameter.
Bergi
1
F: "Bedeutet dies, dass in Sprachen, die dies zulassen, die sieben Zeichen für die Rückgabe einfach durch eine Zuweisung ersetzt werden können?" A: "Ja, vorausgesetzt, der geänderte Wert ist dann in dem Kontext verfügbar, der die Funktion aufgerufen hat." Scheint mir ziemlich klar.
Asone Tuhid