ฉันควรใส่กระจกไว้ที่ไหน


30

นี่คือกระจกเงา: |. ฉันเพิ่งค้นพบว่าคุณสามารถติดกระจกที่อยู่ตรงกลางของสตริงถ้าสตริงสามารถสะท้อนในตัวเอง! abccbaยกตัวอย่างเช่นสตริง หากคุณผ่าครึ่งครึ่งทั้งสองจะเป็นภาพสะท้อนซึ่งกันและกัน:

abc  <-->  cba

abc|cbaดังนั้นเราสามารถติดกระจกในช่วงกลางของสตริงและสตริงใหม่ของเราคือ บางครั้งมีเพียงบางส่วนของสตริงเท่านั้นที่สามารถทำการมิรเรอร์ได้ ตัวอย่างเช่นสตริง "mirror" r สองถูกมิร์เรอร์ แต่ส่วนที่เหลือของสตริงไม่ใช่ ไม่เป็นไรเราจะลบส่วนของสตริงที่ไม่ทำมิเรอร์กันและเราจะได้สตริงต่อไปนี้:

r|r

บางสายอาจถูกมิร์เรอร์ในหลาย ๆ ที่ ตัวอย่างเช่น "Hello World, xyzzyx" ฉันชอบที่มีข้อความจำนวนมากสะท้อนในกระจกของฉันดังนั้นคุณต้องหาที่ที่ดีที่สุดในการวางกระจกของฉัน ในกรณีนี้คุณควรส่งออกสตริงมิเรอร์ที่ยาวขึ้นและเหมือนกับตัวอย่างสุดท้ายของเราลบทุกอย่างออก สายนี้กลายเป็น:

xyz|zyx

สตริงบางอย่างดูเหมือนว่าพวกเขาสามารถสะท้อน แต่จริงๆแล้วไม่สามารถ หากสตริงไม่สามารถมิร์เรอร์ที่ใดก็ได้คุณไม่ควรแสดงผลอะไรเลย

ความท้าทาย:

รับสตริงที่มีเพียงพิมพ์ -iiii หาที่ที่ดีที่สุดที่จะนำกระจกของฉัน ในคำอื่น ๆ

ค้นหาสตริงย่อย palindromic ที่ยาวที่สุดที่ใหญ่ที่สุดจากนั้นส่งออกด้วยอักขระไพพ์ '|' ตรงกลางของมัน

อินพุตจะมีความยาว 1-50 อักขระ

คุณสามารถสมมติว่าอินพุตจะไม่มีมิร|เรอร์หรือบรรทัดใหม่ นอกเหนือจากนั้นตัวละครที่พิมพ์ได้ทั้งหมดเป็นเกมที่ยุติธรรม หากสตริงย่อยที่มิรเรอร์ที่ยาวที่สุดนั้นเชื่อมโยงกันระหว่างสองสตริงย่อยคุณสามารถเลือกได้ว่าจะเอาอันไหนออก ตัวอย่างเช่นสำหรับสตริง "abba ollo" คุณต้องส่งออก "ab | ba" หรือ "ol | lo" แต่ไม่สำคัญว่าคุณจะส่งออกใด สตริงจะต้องตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เช่น "ABba" ไม่ควรส่งออก "AB | ba" แต่ควรส่งออกสตริงว่างเปล่า

ตัวอย่าง IO:

"Hello World"     --> "l|l"
"Programming Puzzles and Code-Golf"     --> Either "m|m" or "z|z"
"abcba"           --> ""
"Hulluh"          --> "ul|lu"
"abcdefggfedcba"  --> "abcdefg|gfedcba"
"abcdefggfabc"    --> "fg|gf"
"AbbA"            --> "Ab|bA"
"This input is a lot like the last one, but with more characters that don't change the output. AbbA" --> "Ab|bA"

ตามปกตินี่คือ code-golf ดังนั้นจึงใช้ช่องโหว่มาตรฐานและคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!


มีการจำกัดความยาวของอินพุตหรือไม่?
Mego

@Mego ตราบใดที่อัลกอริทึมของคุณทำงานได้กับข้อมูลใด ๆ ฉันไม่สนใจว่าจะใช้เวลานานเท่าใด / ต้องใช้หน่วยความจำเท่าใด
DJMcMayhem

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

@Mego Ah ที่เหมาะสม สมมติว่าอินพุตมีความยาวได้สูงสุด 50 อักขระ คุณคิดว่าดีไหม?
DJMcMayhem

คำตอบ:


9

Pyth - 19 17 15 13 ไบต์

ขอบคุณ @FryAmTheEggman ที่ช่วยฉันสองไบต์

ARRGH เป็นกรณีพิเศษที่ไม่มีคำตอบ แก้ไขได้!

e_I#jL\|cL2.:

Test Suite

e                Last element in list, this works out to longest one
  _I             Invariance under reverse, this detect palindrome
   #             Filter
   jL            Map join
    \|           By "|"
    cL2          Map chop in two pieces
     .:Q)        Substrings. Implicit Q). ) makes it do all substrings.

2
Nooooo! Ninja'd ไปยังคำตอบของ pyth; _;
Downgoat

กรุณาอธิบาย : 3
Downgoat

@ Downgoat เขานำสตริงย่อยและสับเป็นสองเข้าร่วมแต่ละคู่ด้วย |, กรองโดยสมมาตร, ต่อท้ายที่ [k] และรับองค์ประกอบสุดท้าย (ซึ่งยาวที่สุด)
busukxuan

@ ลงไปเสร็จแล้ว
Maltysen

2
:Q)= Bignose
gcampbell

8

05AB1E , 19 17 14 ไบต์

รหัส:

Œévy2ä'|ý©ÂQi®

คำอธิบาย:

Œ                # Get all substrings of the input
 é               # Sort by length (shortest first)
  vy             # For each element...
    2ä           # Split into two pieces
      '|ý        # Join by "|"
         ©       # Copy this into the register
          Â      # Bifurcate, pushing a and reversed a
           Q     # Check if it's a palindrome
            i®   # If so, push that string again
                 # Implicit, the top element is outputted

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .


5

Python 2 102 97 ไบต์

def f(s):h=len(s)/2;r=s[:h]+'|'+s[h:];return s and max(r*(r==r[::-1]),f(s[1:]),f(s[:-1]),key=len)

ค่อนข้างช้าและไม่มีประสิทธิภาพ ... ตรวจสอบกรณีทดสอบที่มีขนาดเล็กในIdeone


4

JavaScript, 100 99 ไบต์

s=>eval('for(O=i=0;s[i++];O=O[j+j]?O:o)for(o="|",j=0;(S=s[i-1-j])&&S==s[i+j++];o=S+o+S);O[1]?O:""')

หรือ

s=>eval('for(O="",i=0;s[i++];O=O[j+j]||j<2?O:o)for(o="|",j=0;(S=s[i-1-j])&&S==s[i+j++];o=S+o+S);O')

แค่อยากรู้อยากเห็นสิ่งที่มีไว้evalเพื่อ?
gcampbell

@gcampbell evalเพื่อหลีกเลี่ยงreturn
edc65

คุณไม่สามารถใช้เครื่องหมายคอมม่าเพื่อหลีกเลี่ยงการส่งคืนได้หรือไม่
นายกเทศมนตรีราย

@SpeedyNinja ไม่ forไม่ใช่การแสดงออกดังนั้นโดยปกติแล้วจะต้องใช้เครื่องมือจัดฟันและ areturn
jrich


2

จอตาติน่า 66 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

M!&`(.)+(?<-1>\1)+(?(1)¶)
O$#`.+
$.&
A-2`
^(.)+?(?=(?<-1>.)+$)
$&|

ลองออนไลน์!(บรรทัดแรกเปิดใช้งานการทดสอบหลายกรณีทดสอบที่แยกบรรทัด linefeed)

อืมนานกว่าที่ฉันต้องการ ...


2

JavaScript (ES6), 91

s=>[...s].map((d,i)=>{for(a='|',j=0;d=s[i-j],d&&d==s[i-~j];r=r[j+++j]?r:a)a=d+a+d},r='')&&r

น้อย golfed

f=s=>
  [...s].map(
    (d,i) => {
    for(a='|', j=0; d=s[i-j], d&&d==s[i-~j]; r = r[j++ +j]? r : a)
      a = d+a+d
    }, r=''
  ) && r

ทดสอบ

F=
s=>[...s].map((d,i)=>{for(a='|',j=0;d=s[i-j],d&&d==s[i-~j];r=r[j+++j]?r:a)a=d+a+d},r='')&&r

;[["Hello World", "l|l"]
,["Programming Puzzles and Code-Golf", "m|m"]
,["abcba", ""]
,["Hulluh", "ul|lu"]
,["abcdefggfedcba", "abcdefg|gfedcba"]
,["abcdefggfabc", "fg|gf"]
,["AbbA", "Ab|bA"]
,["This input is a lot like the last one, but with more characters that don't change the output. AbbA", "Ab|bA"]]
.forEach(t=>{
  var i=t[0],k=t[1],r=F(i)
  console.log(k==r?'OK ':'KO ',i+' -> '+r,k!=r?'(check '+k+')':'')
})  


2

Perl 5, 105 100 98 + 1 = 106 101 99 ไบต์

/(?=((.)(?1)?\2)(?{[push@_,$1})(?!))/;($_)=sort{length$b<=>length$a}@_;substr($_,length>>1,0)='|'if$_

ฉันแค่ต้องการให้ regexes แบบวนซ้ำ ต้องการ-pตัวเลือก แก้ไข: บันทึกแล้ว (ขีดฆ่า 4) 7 ไบต์ขอบคุณ @ msh210 (ไบต์ที่หายไปเกิดจากการบันทึกที่ถูกแทนที่ด้วยการบันทึกล่าสุดของ @ msh210)


ฉันไม่ได้ทดสอบใด ๆ เหล่านี้ แต่อาจนี้สามารถย่อรูปแบบต่างๆรวมไปถึง: (1) สามารถ@_=(@_,$1) push@_,$1(2) ;ละเว้นการขึ้นบรรทัดใหม่และสุดท้าย (3) ฉันสงสัยว่ามีสภาพการจัดเรียงสั้นคุณสามารถใช้ (ถ้าไม่มีอะไรแล้วอย่างน้อย --- บางที --- แทน-สำหรับ<=>)
msh210

@ msh210 ขอบคุณสำหรับสองจุดแรก แต่ฉันได้ลองแล้ว-และมันใช้งานไม่ได้ (อาจต้อง parens สำหรับลำดับความสำคัญที่เอาชนะการบันทึก)
Neil

ลองy...c>>1หรือแทนy...c/2 length>>1(ยังไม่ทดลอง)
msh210

@ msh210 ฉันชัดควรจะมีการอ่านเคล็ดลับสำหรับการเล่นกอล์ฟใน Perl แรก ...
นีล

ฉันเดาว่าคู่สุดท้ายของคุณสามารถไปได้ด้วย
msh210

2

Python 2, 91 ไบต์

f=lambda s,p='':s and max((''<p<=s<p+'\x7f')*(p[::-1]+'|'+p),f(s[1:]),f(s[1:],s[0]+p),key=len)

แทนที่\x7fด้วย DEL ตัวละครจริงซึ่งก็คือ ASCII 127 (ให้เครดิตกับ Dennis)

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

ฟังก์ชันเดาว่าอักขระตัวแรกอยู่ในครึ่งซ้ายของมิเรอร์หรือไม่ หากไม่เป็นเช่นนั้นเพียงแค่หยดมันและเกิดขึ้นอีกครั้งในส่วนที่เหลือ ถ้าเป็นเช่นนั้นมันจะถูกเพิ่มไปยังสแต็กpของอักขระที่กลับด้าน หากสตริงเริ่มต้นด้วยสแต็กสตริงมิรเรอร์จะถูกสร้างขึ้นและถูกพิจารณาว่าเป็นมิรเรอร์ที่ยาวที่สุด เพื่อหลีกเลี่ยง|ในฐานะเอาต์พุตจะพิจารณาเฉพาะสแต็กที่ไม่ว่างเปล่า


2

เยลลี่ขนาด 17 ไบต์

ẆŒḂÐfṪœs2j”|µẋLḂ$

ลองออนไลน์!

ทำด้วยความช่วยเหลือจากMr. Xcoderและ DJMcMayhemในการแชท

มันทำงานอย่างไร

ẆŒḂÐfṪœs2j”|µẋLḂ$ - Main link. Argument s  e.g.    ; 'AbbA'

Ẇ                 - All contiguous sublists
   Ðf             - Keep elements that are...
 ŒḂ               -  Palindromic                   ; [['A'], ['b'], ['b'], ['A'], ['bb'], ['AbbA']]
     Ṫ            - Final element                  ; 'AbbA'
      œs2         - Split into 2 chunks            ; ['Ab', 'bA']
         j”|      - Join with "|"                  ; 'Ab|bA'
            µ     - New link with ^ as argument
              LḂ$ - Is the length odd?             ; 1
             ẋ    - Repeat the string ^ many times ; 'Ab|bA'


1

TSQL 227 223 ไบต์

ฉันฮาร์ดโค้ดความยาวได้สูงสุด 99 ไบต์บันทึกเป็นไบต์ แต่ทำให้ช้าลง มันยังคงมีประสิทธิภาพที่ดีอยู่ดี

แข็งแรงเล่นกอล์ฟ:

DECLARE @t varchar(99)='AbccbA'

,@z char(99)='',@a INT=0,@ INT=0WHILE @a<LEN(@t)SELECT
@z=IIF(LEN(x)>LEN(@z)/2and @t LIKE'%'+x+REVERSE(x)+'%'COLLATE
Thai_bin,x+'|'+REVERSE(x),@z),@=IIF(@=50,1,@+1),@a+=IIF(@=1,1,0)FROM(SELECT
SUBSTRING(@t,@a,@)x)x PRINT @z

Ungolfed:

DECLARE @t varchar(99)='AbccbA'

,@z char(99)='',
@a INT=0,
@ INT=0
WHILE @a<LEN(@t)
  SELECT
    @z=IIF(LEN(x)>LEN(@z)/2and @t LIKE'%'+x+REVERSE(x)+'%'COLLATE Thai_bin,x+'|'
       +REVERSE(x),@z),
    @=IIF(@=99,1,@+1),
    @a+=IIF(@=1,1,0)
  FROM
    (SELECT SUBSTRING(@t,@a,@)x)x

PRINT @z

ซอ


1
คุณสามารถโกนหนวดออกได้ 2 ไบต์หากคุณ จำกัด ไว้ที่ 99 เนื่องจากตัวอย่างล่าสุดมีความยาวเพียง 99 ตัวอักษร
Alex Carlsen

1
@VisualBean ขอบคุณคุณเปลี่ยนสคริปต์เป็นเพียง 99 ตัวอักษรเปลี่ยนการจัดเรียงจาก Thai_CS_AS เป็น thai_bin
t-clausen.dk

0

Python 2, 149 ไบต์

R,L,s=range,len,input()
t=max([s[i:j/2+i/2]for i in R(L(s))for j in R(L(s)+1)if s[i:j]==s[i:j][::-1]and(j-i)%2<1],key=L)
print t+'|'*(L(t)>0)+t[::-1]

ลองออนไลน์

โปรแกรมนี้ค้นหาช่วงครึ่งแรกของสตริงย่อย palindromic ที่ใหญ่ที่สุดที่มีความยาวเท่ากันและพิมพ์สตริงนั้นตามด้วย a |ตามด้วยสตริงนั้นกลับด้าน หากไม่มีสตริงที่เหมาะสมtจะเป็นสตริงว่างและ'|'*(L(t)>0)จะประเมินเป็นสตริงว่าง


0

Java 8, 294 283 232 ไบต์

s->{int l=s.length(),i=0,j,z,y=0;String a,b="";for(;i<l;i++)for(j=0;j<=l-i;)if((a=s.substring(i,i+j++)).equals(new StringBuffer(a).reverse()+"")&(z=a.length())%2<1&z>y){y=z;b=a;}return y>0?b.substring(0,y/=2)+"|"+b.substring(y):"";}

คำอธิบาย:

ลองที่นี่

s->{                               // Method with String as both parameter and return-type
  int l=s.length(),                //  Length of the input-String
      i=0,j,                       //  Index-integers
      z,y=0;                       //  Temp-integers
  String a,b="";                   //  Temp-Strings
  for(;i<l;i++)                    //  Loop (1) from 0 to `l` (exclusive)
    for(j=0;j<=l-i;                //   Inner loop (2) from 0 to `l-i` (inclusive)
      if((a=s.substring(i,i+j++))  //    Set the current substring to `a`
          .equals(new StringBuffer(a).reverse()+"")
                                   //    If `a` is a palindrome
         &(z=a.length())%2<1       //    And the length of `a` is even
         &z>y){                    //    And the length of `a` is larger than `y`
        y=z;                       //     Change `y` to `z`
        b=a;}                      //     Change `b` to `a`
                                   //   End of inner loop (2) (implicit / single-line body)
                                   //  End of loop (1) (implicit / single-line body)
  return y>0?                      //  If the result-length is not 0:
    b.substring(0,y/=2)+"|"+b.substring(y)
                                   //   Return the result
   :                               //  Else:
    "";                            //   Return an empty String
}                                  // End of method
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.