길이 목록과 길이를 나타내는 문자열이 있으면 일치합니까?


16

길이 목록을 나타내는 패턴과 해당 길이를 나타내는 문자열이 있으면 일치합니까?

관심있는 사람들에게는 Nonogram 의 행이나 열 이 올바른지 확인하는 것과 동등한 질문 입니다. 그러나 나는 Nonograms와 관련된 모든 언어를 생략 하여이 퍼즐에 익숙하지 않은 사람들에게 질문을 덜 혼란스럽게 만듭니다.

입력

줄 바꿈으로 구분 된 두 줄의 데이터.

  1. 첫 번째 줄은 공백으로 구분 된 정수 목록입니다. 예 :

    3 6 1 4 6
    

    이 줄 은 정수 목록과 동일한 크기의 채워진 공간 패턴알 수없는 빈 공간으로 구분되며 양의 길이는 두 번째 줄과 일치해야합니다. 일치하는 문자열의 시작과 끝에 빈 공간이있을 수도 있습니다.

  2. 두 번째 줄은 한 줄의 패턴과 일치하거나 일치하지 않는 줄입니다. 그것은 전적으로 구성 #, x_. 이 라인은되고 보장적어도 긴만큼 첫 번째 줄에서 정수의 합이 플러스, 다른 정수의 수를 뺀 1, 및 이상이 될 수 있습니다. 따라서이 경우 두 번째 줄은 (3+6+1+4+6) + (5) - 124 자 이상이어야 합니다. 첫 번째 라인의 패턴과 일치하는 24 자 라인 예제는 다음과 같습니다.

    ###_######_#_####_######
    

기호의 의미 :

  • # 이것은 채워진 상자를 나타냅니다
  • x "비어 있음"으로 표시된 상자를 나타냅니다.
  • _ 이것은 알려지지 않은 / 표시되지 않은 상자를 나타냅니다.

아이디어는 :

  1. 두 번째 줄이 첫 번째 줄의 패턴을 충족하는 유효한 행일 수 있는지 확인하십시오.
    • (쓰기 아래의 예를이 당신에게 달려해야 할 선택이 방법 당신은 명백한 오류 메시지를 인쇄해야합니다 ERROR미지의 공간이 하나로 작성 할 수없는 경우 그러나 그 5 자 일 필요는 없습니다) #또는 x처음에 맞게 선.
  2. 공백으로 구분 된 행 에 완전히 배치 된 정수의 인덱스가없는 인덱스 를 인쇄하십시오 . 모호성이 있으면 색인을 인쇄 하지 마십시오 .

예 :

Input:                    |  Output:    |  Reason:
--------------------------------------------------------------------------
3 6 1 4 6                 | 0 1 2 3 4   |  This is a complete string that 
###x######x#x####x######  |             |  matches perfectly.
--------------------------------------------------------------------------
1 2 1                     | 0 1 2       |  There is no ambiguity which filled cells 
#____xx___##__x_#         |             |  correspond to which parts of the pattern.
--------------------------------------------------------------------------
1 2 1                     |             |  I don't know whether the filled block is
____#___x                 |             |  part of the 1, 2, or 1, so output nothing.
--------------------------------------------------------------------------
1 2 1                     | ERROR       | The first unknown cell will create a block that
#_#x_#                    |             | matches either 1 1 or 3, but not 1 2.
--------------------------------------------------------------------------
1 2 1                     | 0 2         | Even though we know where all the filled cells
#____#                    |             | must be, only 0 and 2 are actually filled here.
--------------------------------------------------------------------------
1 1 1 1                   |             | There are so many possible ways to do fill this,
__#_______#____           |             | we don't know which indices are actually matched.
--------------------------------------------------------------------------
4 4                       |             | Again, we don't know WHICH 4 is matched here, 
______x####________       |             | so output nothing.
--------------------------------------------------------------------------
4 4                       | 0           | However, here, there's no room for a previous 4,
__x####________           |             | so the displayed 4 must be index 0.
--------------------------------------------------------------------------
3                         | ERROR       | We can't fit a 3 into a space before or after
__x__                     |             | the x, so this is impossible to match.
--------------------------------------------------------------------------
5 1 3                     | 0           | While we can match the 5, we don't know whether
x#####x____#____          |             | the single block matches the 1 or the 3.
--------------------------------------------------------------------------
3 2 3                     | 1           | The two has been completely placed,
____##x##____             |             | even though we don't know which it is.

규칙 :

입력을 개행으로 구분 된 문자열 또는 STDIN (또는 가장 가까운 대안)으로 수신하고 출력을 공백으로 구분 된 문자열로 리턴하거나 STDOUT (또는 가장 가까운 대안)으로 인쇄 하는 프로그램 또는 함수를 작성할 수 있습니다 . 선택적으로 출력에 단일 후행 줄 바꿈을 포함시킬 수 있습니다.

또한 더 이상 재미 있지 않은 표준 허점금지 됩니다.


1
이것은 노노 그램을 해결하기위한 것입니다. 논 그램을 언급하는 것이 도움이 될 수 있습니다.
xnor

@ jimmy23013 이에 대한 답변으로 수정되었습니다.
durron597

답변:


5

펄, 134 바이트

(스위치 1 개 포함)

perl -pe '$p.="([#_]{$_})[x_]+"for@l=split;chop$p,$_=<>;/^[x_]*$p*$(?{$h[$_-1].=$$_ for 1..@l})(?!)/;$_=@h?join$",grep{$h[$_]!~/_/}0..$#l:ERROR'

STDIN에서 두 줄의 입력을받습니다. 모든 입력에 대해 다시 실행해야합니다.

아이디어는 먼저 주어진 길이와 일치하는 가능한 모든 패턴을 추출하는 것입니다. 예를 들어 길이 1 2와 패턴 이 있으면 #_x_#_일치하는 패턴은 (#, _#)(#, #_)입니다. 그런 다음 모든 인덱스에 대해 일치하는 패턴을 연결하십시오. 예를 들어 결과는 목록 (##, _##_)입니다. 이제 '#'문자 만있는 목록의 모든 문자열의 색인을 인쇄하십시오.

Perl의 정규식에서 가능한 모든 일치 항목을 추출하는 방법이 있습니다 .


멋있는. ungolfed 버전과 아이디어 링크를 추가해 주시겠습니까?
durron597

물론, 나는 대답의 끝에 링크를 추가했습니다.
svsd

골프 코드 스 니펫이 얼마나 끔찍한 지 보여주는 실제 사례! 적어도 나에게
Arjun

1
@Arjun Golfing은 코드를 난독 화하는 경향이 있습니다. 골프 코드에는 아름다움이 있지만, 작성된 언어를 아는 경우에만 가능합니다.
svsd

1
한 시나리오가 문제 설명에서 여전히 모호하기 때문에 새로운 예를 추가했습니다. 다행히도이 경우에도 프로그램은 여전히 ​​올바르게 작동합니다.
durron597
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.