স্ট্রিংগুলি Palindromizing


30

ভূমিকা

যারা জানেন না তাদের জন্য, প্যালিনড্রোমটি যখন স্ট্রিংটি পেছনের স্ট্রিংয়ের সমান হয় (ইন্টারপানक्शन, স্পেসস ইত্যাদি ব্যতীত)। প্যালিনড্রোমের উদাহরণ হ'ল:

abcdcba

যদি আপনি এটির বিপরীত হন তবে আপনি এগুলি শেষ করবেন:

abcdcba

যা একই। অতএব, আমরা একে প্যালিনড্রোম বলি। জিনিসগুলিকে পাল্লাইমাইজ করতে, আসুন একটি স্ট্রিংয়ের উদাহরণ দেখুন:

adbcb

এটি কোনও প্যালিনড্রোম নয়। এটি প্যালিনড্রোমাইজ করতে, আমাদের উভয় সংস্করণ অক্ষত রেখে, প্রাথমিক স্ট্রিংয়ের ডানদিকে বিপরীত স্ট্রিংটিকে প্রাথমিক স্ট্রিংয়ে মার্জ করতে হবে । খাটো, তত ভাল।

প্রথম জিনিসটি আমরা চেষ্টা করতে পারি:

adbcb
bcbda
^^ ^^

সমস্ত অক্ষর মেলে না, সুতরাং বিপরীত স্ট্রিংয়ের জন্য এটি সঠিক অবস্থান নয়। আমরা ডানদিকে এক ধাপ এগিয়ে যাই:

adbcb
 bcbda
 ^^^^

এটিও সমস্ত চরিত্রের সাথে মেলে না। আমরা ডানদিকে আরও একটি ধাপ এগিয়ে চলেছি:

adbcb
  bcbda

এবার, সমস্ত চরিত্র মেলেঅক্ষত রেখে আমরা উভয় স্ট্রিংকে মার্জ করতে পারি । চূড়ান্ত ফলাফল:

adbcbda

এটি প্যালিনড্রোমাইজড স্ট্রিং


কাজটি

একটি স্ট্রিং দেওয়া হয়েছে (কমপক্ষে একটি অক্ষর সহ) কেবলমাত্র ছোট হাতের অক্ষর (বা বড় হাতের অক্ষর সমন্বিত , যদি এটি আরও ভাল ফিট হয়), প্যালিনড্রোমাইজড স্ট্রিং আউটপুট দেয় ।


পরীক্ষার মামলা

Input     Output

abcb      abcba
hello     hellolleh
bonobo    bonobonob
radar     radar
hex       hexeh

এটি , তাই সর্বনিম্ন পরিমাণ বাইটের সাথে জমাটি জয়!



6
আপনার অবশ্যই উল্লেখ করতে হবে যে বিপরীত স্ট্রিংটি ডানদিকে বিপরীত স্ট্রিংয়ের সাথে মূল স্ট্রিংয়ের সাথে একত্রীকরণ করতে হবে। যদি এটি বাম দিকে যেতে obonoboপারে তবে এটি পরীক্ষার ক্ষেত্রে আরও ভাল সমাধান হবে।
স্তর নদী সেন্ট


2
@ লেভেলরিভারস্ট +1 কেবলমাত্র "ওবোনবো" এরকম আশ্চর্যজনক শব্দ হিসাবে
নাথানিয়েল

1
@ নাথানিয়েল ধন্যবাদ তবে bono b o nobএটি একটি সম্পূর্ণ বাক্য। Godশ্বর এবং বোনোর মধ্যে পার্থক্য কী? Godশ্বর ডোনলিনকে বনো বলে ভান করে ঘুরে বেড়াবেন না ;-)
লেভেল রিভার সেন্ট

উত্তর:


5

জেলি, 11 10 বাইট

ṫỤfU$Ḣœ^;U

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

কিভাবে এটা কাজ করে

ṫỤfU$Ḣœ^;U  Main link. Argument: s (string)

 Ụ          Yield all indices of s, sorted by their corr. character values.
ṫ           Tail; for each index n, remove all characters before thr nth.
            This yields the list of suffixes of s, sorted by their first character,
            then (in descending order) by length.
    $       Combine the two links to the left into a chain:
   U        Upend; reverse all suffixes.
  f         Filter; only keep suffixes that are also reversed suffixes.
            This gives the list of all palindromic suffixes. Since all of them
            start with the same letter, they are sorted by length.
     Ḣ      Head; select the first, longest palindromic suffix.
      œ^    Multiset symmetric difference; chop the selected suffix from s.
         U  Upend; yield s, reversed.
        ;   Concatenate the results to the left and to the right.

15

পাইথ (কমেন্ট বি 9 এএ 874), 11 বাইট

.VkI_IJ+zbB

পরীক্ষা স্যুট

এই কোডটি পাইথের বর্তমান সংস্করণে বাগটি ব্যবহার করে, b93a874 কমিট করে । বাগটি এমনভাবে _IJ+zbপার্স করা হয় যেন এটি ছিল q_J+zbJ+zb, যা সমান _I+zb+zb, যখন এটি (পাইথের নকশা উদ্দেশ্য দ্বারা) পার্স করা উচিত q_J+zbJ, যা সমান _I+zb। এটি আমাকে একটি বাইট সংরক্ষণ করতে দেয় - বাগ ঠিক হওয়ার পরে, সঠিক কোডটি হবে.VkI_IJ+zbJB । পরিবর্তে আমি সেই কোডটি ব্যাখ্যা করব।

মূলত, কোড ব্রুট সমস্ত সম্ভাব্য স্ট্রিংয়ের উপর চাপ দেয় যতক্ষণ না এটি সংক্ষিপ্ত স্ট্রিংটি খুঁজে পায় যা প্যালিনড্রোম গঠনের জন্য ইনপুটটিতে যুক্ত করা যায় এবং সংযুক্ত স্ট্রিংটিকে আউটপুট করে।

.VkI_IJ+zbJB
                z = input()
.Vk             For b in possible strings ordered by length,
       +zb      Add z and b,
      J         Store it in J,
    _I          Check if the result is a palindrome,
   I            If so,
          J     Print J (This line doesn't actually exist, gets added by the bug.
          B     Break.

আপনি কীভাবে এই জাতীয় কোড নিয়ে আসবেন? এটি পাইথের সাথে পরিচিত না এমন কেউ সবে পঠনযোগ্য এবং একেবারেই বোধগম্য নয়। এ জাতীয় ভাষার উদ্দেশ্য কী।
অনুকুল

5
@ মোমো ভাষাটির উদ্দেশ্য হ'ল মজাদার জন্য শর্ট কোড লেখা। এটি একটি বিনোদনমূলক ক্রিয়াকলাপ। আমি এটি লিখতে পারি কারণ আমার প্রচুর অনুশীলন রয়েছে, এবং কারণ ভাষাটি আবিষ্কার করেছি। আমি জানি যে ভাষাটি জানেন না এমন কারও পক্ষে এটি বোধগম্য নয়, যার কারণেই আমি ব্যাখ্যাটি অন্তর্ভুক্ত করেছি।
isaacg

13

পাইথন, 46 বাইট

f=lambda s:s*(s==s[::-1])or s[0]+f(s[1:])+s[0]

যদি স্ট্রিংটি প্যালিনড্রোম হয় তবে এটি ফিরিয়ে দিন। অন্যথায়, স্ট্রিংয়ের অবশিষ্ট অংশের জন্য পুনরাবৃত্তির ফলাফলের চারদিকে প্রথম অক্ষর স্যান্ডউইচ।

উদাহরণস্বরূপ ভাঙ্গন:

f(bonobo)
b  f(onobo) b
b o f(nobo) o b 
b o n f(obo) n o b
b o n obo n o b

আমি মনে করি আপনি যদি বিপরীত শর্তটি ব্যবহার করেন তবে আপনি একটি বাইট সংরক্ষণ করতে পারবেন ( s!=s[::-1])
21

@ অ্যাডিটসু এটি কাজ করে তবে একটি গুণ ব্যবহার করা আরও খাটো।
xnor

9

হাস্কেল, 36 বাইট

f s|s==reverse s=s|h:t<-s=h:f t++[h]

আরও পঠনযোগ্য:

f s
 |s==reverse s = s
 |(h:t)<-s     = h:(f t)++[h]

যদি স্ট্রিংটি প্যালিনড্রোম হয় তবে এটি ফিরিয়ে দিন। অন্যথায়, স্ট্রিংয়ের লেজের জন্য পুনরাবৃত্তির ফলাফলের চারদিকে প্রথম বর্ণটি স্যান্ডউইচ।

স্ট্রিংটি দ্বিতীয় গার্ডে sবিভক্ত হয় h:t, 1>0এই ক্ষেত্রে একটি ফিলারকে বাধ্য করে । এটি ইনপুটটির s@(h:t)জন্য করার চেয়ে কম ।


5

পাইথ - 16 12 বাইট

4 বাইট সংরক্ষণ করেছেন @ ফ্রাইআমডেজিগম্যানকে ধন্যবাদ thanks

FGITW, অনেক গল্ফিং সম্ভব।

h_I#+R_Q+k._

টেস্ট স্যুট


5

ব্র্যাচল্যাগ , 16 6 5 বাইট (প্রতিদ্বন্দ্বী)

:Ac.r

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

আমি যখন আমার প্রাথমিক উত্তর পোস্ট করেছি তখন এটি জাভাতে পুরানো বাস্তবায়নের মধ্যে ছিল। যেহেতু আমি প্রোলগের সবকিছু পুনরায় প্রোগ্রাম করেছি তাই এটি এখন প্রথম স্থানে থাকা উচিত হিসাবে কাজ করে।

ব্যাখ্যা

(?):Ac.        Output is the concatenation of Input with another unknown string A
      .r(.)    The reverse of the Output is the Output

ব্যাকপ্রোগ্যাগেশন এটিকে এমন করে তোলে যাতে এর জন্য প্রথম বৈধ মানটি সবচেয়ে কমতম Aখুঁজে পাবে যা আপনি ইনপুটকে প্যালিনড্রোমে পরিণত করতে পারেন conc

বিকল্প সমাধান, 5 বাইট

~@[.r

এটি মোটামুটি উপরের উত্তরের মতোই, "আউটপুট একটি স্ট্রিং সহ ইনপুটটির সংক্ষিপ্তকরণ" উল্লেখ করার পরিবর্তে, আমরা বলেছি Aযে "আউটপুট একটি স্ট্রিং যার জন্য ইনপুট আউটপুটটির একটি উপসর্গ"।


4

জাভাস্ক্রিপ্ট (ES6), 92 বাইট

(s,a=[...s],r=a.reverse().join``)=>s.slice(0,a.findIndex((_,i)=>r.startsWith(s.slice(i))))+r

মূল স্ট্রিং এবং এর বিপরীতের মধ্যে ওভারল্যাপ থেকে দূরে গণনা এবং টুকরো টুকরো টুকরো।


4

রেটিনা, 29 25

$
¶$_
O^#r`.\G
(.+)¶\1
$1

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

11 টি বাইট সংরক্ষণের জন্য মার্টিনকে বড় ধন্যবাদ !

এটি কেবল স্ট্রিংটির বিপরীত অনুলিপি তৈরি করে এবং তাদের একসাথে স্মুশ করে। এর একমাত্র সত্যই অভিনব অংশটি হ'ল বিপরীত পদ্ধতি: O^#r`.\Gযা বাছাই মোড ব্যবহার করে করা হয়। আমরা দ্বিতীয় স্ট্রিংয়ের অক্ষরগুলিকে বাছাই করি (যেগুলি নিউলাইন নয় এবং স্ট্রিংয়ের শেষে থেকে ধারাবাহিক \Gহয়, তাদের ধন্যবাদ ) তাদের সংখ্যাসূচক মান অনুসারে, যা কোনও সংখ্যা নেই বলে 0 হয়। তারপরে আমরা বিপরীতটি বিপরীত করি ^বিকল্পের সাথে এই স্থিতিশীল ফলাফলগুলির ক্রমের ক্রম । অভিনব ব্যবহারের জন্য সমস্ত ক্রেডিট \Gমার্টিনের অন্তর্ভুক্ত :)


3

সিজেম, 18

q__,,{1$>_W%=}#<W%

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

ব্যাখ্যা:

q         read the input
__        make 2 copies
,,        convert the last one to a range [0 … length-1]
{…}#      find the first index that satisfies the condition:
  1$>     copy the input string and take the suffix from that position
  _W%=    duplicate, reverse and compare (palindrome check)
<         take the prefix before the found index
W%        reverse that prefix
          at the end, the stack contains the input string and that reversed prefix

3

লুয়া, 89 88 বাইট

আমি জাভাস্ক্রিপ্ট মারলাম! L o / সংরক্ষিত 1 বাইট @ লিকইননকে ধন্যবাদ ^^

এটি একটি সম্পূর্ণ প্রোগ্রাম, এর ইনপুটটি কমান্ড-লাইন আর্গুমেন্ট হিসাবে গ্রহণ করে।

i=1s=...r=s:reverse()while s:sub(i)~=r:sub(0,#r-i+1)do i=i+1 end print(s..r:sub(#r-i+2))

ungolfed

i=1                             -- initialise i at 1 as string are 1-indexed in lua
s=...                           -- use s as a shorthand for the first argument
r=s:reverse()                   -- reverse the string s and save it into r
while(s:sub(i)~=r:sub(0,#r-i+1))-- iterate while the last i characters of s
do                              -- aren't equals to the first i characters of r
  i=i+1                         -- increment the number of character to skip
end
print(s..r:sub(#r-i+2))         -- output the merged string

আমি বিশ্বাস করি কাছের বন্ধনীগুলি whileসরানো যেতে পারে?
ফাঁস নুন

@ লেকিউন নিশ্চিত হন যে তারা can
ক্যাটেনকিও

পারছিনা i=i+1end?
এরিক আউটগল্ফার

1
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ দুঃখের বিষয়, আমি পারছি না। এটি 1endএকটি হেক্সাডেসিমাল সংখ্যা হিসাবে মূল্যায়ন করার চেষ্টা করবে । সাধারণত, আপনি [abcdef]কোনও হেক্সাডেসিমাল হিসাবে বিবেচনা না করে কোনও সংখ্যার পরে সরাসরি ব্যবহার করতে পারবেন না । আর একটি ব্যতিক্রম রয়েছে 0x
কাটেনকিও

3

প্রোলোগ, 43 বাইট

a(S):-append(S,_,U),reverse(U,U),writef(U).

এটি একটি কোড স্ট্রিংটিকে ইনপুট হিসাবে প্রত্যাশা করে, যেমন এসডাব্লুআই-প্রোলগ: এ: a(`hello`).

ব্যাখ্যা

এটি মূলত আমার ব্র্যাচল্যাগ উত্তরের একটি বন্দর।

a(S) :-               % S is the input string as a list of codes
    append(S,_,U),    % U is a list of codes resulting in appending an unknown list to S
    reverse(U,U),     % The reverse of U is U
    writef(U).        % Write U to STDOUT as a list of codes

3

অক্টাভা, 78 75 বাইট

Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ এর জন্য 3 বাইট সংরক্ষিত!

function p=L(s)d=0;while~all(diag(s==rot90(s),d++))p=[s fliplr(s(1:d))];end

আইডিয়োন এখনও নামযুক্ত ফাংশনগুলির জন্য ব্যর্থ হয়, তবে এখানে প্রোগ্রাম হিসাবে কোডটির একটি পরীক্ষা চালানো হয়।


2

পার্ল, 37 বাইট

এক্সনরের উত্তরের ভিত্তিতে।

জন্য +2 অন্তর্ভুক্ত -lp

STDIN এ ইনপুট দিয়ে চালান, যেমন

palindromize.pl <<< bonobo

palindromize.pl:

#!/usr/bin/perl -lp
s/.//,do$0,$_=$&.$_.$&if$_!~reverse



1

জে, 20 বাইট

,[|.@{.~(-:|.)\.i.1:

এটি একটি monadic ক্রিয়া। এখানে চেষ্টা করুন। ব্যবহার:

   f =: ,[|.@{.~(-:|.)\.i.1:
   f 'race'
'racecar'

ব্যাখ্যা

আমি এই সত্যটি ব্যবহার করছি যে এস এর প্যালিনড্রোমাইজেশন হ'ল এস + রিভার্স (পি) , যেখানে পি এস এর সংক্ষিপ্ত উপসর্গ, যার অপসারণের ফলে প্যালিনড্রোমের ফলাফল হয়। জেতে, কোনও অ্যারেটির প্রথম উপাদানটির জন্য অনুসন্ধান করা সামান্য আড়াল যা কোনও শিকারীকে সন্তুষ্ট করে; অতএব সূচক।

,[|.@{.~(-:|.)\.i.1:  Input is S.
        (    )\.      Map over suffixes of S:
         -:             Does it match
           |.           its reversal? This gives 1 for palindromic suffixes and 0 for others.
                i.1:  Take the first (0-based) index of 1 in that array.
 [   {.~              Take a prefix of S of that length: this is P.
  |.@                 Reverse of P.
,                     Concatenate it to S.

1

হাস্কেল, 68 বাইট

import Data.List
f i=[i++r x|x<-inits i,i++r x==x++r i]!!0
r=reverse

ব্যবহারের উদাহরণ: f "abcb"-> "abcba"

ইনপুটটির মাধ্যমে অনুসন্ধান initsকরুন i(যেমন inits "abcb"->>["", "a", "ab", "abc", "abcb"] ) আপনি এক যেখানে এটি বিপরীত যোগ হচ্ছে খুঁজে না হওয়া পর্যন্ত iএকটি যে শব্দ কবিতা প্রভৃতি উলটা করিয়া পড়িলেও একই থাকে তৈরী করে।


r=reverseআগে যেতে হবে না f i=...?
এরিক আউটগল্ফার

@ ইজি: না, আপনি যে কোনও অর্ডার ব্যবহার করতে পারেন।
নিমি

আমি 46 বাইটে পরিচালনা করেছি। আমি বাজি ধরছি এটি আরও ভাল করা যায়।
theonlygusti

@ থিওনলিগুস্তি: এক্সনরের উত্তর দেখুন
নিমি

1

এমএটিএল , 17 16 বাইট

@ অ্যাডিতসুর সিজেএম উত্তরে আলগাভাবে অনুপ্রাণিত ।

`xGt@q:)PhttP=A~

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

ব্যাখ্যা

`        % Do...while loop
  x      %   Delete top of stack, which contains a not useful result from the
         %   iteration. Takes input implicitly on first iteration, and deletes it
  G      %   Push input
  t      %   Duplicate
  @q:    %   Generate range [1,...,n-1], where n is iteration index. On the  first
         %   iteration this is an empty array
  )      %   Use that as index into copy of input string: get its first n elements
  Ph     %   Flip and concatenate to input string
  t      %   Duplicate. This will be the final result, or will be deleted at the
         %   beginning of next iteration
  tP     %   Duplicate and flip
  =A~    %   Compare element-wise. Is there some element different? If so, the
         %   result is true. This is the loop condition, so go there will be a 
         %   new iteration. Else the loop is exited with the stack containing
         %   the contatenated string
         % End loop implicitly
         % Display stack contents implicitly

1

রুবি, 44 বাইট

এই উত্তরটি এক্সনরের পাইথন এবং হাস্কেলের সমাধানের উপর ভিত্তি করে ।

f=->s{s.reverse==s ?s:s[0]+f[s[1..-1]]+s[0]}

পারছিনা ==s?s:?
এরিক আউটগল্ফার

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ ইরব যদি চেষ্টা করি তবে একটি ফিট নিক্ষেপ করুন। কিভাবে এটা parses কি কিছু হওয়া আবশ্যক ?মধ্যে ?:তিন এবং ?x == 'x'প্রতিকল্পন রুবি 1.9 থেকে ব্যবহার করা
Sherlock9

1

ওরাকল এসকিউএল 11.2, 195 বাইট

SELECT MIN(p)KEEP(DENSE_RANK FIRST ORDER BY LENGTH(p))FROM(SELECT:1||SUBSTR(REVERSE(:1),LEVEL+1)p FROM DUAL WHERE SUBSTR(:1,-LEVEL,LEVEL)=SUBSTR(REVERSE(:1),1,LEVEL)CONNECT BY LEVEL<=LENGTH(:1));

আন golfed

SELECT MIN(p)KEEP(DENSE_RANK FIRST ORDER BY LENGTH(p))
FROM (
       SELECT :1||SUBSTR(REVERSE(:1),LEVEL+1)p 
       FROM   DUAL 
       WHERE  SUBSTR(:1,-LEVEL,LEVEL)=SUBSTR(REVERSE(:1),1,LEVEL)
       CONNECT BY LEVEL<=LENGTH(:1)
     );

1

গুরুতরভাবে, 34 বাইট

╩╜lur`╜╨"Σ╜+;;R=*"£M`MΣ;░p╜;;R=I.

শেষ অক্ষরটি একটি নন-ব্রেকিং স্পেস (এএসসিআইআই 127 বা) 0x7F )।

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

ব্যাখ্যা:

╩╜lur`╜╨"Σ╜+;;R=*"£M`MΣ;░p╜;;R=I.<NBSP>
╩                                        push inputs to registers (call the value in register 0 "s" for this explanation)
 ╜lur                                    push range(0, len(s)+1)
     `              `M                   map (for i in a):
      ╜╨                                   push all i-length permutations of s
        "        "£M                       map (for k in perms):
         Σ╜+                                 push s+''.join(k) (call it p)
            ;;R=                             palindrome test
                *                            multiply (push p if palindrome else '')
                      Σ                  summation (flatten lists into list of strings)
                       ;░                filter truthy values
                         p               pop first element (guaranteed to be shortest, call it x)
                          ╜;;R=I         pop x, push s if s is palindromic else x
                                .<NBSP>  print and quit

1

সি #, 202 বাইট

আমি চেষ্টা করেছিলাম.

class P{static void Main(string[]a){string s=Console.ReadLine(),o=new string(s.Reverse().ToArray()),w=s;for(int i=0;w!=new string(w.Reverse().ToArray());){w=s.Substring(0,i++)+o;}Console.WriteLine(w);}}

Ungolfed:

class P
{
    static void Main(string[] a)
    {
        string s = Console.ReadLine(), o = new string(s.Reverse().ToArray()), w = s;
        for(int i = 0; w!=new string(w.Reverse().ToArray());)
        {
            w = s.Substring(0, i++) + o;
        }
        Console.WriteLine(w);
        Console.ReadKey();
    }

}

.রেভার ()। টুআর্রে () কে এই দুটি কলকে গ্রুপ করার জন্য কেউ আমাকে কোনও ধারণা সরবরাহ করতে পারেন? একটি পৃথক পদ্ধতি আরও বাইট হয়।


0

কিউবিআইসি , 41 বাইট

;_FA|C=A{a=a+1~C=_fC||_XC\C=A+right$(B,a)

ব্যাখ্যা:

;_FA|    Read A$ from the cmd line, then flip it to create B$
C=A      Set C$ to be A$
{        Start an infinite DO-loop
a=a+1    Increment a (not to be confused with A$...)
~C=_fC|  If C$ is equal to its own reversed version
|_XC     THEN end, printing C$
\C=A+    ELSE, C$ is reset to the base A$, with
right$(B the right part of its own reversal
,a)      for length a (remember, we increment this each iteration
         DO and IF implicitly closed at EOF

0

হাস্কেল, 46 বাইট

f l|l==reverse l=l|(h:t)<-l=l!!0:(f$tail l)++[l!!0]

আমি ভাবছি এতে বন্ধনী অপসারণ করার কোনও উপায় আছে কিনা (f$tail l)++[l!!0]...

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