เครื่องกำเนิดปิด Palindromic แบบสองทาง


24

บทนำ

การปิด palindromic ของสตริงอินพุตคือ palindrome ที่สั้นที่สุดที่สามารถสร้างขึ้นจากสตริงอินพุตที่ palindrome สุดท้ายเริ่มต้นด้วยสตริงอินพุต

สำหรับความท้าทายนี้เราจะพิจารณาการปิด palindromic แบบสองทางเช่นนั้น

  • การปิด Palindromic ด้านซ้ายของสตริงอินพุตคือ palindrome ที่สั้นที่สุดที่เป็นไปได้ที่เริ่มต้นด้วยสตริงอินพุต
  • การปิด Palindromic ที่ถูกต้องของสตริงอินพุตคือ palindrome ที่สั้นที่สุดที่เป็นไปได้ซึ่งลงท้ายด้วยสตริงอินพุต
  • การปิด Palindromic แบบสองทางของสตริงอินพุตนั้นสั้นกว่าของการปิด Palindromic ซ้ายหรือขวาของสตริงอินพุต

งาน

งานของคุณง่าย รับสตริง (ประกอบด้วย ASCII ที่พิมพ์ได้เท่านั้น, บรรทัดใหม่และช่องว่างสีขาว), ส่งออกการปิด palindromic แบบสองทางของสตริงนั้น ในกรณีที่มีการเสมอกันการปิด Palindromic ด้านซ้ายหรือขวานั้นเป็นผลลัพธ์ที่ถูกต้อง

คุณสามารถเขียนโปรแกรมหรือฟังก์ชันรับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด) อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ฟังก์ชันและพิมพ์ผลลัพธ์ไปที่ STDOUT (หรือทางเลือกใกล้เคียงที่สุด) หรือส่งคืนเป็นสตริง

คุณสามารถสันนิษฐานได้ว่าอินพุตจะไม่เป็นสตริงว่าง

ตัวอย่างไม่กี่:

<Input>   -> <Output>
"abcdef"  -> "abcdefedcba"  (or "fedcbabcdef")
"abcba"   -> "abcba"
"abcb"    -> "abcba"
"cbca"    -> "acbca"

เครดิตเริ่มต้นของ Idea ไปที่ VisualMelon ซึ่งเป็นความคิดสุดท้ายด้วยความช่วยเหลือจาก Martin และ Zgarb

ข้อตกลงปิด palindromic ปิด pallindromic ซ้ายและปิด palindromic ขวาถูกใช้ครั้งแรกและกำหนดโดยกระดาษนี้


1
ฉันต้องการจะดูวิธีแก้ปัญหา Palindromic ...
ojdo

2
@ojdo ฉันคิดว่าจะเพิ่มเป็นโบนัส แต่ฉันค่อนข้างมั่นใจว่าคำตอบส่วนใหญ่จะใช้ความคิดเห็นเพื่อสร้าง palindrome หากคำตอบบางอย่างอาจเป็นคำอธิบายที่ดีเช่นกันโดยไม่ต้องพึ่งพาความคิดเห็นใด ๆ ฉันจะปล่อยให้คำตอบนั้นมากมาย!
เครื่องมือเพิ่มประสิทธิภาพ

คำตอบ:


11

Pyth, 22 19

hfq_TTsm,+z_d+_dzyz

ลองมันออนไลน์

คำอธิบาย

ปิด palindromic สองทางคือทั้งในรูปแบบAXหรือXAที่Xเป็นสายป้อนและเป็นย่อยของA Xจริง ๆ แล้วฉันจะต้องเป็นซับสตริงที่ต่อเนื่องกันของXคำนำหน้าสำหรับหนึ่งรูปแบบคำต่อท้ายสำหรับรูปแบบอื่น แต่ฉันไม่สนใจข้อบกพร่องเหล่านี้ สตริงย่อย (ต่อเนื่องหรือไม่) คือทั้งหมดที่ฉันต้องการใน Pyth

                        Implicit: z = raw_input() // Read a string
                 yz     A list with all substrings (contiguous or not) of z
       m                For each of these substrings d, build
        ,                  a pair of two strings:
         +z_d              ( z + inveres(d) ,
             +_dz            inverse(d) + z )
      s                 Sum (put all created pairs into a list)
 fq_TT                  filter elements T, where inverse(T) == T (Palindrom)
h                          Take the first element

แก้ไข

.olN...รุ่นเก่าสั่งสตริงหลังจากการกรองโดยความยาว เพิ่งรับรู้ว่าyจะส่งคืนสตริงย่อยตามความยาว ดังนั้น palindromes เหล่านี้จึงถูกเรียงลำดับแล้ว


6

คลิป 40

(sl`f[a=ava}+m[i+v+ixx}Rlxm[i+xvu0ix}Rlx

ตัวอย่าง

Documents>java -jar Clip4.jar palindrome.clip
abcb
abcba

คำอธิบาย

(sl`                                        .- The shortest                     -.
    f[a=ava}                                .- palindrome                       -.
            +                               .- among the following two sets:    -.
             m[i      }Rlx                  .- For each number up to length(x)  -.
                +                           .- combine                          -.
                 v+ix                       .- the last i chars of x, reversed  -.
                     x                      .- and x.                           -.
                          m[i       }Rlx    .- For each number up to length(x)  -.
                             +              .- combine                          -.
                              x             .- x and                            -.
                               vu0ix        .- the first i chars of x, reversed.-.

6

CJam, 30 ไบต์

หวังเป็นอย่างยิ่งว่าจะได้เห็นคำตอบของ CJam ในตอนนี้ ..

q:Q,{)QW%/(Q+Q@+s}%{,}${_W%=}=

ฉันเกลียด{,}$บล็อกนั้นในนั้น แต่ฉันได้รับรายชื่อ palindromes ที่ไม่ได้เรียงเนื่องจากอัลกอริทึมการสร้างที่ฉันใช้อยู่

คำอธิบายรหัส

q:Q,{            }%             "Read the input string, store in Q, take length and";
                                "run the code block that many times";
     )QW%                       "Increment the iteration index and Put reversed Q on stack";
         /                      "Split reversed Q into parts of incremented iteration index";
          (Q+                   "Take out the first part and prepend it to Q";
             Q@+s               "Take the rest of the parts and append them to Q";
                   {,}$         "At this point, we have all possible prepended and appended";
                                "sequences of the input string. Sort them by length";
                       {_W%=}=  "Take the first sequence which is a palindrome";

ลองออนไลน์ได้ที่นี่


6
ฉันเกลียด{,}$บล็อกนั่นในนั้นด้วย! แค่ล้อเล่นฉันไม่รู้เลยว่าสิ่งใดใน CJam ทำ
Alex A.

4

Python 2 115 113 109 105 96 ไบต์

f=lambda x:[x for x in sum([[x[:~i:-1]+x,x+x[i::-1]]for i in range(len(x))],[])if x==x[::-1]][0]

หวังว่าจะสามารถลงเล่นกอล์ฟต่อไปได้ บิตน่าจะทราบ:

  • ใช้ผลรวมสำหรับสองรายการความเข้าใจในหนึ่งเดียว
  • การสร้างคำตามลำดับที่เรียงไว้เพื่อหลีกเลี่ยงความต้องการขั้นต่ำ (แนะนำโดย @Jakube)

1
aรายการที่ยังไม่อยู่ในลำดับที่เรียงลำดับดังนั้นนี้ล้มเหลวสำหรับสตริงเช่น
Sp3000

4

Mathematica, 96 ไบต์

จะต้องมีวิธีที่หรูหรากว่านี้ ...

""<>#&@@SortBy[r=Reverse;#/.{b___,a__/;r@{a}=={a}}:>{b,r@{b,a}}&/@{r@#,#}&@Characters@#,Length]&

สิ่งนี้นิยามฟังก์ชันที่ไม่มีชื่อซึ่งรับค่าสตริงและส่งคืนผลลัพธ์

แนวคิดพื้นฐานคือ

  • Charactersแยกสตริงเข้าไปใน
  • สร้างอาร์เรย์ด้วยรายการนี้และย้อนกลับ
  • ใช้การจับคู่รูปแบบเพื่อค้นหา Palindromic ที่ถูกต้องของแต่ละรายการ:

    {b___,a__/;r@{a}=={a}}:>{b,r@{b,a}}
    

    โปรดทราบว่านี่จะไม่ส่งคืนรายการที่แน่นอน เช่น{a,b,c}คุณจะได้รับ

    {a,b,{c,b,a}}
    
  • จัดเรียงผลลัพธ์สองรายการตามความยาว

  • ""<>#&@@เลือกสั้นและเข้าร่วมได้กลับเข้ามาในสตริงกับ

มันออกเมื่อเข้าเป็นabacaba คำตอบที่ถูกต้องคือabac cabacฉันคิดว่าคุณควรทำให้แบนก่อนจัดเรียงตามความยาว
alephalpha

1
@alephalpha พบการแก้ไขที่ดีกว่าซึ่งไม่จำเป็นต้องเปลี่ยนขนาดรหัส (ซึ่งจริงๆแล้วเป็นความตั้งใจของฉันที่ไม่ได้เรียงลำดับ)
Martin Ender

2

Brachylog (2), 6 ไบต์, ภาษาโพสต์วันที่ท้าทาย

~{↔?a}

ลองออนไลน์!

ตามปกติสำหรับ Brachylog นี่คือฟังก์ชั่นไม่ใช่โปรแกรมเต็มรูปแบบ

คำอธิบาย

~{↔?a}
~{   }   Find a value that produces {the input} upon doing the following:
  ↔        reversing it;
   ?       asserting that we still have the same value;
    a      and taking either a prefix, or a suffix.

เท่าที่ฉันรู้ (มันไม่ใช่ภาษาของฉัน แต่ดูเหมือนไม่น่าเป็นไปได้) aไม่ได้ถูกเพิ่มใน Brachylog สำหรับความท้าทายนี้ แต่มันมีประโยชน์จริงๆที่นี่ เราใช้วิธี "ย้อนกลับและยืนยันว่าไม่ได้เปลี่ยนแปลง" เพื่อยืนยันว่าค่าที่เราค้นหานั้นเป็นโทนสี

สำหรับเหตุผลที่สิ่งนี้สร้างpalindrome ที่สั้นที่สุดลำดับการประเมินของ Prolog (และด้วยเหตุนี้ของ Brachylog) ได้รับอิทธิพลอย่างมากจากสิ่งแรกที่ประเมิน ในกรณีนี้นั่นคือคำสั่ง "ย้อนกลับ" และ (เช่นการดำเนินการรายการส่วนใหญ่) มันตั้งค่าลำดับการประเมินผลที่มีวัตถุประสงค์เพื่อลดขนาดของรายการผลลัพธ์ เหมือนกับขนาดของเอาต์พุตโปรแกรมจึงจบลงอย่างมีความสุขโดยลดสิ่งที่ถูกต้องโดยบังเอิญซึ่งหมายความว่าฉันไม่จำเป็นต้องเพิ่มคำแนะนำที่ชัดเจน


a- ไม่ได้เพิ่ม Adfix สำหรับความท้าทายนี้ ฉันไม่มีสัญลักษณ์ที่มีตัวช่วยจำที่ดีสำหรับคำนำหน้าและคำต่อท้ายดังนั้นฉันจึงรวมทั้งสองเป็น adfix ซึ่งสามารถใช้ตัวห้อยเพื่อเลือกคำนำหน้าหรือคำต่อท้ายหากจำเป็นเท่านั้น
ลดขนาด

1

ทับทิม, 76 + 2 = 78

ด้วยการตั้งค่าสถานะบรรทัดคำสั่ง-pl( lอาจไม่จำเป็นขึ้นอยู่กับวิธีการป้อนข้อมูลของคุณ) เรียกใช้

$_=[[$_,r=$_.reverse]*"\0",r+"\0#$_"].min_by{|s|s.sub!(/(.*)\0\1/){$1}.size}

รับสตริง 'abaa' สร้างสตริง 'cbca 0 acbc' และ 'acbc 0 cbca' โดยที่0คืออักขระที่ไม่สามารถพิมพ์ได้ด้วยรหัส ascii 0 จากนั้นลบหนึ่งสำเนาของสตริงซ้ำซ้ำที่ยาวที่สุดที่พบในแต่ละ0 'a' ในครั้งแรกและ 'cbc' ในครั้งที่สองเพื่อรับการปิดทั้งสอง จากนั้นจะให้ผลลัพธ์ที่สั้นที่สุด

สิ่งเดียวที่แปลกจริง ๆ เกี่ยวกับรหัส golfed คือมันทำให้สตริงสั้นลงในขณะที่จัดเรียงมันซึ่งเราสามารถหนีไปได้เพราะmin_byเพียงทำการบล็อกครั้งเดียวต่อองค์ประกอบที่ถูกเปรียบเทียบ (ทั้งคู่เพราะมันเป็นการแปลงชวาร์ตเซียนและเพราะมีเพียงสอง องค์ประกอบที่จะเปรียบเทียบ)


1

Python 3, 107 ไบต์


f=lambda a:[i for i in[a[:i:-1]*j+a+a[-1-i::-1]*(1-j)for i in range(len(a))for j in(0,1)]if i==i[::-1]][-1]

ทดสอบ:

>>> print("\n".join(map(f, ["abcdef", "abcba", "abcb", "cbca"])))
abcdefedcba
abcba
abcba
acbca

1

Haskell, 107 ไบต์

import Data.List
r=reverse
f s=snd$minimum[(length x,x)|x<-map(s++)(tails$r s)++map(++s)(inits$r s),x==r x]

ทดสอบ:

*Main> mapM_ (putStrLn.f) ["abcdef", "abcba", "abcb", "cbca"]
abcdefedcba
abcba
abcba
acbca

1

J, 66 62 ไบต์

3 :'>({~[:(i.>./)(#%~[-:|.)@>),(<@([,|.@{.~)"#:i.@#"1)y,:|.y'

ค่อนข้างตรงไปตรงมา เทคนิคสองอย่างที่ฉันใช้:

การปิด Palindromic ด้านขวาคือการปิด Palindromic ด้านซ้ายของสตริงที่กลับด้าน

การค้นหาความยาวของสตริงด้วยความยาวต่ำสุดและ palindromity ด้วยนิพจน์นาที (is_palindrome / length)

   f=.3 :'>({~[:(i.>./)(#%~[-:|.)@>),(<@([,|.@{.~)"#:i.@#"1)y,:|.y'

   f 'lama'
lamal

ลองออนไลน์ได้ที่นี่

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