Bir uzunluk listesi ve bu uzunlukları temsil eden bir dize verildiğinde, bunlar eşleşiyor mu?


16

Bir uzunluk listesini temsil eden bir desen ve bu uzunlukları temsil eden bir dize verildiğinde, bunlar eşleşir mi?

İlgilenenler için bu, Nonogram'ın bir satırının veya sütununun doğru olup olmadığını doğrulamaya eşdeğer bir sorudur . Ancak, bu bulmacalara aşina olmayanlar için soruyu daha az kafa karıştırıcı yapmak için Nonogram'larla ilgili tüm dilleri atladım.

Giriş

Yeni satırla ayrılmış iki veri satırı.

  1. İlk satır, boşlukla ayrılmış bir tamsayı listesi olacaktır, örnek:

    3 6 1 4 6
    

    Bu çizgi , ikinci satırın eşleşmesi gereken bilinmeyen , pozitif uzunlukta boş boşluklarla ayrılmış, tamsayı listesine eşit boyutta doldurulmuş boşlukların bir desenini tanımlar . Eşleşen dizenin başında ve sonunda boş alanlar da olabilir.

  2. İkinci satır, birinci satırdaki desenle eşleşebilen veya eşleşmeyebilen bir satır olacaktır. Tamamen oluşur #, xve _. Bu satırın en azından ilk satırdaki tamsayıların toplamı artı ayrı tamsayıların sayısı eksi 1 olduğu sürece garanti edilir ve daha uzun olabilir. Bu durumda, bu durumda ikinci satırın en az veya 24 karakter uzunluğunda olması garanti edilir . İlk satırdaki desenle eşleşen 24 karakterlik bir örnek:(3+6+1+4+6) + (5) - 1

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

Sembollerin anlamı:

  • # Bu doldurulmuş bir kutuyu temsil eder
  • x Bu, "boş olması garantili" olarak işaretlenmiş bir kutuyu temsil eder
  • _ Bu, bilinmeyen / işaretlenmemiş bir kutuyu temsil eder.

Hedef

Fikir:

  1. İkinci satırın, ilk satırın desenini karşılayan geçerli bir satır olabileceğini doğrulayın.
    • ERRORBilinmeyen boşlukların ikisiyle doldurulması #veya xilkiyle eşleşmemesi durumunda, kesin bir hata mesajı yazdırmalısınız (bunu nasıl seçeceğiniz size bağlıdır; aşağıdaki örnekler yazılır, ancak bu 5 karakter olması gerekmez) hat.
  2. Tamamen sıraya yerleştirilmiş , boşlukla ayrılmış tamsayıların sıfır indeksli indekslerini yazdırın . Belirsizlik varsa, yok indeksi yazdırmak .

Örnekler:

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.

Kurallar:

Girişi yeni satırla ayrılmış bir Dize veya STDIN'den (veya en yakın alternatif) alan ve çıktıyı boşlukla ayrılmış bir Dize olarak döndüren veya STDOUT'a (veya en yakın alternatife) basan bir program veya işlev yazabilirsiniz . İsteğe bağlı olarak, çıktıya tek bir sondaki yeni satır ekleyebilirsiniz.

Ayrıca, komik artık standart boşluklar vardır yasaklandı .


1
Bu nonogramları çözmek içindir, değil mi? Nongramlardan bahsetmek yardımcı olabilir, çünkü bu, onları çözenler için hemen mantıklıdır.
xnor

@ jimmy23013 Yanıt olarak düzenlendi.
durron597

Yanıtlar:


5

Perl, 134 bayt

(1 anahtar içerir)

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

STDIN'den iki satır giriş alır. Her giriş için yeniden yürütülmelidir.

Fikir önce verilen uzunluklarla eşleşen tüm olası desenleri çıkarmaktır. Örneğin, uzunluklarımız 1 2ve desenimiz #_x_#_varsa, eşleşen desenler (#, _#)ve olur (#, #_). Daha sonra, her dizin için eşleşen modelleri birleştirin - örneğin sonuç listedir (##, _##_). Şimdi, listede sadece '#' karakteri olan tüm dizelerin indekslerini yazdırın.

Burada Perl'de bir regex tüm olası maçları çıkarmak için yöntem var .


Güzel. Unungolfed sürümü ve ideone bağlantısı ekleyebilir misiniz lütfen?
durron597

Tabii, cevabımın sonuna bağlantıyı ekledim.
svsd

Golf kod parçacığının ne kadar korkunç görünebileceğinin gerçek örneği! En azından benim için.
Arjun

1
@Arjun Golfing kodu gizleme eğilimindedir. Golf kodunda güzellik var, ancak sadece dili
yazılırsa

1
Yeni bir örnek ekledim çünkü bir senaryo problem tanımında hala belirsiz. Neyse ki, programınız bu durumda da hala doğru çalışıyor.
durron597
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.