การแทรกขั้นต่ำเพื่อสร้าง palindrome


15

วันนี้คุณจะได้ทำสิ่งท้าทาย palindrome อื่น!

ดังนั้นวันนี้งานของคุณคือการใช้สายอักขระและกำหนดจำนวนตัวอักษรขั้นต่ำที่ต้องใช้ในการแทรกเพื่อเปลี่ยนให้เป็นแบบ palindrome

fishesตัวอย่างเช่นลองสตริง

ในกรณีนี้วิธีที่ดีที่สุดคือการเพิ่มh ifดังนั้นผลลัพธ์จะเป็น 3

fishe s
     h if
---------
fishehsif

codegolfตอนนี้ขอลองกับ เนื่องจากมีการทำซ้ำoเราจึงสามารถทำ:

  codeg  o lf
fl     ed c
-------------
flcodegedoclf

เพื่อรับผลลัพธ์ 5

กรณีทดสอบ

ppcg -> 2
codegolf -> 5
palindrome -> 9
stackexchange -> 8
programmingpuzzlesandcodegolf -> 20

1
ที่เกี่ยวข้องกับการแทรกเกิดขึ้นทางด้านขวาเท่านั้น
xnor

2
ว้าวอีกครั้งฉันมีความคิดที่ท้าทายตรงนี้เมื่อสองวันที่แล้ว ... แต่ระบบการให้คะแนนจะเป็นความยาวของรหัสของคุณ + ผลลัพธ์เมื่อโค้ดของมันวิ่งผ่านตัวมันเอง (เช่นรหัสคือppcgคะแนนคือ 4 +2 = 6)
ETHproductions

5
นี่เป็นความท้าทายที่ดี แต่ฉันต้องการถ้าความท้าทายในหัวข้อเดียวกันนั้นมีระยะห่างมากขึ้น ในช่วงสองสามวันที่ผ่านมามีอาการปวดท้องมากมาย
xnor

1
มันอาจเป็นเรื่องยากที่จะพิสูจน์ว่าโปรแกรมที่ระบุพบจำนวนตัวอักษรขั้นต่ำจริงๆ
edc65

คำตอบ:


3

Pyth, 10 ไบต์

ชุดทดสอบ

l.-Qe@y_Qy

         y   All subsequences of the input (implicit), sorted by length
      y_Q    All subsequences of the reversed input, sorted by length
     @       Their setwise intersection: the common subsequences
    e        Last element: the longest common subsequence
 .-Q         Remove it bagwise from the input: the letters not in this LCS
l            The length of that

มีการเทียบเคียงลักษณะเฉพาะบางประการของค่าที่เราใช้หลังจาก:

  • การแทรกที่น้อยที่สุดที่จำเป็นในการสร้าง palindrome
  • การลบที่น้อยที่สุดที่จำเป็นในการสร้าง palindrome
  • จำนวนครึ่งของการดำเนินการลบหรือแทรกที่จำเป็นในการแปลงสตริงกลับด้าน
  • ความยาวของอินพุตที่มีการเรียงลำดับ palindromic ที่ยาวที่สุดออก
  • ความยาวของอินพุตลบการเรียงลำดับทั่วไปที่ยาวที่สุดระหว่างมันและการย้อนกลับ (รหัสใช้รหัสนี้)

แนวคิดทั่วไปคือ "โครงกระดูก" ของตัวอักษรในอินพุตที่ตรงกับตัวอักษรของอินพุตในผลิตภัณฑ์สุดท้าย

  codeg  o lf
   *  *  *
fl o  gedoc 

flcodegedoclf

โครงกระดูกนี้เป็น Palindrome เสมอโดยมีตัวอักษรจับคู่กับคู่ที่กลับด้าน ตัวอักษรที่ไม่ใช่โครงกระดูกแต่ละตัวนั้นไม่ตรงกันและจะต้องใส่ตัวอักษรคู่กัน

ทางเลือกที่มีความยาวเท่ากันแทนที่จะใช้เงื่อนไขที่สี่ความยาวของอินพุตลบความยาวของอนุกรมที่ยาวที่สุดของ Palindromic

l.-Qef_ITy

ลิงก์ไปยังชุดทดสอบ

ส่วนที่แตกต่างคือ

f_ITy

    y   All subsequences of the input (implicit), sorted by length.
f       Filtered on:
 _IT     being invariant under reversal, i.e. a palindrome

สำหรับทั้งคู่แทนที่จะลบการเรียงลำดับพาลินโดรมิกออกจากอินพุตและรับความยาวเราสามารถลบความยาวออกจากความยาวของอินพุตแทน คนใดคนหนึ่งค่าใช้จ่าย 4 ไบต์: VS-lQll.-Q


3

Python ขนาด 112 ไบต์

d=lambda x,l,h:0if h<l else d(x,l+1,h-1)if x[l]==x[h]else-~min(d(x,l+1,h),d(x,l,h-1));e=lambda x:d(x,0,len(x)-1)

ไม่มีประสิทธิภาพมาก

ลองออนไลน์! คุณต้องรอสักครู่ก่อนที่คดีสุดท้ายจะเสร็จ

โทรด้วยe(<string>, 0, <length of string - 1>)เช่น e ("ปลา", 0, 5) `

Ungolfed (เรียงลำดับ) พร้อมคำอธิบาย:

def minInsert(x, l, h):                # Declare func, arugments for x, l, h       # d=lambda x,l,h:
  if l >= h:                           # If l is the same or past h                #                 if h<l
    return 0                           #     then return 0                         #                0
  elif x[l] == x[h]:                   # If first and last character are the same  #                        else             if x[l]==x[h]
    return minInsert(x, l + 1, h - 1)  #     then return the min w/o first & last  #                             d(x,l+1,h-1)
  else:                                # If not, we shave off a character          #                                                      else
    a = minInsert(x, l, h - 1)         #     (last one)                            #                                                                d(x,l+1,h)
    b = minInsert(x, l + 1, h)         #     (first one)                           #                                                                           d(x,l,h-1)
    return min(a, b) + 1               #     and add one for the char we took off  #                                                          -~min(          ,          )

3
การรับอินพุตเพิ่มเติมด้วยข้อมูล (ความยาวรายการ) ไม่ถูกกฎหมายตามค่าเริ่มต้น ไม่เป็นเข้าของ 0, l=0แต่คุณสามารถแก้ไขปัญหาที่มีการโต้เถียงเริ่มต้น
xnor

@xnor แก้ไข .---
Oliver Ni

@ edc65 ฉันไปแล้ว
Oliver Ni


2

Brachylogขนาด 9 ไบต์

⊆P↔P;?lᵐ-

ลองออนไลน์!

ความท้าทายนี้ต้องการคำตอบ Brachylog v2 จริง ๆ เนื่องจาก palindromization ของการแทรกนั้นใช้งานง่ายในภาษานั้น

คำอธิบาย

⊆P↔Pจริง ๆ แล้วคืออะไร palindromization โดยการแทรก (ดูตัวอย่างนี้ )

⊆P           P is an ordered superset of the input
 P↔P         P reversed is P (i.e. P is a palindrome)
   P;?lᵐ     Compute the length of both P and the input
        -    Subtraction

1

C, 89 121 ไบต์

#define g(a) f(a,a+strlen(a)-1)
f(char*a,char*b){return a>=b?0:*a-*b?f(a+1,b)<f(a,b-1)?f(++a,b)+1:f(a,--b)+1:f(++a,--b);}

พอร์ตไร้ยางอายของคำตอบของOliverไม่สามารถคิดถึงวิธีแก้ปัญหาที่สั้นกว่านี้ได้

gการเรียกfด้วยตัวชี้ไปที่อักขระตัวแรกและตัวสุดท้ายของสตริง (ตัวอักษรตัวสุดท้ายเป็นส่วนหนึ่งของตัวอักษรไม่ใช่ตัวอักษร'\0' ) รับค่าที่ไม่มีประสิทธิภาพมากขึ้นเนื่องจากfถูกเรียกสองครั้งสำหรับminเคส

Ungolfed:

f(char*a,char*b){
 return a>=b ? 0 :
   *a-*b ?    //if the pointed chars are not the same
     f(a+1,b)<f(a,b-1) ? f(a+1,b)+1 : f(a,b-1)+1    //min(f..,f..)+1
   : f(a+1,b-1);  //if they were the same, make it more narrow
 }

การใช้งาน:

int main(){
 char s[]="palindrome";
 printf("%d\n",g(s));
}

2
การป้อนข้อมูลพิเศษด้วยข้อมูลไม่ถูกกฎหมายโดยค่าเริ่มต้น
edc65

1

Brachylog v1 , 13 ไบต์

,IrIs?:I:lar-

ลองออนไลน์!

คุณสามารถตรวจสอบ palindromes พบกับรหัสนี้นี้

คำอธิบาย

ฉันเกือบจะประหลาดใจที่มันใช้งานได้แม้จะดูว่ามันเรียบง่ายมาก

,IrI             I reversed is I (i.e. I is a palindrome)
   Is?           The Input is an ordered subset of I
     ?:I:la      The list [length(Input), length(I)]
           r-    Output = length(I) - length(Input)

สิ่งนี้รับประกันได้ว่าจะพบ palindrome ที่เล็กที่สุดเพราะIrIจะสร้างสตริงของความยาวที่เพิ่มขึ้นเมื่อย้อนรอยโดยเริ่มจากสตริงว่าง

s - Ordered subsetนี้ไม่ได้มีประสิทธิภาพพอที่จะคำนวณกรณีทดสอบล่าสุดเมื่อวันที่ติ้วเพราะการใช้งานของ


0

รุ่นที่234 232 ไบต์

@echo off
set n=99
call:l 0 %1
echo %n%
exit/b
:g
set/am=%1
if %m% lss %n% set/an=m
exit/b
:l
if "%2"=="" goto g
set s=%2
if %s:~,1%==%s:~-1% call:l %1 %s:~1,-1%&exit/b
call:l %1+1 %s:~1%
set s=%2
call:l %1+1 %s:~,-1%

ทำงานโดยพยายามแทรกตัวอักขระที่ไม่จับคู่ที่ปลายทั้งสองซ้ำ ๆ ช้ามาก (ฉันไม่ได้ลองใช้กรณีทดสอบสุดท้าย) ข้อ จำกัด การเรียกซ้ำหมายความว่าวิธีนี้ใช้ได้กับความยาวสตริงที่ จำกัด เท่านั้นดังนั้น99ค่อนข้าง จำกัด ฉันต้องใช้callพารามิเตอร์เป็นตัวแปรท้องถิ่นเนื่องจากฉันไม่setlocalสามารถทำงานให้ฉันได้ซึ่งหมายความว่า%1พารามิเตอร์ของ:lรูทีนย่อยนั้นคือนิพจน์ที่ประเมินจำนวนการแทรกที่ทำได้จนถึงตอนนี้

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