Ich habe kürzlich ' The Weaver ' durchgespielt und ich denke, es ist eine interessante Herausforderung für Code-Golf .
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:
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):
Dies ist Codegolf, daher gewinnt die kürzeste Antwort in Bytes für jede Sprache.
quelle
Antworten:
Python 3 , 74 Bytes
Probieren Sie es online!
Muss
l
in lexikografischer Reihenfolge sortiert werden.a
undb
sind Listen von Zeichen, die (linkes Band, oberes Band) darstellen.Rückkehr durch Ändern der Liste
a
undb
.quelle
Jelly ,
373530 BytesProbieren 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]
mitl[x]
und zurückr[y]
ausgetauscht zurück.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 Haskellfoldl
).quelle
Python 2 , 193 Bytes
Probieren Sie es online!
Nimmt 1-indizierte Swap-Koordinaten auf
quelle
APL (Dyalog Classic) ,
3130 BytesProbieren 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 musstequelle
Javascript,
877662 BytesProbieren 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,y1
vorher kommt,x2,y2
wenn entwederx1 < x2 && y1 = y2
oderx1 = x2 && y1 < y2
. Gibt zurück, indem Eingabearrays geändert werden.quelle
;return[r,c]
und es eine Rückkehr durch Änderung nennen könnenif(r[i]&&c[j])
würde etwas mehr Bytes sparen.x1=1,x2=2,y1=2,y2=1
. Weilx1<x2
,(x1,y1)
kommt vor(x2,y2)
; sondern weily2<y1
,(x2,y2)
kommt vor(x1,y1)
. Ich denke "x1 < x2
undy1 < y2
" reicht aus.Ruby ,
5654 BytesProbieren Sie es online!
Eine Portierung der Python 3-Antwort von user202729 mit einigen Ruby-Tricks
Koordinaten müssen lexikografisch sortiert sein
quelle