Aynamı nereye koymalıyım?


30

Bu bir ayna: |. Dize kendiliğinden yansıtılabilirse, bir dize ortasında bir ayna yapıştırabileceğinizi öğrendim! Örneğin, dize abccba. Yarıda keserseniz, iki yarım birbirinin ayna görüntüsüdür:

abc  <-->  cba

Böylece, dize ortasında bir ayna tutabiliriz, ve yeni dize abc|cba. Bazen, dizginin sadece bir kısmı kendi kendine yansıtılabilir. Örneğin, "ayna" dizesi. İki r yansıtılır, ancak dizenin geri kalanı değil. Sorun değil, dizenin birbirini yansıtmayan kısımlarını kaldıracağız ve aşağıdaki dizgiyi alacağız:

r|r

Bazı dizeler birden fazla yerde yansıtılabilir. Örneğin, "Merhaba Dünya, xyzzyx". Aynaya yansıyan bir sürü metnin olmasını seviyorum, bu yüzden aynamı koymak için en iyi yeri bulman gerekiyor. Bu durumda, daha uzun aynalı dizgeyi çıktılamalısınız ve son örneğimizde olduğu gibi her şeyi kaldırmalısınız. Bu dize olur:

xyz|zyx

Bazı dizeler yansıtılabilir gibi görünür , ancak aslında olamaz. Bir dize hiçbir yerde yansıtılamazsa, hiçbir şey çıkarmamalısınız.

Meydan okuma:

Yalnızca yazdırılabilir ascii içeren bir dize verildiğinde, aynamı koymak için en iyi yeri bulun. Diğer bir deyişle,

En büyük çift uzunluktaki palindromik altlığı bulun ve sonra '|' ortasında.

Giriş 1-50 karakter uzunluğunda olacak.

Girişin ayna |veya yeni satır içermeyeceğini varsayabilirsiniz . Bunun ötesinde, tüm basılabilir-ascii karakterleri adil bir oyundur. En uzun yansıtılmış alt dize iki alt dize arasına bağlıysa, hangisinin çıktısını seçebilirsiniz. Örneğin, "abba ollo" dizgisi için "ab | ba" veya "ol | lo" yazmalısınız, ancak hangisini çıkardığınız önemli değildir. Dizeler "ABBA" harf duyarlı, örneğin şunlardır should not çıktı "AB | ba", bu çıkış boş dize olmalıdır.

Örnek 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"

Her zaman olduğu gibi, bu kod golf, bu yüzden standart boşluklar geçerli ve bayt cinsinden en kısa cevap kazanıyor!


Girişin uzunluğu konusunda bir sınır var mı?
Mego

@Mego Algoritmanız teorik olarak herhangi bir giriş üzerinde çalıştığı sürece, ne kadar sürdüğü / ne kadar bellek aldığı umurumda değil.
DJMcMayhem

Vanilya regex motorlarının sadece belirli bir sonlu değere kadar (isteğe bağlı olarak uzun palindromların aksine) uzunluktaki palindromları eşleştirme yeteneğine sahip olduğunu ve regex tabanlı bir çözüm olasılığının bir üst kısmın olup olmamasına bağlı olacağını sordum. girişin uzunluğu sınırlıdır.
Mego

@Mego Ah, bu mantıklı. Diyelim ki giriş 50 karakter uzunluğunda olabilir. Bu nasıl ses geliyor?
DJMcMayhem

Yanıtlar:


9

Pyth - 19 17 15 13 bayt

Beni iki bayttan kurtardığı için @FryAmTheEggman'e teşekkürler.

ARRGH cevap yok için özel durum. Bunu çözdüm!

e_I#jL\|cL2.:

Test Takımı .

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
Hayır! Ninja pyth cevabına; _;
Downgoat

Açıklama lütfen? : 3
Downgoat

@Downgoat bütün alt dizileri aldı ve ikiye böldü, her çiftle | 'ye katıldı, simetri ile filtre etti, [k]' ya
ekle

@ Downgoat yapıldı.
Maltysen

2
:Q)= Bignose
gcampbell

8

05AB1E , 19 17 14 bayt

Kod:

Œévy2ä'|ý©ÂQi®

Açıklama:

Œ                # 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 kodlamasını kullanır . Çevrimiçi deneyin! .


5

Python 2, 102 97 bayt

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)

Oldukça yavaş ve verimsiz ... İdeone üzerindeki küçük test durumlarını doğrulayın .


4

JavaScript, 100 99 bayt

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:""')

veya

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')

Sadece merak ediyorum, ne evaliçin?
gcampbell

kaçamak evaliçin @gcampbellreturn
edc65 4:06

Dönmesini önlemek için virgül operatörünü kullanamaz mısınız?
MayorMonty

@ SpeedyNinja noope. forbir ifade değildir, bu yüzden normalde parantez gerektirir ve areturn
jrich


2

Retina , 66 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

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

Çevrimiçi deneyin! (İlk satır, birkaç satır besleme ile ayrılmış test durumunun bir kerede test edilmesini sağlar.)

Hmmm, istediğimden daha uzun ...


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

Daha az golf oynadı

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

Ölçek

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 bayt

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

Ben sadece özyinelemeli regexes gitmek vermek istedim. Seçeneğe ihtiyacı var -p. Düzenleme: @ msh210 sayesinde kaydedilmiş (4 çarpı) 7 bayt. (Kayıp bayt, @ msh210'un son tasarrufuyla değiştirilen bir tasarruftan kaynaklanmaktadır.)


Bunların hiçbirini test etmedim, ancak muhtemelen bu aşağıdakiler de dahil olmak üzere çeşitli şekillerde kısaltılabilir: (1) @_=(@_,$1)olabilir push@_,$1. (2) Yeni satırları ve finali atlayın ;. Sana (daha sonra başka bir şey en azından --- belki --- yerine eğer kullanabilirsiniz kısa sıralama şartı var sanıyorum (3) -için <=>)
msh210

@ msh210 İlk iki puan için teşekkürler ama çoktan denedim -ve işe yaramadı (büyük olasılıkla tasarrufun önüne geçen bir parens gerektiriyor).
Neil,

Deneyin y...c>>1ya da y...c/2yerine length>>1. (
Denenmemiş

@ msh210 Açıkçası ilk önce Perl'de golf oynamak için ipuçlarını okumam gerekirdi ...
Neil

Sanırım son çiftiniz de gidebilir.
msh210

2

Python 2, 91 bayt

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)

\x7fASCII 127 olan gerçek DEL karakteriyle değiştirin (Dennis'e verilen kredi).

Bu, Dennis'in enmax uzun palindrom aralığını bulmak için tekrarlı bir şekilde dallanma ve kullanma konusundaki cevabına benzer bir stratejiyi izler . Ancak, bunun yerine, soldaki yarıyı bulur ve aynada yansıtılan sağ yarıdan hemen sonra kendinden yapılmış bir başlangıçla geldiğini kontrol eder .

İşlev, ilk karakterin yansıtılmış sol yarıda olup olmadığını tahmin eder. Değilse, sadece onu bırakır ve geri kalanı üzerine recurses. Öyleyse p, ters çevrilmiş karakter yığına eklenir . Dize hiç yığınla başlarsa, ayna dizesi oluşturulur ve olası en uzun ayna olarak kabul edilir. |Çıktı olarak önlemek için sadece boş olmayan yığınlar göz önünde bulundurulur.


2

Jöle , 17 bayt

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

Çevrimiçi deneyin!

Sohbet sırasında Bay Xcoder ve DJMcMayhem'den yardım alarak

Nasıl çalışır

ẆŒḂÐ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

Haskell, 126 111 bayt

(!)=drop
f s|n<-length s=last$"":[a++'|':b|k<-[1..n],t<-map(!s)[1..n-k],let[a,b]=take k<$>[t,k!t],a==reverse b]

1

TSQL 227 223 bayt

Uzunluğu maksimum 99 bayta kadar kodladım, bu kaydedilen bayt ama daha yavaş yaptı. Yine de hala iyi bir performansa sahip.

golfed:

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

Keman


1
Son örnek sadece 99 karakter uzunluğunda olduğu için 99 ile sınırlandırırsanız 2 bayt'ı tıraş edebilirsiniz
Alex Carlsen

1
@VisualBean, sadece 99 karaktere izin verecek şekilde betiği değiştirdi, aynı zamanda harmanlamayı Thai_CS_AS'den thai_bin olarak değiştirdi
t-clausen.dk

0

Python 2, 149 bayt

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]

Çevrimiçi deneyin

Bu program, eşit uzunluktaki en büyük palindromik alt tabanın ilk yarısını bulur ve bu dizgeyi, ardından a dizgesini, ardından |dizgiyi ters çevirir. Uygun bir dize yoksa, tboş dize olacak ve boş dize '|'*(L(t)>0)değerlendirecektir.


0

Java 8, 294 283 232 bayt

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):"";}

Açıklama:

Burada dene.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.