ミラーはどこに置けばいいですか?


30

これはミラーです|。文字列をミラーリングできる場合、文字列の中央にミラーを貼り付けることができることがわかりました!たとえば、文字列abccba。半分にカットすると、2つの半分は互いに鏡像になります。

abc  <-->  cba

したがって、文字列の中央にミラーを貼り付けることができ、新しい文字列はabc|cbaです。場合によっては、文字列の一部のみをミラーリングできます。たとえば、文字列「mirror」。2つのrはミラーリングされていますが、残りのストリングはミラーリングされていません。大丈夫です。互いにミラーリングしない文字列の部分を削除するだけで、次の文字列が取得されます。

r|r

一部の文字列は、複数の場所でミラー化できます。たとえば、「He​​llo World、xyzzyx」。鏡にたくさんのテキストが映るのが好きなので、鏡を置くのに最適な場所を見つける必要があります。この場合、より長いミラーリングされた文字列を出力し、最後の例と同様に、他のすべてを削除する必要があります。この文字列は次のようになります。

xyz|zyx

一部の文字列はミラーリングできるように見えますが、実際にはミラーリングできません。文字列をどこにもミラーリングできない場合は、何も出力しないでください。

チャレンジ:

printable-asciiのみを含む文字列が与えられた場合、ミラーを配置するのに最適な場所を見つけます。言い換えると、

最大の偶数長のパリンドローム部分文字列を見つけて、パイプ文字「|」で出力します 途中で。

入力の長さは1〜50文字です。

入力にミラー|や改行は含まれないと想定できます。それを超えて、すべての印刷可能なアスキー文字は公正なゲームです。ミラーリングされた最長のサブストリングが2つのサブストリングの間にある場合、出力するサブストリングを選択できます。たとえば、文字列「abba ollo」の場合、「ab | ba」または「ol | lo」を出力する必要がありますが、どちらを出力してもかまいません。文字列は、大文字と小文字が区別され例えば「ABBA」すべきでない出力は空の文字列|「BA AB」、それが出力する必要があり。

サンプル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"

いつものように、これはコードゴルフなので、標準的な抜け穴が適用され、バイト単位の最短回答が勝ちます!


入力の長さに制限はありますか?
メゴ

@Megoアルゴリズムが理論的にどの入力でも機能する限り、どのくらいの時間/どれくらいのメモリが必要かは気にしません。
DJMcMayhem

バニラ正規表現エンジンは、(任意の長さのパリンドロームとは対照的に)指定された有限値までの長さのパリンドロームのみを照合でき、正規表現ベースのソリューションの可能性は上限があるかどうかに依存するため、入力の長さに制限があります。
メゴ

@Megoあ、それは理にかなっています。入力の長さは最大50文字としましょう。どのように聞こえますか?
DJMcMayhem

回答:


9

Pyth- 19 17 15 13バイト

2バイト節約してくれた@FryAmTheEggmanに感謝します。

答えが得られない特別なケースについて。それを解決しました!

e_I#jL\|cL2.:

テストスイート

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
いや!忍者の答えに答えた; _;
Downgoat

説明してください?:3
ダウンゴート

@Downgoat彼はすべての部分文字列を取り、2つに切り刻み、各ペアを|で結合し、対称性でフィルタリングし、それを[k]に追加して最後の要素(最長)を
取得します-busukxuan

@Downgoat完了。
マルティセン

2
:Q)= Bignose
gcampbell

8

05AB1E19 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

戻りを避けるためにカンマ演算子を使用できませんか?
MayorMonty

@SpeedyNinjaいいえ。forそれは通常、中括弧とが必要となるので、式ではありませんreturn
jrich



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

少ないゴルフ

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

パール5、105 100 98 + 1 = 106の 101 99のバイト

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

再帰的な正規表現を試してみたかっただけです。-pオプションが必要です。編集:@ msh210のおかげで7バイト保存(4を取り消し)。(不足しているバイトは、@ msh210の最新の保存によって置き換えられた保存によるものです。)


私はこれらのいずれもテストしていませんが、おそらくこれはさまざまな方法で省略@_=(@_,$1)できますpush@_,$1。(2)改行と最終を省略し;ます。(3)使用できる短いソート条件があると思われます(少なくとも---おそらく---の代わりになる-場合<=>
-msh210

@ msh210最初の2つの点に感謝しますが、私はすでに試してみましたが-、機能しませんでした(おそらく、優先度を下げるために括弧が必要です)。
ニール

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)

\x7fASCII 127(デニスのクレジット)である実際の文字DELに置き換えます。

これは、最長の回文間隔を見つけるために再帰的に分岐を使用するというデニスの答えと同様の戦略に従いmaxます。しかし、代わりに、左半分を見つけ、対応するミラー化された右半分が自作のstartwithでその直後に来ることを確認します。

この関数は、最初の文字がミラー化された左半分にあるかどうかを推測します。そうでない場合は、それを単にドロップし、残りで再帰します。そうである場合、それはp反転文字のスタックに追加されます。文字列がスタックで始まる場合、ミラー文字列が生成され、可能な限り長いミラーと見なされます。|出力として回避するために、空でないスタックのみが考慮されます。


2

ゼリー、17バイト

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

オンラインでお試しください!

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

Haskell、126 111バイト

(!)=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バイト

長さを最大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

ゴルフをしていない:

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
あなたは99に制限した場合、最後の例では、唯一の99文字の長さであるとして、あなたは2バイトをオフに剃ることができます
アレックス・カールセン

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]

オンラインで試す

このプログラムは、偶数の長さの最大のパリンドローム部分文字列の前半を見つけ、その文字列を出力します|。適切な文字列がない場合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.