Czy będziesz moim Tkaczem?

14

Ostatnio grałem w „ The Weaver ” i myślę, że stanowi to interesujące wyzwanie dla .

Przesłanka:

Weaver to gra, w której dostajesz wiele wstążek pochodzących z 2 kierunków w odstępie 90 stopni, a Twoim celem jest zamiana ich na określonych skrzyżowaniach, aby osiągnąć pożądany wynik.

   W ten sposób: To jest zamiana: To nie jest:

Lubię tozamiananie zamiana

Wejście:

3 tablice:

  • Górne wstążki (od lewej do prawej)
  • Lewe wstążki (od góry do dołu)
  • Współrzędne skrzyżowań do zamiany

Wynik:

2 tablice:

  • Dolne wstążki (od lewej do prawej)
  • Prawa wstążka (od góry do dołu)

Przykłady:

Użyję powyższego obrazu jako pierwszego przykładu:

Wejście: [r, y, b], [r, y, b], [(0, 1), (2, 1), (2, 2)]

Co się dzieje:

   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

Gdzie reprezentuje zamianę.

Wynik: [r, b, r], [y, y, b]


Wejście: [a, b, c], [d, e, f], [(0, 0), (2, 1)]

Co się dzieje:

   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

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


Wejście: [a, b], [a, b, c], [(0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 1)]

Co się dzieje:

   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

Wynik: [c, b], [b, a, a]

Uwagi:

  • Przykłady pokazują podane współrzędne, tak (row, column)jakbyś mógł je przyjąć (column, row).
  • Górny rząd i lewa kolumna mogą mieć wstążki tego samego koloru
  • Tablica może być prostokątna
  • Wszystkie współrzędne będą nieujemne ( >=0) (lub ściśle dodatnie ( >=1), jeśli wybierzesz indeksowanie 1)
  • Zignoruj ​​wszelkie zamiany znajdujące się poza planszą
  • Możesz wybrać pracę z literami ( [a-zA-Z]), liczbami całkowitymi ( [0-9]) lub obydwoma
  • Taśmy wyjściowe muszą dokładnie pasować do wstążek na wejściu ( a -> a)
  • Możesz założyć, że lista zamian jest posortowana w dowolny sposób, pod warunkiem, że jest spójna (jeśli tak, proszę określić, w jaki sposób powinna być posortowana)
  • Możesz przyjąć współrzędne wymiany jako indeksowane 0 lub 1
  • Domyślne luki są zabronione

Więcej przykładów:

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]

Ostatni przykład dotyczy tego przypadku (jeśli to ułatwia wizualizację):

przykład

To jest więc wygrywa najkrótsza odpowiedź w bajtach dla każdego języka.

Asone Tuhid
źródło
1
Ponownie „ Ignoruj ​​wszelkie zamiany znajdujące się poza planszą ” - oznacza to, że nie możemy założyć, że wszystkie współrzędne zamiany znajdują się na planszy, i musimy je przefiltrować pod kątem ważności (zignoruj ​​nieprawidłowe), czy oznacza to, że możemy zignorować czy współrzędne są poza tablicą, ponieważ dane wejściowe zawsze będą prawidłowe?
Bergi,
@Bergi oznacza, że ​​dane wejściowe mogą obejmować swapy poza tablicą i musisz je filtrować lub ignorować. (Trzeci przykład zawiera taką zamianę)
Asone Tuhid
O. Myślę, że wyzwanie byłoby bardziej interesujące, gdyby wymiany miały tylko prawidłowe współrzędne, ale nie mogliśmy założyć, że zostały posortowane w kolejności, która pasuje do naszego rozwiązania.
Bergi,
1
@Bergi Prawdopodobnie masz rację, cóż, jest już za późno na zmianę. I nie, wszystkie współrzędne będą dodatnie, zaktualizuję pytanie.
Asone Tuhid,
1
@AsoneTuhid Jeśli współrzędne są (wiersz, kolumna), bardziej sensowne jest we / wy najpierw lewe wstążki, a górne wstążki drugie. Czy to jest dozwolone?
ngn

Odpowiedzi:

8

Python 3 , 74 bajty

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]

Wypróbuj online!

Wymaga lsortowania w porządku leksykograficznym. ai bsą to listy znaków reprezentujących (lewa wstążka, górna wstążka).

Zwraca, modyfikując listę ai b.

użytkownik202729
źródło
3

Galaretka , 37 35 30 bajtów

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

Wypróbuj online!

Program dynamiczny, weź 0-indeksującą listę indeksów wymiany jako lewy argument (posortowany w odwrotnej kolejności leksykograficznej) i (lewą wstążkę, górną wstążkę) jako prawy argument. Zwraca (prawa wstążka, dolna wstążka).


Galaretka to język milczący. Nie ma (prawie) żadnej zmiennej do pracy, więc robienie czegokolwiek wymaga więcej niż dwóch zmiennych naraz.

Pierwszy człon wykonuje [l,t]jako lewego argumentu [x,y](0 indeksowania) jako prawym argumencie, i powrót [l,t]do l[x]i r[y]wymieniane.

ṙ "z0U1¦Zḟ 0 €" N}
ṙ "Zipwith rotate. Aktualna wartość:` [l ṙ x, t ṙ y] `
                   (więc l [x] ir [x] staje się odpowiednio l [0] i r [0])
  z0 Zip, wypełnij 0. Elementy o odpowiednich (nowych) indeksach to
                   sparowane razem, z 0 jako wypełniaczem.
    U1¦ Odwróć parę przy indeksie „1” (pierwszy indeks).
       0 € Z powrotem Zip i odfiltruj „0”, skutecznie cofnij Z0.
           ṙ „N} Zipz obracaniem o wartość przesunięcia ujemnego, do tyłu od„ ṙ ”.

Więc w zasadzie „ U1¦pod ṙ"z0”.


Drugi link po prostu odfiltrowuje indeksy OoB ( <Ạ¥Ðf L€), dołącza drugi argument ( ⁹ṭ), reverse ( ) i redukuje ç(podobnie jak w przypadku Haskella foldl)

użytkownik202729
źródło
2

Python 2 , 193 bajtów

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]

Wypróbuj online!

Pobiera 1-indeksowane współrzędne wymiany

TFeld
źródło
2

APL (Dyalog Classic) , 31 30 bajtów

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

Wypróbuj online!

Lewy argument to para wektorów znaków - lewe wstążki i górne wstążki. Właściwym argumentem jest wektor par współrzędnych - lokalizacji zamiany. Zwraca parę prawych wstążek i dolnych wstążek. (Zauważ, że inaczej niż w przykładach, używam kolejności lewy górny i prawy dolny dla wstążek, aby zachować spójność z kolejnością osi rzędów-kolumn we współrzędnych.)

Swapy musi być uporządkowane tak, że zamiana na lewym górnym rogu innego przychodzi zanim po niego. Jeśli dwie wymiany znajdują się w lewym dolnym rogu / prawym górnym rogu, ich kolejność nie ma znaczenia.

EDYCJA: zapisano jeden bajt ( ), wymagając odwrotnej kolejności zamiany w danych wejściowych

ngn
źródło
1

JavaScript, 87 76 62 bajtów

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

Wypróbuj online!

Ten sam trywialny algorytm jak odpowiedź na Python 3. Używa tablic jako krotek współrzędnych. Wymaga, aby kolory wstążki były oznaczone prawdziwymi wartościami. Wymaga częściowego uporządkowania współrzędnych, aby pojawiło się x1,y1wcześniej, x2,y2jeśli któryś x1 < x2 && y1 = y2lub x1 = x2 && y1 < y2. Zwraca przez modyfikację tablic wejściowych.

Bergi
źródło
Jestem pewien, że możesz usunąć ;return[r,c]i nazwać to zwrotem przez modyfikację
Asone Tuhid
if(r[i]&&c[j])zaoszczędziłoby trochę więcej bajtów.
Neil
Wiem, że mój stan jest zbyt silny, ale twój stan jest wewnętrznie sprzeczny. Zastanów się x1=1,x2=2,y1=2,y2=1. Ponieważ x1<x2, (x1,y1)jest przed (x2,y2); ale dlatego y2<y1, że (x2,y2)jest wcześniej (x1,y1). Myślę, że „ x1 < x2i y1 < y2” wystarczy.
user202729,
@AsoneTuhid Hm, myślę, że to oszustwo. Modyfikowanie obiektów wejściowych to nie to samo, co dane wyjściowe według parametrów odniesienia.
Bergi,
1
P: „Czy to oznacza, że ​​w językach, które na to pozwalają, siedem znaków zwrotu można po prostu zastąpić przypisaniem?” Odp .: „Tak, pod warunkiem, że zmieniona wartość będzie dostępna w kontekście, który wywołał funkcję.”. Wydaje mi się to całkiem jasne.
Asone Tuhid,