กำหนดรายการความยาวและสตริงที่แสดงความยาวเหล่านั้นตรงกันหรือไม่


16

กำหนดรูปแบบที่แสดงรายการความยาวและสตริงที่แสดงความยาวเหล่านั้นตรงกันหรือไม่

สำหรับผู้ที่สนใจคำถามนี้เทียบเท่ากับการตรวจสอบว่าแถวหรือคอลัมน์ของNonogramอาจถูกต้อง อย่างไรก็ตามฉันละเว้นภาษาทั้งหมดที่เกี่ยวข้องกับ Nonograms เพื่อทำให้คำถามสับสนน้อยลงสำหรับผู้ที่ไม่คุ้นเคยกับปริศนาเหล่านี้

อินพุต

ข้อมูลสองบรรทัดคั่นด้วยบรรทัดใหม่

  1. บรรทัดแรกจะเป็นรายการที่คั่นด้วยช่องว่างของจำนวนเต็มตัวอย่าง:

    3 6 1 4 6
    

    บรรทัดนี้อธิบายรูปแบบของการเว้นวรรคที่มีขนาดเท่ากับรายการจำนวนเต็มคั่นด้วยช่องว่างที่ไม่ทราบความยาวบวกที่ไม่รู้จักที่บรรทัดที่สองต้องตรงกัน อาจมีช่องว่างที่จุดเริ่มต้นและจุดสิ้นสุดของสตริงที่ตรงกัน

  2. บรรทัดที่สองจะเป็นบรรทัดที่อาจหรืออาจไม่ตรงกับรูปแบบในบรรทัดที่หนึ่ง มันประกอบด้วยทั้งหมดของ#, และx _บรรทัดนี้รับประกันว่าอย่างน้อยตราบใดที่ผลรวมของจำนวนเต็มในบรรทัดแรกบวกกับจำนวนของจำนวนเต็มชัดเจนลบ 1และสามารถยาวได้ ดังนั้นบรรทัดที่สองในกรณีนี้จะต้องมีความยาวอย่างน้อย(3+6+1+4+6) + (5) - 124 ตัวอักษร นี่คือตัวอย่างอักขระ 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.

กฎ:

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นซึ่งรับอินพุตเป็นสตริงตัวคั่น newline หรือจาก STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด) และส่งคืนเอาต์พุตเป็นช่องว่างแบบมีตัวคั่นสตริงหรือพิมพ์ลงใน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด) คุณสามารถเลือกที่จะรวมบรรทัดใหม่ต่อท้ายหนึ่งบรรทัดในเอาต์พุตได้

นอกจากนี้ช่องโหว่มาตรฐานซึ่งจะไม่ตลกจะห้าม


1
นี่เป็นการแก้ nonograms ใช่ไหม มันอาจช่วยพูดถึง nongrams เนื่องจากทำให้การท้าทายนั้นสมเหตุสมผลสำหรับผู้ที่แก้ปัญหา
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_#_แล้วรูปแบบการจับคู่ที่มีและ(#, _#) (#, #_)จากนั้นเชื่อมรูปแบบการจับคู่สำหรับทุกดัชนี - (##, _##_)ตัวอย่างผลที่ได้คือรายการ ตอนนี้พิมพ์ดัชนีของสตริงทั้งหมดในรายการที่มีอักขระ '#' เท่านั้น

ผมได้วิธีการที่จะดึงการแข่งขันเป็นไปได้ทั้งหมดจาก regex ใน Perl ที่นี่


เย็น. คุณช่วยเพิ่มเวอร์ชั่นที่ไม่ได้แต่งแต้มและลิงค์ ideone ได้ไหม?
durron597

แน่นอนว่าฉันได้เพิ่มลิงค์ในตอนท้ายของคำตอบของฉัน
svsd

ตัวอย่างจริงของตัวอย่างโค้ดที่แย่ที่ golfed สามารถดูได้! อย่างน้อยสำหรับฉัน
Arjun

1
@Arjun Golfing มีแนวโน้มที่จะทำให้งงงวยรหัส มีความสวยงามในการตีกอล์ฟ แต่ถ้าคุณรู้ว่าภาษานั้นถูกเขียนขึ้นมา
svsd

1
ฉันเพิ่มตัวอย่างใหม่เนื่องจากสถานการณ์หนึ่งยังคงคลุมเครือในคำอธิบายปัญหา โชคดีที่โปรแกรมของคุณยังคงทำงานได้อย่างถูกต้องในกรณีนั้นเช่นกัน
durron597
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.