Bạn sẽ là thợ dệt của tôi?


14

Gần đây tôi đã chơi qua ' Người thợ dệt ' và tôi nghĩ rằng đây là một thử thách thú vị cho .

Tiền đề:

Weaver là một trò chơi trong đó bạn được cung cấp một số dải băng đến từ 2 hướng cách nhau 90 độ và mục tiêu của bạn là hoán đổi chúng tại các giao lộ nhất định để đạt được đầu ra mong muốn.

   Giống như thế này: Đây là một trao đổi: Đây không phải là:

Như thế nàytrao đổikhông phải là một trao đổi

Đầu vào:

3 mảng:

  • Dải băng trên cùng (trái sang phải)
  • Ruy băng trái (từ trên xuống dưới)
  • Các tọa độ của các giao điểm để trao đổi

Đầu ra:

2 mảng:

  • Dải băng dưới cùng (trái sang phải)
  • Ruy băng bên phải (từ trên xuống dưới)

Ví dụ:

Tôi sẽ sử dụng hình ảnh trên làm ví dụ đầu tiên:

Đầu vào: [r, y, b], [r, y, b], [(0, 1), (2, 1), (2, 2)]

Điều gì xảy ra:

   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

Trường hợp đại diện cho một trao đổi.

Đầu ra: [r, b, r], [y, y, b]


Đầu vào: [a, b, c], [d, e, f], [(0, 0), (2, 1)]

Điều gì xảy ra:

   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

Đầu ra: [d, f, c], [a, e, b]


Đầu vào: [a, b], [a, b, c], [(0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 1)]

Điều gì xảy ra:

   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

Đầu ra: [c, b], [b, a, a]

Ghi chú:

  • Các ví dụ hiển thị tọa độ được đưa ra như (row, column)thể bạn có thể lấy chúng làm (column, row).
  • Hàng trên cùng và cột bên trái có thể có dải băng cùng màu
  • Bảng có thể là hình chữ nhật
  • Tất cả các tọa độ sẽ không âm ( >=0) (hoặc hoàn toàn dương ( >=1) nếu bạn chọn lập chỉ mục 1)
  • Bỏ qua bất kỳ giao dịch hoán đổi bên ngoài bảng
  • Bạn có thể chọn làm việc với các chữ cái ( [a-zA-Z]), số nguyên ( [0-9]) hoặc cả hai
  • Các dải băng trong đầu ra của bạn phải khớp với các dải băng trong đầu vào chính xác ( a -> a)
  • Bạn có thể giả sử danh sách các giao dịch hoán đổi được sắp xếp theo bất kỳ cách nào bạn muốn, miễn là nó phù hợp (nếu bạn làm như vậy, vui lòng chỉ định cách sắp xếp nó)
  • Bạn có thể lấy tọa độ hoán đổi là 0 hoặc 1 chỉ mục
  • Các lỗ hổng mặc định bị cấm

Ví dụ khác:

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]

Ví dụ cuối cùng liên quan đến trường hợp này (nếu điều đó giúp dễ hình dung hơn):

thí dụ

Đây là vì vậy câu trả lời ngắn nhất tính bằng byte cho mỗi ngôn ngữ sẽ thắng.


1
Re " Bỏ qua mọi giao dịch hoán đổi bên ngoài bảng " - điều đó có nghĩa là chúng ta không thể cho rằng tất cả các tọa độ trao đổi đều nằm trên bảng và chúng ta cần lọc chúng cho hợp lệ (bỏ qua các giá trị không hợp lệ) hoặc điều đó có nghĩa là chúng ta có thể bỏ qua trường hợp tọa độ nằm ngoài bảng vì đầu vào sẽ luôn hợp lệ?
Bergi

@Bergi có nghĩa là đầu vào có thể bao gồm các giao dịch hoán đổi bên ngoài bảng và bạn phải lọc hoặc bỏ qua chúng. (Ví dụ thứ 3 bao gồm một trao đổi như vậy)
Asone Tuhid

Oh. Tôi nghĩ rằng thách thức sẽ thú vị hơn nếu các giao dịch hoán đổi chỉ có tọa độ hợp lệ, nhưng chúng tôi không thể cho rằng chúng được sắp xếp theo thứ tự phù hợp với giải pháp của chúng tôi.
Bergi

1
@Bergi Có lẽ bạn đúng, tốt, bây giờ đã quá muộn để thay đổi. Và không, tất cả các tọa độ sẽ là tích cực, tôi sẽ cập nhật câu hỏi.
Asone Tuhid

1
@AsoneTuhid Nếu coords là (hàng, col), sẽ có ý nghĩa hơn đối với i / o dải băng bên trái trước và dải băng trên cùng thứ hai. Điều đó có được phép không?
ngn

Câu trả lời:


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]

Hãy thử trực tuyến!

Yêu cầu lđược sắp xếp theo thứ tự từ điển. ablà danh sách các ký tự đại diện (ruy băng bên trái, ruy băng trên cùng).

Trả về bằng cách sửa đổi danh sách ab.


3

Thạch , 37 35 30 byte

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

Hãy thử trực tuyến!

Chương trình Dyadic, lấy danh sách 0 chỉ mục của các chỉ số hoán đổi làm đối số bên trái (được sắp xếp theo thứ tự từ điển đảo ngược) và (ruy băng bên trái, ruy băng trên cùng) làm đối số bên phải. Trả về (ruy băng bên phải, ruy băng dưới cùng).


Jelly là một ngôn ngữ ngầm. Không có (hầu như) không có biến để làm việc, vì vậy làm bất cứ điều gì liên quan đến nhiều hơn hai biến cùng một lúc là một mớ hỗn độn.

Các liên kết đầu tiên diễn [l,t]như là đối số bên trái của nó, [x,y](0-indexing) như là đối số quyền của mình, và trở lại [l,t]với l[x]r[y]trao đổi.

ṙ "z0U1¦Zḟ € 0ṙ" N}
ṙ "Zipwith xoay. Giá trị hiện tại:` [l ṙ x, t ṙ y] `
                   (vì vậy l [x] và r [x] lần lượt trở thành l [0] và r [0])
  z0 Zip, điền vào 0. Các phần tử tại các chỉ số tương ứng (mới) là
                   được ghép với nhau, với 0 là phụ.
    U1¦ Đảo ngược cặp tại chỉ mục `1` (chỉ mục đầu tiên).
       Z € 0 Zip một lần nữa và lọc ra `0`, hoàn tác lại z0 một cách hiệu quả.
           ṙ "N} Zipwith xoay theo lượng dịch chuyển âm, ngược lại` ṙ "`.

Vì vậy, về cơ bản " U1¦dưới ṙ"z0".


Liên kết thứ hai chỉ cần lọc ra các chỉ số OoB ( <Ạ¥Ðf L€), nối thêm đối số thứ hai ( ⁹ṭ), đảo ngược ( ) và giảm hơn ç(tương tự như của 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]

Hãy thử trực tuyến!

Có tọa độ hoán đổi 1 chỉ mục


2

APL (Dyalog Classic) , 31 30 byte

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

Hãy thử trực tuyến!

Đối số bên trái là một cặp vectơ ký tự - ruy băng bên trái và ruy băng trên cùng. Đối số đúng là một vectơ của các cặp tọa độ - vị trí hoán đổi. Trả về một cặp ruy băng bên phải và ruy băng dưới cùng. (Lưu ý rằng không giống như trong các ví dụ, tôi sử dụng thứ tự trên cùng bên trái và dưới cùng bên phải cho các dải băng để phù hợp với thứ tự trục hàng-col trong tọa độ.)

Các giao dịch hoán đổi phải được sắp xếp sao cho việc hoán đổi sang phía trên bên trái của người khác đến trước sau đó. Nếu hai giao dịch hoán đổi ở phía dưới bên trái / phía trên bên phải của nhau, thứ tự của chúng không thành vấn đề.

EDIT: đã lưu một byte ( ) bằng cách yêu cầu đảo ngược các giao dịch hoán đổi trong đầu vào


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]]}

Hãy thử trực tuyến!

Thuật toán tầm thường tương tự như câu trả lời Python 3. Sử dụng mảng như các bộ tọa độ. Yêu cầu màu ruy băng được chỉ định bởi các giá trị trung thực. Yêu cầu tọa độ phải được sắp xếp một phần để x1,y1đi trước x2,y2nếu x1 < x2 && y1 = y2hoặc x1 = x2 && y1 < y2. Trả về bằng cách sửa đổi mảng đầu vào.


Tôi khá chắc chắn rằng bạn có thể xóa ;return[r,c]và gọi nó là trả lại bằng cách sửa đổi
Asone Tuhid

if(r[i]&&c[j]) sẽ tiết kiệm thêm một số byte.
Neil

Tôi biết rằng tình trạng của tôi quá mạnh mẽ, nhưng điều kiện của bạn là tự mâu thuẫn. Hãy xem xét x1=1,x2=2,y1=2,y2=1. Bởi vì x1<x2, (x1,y1)đến trước (x2,y2); nhưng bởi vì y2<y1, (x2,y2)đến trước (x1,y1). Tôi nghĩ " x1 < x2y1 < y2" đủ.
dùng202729

@AsoneTuhid Hừm, tôi nghĩ đó là gian lận. Sửa đổi các đối tượng đầu vào không giống như đầu ra bởi các tham số tham chiếu.
Bergi

1
Q: "Điều này có nghĩa là trong các ngôn ngữ cho phép nó, bảy ký tự để trả lại có thể được thay thế bằng một phép gán?" A: "Có, với điều kiện giá trị thay đổi sau đó sẽ có thể truy cập được trong ngữ cảnh được gọi là hàm.". Có vẻ khá rõ ràng với tôi.
Asone Tuhid

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.