প্যালিনড্রোম তৈরি করতে সর্বনিম্ন সন্নিবেশ


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)
ইটিএইচ প্রডাকশন

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

আমাদের পরে যে মান রয়েছে তার কয়েকটি সমমানের বৈশিষ্ট্য রয়েছে:

  • একটি প্যালিনড্রোম তৈরি করতে খুব কম সন্নিবেশ দরকার
  • একটি প্যালিনড্রোম তৈরি করতে সবচেয়ে কম মুছে ফেলা দরকার
  • এর বিপরীতে স্ট্রিংকে রূপান্তর করতে প্রয়োজনীয় মোছা বা sertোকানো ক্রিয়াকলাপগুলির অর্ধেক সংখ্যা
  • এর দীর্ঘতম প্যালিনড্রমিক উপসর্গ সহ ইনপুটটির দৈর্ঘ্য সরানো হয়েছে
  • ইনপুটটির দৈর্ঘ্য এবং এর বিপরীতে দীর্ঘতম সাধারণ অনুচ্ছেদটি সরিয়ে দেয়। (কোডটি এটি ব্যবহার করে))

সাধারণ ধারণাটি চূড়ান্ত পণ্যটির ইনপুটগুলির অক্ষরের সাথে মেলে এমন ইনপুটগুলিতে বর্ণগুলির "কঙ্কাল"।

  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

@xnor স্থির .---
অলিভার নি

@ edc65 আমি সংযুক্ত হয়েছি।
অলিভার নি

2

05 এ বি 1 , 11 বাইট

ব্যবহার সিপি-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ᵐ-

এটি অনলাইন চেষ্টা করুন!

এই চ্যালেঞ্জটির সত্যই একটি ব্র্যাচল্যাগ ভি 2 উত্তর দরকার ছিল, কারণ ভাষায় সন্নিবেশ প্যালিনড্রোমাইজেশন এতটা স্বজ্ঞাত।

ব্যাখ্যা

⊆P↔Pসন্নিবেশ দ্বারা প্যালিনড্রোমাইজেশন আসলেই হয় ( উদাহরণ দেখুন )

⊆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

ব্র্যাচল্যাগ ভি 1 , 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)

এটি ক্ষুদ্রতম প্যালিনড্রোম খুঁজে পাওয়ার গ্যারান্টিযুক্ত কারণ 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%

উভয় প্রান্তে ননম্যাচিং অক্ষরগুলি sertোকানোর চেষ্টা করে পুনরাবৃত্তভাবে কাজ করে তাই খুব ধীর (আমি শেষ পরীক্ষার কেসটি চেষ্টা করি নি)। পুনরাবৃত্তি সীমা মানে এই যেহেতু এটি কেবল সীমিত স্ট্রিং দৈর্ঘ্যের জন্যই কাজ করে, তাই এটি 99কিছুটা স্বেচ্ছাসেবী। আমার পক্ষে কাজ করতে না পারায় আমাকে callস্থানীয় ভেরিয়েবল হিসাবে প্যারামিটার ব্যবহার করতে setlocalহবে, যার অর্থ সাব্রোটিনের %1পরামিতি :lএমন একটি অভিব্যক্তি যা এখন পর্যন্ত করা সংখ্যার মূল্যায়ন করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.