ระยะ Hamming ที่เล็กที่สุดไปจนถึง palindrome ที่มีซับสตริง


17

นี้ได้รับแรงบันดาลใจจากคำถาม CS.SE เอาออกตอนนี้

งาน

กำหนดสตริงอินพุต A และ B ที่ไม่ว่างสองสตริงให้เอาต์พุตเป็นระยะทางที่เล็กที่สุดจาก A ไปยัง palindrome ที่มี B เป็นสตริงย่อย ระยะทางถูกกำหนดโดยจำนวนการแทนที่อักขระ ( ระยะทาง Hamming )

ข้อ จำกัด

  • Sensible input: palindrome มีอยู่ ซึ่งหมายความว่า | A | ≥ | B |
  • A และ B มีอักขระ ASCII ที่ต่ำกว่าเท่านั้นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่จะแตกต่างกัน (เช่นเดียวกับอักขระอื่น ๆ ทั้งหมด)
  • หากภาษาของคุณไม่สามารถจัดการกับอักขระ ASCII ได้คุณอาจใช้จำนวนเต็ม (หรือชนิดข้อมูลที่เหมาะสมอื่น ๆ ) ได้เช่นกันและคุณอาจเลือกที่จะ จำกัด ช่วงไว้ที่ 128 องค์ประกอบ
  • คุณสามารถรับอินพุตจาก stdin, ฟังก์ชันอาร์กิวเมนต์, อาร์กิวเมนต์บรรทัดคำสั่ง ฯลฯ
  • คุณอาจให้ผลลัพธ์ stdout ค่าส่งคืนเป็นต้น
  • คุณไม่จำเป็นต้องให้ palindrome ที่ใช้งานได้ระยะทางที่เล็กที่สุดถึงหนึ่งก็เพียงพอแล้ว

ตัวอย่าง

A                   B            Output
thilloaoyreot       hello        4 (thelloaolleht)
benjonson           stack        9 (stackcats)
neversaynever!      odd          9 (neveroddoreven)
ppcggcpp            gg           0 (ppcggcpp)
stars               tat          1 (stats)

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

นี่คือรหัสกอล์ฟรหัสที่สั้นที่สุดเป็นไบต์ชนะ

คำตอบ:


5

Pyth, 19 ไบต์

hSmsnVQd/#z_I#^+Qzl

สาธิต

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

คำอธิบาย:

hSmsnVQd/#z_I#^+Qzl
hSmsnVQd/#z_I#^+QzlQ     Variable introduction
                         Q = string A, z = string B.
               +Qz       Concatenate A and B
              ^   lQ     Form every string of length equal to len(A)using
                         characters from the concatenation.
             #           Filter on
           _I            Invariance under reversal (palindrome)
         #               Filter on
        / z              Nonzero occurences of B
  m                      Map to
    nV                   !=, vectorized over
      Qd                 A and the map input
   s                     Sum (gives the hamming weight)
hS                       Min

บางอย่างเช่นนี้เป็นสิ่งที่ฉันคิด แต่ตัดสินใจ O ((m + n) ^ n) เกินไป O (ไม่ดี) : D
PurkkaKoodari

3

Pyth, 45 ไบต์

hSmsnVQdf}zTsmm+hc2KsXcd+Bklz1z_hc2PKh-lQlz_B

ลองออนไลน์ ชุดทดสอบ

ฉันยังไม่พอใจอย่างแน่นอนกับสิ่งที่เกิดขึ้น แต่อย่างน้อยมันค่อนข้างยากที่จะเข้าใจโดยไม่มีคำอธิบายในตอนนี้ (สำเร็จฉันเดาได้ไหม)

คำอธิบาย

  • ใช้เวลาในการตอบในฐานะQและ B zเป็น
  • m_BQคำนวณสิ่งต่อไปนี้สำหรับทั้ง A และกลับด้านเป็นd:
    • mh-ldlzคำนวณสิ่งต่อไปนี้สำหรับทุกคนkตั้งแต่ 0 ถึงlen(A) - len(B)รวม:
      • +Bklzk, k + len(B)รับทั้งคู่
      • cdแยกdที่ดัชนีเหล่านั้น
      • X1zแทนที่ส่วนที่สอง (กลาง) ด้วย B
      • KsConcatenate Kชิ้นและบันทึกไปยัง ตอนนี้ B ถูกแทรกที่ตำแหน่งkใน A หรือกลับด้าน
      • hc2แยกสตริงผลลัพธ์เป็นสองและเก็บชิ้นแรก สิ่งนี้จะให้ครึ่งหนึ่งของสตริงที่มีอักขระกลางที่เป็นไปได้
      • hc2PKเอาตัวละครตัวสุดท้ายออกและทำแบบเดียวกันโดยรักษาส่วนแรกไว้ ซึ่งจะให้ครึ่งหนึ่งของสตริงโดยไม่มีอักขระกลางที่เป็นไปได้
      • +_เพิ่มด้านหลังของชิ้นส่วนที่สั้นลงไปยังส่วนที่ยาวกว่า ตอนนี้เรามีอาการปวดท้อง
  • s ต่อผลลัพธ์สำหรับ A และการย้อนกลับ
  • f}zT ลบสตริงทั้งหมดที่ไม่มี B
  • mคำนวณค่าต่อไปนี้สำหรับสตริงผลลัพธ์ทั้งหมดd:
    • nVQd รับความไม่เท่าเทียมกันแบบคู่กับ A สิ่งนี้จะให้จริงสำหรับคู่ที่ต้องเปลี่ยน
    • sรวมรายการ นี่จะทำให้ระยะทางของ Hamming
  • hS รับผลขั้นต่ำ

1

JavaScript (Firefox 30+), 152 146 ไบต์

(A,B)=>Math.min(...[...Array(A[l='length']-B[l]+1)].map((_,i)=>[for(c of q=A.slice(j=t=0,i)+B+A.slice(i+B[l]))t+=(c!=A[j])+(c!=q[q[l]-++j])/2]|t))

วิธีเดรัจฉานบังคับ: สร้างการทับซ้อนของ A และ B ที่เป็นไปได้แต่ละอันทำให้แต่ละอันเป็นแบบพาลินโดรมคำนวณระยะห่างจากแฮมมิงจาก A และใช้ระยะทางที่น้อยที่สุด

น่าจะเป็นสนามกอล์ฟอีกเล็กน้อย ...

ตัวอย่างการทดสอบ

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