모든 코드와 어댑터를 함께 묶을 수 있습니까?


30

언젠가는 사용하지 않는 컴퓨터 코드와 어댑터 (USB-USB mini, VGA-DVI 등)의 큰 상자를 파고 들었다고 가정하십시오. 엉킨 코드가 어디에서나 엉망이되어 모든 코드를 하나의 긴 가닥으로 묶은 다음 롤업하여 물건을 단순화 할 수 있는지 궁금합니다.

문제는 모든 코드와 어댑터를 이렇게 긴 줄로 연결할 수 있습니까? 플러그가 완전히 다른 두 개의 코드 만 있다면 서로 연결할 수 없습니다. 그러나 두 코드를 모두 연결할 수있는 세 번째 코드가 있다면 모든 코드를 함께 묶을 수 있습니다.

모든 코드 가닥 끝에 어떤 유형의 플러그가 있는지는 신경 쓰지 않습니다. 루프를 형성하기 위해 서로 연결하지 않아도됩니다. 모든 코드 가닥을 만들 수 있는지, 가능하다면 어떻게해야하는지 알고 싶을뿐입니다.

도전

모든 줄이 소유 한 코드 중 하나를 나타내는 여러 줄로 된 프로그램이나 함수를 작성하십시오. 코드는 -한쪽 끝에 플러그가있는 하나 이상의 대시 ( )로 구성됩니다. 플러그는 항상 8 자 중 하나입니다 ()[]{}<>.

다음은 유효한 코드입니다.

>->
(--[
}-{
<-----]
(---)

그러나 이것들은 아닙니다 :

-->
(--
)--
[{
---

코드를 연결할 때 정확히 동일한 브래킷 유형의 플러그 만 함께 연결할 수 있습니다.

다음은 유효한 코드 연결입니다.

...---((---...
...---))---...
...---]]---...
...---{{---...
...---<<---...

그리고 이것들은 유효하지 않습니다 :

...---()---...
...---)(---...
...---{]---...
...---{[---...
...---><---...
...--->)---...

입력의 모든 코드를 하나의 긴 스트랜드로 재 배열하고 함께 연결할 수있는 경우 해당 스트랜드를 한 줄의 stdout으로 출력합니다 (선택적 후행 줄 바꿈). 여러 솔루션이있는 경우 출력 할 솔루션 중 하나를 선택할 수 있습니다. 단일 가닥을 만들 수 없으면 아무 것도 출력하지 않습니다 (또는 선택적인 후행 줄 바꿈으로 빈 문자열을 출력합니다).


예를 들어 입력이

[-->
{---]
>----{

출력은

[-->>----{{---]

모든 코드가 서로 연결되어 있습니다.

그러나 입력이

[-->
{---]

코드를 연결할 수 없으므로 출력이 없습니다.


연결하는 데 필요한만큼 코드를 뒤집을 수 있습니다. 예를 들어, [-->그리고 <--]그들이 연결 유형과 동일하게 할 수 있기 때문에 효과적으로 같은 코드입니다. 일부 출력은 입력 코드 플립에 따라 달라질 수 있습니다.


예를 들어

(-[
}--]

출력 할 수 있었다

(-[[--{

두 번째 코드가 뒤집힌 곳

}--]]-)

첫 번째 코드가 뒤집힌 곳.

(일반적으로 전체 출력 플립은 모든 코드를 개별적으로 처음 플립하는 것과 동일하므로 유효합니다.)


출력의 코드 길이는 물론 해당 입력 코드의 길이와 일치해야합니다. 그러나 모든 코드 가닥을 만들기 위해 코드를 원하는만큼 재정렬하고 뒤집을 수 있습니다. 입력에는 항상 하나 이상의 코드가 포함됩니다.

바이트 단위의 가장 짧은 코드가 이깁니다.

테스트 사례

출력이있는 경우 :

[-->
{---]
>----{
gives
[-->>----{{---]
or
[---}}----<<--]

(-[
}--]
gives
(-[[--{
or
}--]]-)

(-)
gives
(-)

[--{
gives
[--{
or
}--]

[-]
]-[
gives
[-]]-[
or
]-[[-]

[----->
)------------[
{--<
}---)
could give
[----->>--}}---))------------[
or
>--}}---))------------[[----->
or
}---))------------[[----->>--}
or
{--<<-----]]------------((---{
etc.

>-->
>->
>--->
could give
>-->>->>--->
or
>--->>-->>->
or
>->>-->>--->
or
<--<<---<<-<
etc.

(-]
]->
>-}
}-)
)-[
[-<
<-{
{-(
could give
(-]]->>-}}-))-[[-<<-{{-(
or
{-((-]]->>-}}-))-[[-<<-{
or
<-{{-((-]]->>-}}-))-[[->
etc.

출력이없는 경우 :

[-->
{---]

[-]
[-]

(-]
]->
}-)

>->
>-->
]---]

[-------------------]
]-------------------[
[-----------------]
[-----------------]

{--[
]--}

6
사용하지 않는 컴퓨터 코드 및 어댑터의 큰 상자 기분이 좋아집니다.-나는 유일한 사람이 아닙니다. 실제로이 상자들 중 몇 개가 있습니다.
Digital Trauma

하지만 코드를 연결하면 어떻게 되나요?
anOKsquirrel

코드 가 모두 유효한 것으로 보장 됩니까?
R. Kap

@ R.Kap 네, 그렇습니다
Calvin 's Hobbies

답변:


10

읽을 수 없음 , 3924 바이트

Unread에서 콜 스택과 유사한 구조를 구현 한 것은 이번이 처음입니다.

(이것의 첫 번째 버전은 5300 바이트 이상이었습니다. 골프를 얼마나했는지에 대한 아이디어를 제공하기 위해서입니다.)

' "" "" "" ""' "" "" "" ' "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" " '" "'" " '" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" " " '" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """"""""""""""""""""""""""""""""""""""""""""""""""" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ' "" "" "" "'" " '" "'" "" "" "" ' "" "" "" "" "" "" "" "" "" "" ""' "" "" "" " '" "" "" ""' "" ' "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" ' "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ' "" "" "" "" " '" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ ' "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' ""' "" " '" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" " '' "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" " " '" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "' "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" " '" "" "" "" "'" "" "" "" " '" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "'" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "' ' "" "" "" " '" ""' "" ' ""' "" "" "" " '" "" "" "" "" "" "" "" "" "" ""'"" "" "" " '" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" '' "" "" " '" "" "" "" "" ""' "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "" "' ' "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" ""'"" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" ' ""' "" " '" "" "'" "" "" "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "" """ '" "" ""' "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "' ' "" "" "" "" "" "" " '" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" '' "" "" "" "" " '" "'" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" ''"" ' "" "" ""' "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" ""' "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ' "" "" ""' "" " '" "'" " '" "'" " '" "" "" "" "" "" "" "" "" "" "" "" "" "' "" "" "" "'" " '" "'" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" ' "" "" "" "'" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" ' "" "" "" "" ""' "" "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "' "" "" "" " '" "'" " '" ""' "" "" "" ' "" "" "" "" "" "" "" "" "" "" ""'"" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" ' "" "" "" ""' "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" " ' "" "" "" "'" "" ' "" "'" "" "" "" "" "" "" "" "" " '" "'" " '" "" "" """" "" "" "" "" " '" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" " " '" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" ""' "" ' ""' "" ' "" "" "" "'" "" ' "" "" "" "" "" "" "" "" ""'"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" ' "" "" ""' "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" ' "" "" ""' "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" ""' "" ' ""' "" ' "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" '' "" "" "" "" ' "" "'" "" "" "" "" "" " '" "'" "" "" "" "" "" "" "" "" "" """ "" "" " '" "" "" ""' "" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "' "" "" " '" "" "" "" "" "" "" "" "" "" "" "'" ' "" "" "" "" "" "" "" "" "" "" " "" "" "" "" ' "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ' ""' "" ' ""' "" ' "" "'" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "' "" "" "" "'" " '" "'" " '" "'" "" ' "'" "" "" "" " '" "'" "" "" "" "" "" "" "" "" "" ' "" "'" ""' "" "" "" "'" " '" "'" " '" "'" "" ' "'" "" "" "" " '" "'" "" "" "" "" "" "" "" "" "" ' "" "'" ""

설명

이 예제 입력을 고려하십시오.

>--{
[---}

대부분의 실행에서 테이프는 다음과 같이 배치됩니다.

  • 셀 0 ~ 5는 다양한 변수의 위치입니다.

  • Cell 6 이후에는 상자에있는 케이블 세트에 대한 모든 정보가 포함되어 있습니다.

    테이프 레이아웃 예

  • "제로 터미네이터"뒤의 나머지 셀에는 스택이 포함됩니다. 각 "스택 프레임"은 케이블의 첫 번째 셀 ( "시작 플러그"셀)을 가리키는 단일 셀입니다. 위의 예제에서 프로그램이 솔루션을 찾았다 고 판단하면 스택에는 6 ( >--{첫 번째 케이블 참조)과 21 ( {---]두 번째 케이블의 미러 참조 )이 포함됩니다.

이 프로그램은 세 가지 주요 단계로 진행됩니다.

  1. 전체 입력을 읽고 모든 미러링 된 케이블을 포함하여 위의 구조를 생성하십시오.
  2. 모든 조합을 시도해보십시오 (그러나 해결책이 있으면 중지하십시오).
  3. 솔루션을 찾으면 출력하십시오.

첫 번째 단계 (입력 읽기 및 케이블 생성 구조)는 셀 # 1 (내가 호출 할 것 p)과 # 2 (내가 호출 할 것) 만 사용 ch하며 다음과 같이 while 루프에서 작동합니다.

  • 조건 : p6 씩 증가하는 동안 다음 문자 (시작 플러그)를 cell로 읽고 (EOF) *p아닌지 확인하십시오 -1.

  • (하이픈) 이외의 문자가 나타날 때까지 이후 문자를로 읽어서 *(p+2)계산합니다 . 이때 하이픈 (케이블 길이) 수와 하이픈이 아닌 마지막 문자 (끝 플러그)가 포함됩니다. 또한 하이픈 문자를 셀 # 5에 복사하여 나중에 출력 단계에서이 ASCII 코드에 액세스 할 수 있습니다.*(p+1)-*(p+1)*(p+2)

  • while 루프에서 미러 플러그를 찾아에 저장 *(p+3)한 다음 0이 p될 때까지 2 씩 증가시킵니다 *p. 의사 코드에서 루프는 다음과 같습니다.

    while (ch = *p) {
        *(p+3) = (ch -= 40) ? (ch -= 1) ? (ch -= 19) ? (ch -= 31) ? ch-32 ? *p-2 : *p+2 : *p+2 : *p+2 : *p-1 : *p+1
        p += 2
    }
    
  • 이 루프는 항상 두 번의 반복 (시작 플러그 및 엔드 플러그)을 수행하고이 케이블의 네 번째 및 여섯 번째 셀에 결과를 저장합니다. 이제주의를 기울 였다면, 여섯 번째 셀이 실제로 미러링 된 엔드 플러그의 올바른 위치이지만 미러 된 시작 플러그는 "부울 표시 원래 케이블"이라는 셀에 있습니다. 이 셀만 0이 아닌 값이면되므로 괜찮습니다.

  • 이후 p단 4의 총 증가하고있다, 지금 표시 "부울 나타내는 케이블이 사용 중입니다"셀을 가리키는 것. *(p+3)값으로 설정하십시오 *(p-1). 그러면 미러링 된 시작 플러그가 올바른 위치에 배치됩니다.

  • 하나 이상의 문자를 읽고 버립니다 (줄 바꿈이 예상되지만 프로그램은이를 확인하지 않습니다).

p초기에는 0에서 시작하지만 while 조건에서 6 씩 증가하므로 케이블 데이터는 셀 # 6에서 시작합니다. p루프 본체 내부에서 4 씩 증가하므로 각 케이블 당 총 10 개가 필요합니다.

두 번째 단계에서, 세포 # 0-4가 내가 전화 할게 있다고 변수들에 의해 점령 a, p, q, m,와 notdone. 셀 # 5는 여전히 하이픈의 ASCII 코드를 기억합니다.

2 단계를 준비하려면 *p케이블 목록의 터미네이터로 작동 할 수 있도록 0 ( "0 터미네이터"라고 표시된 셀)으로 다시 설정해야합니다 . 우리는 또한 q(스택 포인터)를 p+1(즉,“제로 터미네이터”뒤의 셀; 스택이 시작되는 곳)로 설정합니다. *q1 (스택의 첫 번째 항목; 왜 1이 나중에 분명해 질까요); 및 notdone1. 모든이 단일 문에서 이루어집니다 :

*p = (notdone = *(q = p+1) = 1)-1

두 번째 단계는 while 루프입니다. 그 상태는 간단 notdone합니다. while 루프를 반복 할 때마다 다음 4 가지 중 하나가 발생할 수 있습니다.

  1. 모든 케이블이 "사용 중"으로 표시되어 있습니다. 이것은 우리가 해결책을 찾았 음을 의미합니다 (현재 스택 내용으로 나타남).
  2. 우리는 발전 할 수 있습니다 *q(즉, 새로운 StackFrame을 작성) 같이 Recurse 다음 (우리는 즉시 그 쌍둥이와 함께 "사용"으로 표시)와 다른 자격 케이블.
  3. *q더 이상 적합한 케이블이 없기 때문에 진행할 수 없으므로 역 추적해야합니다 (스택 프레임을 제거하고 이전 케이블과 해당 트윈을 더 이상 "사용 중이 아님"으로 표시).
  4. *q더 이상 적합한 케이블이 없기 때문에 진행할 수 없으며 스택 맨 아래에 도달했기 때문에 역 추적 할 수 없습니다. 이것은 해결책이 없음을 의미합니다.

루프 바디는이 네 가지 조건 각각을이 순서대로 확인합니다. 세부 사항은 다음과 같습니다.

  1. mand p를 1로 설정 하고 while 루프에서 p5만큼 증가 (따라서 케이블을 반복)하고 *(p+4)(“사용 중”)이 설정되어 있는지 확인하십시오 . 그렇지 않으면 m0으로 설정 합니다. 루프가 끝나면 m모든 케이블이 사용 중인지 알려줍니다. 그렇다면 notdone0으로 설정 하여 메인 루프를 종료하십시오. 그렇지 않으면 아래 2 단계에서 계속하십시오.

  2. 설정 p으로 *q증분 (스택 상단의 케이블) 및 상기 유사한 반면 루프 p케이블을 반복하는 5. 시작할 때 *q우리는 이전에 고려하지 않은 것들만 고려합니다. 그러나 새 스택 프레임의 초기 값은 1이므로 첫 번째 케이블은 셀 6의 첫 번째 케이블이며 첫 번째 케이블입니다.

    각 케이블을 위해, 우리는 확인해야 *(p+4)이미 사용하지, 그리고 또한 수 있도록 중 하나를 *(q-1) 제로 (우리가 스택의 맨 아래에있어 의미가, 그래서 시작 플러그에 제약이 없다) 또는 *p (케이블의 시작 플러그)는 *(*(q-1)+2)(스택에서 바로 아래에있는 케이블의 끝 플러그)와 같습니다. 우리는 설정하여 평등에 대한 확인 a*(*(q-1)+2)m*p+1후 잠시 루프에서 모두 감소시키는. 가 +1있기 때문이다 m가 한 번 이상 감소되도록, 그동안 조건 내에서 감소한다 a. 하면 a이 끝에 제로이고, 두 플러그 같다.

    따라서 *(q-1)0이거나 동등 비교에 성공한 경우 케이블이 적합합니다. 설정 *q하는 p새로운 하나 스택의 상단에 케이블을 교체; m일치하는 케이블을 찾았 음을 나타내도록 동일하게 설정 하십시오. 그런 다음 감소 p합니다. 이 감소는 while 루프 (케이블을 통한 반복)가 일찍 종료되도록하는 약간의 트릭입니다. p다시 5 씩 증가하므로이 케이블의 "사용 중"플래그가 포함 된 셀로 가져갑니다. 방금 확인 했으므로 0입니다. 마지막으로, 케이블 반복 while 루프 후 m0이 아닌지 확인합니다 . 그렇다면 일치하는 케이블을 찾았으며 해당 케이블 p의 "사용 중"플래그를 가리키고 있습니다. 사용 중으로 표시하려면 1로 설정하십시오. 또한 설정*(*(p-1) ? p+5 : p-5)트윈을 사용중인 것으로 표시합니다. 마지막으로 qnew *q를 1로 늘리고 설정하여 새 스택 프레임을 만듭니다.

  3. 케이블 반복 while 루프 후 m0이되면 더 이상 일치하는 케이블이 없으므로 역 추적해야합니다. 감소는 q여전히 케이블 (비 제로 값)을 가리키는 않다면 스택을 아래로 이동하고 확인합니다. 그렇다면 해당 케이블과 해당 트윈을 더 이상 사용하지 않는 것으로 표시하십시오. (우리의 가치 저장 *q의를 p코드에서이 표현을 짧게 만들 수 있습니다.)

  4. 감소한 후 q값이 0 인 것을 발견하면 "제로 종결 자"이며 이는 스택을 초과 한 것입니다. 우리는 해결책이 없다는 결론을 내립니다. notdone메인 루프를 종료하기 위해 0으로 설정 했습니다.

세 번째 단계는 출력 단계입니다. 발생할 수있는 두 가지가 있습니다.

  • 메인 루프가 출력해야 할 솔루션을 찾았습니다.
  • 메인 루프는 해결책이 없다고 결론 내렸고 아무것도 출력하지 않았습니다.

편리하게 솔루션 이 없으면p 0 *q을 확인하기 전에 값으로 설정하기 때문에 0입니다. 해결책 있다면 p케이블을 통해 반복했기 때문에“제로 터미네이터”를 가리키고 있으므로 p스택을 반복 하는 데 사용할 수 있습니다 . 따라서 스택을 반복하여 각 케이블에 대해 시작 플러그 ( *(*p)), 하이픈 ( *(*p+1)while 루프 감소 , 셀 # 5에 저장된 하이픈 ASCII 코드 사용) 및 엔드 플러그 ( *(*p+2))를 출력합니다. 이것이 케이블 길이 정보를 파괴한다는 것을 명심하지 마십시오. 우리는 더 이상 필요하지 않습니다.


3

CJam, 67

qN%e!{_,2,m*\f{.{_{"()[]{}<>--"_@#1^=}%W%?}_2ew{~\W=#}%0-{;}&}~}%1<

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

참고 : 링크에는 버그 수정이 포함되어 있으므로 리포지토리의 최신 코드 (푸시되었지만 아직 릴리스되지 않은 코드)가 사용됩니다.

설명:

프로그램은 단순히 코드의 모든 순열과 모든 방향을 시도합니다.

qN%             read the input and split into lines
e!              generate all permutations
{…}%            map each permutation of cords
  _,            get the number of cords (n)
  2,m*          generate all patterns of n bits (cartesian power of [0 1])
  \f{…}         for each bit pattern and the cord permutation
    .{…}        apply the block to each bit and cord (flipping cords for bit 0)
      _         duplicate the cord
      {…}%      map each character of the cord
        "…"_    push the string of all the plugs (and 2 dashes) and duplicate it
        @#      get the index of the character in the string
        1^      XOR with 1
        =       get the character at this new index (plugs get toggled)
      W%        reverse the cord
                 the stack now has the bit, the original cord and the flipped cord
      ?         if the bit is 1, use the original cord, else use the flipped one
    _           duplicate the array of cords
    2ew         get all pairs of adjacent cords
    {…}%        map each pair of cords
      ~\        dump the 2 cords on the stack and swap them
      W=        get the right plug of the first cord
      #         find its position in the second cord (if 0, we have a match)
    0-          remove all the zeros
    {…}&        if the array is not empty (i.e. we have a mismatch)
      ;         pop the array of cords
  ~             dump all the results for this permutation on the stack
                 (to avoid nested arrays)
1<              get the first result (if any) from the array of all results

아마도 그것이 정확히 어떻게 작동하는지에 대한 설명일까요?
Timwi

@Timwi 좋아, 나는 또한 그것을 조금 더
골프

이 솔루션은 입력에 대한 출력을 생성하지 않으므로 유효하지 않습니다 (-] ]-> >-} }-) )-[ [-< <-{ {-(.
R. Kap

@ R.Kap 그것은 그 입력을 해결하지만, 특정 온라인 인터프리터는 타임 아웃을 가지고 있습니다 (그리고 그것에 대해 침묵합니다). 대신 여기에서 시도해 보거나 (몇 분 정도) 자바 인터프리터 (가장 빠름)를 사용하십시오
aditsu

사실, 위에 링크 된 인터프리터는 해당 입력을 해결하는 데 시간이 오래 걸릴 것입니다. 자바 인터프리터 내 컴퓨터 미만 1.5 분에서 해결할 수있는 문제 그것.
aditsu

2

자바 스크립트 (ES6), 206

재귀 함수

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>l[0]?l.some((b,i)=>r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])] .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)&&(l=[...l],l[i]=r,f(l)))?r:'':a

더 읽기

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>
  l[0]?
  l.some((b,i)=>
     r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])]
     .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)
     &&(l=[...l],l[i]=r,f(l))
    )?r:''
 :a

테스트

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>l[0]?l.some((b,i)=>r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])] .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)&&(l=[...l],l[i]=r,f(l)))?r:'':a

console.log=(...x)=>O.textContent+=x+'\n'

;[
 //OK
 ['[-->','{---]','>----{']
,['(-[','}--]']
,['(-)']
,['[--{']
,['[-]',']-[']
,['[----->',')------------[','{--<','}---)']
,['>-->','>->','>--->']
,['(-]',']->','>-}','}-)',')-[','[-<','<-{','{-(']
 //KO
,['[-->','{---]']
,['[-]','[-]']
,['(-]',']->','}-)']
,['>->','>-->',']---]']
,['[-------]',']-------[','[-------]','[---------]'] // shortened a little,
,['{--[',']--}']
].forEach(t=>{
  console.log(t+' : "'+f(t)+'"\n')
})
<pre id=O></pre>


1

자바 스크립트, 800 바이트

최적화 된 솔루션과는 거리가 멀지 만 여기에 자바 스크립트로 빠른 해킹이 있습니다 (공상적 인 ecma5 또는 아무것도 모르기 때문에 아무것도 없습니다).

function a(r){function t(r,t){var n=r.slice();return n.splice(t,1),n}function n(r){var t,n={"[":"]","]":"[",">":"<","<":">","(":")",")":"(","{":"}","}":"{"},e=r.split("").reverse();for(t=0;t<e.length;t++)n.hasOwnProperty(e[t])&&(e[t]=n[e[t]]);return e.join("")}function e(r,t){return r.unshift(t),r}var h,u,f=[];if(1==r.length)return r[0];for(h=0;h<r.length;h++){var l=r[h],i=t(r,h),c=l.charAt(0),g=l.charAt(l.length-1);for(u=0;u<i.length;u++){var o=i[u],s=o.charAt(0),p=o.charAt(o.length-1);c==p&&f.push(e(t(i,u),o+l)),g==s&&f.push(e(t(i,u),l+o)),o=n(o),s=o.charAt(0),p=o.charAt(o.length-1),c==p&&f.push(e(t(i,u),o+l)),g==s&&f.push(e(t(i,u),l+o))}}if(f.length<1)return!1;for(h=0;h<f.length;h++){if(1===f[h].length)return f[h][0];f[h]=a(f[h])}for(h=0;h<f.length;h++)if(f[h]!==!1)return f[h];return!1}

Ungolfed, here ... 적어도 2 개의 for 루프가 불필요하고 맨 위에 단일 요소 입력을 확인하고 맨 아래에 단일 요소 일치를 확인하는 것이 번거롭지 만 ... 작동하는 것처럼 보입니다. 테스트 입력을 처리합니다.

function a(inputs)
{
	var i, ii, matches = [];
	if (inputs.length == 1) {
		return inputs[0];
	}
	// For each of the elements in inputs (e1)
	for (i = 0; i < inputs.length; i++) {
		var e1 = inputs[i],
			others = except(inputs,i),
			e1s = e1.charAt(0),
			e1e = e1.charAt(e1.length-1);
		// Compare to each of the other elements in inputs (e2)
		for (ii = 0; ii < others.length; ii++) {
			// get the start and end of the elements to compare (e1s,e1e,e2s,e2e)
			var e2 = others[ii],
				e2s = e2.charAt(0),
				e2e = e2.charAt(e2.length-1);
			// if any of them match up (e1s == e2e || e1s == e2s || e1e == e2s || e1e = e2e)
			// Make a new array of inputs containing the joined elements (as a single element) and all other elements which might join with them
			if (e1s == e2e) {
				matches.push(addTo(except(others,ii),e2+e1));
			}
			if (e1e == e2s) {
				matches.push(addTo(except(others,ii),e1+e2));
			}
			e2 = flip(e2);
			e2s = e2.charAt(0);
			e2e = e2.charAt(e2.length-1);
			if (e1s == e2e) {
				matches.push(addTo(except(others,ii),e2+e1));
			}
			if (e1e == e2s) {
				matches.push(addTo(except(others,ii),e1+e2));
			}
		}
	}

	if (matches.length < 1) {
		return false;
	}

	for (i = 0; i < matches.length; i++) {
		if (matches[i].length  === 1) {
			return matches[i][0];
		} else {
			matches[i] = a(matches[i]);
		}
	};

	for (i = 0; i < matches.length; i++) {
		if (matches[i] !== false) {
			return matches[i];
		}
	};

	return false;

	function except(list,idx)
	{
		var newList = list.slice();
		newList.splice(idx,1);
		return newList;
	}
	function flip(s) {
		var replacements = {
			'[':']',
			']':'[',
			'>':'<',
			'<':'>',
			'(':')',
			')':'(',
			'{':'}',
			'}':'{'
		}, i, a = s.split('').reverse();
		for (i = 0; i < a.length; i++) {
			if (replacements.hasOwnProperty(a[i])) {
				a[i] = replacements[a[i]];
			}
		}

		return a.join('');
	}
	function addTo(arr,newEl)
	{
		arr.unshift(newEl);
		return arr;
	}
}


1
몇 바이트를 절약하기 위해 함수의 이름을 바꿀 수 있습니다. stackoverflow.com/questions/6156319/…
noɥʇʎԀʎzɐɹƆ

1
모든 버전의 JavaScript에서는 .charAt를 피하십시오. s.charAt(x)===s[x]
edc65

1

파이썬 3, 217 바이트

from itertools import*
a='()[]{}<>'
all(any(c[-1]!=d[0]for c,d in zip(q,q[1:]))or print(''.join(q))for p in permutations(open(0))for q in product(*[(c[:-1],a[a.find(c[-2])^1]+c[-3:0:-1]+a[a.find(c[0])^1])for c in p]))

( 아이 데온 데모 )


이것은 어떻게 입력을 받습니까?
R. Kap

@ R.Kap stdin에서 라인 당 하나의 코드.
Anders Kaseorg

적어도 내가 그것을 실행했을 때 그것은 보이지 않는 것 같습니다.
R. Kap

또한, 정답을 얼마나 빨리 찾을 수 (-] ]-> >-} }-) )-[ [-< <-{ {-(있습니까?
R. Kap

@ R.Kap 입력 및 출력 생성에 대한 예제는 Ideone의 데모를 참조하십시오. (그렇게하려는 경우 Windows에서는 작동하지 않을 수 있습니까?) 테스트 케이스에서 ~ 즉시 실행됩니다. 물론 기하 급수적으로 시간이 걸리는 경우도 있습니다.
Anders Kaseorg

0

루아, 477 바이트

function r(s)return s:reverse():gsub("[()%[%]{}<>]",{["("]=")",[")"]="(",["["]="]",["]"]="[",["{"]="}",["}"]="{",["<"]=">",[">"]="<"})end
function a(c,b)for i, v in next,b do
m=c:sub(-1,-1)n=v:sub(1,1)o=r(c):sub(-1,-1)p=r(v):sub(1,1)l=table.remove(b,i)if m==n then
return a(c..v,b)elseif o==n then
return a(r(c)..v,b)elseif m==p then
return a(c..r(v),b)elseif o==p then
return a(r(c)..r(v),b)end
table.insert(b,i,l)end
return#b>0 and""or c
end
print(a(table.remove(arg,1),arg))

코드를 명령 행 인수로 허용


0

파이썬 3.5, 448 432 427 424 286 311 바이트 :

( 일부 입력보다 출력이 길어질 수있는 버그가 있기 때문에 +25 )

def g3(z):
 B=z.split();M='i[::-1].translate({41:40,40:41,125:123,123:125,62:60,60:62,93:91,91:93})';f=B+[eval(M)for i in B if eval(M)not in B];d=[f.pop(0)]
 for h in d:
  try:[d.append([f.pop(f.index(c))for c in f if h[-1]==c[0]][0])if len(d)<len(B)else E]
  except:break
 return''.join(d)if len(d)>=len(B)else''

완벽하게 작동합니다! 7 개 이상의 값을 가진 입력을 제외하고 . 입력에 대한 모든 순열과 입력 반전을 거쳐야하기 때문에 시간 이 오래 걸립니다 . 가능하면 가능하면이 문제를 해결하려고 노력하지만 지금은이 정도면 충분합니다. 지금은 모두 좋다! 경우 에만 나는 어떻게 든 사용할 수있는 try-except지능형리스트에서 블록을, 그것은 조금 짧은, 그리고 볼 수 있었다 훨씬 좋네요을. 그럼에도 불구하고 이제는 모든 테스트 사례에서 작동하며 무엇보다도 수입을 사용 하지 않습니다 ! :)

온라인으로 사용해보십시오! (아이디어) (284 bytes here)

(도움말 : 사용해 보려면 "포크"를 선택한 다음 공백으로 구분 하여 선택 사항을 입력 하고 "실행"을 선택하십시오.)

설명

기본적으로 일어나고있는 일은 ...

  1. B공백에서 입력을 구성 요소 "코드"로 분할하여 입력에서 목록 이 작성됩니다.
  2. M내가 만든 문자열은 평가시 B모든 코드가 포함되어 있지만 이번에는 거꾸로 된 목록을 반환 합니다 .
  3. 에서 생성 된 목록 M은 궁극적으로 "코드"의 가능한 모든 방향으로 B목록을 생성하기 위해 자체적 으로 연결됩니다 f.
  4. d첫 번째 값 (value f[0]) 으로 초기화되는 다른 목록 이 작성됩니다 f.
  5. 마지막으로의 모든 값 d이 반복되고 각 값의 마지막 문자가의 각 요소의 첫 번째 문자와 비교되고 f일치하는 것이 있으면 해당 문자가 팝되거나 제거되어 list에서 반환됩니다 f. a가 될 때까지이 일이 IndexError발생, 또는 목록의 길이를 d초과 B하고,이 NameError에 호출 후 발생 E처리 둘, 다음 목록 d목록의의 내용을 문자열로 결합되고, 길이가 긴로 반환 d더 list 길이보다 크거나 같습니다 B. 그렇지 않으면, 빈 문자열이 반환됩니다 ( ''). d길이가 같지 않기 때문에 B목록의 모든 "코드"를 나타냅니다.B 하나의 긴 "코드"에 연결할 수 없습니다.

@KennyLau 무엇을 바 꾸었습니까? 내가 볼 수 있듯이 방금 추가했습니다 <!-- language: lang-python -->.
R. Kap

이를 통해 코드의 구문 강조를 활성화 할 수 있습니다.
Leaky Nun

@KennyLau 와우, 멋지다. PPCG에서 어떻게 할 것인지 궁금했습니다. 이제 알아요! 고맙습니다! :)
R. Kap
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.