이 전선을 풀도록 도와주세요!


12

내 전선이 모두 뒤엉킨 상태입니다!

전선이 모두 꼬일 때 귀찮지 않습니까? 글쎄, 그건 나에게 일어난 일이므로 그들을 풀 수 있도록 도와 드리고 싶습니다! 귀하의 편의를 위해 장치에서 모두 연결을 끊었지만 모두 여전히 콘센트에 연결되어 있습니다. 당신의 도전은 그들을 풀어야하는 방법을 알아내는 것입니다!

입력

입력은 공백, 파이프 및 X (두 경우 모두)로 구성됩니다. 입력은 다음과 같습니다.

| | | |
 X  | |
| |  x 
|  X  |
| | | |

대문자 X는 왼쪽 와이어가 오른쪽 와이어를 가로 지르고 소문자 x는 반대를 의미합니다. 첫 줄과 마지막 줄은 항상입니다 | | | |.... 입력을 쉼표로 구분 된 문자열, 문자열 배열 등으로 취할 수 있습니다. 형식이 의미가 있고 추가 정보를 포함하지 않는 한 형식이 엄격하지 않습니다.

산출

이 도전을 위해, 나는 얼마나 오래 걸릴지 알아야 할뿐만 아니라, 무엇을해야하는지 정확하게 알아야합니다. 따라서 문자 R 또는 L을 가진 정수 쌍의 목록을 대소 문자를 구분하지 않고 출력합니다. 연결 해제 할 두 개의 전선과 방법을 나타냅니다 (R은 오른쪽 위를 의미하고 L은 L을 나타냄). 당신은 그것들을 가로 지르는 방법을 말해줘야합니다. 나는 그것을 스스로 알아낼 수 없다. 모든 정수 쌍 + 문자를 올바른 순서로 출력하고 여분의 넌센스 텍스트 (괄호, 쉼표 등)를 출력하지 않는 한 출력도 매우 유연합니다. 와이어는 0 개 또는 하나의 인덱스 일 수 있지만 인덱스는 왼쪽에서 시작해야합니다. 맨 위가 아니라 맨 아래에서 풀어야합니다. 출력 스타일은 일관성이 있어야하며 명확하지 않은 경우 출력 방법을 지정하십시오. 캐릭터의 경우는 일관성이 없었습니다.

샘플 출력

위의 입력 예에서 출력은 다음과 같습니다.

2 3 R
3 4 L
1 2 R

여기서 출력 형식은 줄 바꿈으로 구분 된 공백으로 구분 된 값 목록입니다. 이것은 1 인덱스입니다.

추가 사양

X와 x가 순서대로 서로 수직으로 쌓이는 것이 유효합니다. 게으 르기 때문에 불필요하게 전선을 바꾸고 싶지 않으므로 이러한 경우에는 아무것도 출력하지 마십시오. 그것을 찾으면, 전선을 부드럽게 잡아 당겨서 똑바로 뻗을 것입니다.

여러 개의 X와 x를 세로로 쌓아 두는 것도 유효하며, 다른 교차점에 와이어가 포함되어 있지 않는 한 추가 이동을 원하지 않습니다 (게으 르기 때문에). 따라서 문자가 X X x X x x다른 교차없이 열에 표시되면 출력은 여전히 ​​비어 있어야합니다!

이것이 명확하지 않은 경우, R은 X를 제거하고 L은 x를 제거합니다.

같은 행에 두 개의 와이어 교차가있을 수 있으며,이 경우 두 스왑 순서는 중요하지 않습니다. 당신은 결코 같은 것을 얻지 못할 것입니다 | X X |(중간 와이어가 왼쪽과 오른쪽의 와이어 위로 교차되고 있음을 의미하기 때문에 의미가 없습니다).

항상 교차점이있는 것은 아닙니다 ...

입력은 단일 파이프 일 수 있습니다. 그러나 입력은 절대 공백이되지 않습니다.

가장 짧은 유효한 솔루션이 12 월 20 일에 승리합니다!

더 많은 예

내가 약속 한대로 :

실시 예 1

입력

| | | | | |
| |  X   x 
 X  |  x  |
|  x  |  X 
 X   X  | |
| | | | | |

산출

1 2 R
3 4 R
2 3 L
5 6 R
1 2 R
4 5 L
3 4 R
5 6 L

실시 예 2

입력

| | |
 X  |
|  x 
| | |
|  X 
|  x 
| | |

산출

2 3 L
1 2 R

실시 예 3

입력

|

출력물 이 비어 있습니다. 예,이 사건을 처리해야합니다.

실시 예 4

입력

| |
 X 
 x 
 X 
 x 
 X 
 x 
 X 
 x 
 X 
 x 
| |

출력물 이 비어 있습니다. 재미로 :).

실시 예 5

입력

| |
 X 
 X 
 x 
 X 
 x 
 x 
| |

출력 이 여전히 비어 있습니다 ...


4
두 줄의 전선이 같은 줄에 얽혀있을 수 있습니까?
James Holderness

1
@JamesHolderness 그렇습니다. 이 경우 순서는 중요하지 않습니다. 나는 질문에서 그것을 분명히 할 것입니다. 감사!
HyperNeutrino

@JamesHolderness 완료!
HyperNeutrino

답변:


1

펀칭, 173 바이트

입력 내용은 도전 설명에 제공된 정확한 형식으로 stdin에서 읽습니다. 모든 행의 길이는 정확해야하며 마지막 행에는 줄 바꿈이 포함되어야합니다 (즉, 해당 행의 끝에 EOF만이 아님).

$1>>05p~$~:55+-#v_
$_^#`"N":+1g50$<>:2+3%1-05g6g+0v>!#:v#
vg50-1*2p51:-1_^#:<*2!!-*84p6g5<
 +#,.#$"R"\#\-#+5<^g51$_:0`6*\25g\v@_:#!.#:1#,
>+::25p6g\48*\6p48 *-:!^!:--1*2`0:<

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

이 솔루션의 기본 아이디어는 각 와이어의 꼬임 수를 추적하는 "배열"이 있다는 것입니다. 따라서 한 방향으로 꼬임이 발생할 때마다 관련 와이어의 카운트가 증가하고 다른 방향으로 꼬이면 카운트가 감소합니다.

특정 와이어의 꼬임을 처리하는 동시에 와이어의 왼쪽과 오른쪽의 꼬임 수를 확인합니다. 둘 중 하나가 0이 아닌 경우 스택에 이러한 꼬임을 "세척"해야합니다. 더 이상 반대 방향으로 꼬인 뒤틀림으로 풀 수 없기 때문입니다.

마지막 입력 라인 이후에 입력 스트림은 EOF를 반복적으로 반환하며, 이러한 EOF 문자는 적어도 플러싱 목적으로 모든 와이어에서 꼬임으로 해석됩니다. 이렇게하면 프로그램이 배열의 미해결 카운트를 플러시하지만 새로운 트위스트 카운트는 생성하지 않습니다.

입력 처리를 마치면 와이어를 풀기위한 모든 명령이 스택에 배치됩니다. 즉, 와이어를 아래에서 위로 풀기 위해 필요한 명령을 출력하기 위해 역순으로 간단히 팝할 수 있습니다.


이것은 완벽하게 작동하는 것으로 보입니다. 잘 했어!
HyperNeutrino

이것이 정답입니다. 잘 했어! 또한 다른 답변을 확인해 주셔서 감사합니다! :)
HyperNeutrino

@AlexL. 감사. 이것은 사이트에서 나의 첫 번째 승리 답변입니다. Befunge로 가능할 것이라고 생각하지 않았습니다. :)
James Holderness

문제 없어요. 승리를 축하합니다! 나는 당신이 Befunge 답변을 얼마나 짧게했는지뿐만 아니라 오히려 놀랐습니다. :)
HyperNeutrino

5

Pyth- 26 25 바이트

아주 간단합니다. 필터링을 골라 낼 수 있습니다.

fhhT_m+hB/xrdZ\x2@"RL"}\x

여기에서 온라인으로 사용해보십시오 .


좋은 시도입니다. 불행히도, 출력되는 문자가 올바르지 않습니다. 매번 R 인 것 같습니다. 그래도 좋은 시도; 숫자가 올바르게 나오고 있습니다!
HyperNeutrino

@AlexL. 나는 바보입니다, 나는 args를 in에 고정하고 고정 시켰으며, 그것은 저를 한 바이트도 절약했습니다
Maltysen

내가 참조. 좋은 대답입니다! 공감하십시오. :)
HyperNeutrino 5

2
내가 실수하지 않으면 X와 x가 세로로 쌓인 경우를 처리하지 않는 것 같습니다. 전선을 불필요하게 앞뒤로 교체하라는 메시지가 표시됩니다.
James Holderness

5

자바 스크립트 (ES6), 178 바이트

f=([t,...a],r=[])=>a[0]?t.replace(/x/gi,(c,i)=>(c=c<'x'?'R':'L',i=++i/2,r.reduce((f,[j,,d],n)=>f||i<j+2&&j<i+2&&(j-i|c==d||r.splice(n,1)&&2),0)<2?r=[[i,i+1,c],...r]:r))&&f(a,r):r

입력을 행을 나타내는 문자열 배열로 가져 와서 값 배열 (예 :)을 반환합니다 [[2, 3, "R"], [3, 4, "L"], [1, 2, "R"]]. 역순은 제거에 도움이됩니다.


어디 s에서 왔어요 ? 나는 그것을 repl.it에서 실행 중이며 ReferenceError: s is not defined.
HyperNeutrino

@AlexL. 죄송합니다. 이전 버전의 코드에 실수로 붙여 넣었지만 아직 골프를 마치지 못했습니다. 지금 수정해야합니다.
Neil

@JamesHolderness 답변을 제출 한 후 질문이 변경되었으므로 업데이트해야합니다.
Neil

@JamesHolderness Yep. 죄송합니다, 닐 나는 이전에 명확하지 않은 질문의 일부를 명확히해야했습니다.
HyperNeutrino

@JamesHolderness 나는 이것이 현재 요구 사항으로 업데이트 할 수있을 때까지 질문의 이전 반복에 응답하여 내 대답을 비 경쟁으로 표시 한 이유를 알고 있습니다.
Neil

3

파이썬 2, 244241 바이트

m=[]
for l in input():
 for i in range(len(l)):
  c=l[i];a=i/2+1;L,R=[a,a+1,'LR'[c>'v']],[a,a+1,'RL'[c>'v']];x=m.index(L)if L in m else-1;M=zip(*m[:x+1])
  if c in'xX':
   if x>=0and(a in M[1]or a+1in M[0])<1:del m[x]
   else:m=[R]+m
print m

문자열 목록으로 입력을받습니다.

예:

입력: ['| | | |', ' X | |', '| | x ', '| X |', ' x | |']

산출: [[1, 2, 'L'], [2, 3, 'R'], [3, 4, 'L'], [1, 2, 'R']]

편집 : 경우 고정 :

입력: ['| | |', ' X |', ' X |', ' x |', '| X', ' X |', ' x |', ' x |', '| | |']

산출: [[1, 2, 'L'], [2, 3, 'R'], [1, 2, 'R']]


@JamesHolderness 지금 수정해야합니다.
TFeld

제대로 작동하는 것 같습니다.
HyperNeutrino

@JamesHolderness 예, 문제가있는 것 같습니다. TFeld를 수정하십시오. 그렇지 않으면, 좋은 시도!
HyperNeutrino

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