Дано список довжин та рядок, що представляє ці довжини, чи відповідають вони?


16

З огляду на шаблон, що представляє список довжин, і рядок, що представляє ці довжини, чи відповідають вони?

Для зацікавлених це питання, еквівалентне тому, щоб перевірити, чи рядка або стовпчик нонограми може бути правильним. Однак я пропустив усю мову, що стосується Нонограм, щоб зробити питання менш заплутаним для тих, хто не знайомий з цими пазлами.

Вхідні дані

Два рядки даних, розділені новим рядком.

  1. Перший рядок - це розділений пробілом список цілих чисел, наприклад:

    3 6 1 4 6
    

    Цей рядок описує візерунок заповнених пробілів розміром, рівним цілому списку, розділених порожніми пробілами невідомої позитивної довжини, яким повинен відповідати другий рядок. Також можуть бути порожні пробіли на початку та в кінці відповідного рядка.

  2. Другий рядок буде рядком, який може або не відповідає шаблону в першому рядку. Вона цілком складається з #, xі _. Гарантовано, що цей рядок буде принаймні до тих пір, поки сума цілих чисел у першому рядку плюс кількість різних цілих чисел, мінус 1, і може бути довшою. Отже, другий рядок у цьому випадку гарантовано має бути принаймні (3+6+1+4+6) + (5) - 1або 24 символи. Ось приклад рядка з 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

Perl, 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 тут .


Класно. Не могли б ви додати будь-яку версію та посилання на ideone?
durron597

Звичайно, я додав посилання наприкінці своєї відповіді.
svsd

Справжній приклад того, як може виглядати жахливий фрагмент коду для гольфу! Принаймні мені.
Арджун

1
@ Арджун Гольфінг, як правило, придушує код. Код у гольф-коді є красою, але тільки якщо ви знаєте мову, на якій написано.
svsd

1
Я додав новий приклад, оскільки один сценарій все ще був неоднозначним в описі проблеми. На щастя, ваша програма все ще працює коректно і в цьому випадку.
durron597
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.