Ти будеш моїм Ткачем?


14

Нещодавно я грав через " The Weaver " і думаю, що це цікавий виклик для .

Приміщення:

The Weaver - це гра, в якій вам дають ряд стрічок, що виходять з двох напрямків на відстань 90 градусів один від одного, і ваша мета - поміняти їх на певних перехрестях, щоб досягти бажаного виходу.

   Ось так: Це своп: Це не:

Подобається цеміняти місцямине своп

Вхід:

3 масиви:

  • Верхні стрічки (зліва направо)
  • Ліві стрічки (зверху вниз)
  • Координати перехресть, які потрібно міняти місцями

Вихід:

2 масиви:

  • Нижні стрічки (зліва направо)
  • Праві стрічки (зверху вниз)

Приклади:

Я буду використовувати перший образ як перший приклад:

Вхід: [r, y, b], [r, y, b], [(0, 1), (2, 1), (2, 2)]

Що сталося:

   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

Де являє собою своп.

Вихід: [r, b, r], [y, y, b]


Вхід: [a, b, c], [d, e, f], [(0, 0), (2, 1)]

Що сталося:

   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

Вихід: [d, f, c], [a, e, b]


Вхід: [a, b], [a, b, c], [(0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 1)]

Що сталося:

   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

Вихід: [c, b], [b, a, a]

Примітки:

  • Приклади показують координати, задані так, (row, column)ніби ви можете їх прийняти як (column, row).
  • У верхньому рядку та в лівій колонці можуть бути стрічки одного кольору
  • Дошка може бути прямокутною
  • Усі координати будуть негативними ( >=0) (або строго позитивними ( >=1), якщо ви виберете 1-індексацію)
  • Ігноруйте будь-які свопи, які знаходяться поза дошкою
  • Ви можете працювати з буквами ( [a-zA-Z]), цілими числами ( [0-9]) або обома
  • Стрічки на виході повинні точно відповідати стрічкам на вході ( a -> a)
  • Ви можете припустити, що список свопів відсортований будь-яким потрібним способом, якщо він є послідовним (якщо ви це зробите, будь ласка, вкажіть, як його слід сортувати)
  • Ви можете приймати координати свопу як 0 або 1-індексованими
  • Бійниці за замовчуванням заборонені

Більше прикладів:

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]

Останній приклад стосується цього випадку (якщо це полегшує візуалізацію):

приклад

Це тому найкоротша відповідь у байтах за кожну мову виграє.


1
Повторно " Ігноруйте будь-які заміни, які знаходяться поза дошкою " - чи це означає, що ми не можемо припустити, що всі координати свопу є на дошці, і нам потрібно відфільтрувати їх для дійсності (ігнорувати недійсні), чи це означає, що ми можемо ігнорувати якщо координати знаходяться поза дошкою, оскільки вхід завжди буде дійсним?
Бергі

@Bergi це означає, що вхід може містити свопи поза дошкою, і вам доведеться їх фільтрувати або ігнорувати. (Третій приклад включає такий своп)
Асона Тухід

Ой. Я думаю, що виклик був би цікавішим, якби заміни мали б лише дійсні координати, але щоб ми не могли припустити, що вони були відсортовані у порядку, який відповідає нашому рішенню.
Бергі

1
@Bergi Ви, мабуть, праві, ну, зараз вже пізно змінити. І ні, всі координати будуть позитивними, я оновлю питання.
Асона Тухід

1
@AsoneTuhid Якщо координати (рядок, стовпчик), має більше сенсу вводити / виводити ліві стрічки першими, а верхніми стрічками - другими. Це дозволено?
ngn

Відповіді:


8

Python 3 , 74 байти

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]

Спробуйте в Інтернеті!

Потрібно lсортувати в лексикографічному порядку. aі bє списками символів, що представляють (ліва стрічка, верхня стрічка).

Повертається шляхом зміни списку aта b.


3

Желе , 37 35 30 байт

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

Спробуйте в Інтернеті!

Програма "Діадик", візьміть список 0-індексування своп-індексів як лівий аргумент (відсортований у зворотному лексикографічному порядку) та (ліва стрічка, верхня стрічка) як правий аргумент. Повернення (права стрічка, нижня стрічка).


Желе - це мовчазна мова. Немає (майже) змінної, з якою можна працювати, тому робити що-небудь, що включає більше двох змінних одразу - це безлад.

Перше посилання приймає [l,t]як лівий аргумент [x,y](0-індексацію) як свій правий аргумент, а повертається [l,t]з l[x]та r[y]обмінюється.

ṙ "z0U1¦Zḟ € 0ṙ" N}
ṙ "Обертання Zipwith. Поточне значення:` [l ṙ x, t ṙ y] "
                   (так l [x] і r [x] стає l [0] і r [0] відповідно)
  z0 Zip, заповнити 0. Елементи у відповідних (нових) індексах є
                   у парі разом, 0 - як наповнювач.
    U1¦ Зворотну пару на індекс `1` (перший індекс).
       Zḟ € 0 Зіпсуйте знову і відфільтруйте `0 ', ефективно скасуйте z0.
           ṙ "N} Zipwith обертається на суму від'ємного зсуву, зворотній бік" ṙ "`.

Так в основному " U1¦під ṙ"z0".


Друге посилання просто фільтрує індекси OoB ( <Ạ¥Ðf L€), додає другий аргумент ( ⁹ṭ), зворотний ( ) та зменшує над ç(аналогічно Haskell's foldl)



2

APL (Dyalog Classic) , 31 30 байт

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

Спробуйте в Інтернеті!

Лівий аргумент - пара знакових векторів - ліві стрічки та верхні стрічки. Правильний аргумент - вектор пар координат - міняти місцями. Повертає пару правих стрічок і нижніх стрічок. (Зауважте, що на відміну від прикладів, я використовую порядок вліво-вгорі та внизу праворуч для стрічок, щоб вони відповідали порядку розташування осей рядка-колу в координатах.)

Свопи повинні бути відсортовані таким чином, щоб заміни вгорі зліва від іншої відбувалися раніше, ніж після нього. Якщо дві підкачки знаходяться ліворуч / вліво праворуч один від одного, їх порядок не має значення.

EDIT: збережений один байт ( ), вимагаючи зворотного порядку свопів на вході


1

Javascript, 87 76 62 байт

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

Спробуйте в Інтернеті!

Той самий тривіальний алгоритм, як і відповідь Python 3. Використовує масиви як координатні кортежі. Потрібно, щоб кольори стрічок були позначені тритими значеннями. Вимагає, щоб координати були частково впорядковані, щоб вони були x1,y1раніше, x2,y2якщо вони є x1 < x2 && y1 = y2або x1 = x2 && y1 < y2. Повертається шляхом зміни вхідних масивів.


Я впевнений, що ви можете видалити ;return[r,c]і назвати це поверненням за модифікацією
Asone Tuhid,

if(r[i]&&c[j])врятувало б ще кілька байтів.
Ніл

Я знаю, що мій стан занадто сильний, але ваш стан є суперечливим. Розглянемо x1=1,x2=2,y1=2,y2=1. Тому що x1<x2, (x1,y1)приходить раніше (x2,y2); а тому y2<y1, що (x2,y2)приходить раніше (x1,y1). Я думаю, що " x1 < x2і y1 < y2" вистачає.
користувач202729

@AsoneTuhid Гм, я думаю, це обман. Модифікація вхідних об'єктів не є такою ж, як вихід за еталонними параметрами.
Бергі

1
Питання: "Чи означає це, що на мовах, які це дозволяють, сім символів для повернення можна просто замінити призначенням?" A: "Так, за умови, що змінене значення буде доступне в контексті, який викликав функцію." Мені це здається досить зрозумілим.
Асона Тухід

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.