Diberikan daftar panjang, dan string yang mewakili panjang itu, apakah mereka cocok?

16

Diberi pola yang mewakili daftar panjang, dan string yang mewakili panjang itu, apakah cocok?

Bagi mereka yang tertarik, ini adalah pertanyaan yang setara dengan memverifikasi apakah baris atau kolom Nonogram mungkin benar. Namun, saya telah menghilangkan semua bahasa yang berhubungan dengan Nonogram untuk membuat pertanyaan itu kurang membingungkan bagi mereka yang tidak terbiasa dengan teka-teki ini.

Memasukkan

Dua baris data, dipisahkan oleh baris baru.

  1. Baris pertama adalah daftar bilangan bulat yang dipisahkan dengan spasi, contoh:

    3 6 1 4 6
    

    Baris ini menggambarkan pola ruang diisi dengan ukuran yang sama dengan daftar bilangan bulat, dipisahkan oleh ruang kosong yang tidak diketahui , panjang positif yang harus cocok dengan baris kedua. Mungkin juga ada ruang kosong di awal dan akhir string yang cocok.

  2. Baris kedua akan menjadi garis yang mungkin cocok atau tidak cocok dengan pola di baris satu. Ini seluruhnya terdiri dari #, x, dan _. Baris ini dijamin menjadi setidaknya selama jumlah dari bilangan bulat di baris pertama, ditambah jumlah bilangan bulat yang berbeda, minus 1, dan bisa lebih lama. Jadi baris kedua dalam hal ini dijamin setidaknya (3+6+1+4+6) + (5) - 1, atau 24 karakter. Berikut adalah contoh 24 karakter baris yang cocok dengan pola di baris pertama:

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

Arti simbol:

  • # Ini mewakili kotak yang diisi
  • x Ini mewakili kotak yang ditandai "dijamin kosong"
  • _ Ini mewakili kotak yang tidak dikenal / tidak ditandai.

Tujuan

Idenya adalah untuk:

  1. Validasi bahwa baris kedua bisa menjadi baris yang valid yang memenuhi pola baris pertama.
    • Anda harus mencetak pesan kesalahan yang tidak ambigu (bagaimana Anda memilih untuk melakukan ini terserah Anda; contoh di bawah ini ditulis ERRORtetapi tidak harus berupa 5 karakter tersebut) jika spasi yang tidak diketahui tidak dapat diisi dengan salah satu #atau xuntuk mencocokkan dengan yang pertama baris.
  2. Cetak indeks diindeks nol dari bilangan bulat yang telah sepenuhnya ditempatkan di baris, dibatasi ruang. Jika ada ambiguitas, jangan cetak indeks .

Contoh:

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.

Aturan:

Anda dapat menulis program atau fungsi , yang menerima input sebagai String yang dibatasi baris baru atau dari STDIN (atau alternatif terdekat), dan mengembalikan output sebagai String yang dibatasi spasi atau mencetaknya ke STDOUT (atau alternatif terdekat). Anda dapat secara opsional memasukkan satu baris baru dalam output.

Selain itu, celah standar yang tidak lagi lucu yang dilarang .

durron597
sumber
1
Ini untuk menyelesaikan nonogram, bukan? Mungkin membantu menyebutkan nongrams karena itu membuat tantangan masuk akal bagi mereka yang menyelesaikannya.
xnor
@ jimmy23013 Diedit sebagai tanggapan.
durron597

Jawaban:

5

Perl, 134 byte

(termasuk 1 sakelar)

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

Mengambil dua baris input dari STDIN. Harus dieksekusi kembali untuk setiap input.

Idenya adalah untuk pertama mengekstrak semua pola yang mungkin cocok dengan panjang yang diberikan. Misalnya, jika kita memiliki panjang 1 2dan pola #_x_#_, maka pola yang cocok adalah (#, _#)dan (#, #_). Kemudian, gabungkan pola-pola yang cocok untuk setiap indeks - sebagai contoh hasilnya adalah daftar (##, _##_). Sekarang, cetak indeks semua string dalam daftar yang hanya memiliki karakter '#'.

Saya mendapatkan metode untuk mengekstrak semua kemungkinan kecocokan dari regex di Perl di sini .

svsd
sumber
Keren. Bisakah Anda menambahkan versi yang tidak diklik dan tautan ideone?
durron597
Tentu, saya telah menambahkan tautan di akhir jawaban saya.
svsd
Contoh nyata betapa mengerikannya cuplikan kode golf! Setidaknya bagi saya.
Arjun
1
@Arjun Golfing cenderung mengaburkan kode. Ada keindahan dalam kode golf, tetapi hanya jika Anda tahu bahasanya ditulis.
svsd
1
Saya menambahkan contoh baru karena satu skenario masih ambigu dalam deskripsi masalah. Untungnya, program Anda masih berfungsi dengan benar dalam kasus itu juga.
durron597