มีกี่ mesas เริ่มต้นด้วยสตริงที่กำหนด?


11

ลองเรียกรายการสตริงที่ไม่ว่างเปล่าของmesaหากเงื่อนไขต่อไปนี้มีไว้:

  1. แต่ละสตริงที่แสดงไม่ว่างเปล่าและใช้เฉพาะอักขระที่เกิดขึ้นในสตริงแรก
  2. แต่ละสตริงที่ต่อเนื่องกันจะมีความยาวหนึ่งตัวอักษรมากกว่าหนึ่งตัว
  3. ไม่มีสตริงในรายการเป็นsubsequenceของสตริงอื่น ๆ ในรายการ

คำว่า "mesa" มาจากการมองเห็นเช่นนี้ (โดยที่xs จะเป็นตัวอักษรต่าง ๆ ):

    xx..x
    xx..xx
    xx..xxx
    .
    .
    .
    xx..xxx..x 

NB: มันเป็นความจริงทางคณิตศาสตร์ที่มีเพียงจำนวนมากเท่านั้นที่เริ่มต้นด้วยสตริงที่กำหนด หมายเหตุ: ความแตกต่างระหว่างsubsequenceกับ substring ; เช่น 'anna' เป็นส่วนประกอบ (แต่ไม่ใช่ซับสตริง) ของ 'Banana'

ท้าทาย:

  • เขียนโปรแกรมที่สั้นที่สุดที่รับสตริงอินพุตตัวอักษรผสมตัวเลขที่ไม่ว่างเปล่าและส่งออกจำนวน mesas ที่ขึ้นต้นด้วยสตริงนั้น

อินพุต (stdin):

  • สตริงตัวอักษรผสมตัวเลขที่ไม่ว่าง

เอาท์พุท (stdout):

  • จำนวน mesas ที่ขึ้นต้นด้วยสตริงอินพุต

เกณฑ์การให้คะแนน:

  • ผู้ชนะคือโปรแกรมที่มีจำนวนไบต์น้อยที่สุด

ตัวอย่าง mesas

หนึ่งเมซ่าเริ่มต้นด้วยa:

a

หนึ่งเมซ่าเริ่มต้นด้วยaa:

aa

หลายคนเริ่มต้นด้วยab:

ab        ab        ab        ab        (and so on)
          baa       aaa       bbb
                    bbba      bbaa
                              baaaa
                              aaaaaa

เอกลักษณ์ของเมซ่าตัดสินใจอย่างไร? ยกตัวอย่างเช่นผมอาจมีab, bbbเป็นเมซ่าเพียงแค่หยุดที่ระยะที่สอง ถูกต้องหรือไม่ หรือพวกเขาจะต้องทำให้นานที่สุด? นอกจากนี้หากมีการเรียบเรียงใหม่เป็นไปได้หลายของnthคำ (เช่นbaa, aba, aab) พวกเขาไม่นับทั้งหมดเป็นผายแยกต่างหากเช่นกัน (ให้แน่นอนพวกเขาทุกคนปฏิบัติตามกฎ)?
mellamokb

@mellamokb - พวกมันต่างกันนะถ้าพวกมันต่างกัน เช่นab, ab/baa, ab/bbb, ab/bbb/bbaa, ab/bbb/bbaa/baaaa, ab/bbb/bbaa/baaaa/aaaaaaมีผายที่แตกต่างกัน
res

@mellamokb - คุณถามคำถามที่ดีอื่น ๆ ; เช่นจำนวนผายที่มีความยาวสูงสุดเริ่มต้นด้วยสตริงที่กำหนดและความยาวสูงสุดนั้นคืออะไร รุ่นอื่น ๆ ของคำถามเหล่านี้จะแก้ไขตัวอักษรของขนาดที่กำหนด (ขนาดตัวอักษรจะเป็นอินพุต) และจะพิจารณา mesas ทั้งหมด (นิยามใหม่โดยไม่มีเงื่อนไข # 1) ที่ใช้ตัวอักษรจากตัวอักษรที่กำหนดเท่านั้น - อีกครั้งมีเพียงจำนวน จำกัด เท่านั้น
res

คำตอบ:



2

Ruby, 142 อักขระ

m=->l{[*l[0].chars].repeated_permutation(l[-1].size+1).reduce(1){|s,x|l.any?{|y|x*''=~/#{[*y.chars]*'.*'}/}?s:s+m[l+[x*'']]}}
p m[[gets.chop]]

อัลกอริทึมนี้มีความสร้างสรรค์นั่นคือมันจะสร้าง mesas ที่เป็นไปได้ทั้งหมดสำหรับสตริงอินพุตและนับมัน มันทำให้โปรแกรมช้ามาก ๆ - แต่เดี๋ยวก่อนมันคือ codegolf

ตัวอย่างการทำงาน:

> a
1
> aa
1
> ab
43

ฉันหวังว่า mesas ทั้งหมดที่เริ่มต้นด้วยสตริงไบนารี nontrivial บางส่วนของความยาว 3 (เช่นaab) จะมีความยาวที่เป็นไปได้ แต่ฉันไม่แน่ใจ - โปรแกรมของคุณทำงานเป็นเวลาประมาณหนึ่งชั่วโมงสำหรับตัวอย่างนั้น หมายเหตุ: จะไม่มีผลลัพธ์ที่เป็นไปได้สำหรับอินพุตใด ๆ ที่เกี่ยวข้องกับตัวอักษรที่แตกต่างกันมากกว่าสองตัว เช่นบางส่วนของผายที่ขึ้นต้นด้วยabcมีมากขึ้นมีความยาวกว่าจำนวน Ackermann 7000
res

ฉันได้สร้างรุ่นที่ได้รับการปรับปรุงใน C # และหลังจากที่ฉันสร้าง300,000รายการด้วยaabฉันยังคงเห็น 10 คำแรกหรือคำที่เหมือนกันทั้งหมด ดังนั้นฉันคิดว่าอาจเป็นไปไม่ได้สำหรับสิ่งที่มีขนาดใหญ่กว่าตัวละครสองตัว อย่างน้อยก็ไม่ใช่โดยไม่มีการคำนวณอย่างชาญฉลาดและการวิเคราะห์แบบฮิวริสติก
mellamokb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.