पैलिंड्रोम बनाने के लिए न्यूनतम सम्मिलन


15

आज आप एक और पैलेंड्रोम चैलेंज करेंगे!

तो, आज आपका कार्य एक स्ट्रिंग लेना है, और इसे एक पैलिंड्रोम में बदलने के लिए सम्मिलित करने के लिए आवश्यक न्यूनतम अक्षरों का निर्धारण करना है।

उदाहरण के लिए, चलो स्ट्रिंग लेते हैं 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

अजगर, 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 बनाने के लिए आवश्यक सबसे कम सम्मिलन
  • पैलिंड्रोम बनाने के लिए सबसे कम विलोपन
  • स्ट्रिंग को अपने रिवर्स में बदलने के लिए आवश्यक हटाए गए या सम्मिलित ऑपरेशनों की आधी संख्या
  • इसके सबसे लंबे ताल के बाद इनपुट की लंबाई हटा दी गई
  • इनपुट की लंबाई, इसके और इसके रिवर्स के बीच सबसे लंबे समय तक सामान्य को हटाने। (कोड इस एक का उपयोग करता है।)

सामान्य विचार इनपुट में अक्षरों का "कंकाल" है जो अंतिम उत्पाद में इनपुट के अक्षरों से मेल खाता है।

  codeg  o lf
   *  *  *
fl o  gedoc 

flcodegedoclf

यह कंकाल हमेशा एक पलिंद होता है, जिसमें उनके उलटे समकक्षों से मेल खाते हुए अक्षर होते हैं। प्रत्येक गैर-कंकाल पत्र बेजोड़ होते हैं और इसमें अपने समकक्ष को सम्मिलित करना चाहिए।

एक ही-लंबाई विकल्प के बजाय चौथी स्थिति का उपयोग करता है, इनपुट की लंबाई इसकी सबसे लंबे समय तक पैलिंड्रोमिक की लंबाई के बाद

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 बाइट की लागत: -lQlबनाम l.-Q


3

पायथन, 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>)ई के साथ कॉल करें , जैसे ई ("मछलियां", 0, 5) `।

स्पष्टीकरण के साथ अघोषित (प्रकार):

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

@ एक्सनॉर फिक्स्ड ।---
ओलिवर नी

@ edc65 मैंने नक़ल किया।
ओलिवर नी

2

05AB1E , 11 बाइट्स

CP-1252 एन्कोडिंग का उपयोग करता है ।

Âæsæäg¹g-Ä

इसे ऑनलाइन आज़माएं! या टेस्ट सूट के रूप में

व्याख्या

              # implicit input
             # push a reversed copy
 æ            # compute powerset of the reversed string
  sæ          # compute powerset of the string
    äg       # get length of the longest common subset
      ¹g-     # subtract the length of the original string
         Ä    # take absolute value

2

ब्रेकीलॉग , 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

सी, 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);}

ओलिवर के उत्तर का बेशर्म पोर्ट , किसी भी छोटे समाधान के बारे में नहीं सोच सकता था।

gfस्ट्रिंग के पहले और अंतिम चार्ट के लिए सूचक के साथ कॉल (अंतिम चार्ट स्ट्रिंग का हिस्सा है, न कि '\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-

इसे ऑनलाइन आज़माएं!

आप इस कोड के साथ मिल जाने वाले पैलिन्ड्रोम की जांच कर सकते हैं ।

व्याख्या

मैं लगभग यह भी आश्चर्यचकित हूं कि यह कैसे काम करता है, यह देखते हुए कि यह कितना हास्यास्पद है।

,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)

यह सबसे छोटा तालमेल खोजने की गारंटी है क्योंकि 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एक अभिव्यक्ति है जो अब तक किए गए सम्मिलन की संख्या का मूल्यांकन करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.