Đưa ra một danh sách các độ dài và một chuỗi đại diện cho các độ dài đó, chúng có khớp không?


16

Cho một mẫu đại diện cho một danh sách các độ dài và một chuỗi đại diện cho các độ dài đó, chúng có khớp không?

Đối với những người quan tâm, đây là câu hỏi tương đương với việc xác minh nếu một hàng hoặc cột của Nonogram có thể đúng. Tuy nhiên, tôi đã bỏ qua tất cả các ngôn ngữ liên quan đến Nonograms để làm cho câu hỏi bớt khó hiểu hơn đối với những người không quen thuộc với những câu đố này.

Đầu vào

Hai dòng dữ liệu, cách nhau bởi một dòng mới.

  1. Dòng đầu tiên sẽ là một danh sách các số nguyên được phân tách bằng dấu cách, ví dụ:

    3 6 1 4 6
    

    Dòng này mô tả một mẫu các không gian có kích thước đầy bằng danh sách số nguyên, được phân tách bằng các khoảng trống có độ dài dương, không xác định mà dòng thứ hai phải khớp. Cũng có thể có khoảng trống ở đầu và cuối chuỗi khớp.

  2. Dòng thứ hai sẽ là một dòng có thể có hoặc không khớp với mẫu trong dòng một. Nó bao gồm toàn bộ các #, x_. Dòng này được đảm bảoít nhất miễn là tổng của các số nguyên trong dòng đầu tiên, cộng với số lượng số nguyên phân biệt, trừ đi 1, và có thể lâu hơn. Vì vậy, dòng thứ hai trong trường hợp này được đảm bảo dài ít nhất (3+6+1+4+6) + (5) - 1, hoặc dài 24 ký tự. Dưới đây là ví dụ 24 dòng ký tự khớp với mẫu trong dòng đầu tiên:

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

Ý nghĩa của các ký hiệu:

  • # Điều này đại diện cho một hộp đầy
  • x Điều này thể hiện một hộp được đánh dấu là "đảm bảo để trống"
  • _ Điều này đại diện cho một hộp không xác định / không đánh dấu.

Mục tiêu

Ý tưởng là:

  1. Xác thực rằng dòng thứ hai có thể là một hàng hợp lệ đáp ứng mẫu của dòng đầu tiên.
    • Bạn phải in một thông báo lỗi rõ ràng (cách bạn chọn để làm điều này tùy thuộc vào bạn; các ví dụ bên dưới viết ERRORnhưng không cần phải là 5 ký tự đó) nếu không thể điền vào chỗ trống #hoặc xkhớp với dấu đầu tiên hàng.
  2. In các chỉ số không có chỉ mục của các số nguyên đã được đặt hoàn toàn trong hàng, được phân cách bằng dấu cách. Nếu có sự mơ hồ, không in chỉ mục .

Ví dụ:

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.

Quy tắc:

Bạn có thể viết chương trình hoặc hàm , nhận đầu vào dưới dạng Chuỗi được phân tách bằng dòng mới hoặc từ STDIN (hoặc thay thế gần nhất) và trả về đầu ra dưới dạng Chuỗi được phân tách bằng dấu cách hoặc in thành STDOUT (hoặc thay thế gần nhất). Bạn có thể tùy ý bao gồm một dòng mới duy nhất trong đầu ra.

Ngoài ra, các lỗ hổng tiêu chuẩn không còn hài hước sẽ bị cấm .


1
Điều này là để giải quyết nonograms, phải không? Nó có thể giúp đề cập đến nongram vì điều đó làm cho thách thức có ý nghĩa ngay lập tức đối với những người giải quyết chúng.
xnor

@ jimmy23013 Đã chỉnh sửa để đáp lại.
durron597

Câu trả lời:


5

Perl, 134 byte

(bao gồm 1 công tắc)

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

Có hai dòng đầu vào từ STDIN. Phải được thực hiện lại cho mỗi đầu vào.

Ý tưởng là đầu tiên trích xuất tất cả các mẫu có thể phù hợp với độ dài nhất định. Ví dụ: nếu chúng ta có độ dài 1 2và mẫu #_x_#_, thì các mẫu phù hợp là (#, _#)(#, #_). Sau đó, nối các mẫu phù hợp cho mọi chỉ mục - ví dụ kết quả là danh sách (##, _##_). Bây giờ, in các chỉ số của tất cả các chuỗi trong danh sách chỉ có các ký tự '#'.

Tôi có phương pháp trích xuất tất cả các kết quả khớp có thể từ regex trong Perl tại đây .


Mát mẻ. Bạn có thể thêm một phiên bản chưa được chỉnh sửa và một liên kết ideone không?
durron597

Chắc chắn, tôi đã thêm liên kết vào cuối câu trả lời của tôi.
svsd

Ví dụ thực sự về việc một đoạn mã golf có thể trông khủng khiếp như thế nào! Ít nhất cho tôi.
Arjun

1
@Arjun Golfing có xu hướng làm xáo trộn mã. Có vẻ đẹp trong mã golf, nhưng chỉ khi bạn biết ngôn ngữ được viết bằng.
svsd

1
Tôi đã thêm một ví dụ mới vì một kịch bản vẫn còn mơ hồ trong mô tả vấn đề. May mắn thay, chương trình của bạn vẫn hoạt động chính xác trong trường hợp đó quá.
durron597
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.