ต่อกันเป็น Palindrome จาก Substrings Palindromic


14

รับสตริงlค้นหาสตริงย่อย palindromic ทั้งหมดpของl(รวมถึงรายการซ้ำและสตริงอักขระเดี่ยว) ถัดไปจัดเรียงสตริงย่อยทั้งหมดใหม่pให้เป็นพาลินโดรมที่ถูกต้อง (อาจมีคำตอบที่ถูกต้องหลายข้อ) ถ้ามันเป็นไปไม่ได้ที่จะจัดเรียงใหม่pใน palindrome เดียวโปรแกรมของคุณอาจมีพฤติกรรมที่ไม่ได้กำหนด (ข้อผิดพลาดสแต็ค - ล้น, ออก, แขวน / / ฆ่า John Dvorak ฯลฯ โดยไม่ได้ตั้งใจ)


ตัวอย่าง

กรณีทดสอบที่ถูกต้อง

l = anaa
p = ['a', 'n', 'a', 'a', 'aa', 'ana']
result = anaaaaana or aanaaanaa or aaananaaa

l = 1213235
p = ['1', '2', '1', '3', '2', '3', '5', '121', '323']
result = 1213235323121

l = racecar
p = ['r', 'a', 'c', 'e', 'c', 'a', 'r', 'cec', 'aceca', 'racecar']
result = racecarcecaacecracecar (there are others)

l = 11233
p = ['1', '11', '1', '2', '3', '33', '3']
result = 113323311 or 331121133

l = abbccdd
p = ['a', 'b', 'bb', 'b', 'c', 'cc', 'c', 'd', 'dd', 'd']
result = bbccddaddccbb or ccbbddaddbbcc or (etc...)

l = a
p = ['a']
result = a

กรณีทดสอบไม่ถูกต้อง (เป็นไปไม่ได้)

l = 123456789
p = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
result = <not possible, behavior undefined>

l = hjjkl
p = ['h', 'j', 'jj', 'j', 'k', 'l']
result = <not possible, behavior undefined>

l = xjmjj
p = ['x', 'j', 'jmj', 'm', 'j', 'jj', 'j']
result = <not possible, behavior undefined>

กฎระเบียบ

  • หากคำที่ป้อนเข้านั้นเป็นแบบ palindrome นั้นคำนั้นจะถูกต้องเหมือนเป็นอินพุต
  • ควรส่งคืนซับสตริงเดียวเท่านั้นอันใดอันที่คุณเลือกนั้นจะเป็นกฎเกณฑ์ตราบเท่าที่ใช้ได้
  • หากอินพุตไม่มีเอาต์พุตที่สามารถใช้งานได้รหัสของคุณอาจมีพฤติกรรมที่ไม่ได้กำหนด
  • อินพุตจะประกอบด้วยอักขระ ASCII ที่พิมพ์0x20-0x7Eได้เท่านั้น
  • นี่คือไบต์ต่ำสุดคือผู้ชนะ

1
ผลแรกเสนอให้"abbccdd"เป็นความผิด: ตัวอักษรสองตัวสุดท้ายที่ควรจะเป็นไม่ได้"bb" "dd"
ทำให้เสียชีวิต

เราสามารถส่งคืนอาร์เรย์ของสตริงย่อยแทนที่จะเป็นสตริงเดี่ยวได้หรือไม่?
ปุย

ฉันสามารถใส่รายการอักขระเป็นอินพุตได้หรือไม่
alephalpha

1
การแขวนอยู่กับพฤติกรรมที่ยอมรับได้หมายถึงการแขวนคอคนที่ให้มันป้อนหรือไม่
John Dvorak

@JohnDvorak ชี้แจง
Magic Octopus Urn

คำตอบ:


8

Brachylogขนาด 10 ไบต์

{s.↔}ᶠpc.↔

ลองออนไลน์!

ล้มเหลว (เช่นงานพิมพ์false.) หากไม่สามารถทำได้

คำอธิบาย

{   }ᶠ         Find all…
 s.              …substrings of the input…
  .↔             …which are their own reverse
      p        Take a permutation of this list of palindromes
       c.      The output is the concatenation of this permutation
        .↔     The output is its own reverse


3

JavaScript (ES6), 193 ไบต์

"ดูสิไม่มีการเปลี่ยนแปลงในตัว!" (ใช่แล้ว ... มันยาว ... )

ส่งคืนอาร์เรย์ว่างถ้าไม่มีวิธีแก้ปัญหา

f=(s,a=[].concat(...[...s].map((_,i,a)=>a.map((_,j)=>s.slice(i,j+1)))).filter(P=s=>[...s].reverse().join``==s&&s),m=S=[])=>S=a.map((_,i)=>f(s,b=[...a],[...m,b.splice(i,1)]))>''?S:P(m.join``)||S

การสาธิต

อย่างไร?

ลองแบ่งรหัสออกเป็นส่วนย่อย ๆ

เรากำหนดP ()ฟังก์ชั่นที่ให้ผลตอบแทนsถ้าsเป็น palindrome หรือเท็จอย่างอื่น

P = s => [...s].reverse().join`` == s && s

เราคำนวณสตริงทั้งหมดของสายป้อนs โดยใช้P ()เราแยก palindromes ไม่ว่างเปล่าและเก็บไว้ในอาร์เรย์

a = [].concat(...[...s].map((_, i, a) => a.map((_, j) => s.slice(i, j + 1)))).filter(P)

ฟังก์ชัน recursive หลักf ()รับค่าเป็นอินพุตและคำนวณพีชคณิตทั้งหมด มันปรับปรุงSเมื่อใดก็ตามที่การเปลี่ยนแปลงตัวเองเป็น palindrome (เข้าร่วมในครั้งเดียว) และในที่สุดก็ส่งกลับค่าสุดท้ายของS

f = (                        // given:
  a,                         //   a[] = input array
  m = S = []                 //   m[] = current permutation of a[]
) =>                         //   and S initialized to []
  S = a.map((_, i) =>        // for each element at position i in a[]:
    f(                       //   do a recursive call with:
      b = [...a],            //     b[] = copy of a[] without the i-th element
      [...m, b.splice(i, 1)] //     the element extracted from a[] added to m[]
    )                        //   end of recursive call
  ) > '' ?                   // if a[] was not empty:
    S                        //   let S unchanged
  :                          // else:
    P(m.join``) || S         //   update S to m.join('') if it's a palindrome


2

05AB1E , 13 12 ไบต์

ŒʒÂQ}œJʒÂQ}¤

ลองออนไลน์!

-1 ไบต์ขอบคุณ Magic Octopus Urn และ Enigma


Jตัวประกอบโดยอัตโนมัติเพื่อให้คุณไม่จำเป็นต้อง€JเพียงJ; นอกจากนี้คุณควรจะคืนหนึ่ง palindromes ไม่ใช่ทั้งหมด ลองออนไลน์! ถูกต้องสำหรับจำนวนไบต์เดียวกัน
Magic Octopus Urn

@MagicOctopusUrn คงที่ขอบคุณ!
Kaldo

Ùćอาจเป็น¤(หรือตัวเลือกอื่น ๆ จำนวนมาก)
Emigna

@Emigna ไม่แน่ใจว่าทำไมฉันไม่เห็นÙไม่จำเป็น
Magic Octopus Urn

Enigma ของฉันไม่ดีด้วยเหตุผลที่ไม่รู้จักฉันคิดว่าเราควรจะแสดง palindromes ที่ไม่ซ้ำกันทั้งหมดด้วยเหตุนี้ original ดั้งเดิม ขอบคุณสำหรับคำแนะนำคงที่!
Kaldo

2

Stax , 13 ไบต์

绬►Ö∞j∞:Æ╘τδ

เรียกใช้กรณีทดสอบ (ใช้เวลาประมาณ 10 วินาทีในเครื่องปัจจุบันของฉัน)

นี่คือตัวแทน ASCII ที่สอดคล้องกันของโปรแกรมเดียวกัน

:e{cr=fw|Nc$cr=!

มันไม่ได้เป็นสัตว์เดรัจฉานที่บริสุทธิ์แต่ก็มีขนาดเล็กเท่ากับการบังคับใช้เดรัจฉานที่ฉันเขียน เบราว์เซอร์ของฉันขัดข้องหลังจากนั้นประมาณ 10 นาที อย่างไรก็ตามนี่คือวิธีการทำงาน

:e                  Get all contiguous substrings
  {cr=f             Keep only those that are palindromes
       w            Run the rest of the program repeatedly while a truth value is produced.
        |N          Get the next permutation.
          c$        Copy and flatten the permutation.
            cr=!    Test if it's palindrome.  If not, repeat.
                    The last permutation produced will be implicitly printed.

2

Ruby , 131 123 120 ไบต์

->s{m=->t{t==t.reverse}
(1..z=s.size).flat_map{|l|(0..z-l).map{|i|s[i,l]}}.select(&m).permutation.map(&:join).detect &m}

ลองออนไลน์!

แลมบ์ดายอมรับสตริงและส่งคืนสตริง ส่งคืนnilเมื่อไม่มีวิธีแก้ไข

-5 ไบต์: แทนที่select{|t|l[t]}ด้วยselect(&l)

-3 ไบต์: แทนที่map{..}.flattenด้วยflat_map{...}

-1 ไบต์: วนซ้ำเกินความยาวของสตริงย่อยและเริ่มต้นซับสตริงแทนการเริ่มต้นย่อยมากกว่าและสิ้นสุดซับสตริง

-2 ไบต์: ประกาศzที่ใช้ครั้งแรกแทนล่วงหน้า

->s{
  l=->t{t==t.reverse}        # Lambda to test for palindromes
  (1..z=s.size).flat_map{|l| # For each substring length
    (0..z-l).map{|i|         # For each substring start index
      s[i,l]                 # Take the substring
    }
  }                          # flat_map flattens the list of lists of substrings
  .select(&l)                # Filter to include only palindromic substrings
  .permutation               # Take all orderings of substrings
  .map(&:join)               # Flatten each substring ordering into a string
  .detect &l                 # Find the first palindrome
}

1

Pyth , 13 ไบต์

h_I#sM.p_I#.:

ลองออนไลน์!

-1 ไบต์ขอบคุณ Mr. Xcoder


ฮ่า ๆ ฉันมั่นใจว่าไม่มีใครใช้ Pyth ที่ฉันส่งคำตอบแยกต่างหากของฉัน (ตอนนี้ลบ) ก่อนที่จะเห็นคุณ คุณสามารถใช้h_I#sM.p_I#.:หรือe_IDsM.p_I#.:สำหรับ 13 ไบต์
Mr. Xcoder

@ Mr.Xcoder โอ้ฮ่าฮ่า: P ใช่ฉันแทบจะไม่เคยใช้ Pythe ไม่รู้ว่าทำไมฉันถึงใช้มัน ขอบคุณ!
HyperNeutrino


1

Japt , 19 ไบต์

สิ่งที่ขัดขวางโดย Japt ยังไม่สามารถทำได้ ทั้งหมดสตริง (และบางส่วนจากระดับความเหนื่อยล้าในปัจจุบันของฉัน!)

ส่งออกundefinedถ้าไม่มีวิธีแก้ปัญหา

Êõ@ãX fêQÃc á m¬æêQ

ลองมัน


คำอธิบาย

                        :Implicit input of string U
Ê                       :Length of U
 õ                      :Range [1,Ê]
  @      Ã              :Pass each X through a function
   ãX                   :  Substrings of U of length X
      f                 :  Filter
       êQ               :    Is it a palindrome?
          c             :Flatten
            á           :Permutations
              m         :Map
               ¬        :  Join to a string
                æêQ     :Get first element that is a palindrome

1
คำถามของคุณเกี่ยวกับรายการสตริงย่อยที่จะลบออก¬จากคำตอบของคุณ: P หรือไม่?
Magic Octopus Urn

1
คิดว่าฉันสามารถลบได้แต่แล้วฉันก็จำเป็นต้องใช้æ_¬êQดังนั้นมันจะไม่ได้บันทึกไบต์ใด ๆ ต่อไป!
ปุย

ฮ่าฮ่าฮ่าฉันจะคอยระวังวิธีประหยัด byte ของคุณนับจากนี้ไป) ฉันลองลบมันด้วยตัวเองเพื่อตรวจสอบ แต่การรู้คำสั่ง japt ไม่ทำงานเหมือนที่ฉันคิดว่ามันใช้งานได้ดี
Magic Octopus Urn

1

Huskขนาด 12 ไบต์

ḟS=↔mΣPfS=↔Q

ลองออนไลน์!

คำอธิบาย

ḟS=↔mΣPfS=↔Q  Implicit input, a string.
           Q  List of substrings.
       f      Keep those
        S=↔   that are palindromic (equal to their reversal).
      P       Permutations of this list.
    mΣ        Flatten each.
ḟ             Find an element
 S=↔          that is palindromic.

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