Biorąc pod uwagę listę długości i ciąg reprezentujący te długości, czy pasują do siebie?

16

Biorąc pod uwagę wzorzec reprezentujący listę długości i ciąg reprezentujący te długości, czy pasują do siebie?

Dla zainteresowanych jest to pytanie równoważne ze sprawdzeniem, czy wiersz lub kolumna Nonogramu może być poprawna. Jednak pominąłem wszystkie języki związane z Nonogramami, aby pytanie było mniej mylące dla osób niezaznajomionych z tymi zagadkami.

Wejście

Dwie linie danych oddzielone znakiem nowej linii.

  1. Pierwszy wiersz będzie oddzieloną spacjami listą liczb całkowitych, przykład:

    3 6 1 4 6
    

    Ten wiersz opisuje wzór wypełnionych spacji o wielkości równej liście liczb całkowitych, oddzielonych pustymi spacjami o nieznanej , dodatniej długości, które musi dopasować drugi wiersz. Mogą być również puste spacje na początku i na końcu dopasowanego łańcucha.

  2. Druga linia będzie linią, która może, ale nie musi, pasować do wzorca w linii pierwszej. Składa się wyłącznie z #, x, i _. Ta linia jest gwarantowana być co najmniej tak długo, jak suma liczb w pierwszym wierszu, powiększonej o liczbę różnych liczb, minus 1, a może dłużej. Zatem w tym przypadku druga linia ma co najmniej (3+6+1+4+6) + (5) - 124 znaki. Oto przykładowa 24-znakowa linia, która pasuje do wzorca w pierwszym wierszu:

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

Znaczenie symboli:

  • # To reprezentuje wypełnione pole
  • x To pole oznaczone jako „z pewnością puste”
  • _ To reprezentuje nieznane / niezaznaczone pole.

Cel

Chodzi o:

  1. Sprawdź, czy drugi wiersz może być prawidłowym wierszem, który spełnia wzór pierwszego wiersza.
    • Musisz wydrukować jednoznaczny komunikat o błędzie (w jaki sposób wybrać, aby zrobić to do ciebie; poniższe przykłady zapisu ERROR, ale nie muszą być te 5 znaków) Jeżeli nieznane przestrzenie nie mogą być wypełnione albo z #albo xdopasować pierwszy linia.
  2. Wydrukuj indeksowane zero indeksy liczb całkowitych, które zostały całkowicie umieszczone w wierszu, rozdzielone spacjami. W przypadku niejasności nie drukuj indeksu .

Przykłady:

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.

Zasady:

Możesz napisać program lub funkcję , która odbiera dane wejściowe jako ciąg rozdzielany znakiem nowej linii lub ze STDIN (lub najbliższej alternatywy) i zwraca dane wyjściowe jako ciąg rozdzielany spacjami lub drukuje je do STDOUT (lub najbliższej alternatywy).Opcjonalnie możesz dołączyć jeden końcowy znak nowej linii do wyniku.

Dodatkowo zakazanestandardowe luki, które nie są już śmieszne .

durron597
źródło
1
To jest do rozwiązywania nonogramów, prawda? Warto wspomnieć o nongramach, ponieważ to sprawia, że ​​wyzwanie ma natychmiastowy sens dla tych, którzy je rozwiązują.
xnor
@ jimmy23013 Edytowane w odpowiedzi.
durron597,

Odpowiedzi:

5

Perl, 134 bajty

(zawiera 1 przełącznik)

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

Pobiera dwa wiersze danych wejściowych ze STDIN. Należy ponownie wykonać dla każdego wejścia.

Chodzi o to, aby najpierw wyodrębnić wszystkie możliwe wzory pasujące do podanych długości. Na przykład, jeśli mamy długości 1 2i wzór #_x_#_, to pasujące wzory to (#, _#)i (#, #_). Następnie konkatenuj dopasowane wzorce dla każdego indeksu - na przykład wynikiem jest lista(##, _##_) . Teraz wydrukuj indeksy wszystkich ciągów na liście, które mają tylko znaki „#”.

Mam metoda, aby wyodrębnić wszystkie możliwe mecze z regex w Perl tutaj .

svsd
źródło
Chłodny. Czy mógłbyś dodać wersję bez golfa i link ideone?
durron597,
Jasne, dodałem link na końcu mojej odpowiedzi.
svsd,
Prawdziwy przykład tego, jak okropny może być fragment kodu w golfa! Przynajmniej dla mnie.
Arjun,
1
@Arjun Golfing ma tendencję do zaciemniania kodu. W kodzie golfowym jest piękno, ale tylko jeśli znasz język, w którym jest napisany.
svsd
1
Dodałem nowy przykład, ponieważ jeden scenariusz był nadal niejednoznaczny w opisie problemu. Na szczęście w tym przypadku program nadal działa poprawnie.
durron597,