내 위버가 되겠습니까?


14

나는 최근에 ' The Weaver ' 를 겪어 왔으며 그것이 대한 흥미로운 도전을 제시한다고 생각합니다 .

전제:

Weaver는 90도 간격으로 2 방향에서 나오는 많은 리본이 제공되는 게임이며 목표는 특정 교차점에서 교체하여 원하는 출력을 얻는 것입니다.

   이처럼 : 이것은 스왑입니다 : 이것은 아닙니다 :

이렇게교환스왑이 아님

입력:

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) (또는 >=11- 인덱싱을 선택한 경우 엄격히 양수 ( ))입니다.
  • 보드 외부에있는 스왑은 무시하십시오
  • 문자 ( [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

@ 버기 (Bergi)는 입력이 보드 외부의 스왑을 포함 할 수 있으며이를 필터링하거나 무시해야 함을 의미합니다. (세번째 예는 그러한 스왑을 포함합니다)
Asone Tuhid

오. 스왑이 유효한 좌표 만 가지고 있었지만 솔루션에 맞는 순서로 정렬되었다고 가정 할 수 없다면 도전은 더 흥미 로웠을 것입니다.
Bergi

1
@Bergi 아마 옳았을 것입니다. 지금 변경하기에는 너무 늦었습니다. 그리고 아니, 모든 좌표가 긍정적이 될 것입니다. 질문을 업데이트하겠습니다.
Asone Tuhid

1
@AsoneTuhid 좌표가 (행, 열)이면 왼쪽 리본을 먼저, 위쪽 리본을 두 번째로 i / o하는 것이 더 합리적입니다. 허용 되나요?
ngn

답변:


8

파이썬 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사전 식 순서로 정렬 해야합니다 . ab나타내는 문자의 목록 (왼쪽 리본, 상단의 리본)입니다.

목록을 수정하여 반환 a하고 b.


3

젤리 , 37 35 30 바이트

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

온라인으로 사용해보십시오!

Dyadic 프로그램은 스왑 지수의 색인화 목록을 왼쪽 인수 (역 사전 순서로 정렬)로, (왼쪽 리본, 상단 리본) 오른쪽 인수로 사용합니다. 반환 (오른쪽 리본, 아래쪽 리본).


젤리는 암묵적인 언어입니다. 작업 할 변수가 거의 없기 때문에 한 번에 두 개 이상의 변수를 사용하는 것은 엉망입니다.

첫 번째 링크가 얻어 [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 Zip을 다시 압축하고`0`을 걸러 내고 효과적으로 z0을 취소합니다.
           ṙ "N} 음의 이동량만큼 회전 한 지퍼,`ṙ"`의 반대 방향.

기본적으로 " U1¦아래 ṙ"z0"입니다.


두 번째 링크는 단순히 OoB 인덱스 ( <Ạ¥Ðf L€) 를 필터링 하고 두 번째 인수 ( ⁹ṭ)를 추가하고 역 ( )을 줄이고 오버 스캔 ( ç하스켈과 유사 foldl)


2

파이썬 2 , 193 바이트

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]

온라인으로 사용해보십시오!

1 인덱스 스왑 좌표를 사용합니다


2

APL (Dyalog Classic) , 31 30 바이트

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

온라인으로 사용해보십시오!

왼쪽 인수는 한 쌍의 문자형 벡터입니다 (왼쪽 리본과 상단 리본). 올바른 인수는 좌표 쌍-스왑 위치의 벡터입니다. 오른쪽 리본과 하단 리본 쌍을 반환합니다. (이 예와 달리 좌표의 행-축 축 순서와 일치시키기 위해 리본의 왼쪽 위와 오른쪽 아래 순서를 사용합니다.)

스왑은 다른의 왼쪽 상단에 스왑이 올 정도로 분류해야 전에 그. 두 개의 스왑이 서로의 왼쪽 아래 / 오른쪽에있는 경우 순서는 중요하지 않습니다.

편집 : 입력에서 스왑의 역순을 요구하여 1 바이트 ( )를 저장 했습니다.


1

자바 스크립트, 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 = y2x1 = x2 && y1 < y2. 입력 배열을 수정하여 반환합니다.


나는 당신이 ;return[r,c]그것을 삭제 하고 그것을 수정
Asone Tuhid

if(r[i]&&c[j])더 많은 바이트를 절약 할 수 있습니다.
Neil

나는 나의 상태가 너무 강하다는 것을 알고 있지만, 당신의 상태는 자기 모순입니다. 고려하십시오 x1=1,x2=2,y1=2,y2=1. 때문에 x1<x2, (x1,y1)이전에 온다 (x2,y2); 그러나 y2<y1, (x2,y2)앞에 온다 (x1,y1). 나는 " x1 < x2y1 < y2"로 충분 하다고 생각 합니다.
user202729 1

@AsoneTuhid 흠, 그게 속임수라고 생각합니다. 입력 개체 수정은 참조 매개 변수의 출력과 다릅니다.
Bergi

1
Q : "허용되는 언어에서 7 개의 문자를 간단히 대입으로 대체 할 수 있습니까?" A : "예, 변경된 값은 함수를 호출 한 컨텍스트에서 액세스 할 수 있습니다." 나에게 꽤 분명한 것 같습니다.
Asone Tuhid

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.