文字列の回文化


30

前書き

分からない人にとっては、回文とは、文字列が逆方向の文字列と等しい場合です(インターパンクション、スペースなどを除く)。回文の例は次のとおりです。

abcdcba

これを逆にすると、次のようになります。

abcdcba

どちらも同じです。したがって、これを回文と呼びます。物事を回文化するために、文字列の例を見てみましょう。

adbcb

これは回文ではありません。これを回文化するには、逆の文字列を最初の文字列の右側にある最初の文字列にマージし、両方のバージョンをそのままにする必要があります。短いほど良い。

最初に試すことができるのは次のとおりです。

adbcb
bcbda
^^ ^^

すべての文字が一致するわけではないため、これは逆の文字列の正しい位置ではありません。一歩右に進みます。

adbcb
 bcbda
 ^^^^

これもすべての文字に一致するわけではありません。次のステップに進みます。

adbcb
  bcbda

今回は、すべての文字が一致します。私たちはすることができますマージ、両方の文字列をそのままを残します。最終結果は次のとおりです。

adbcbda

これは回文化された文字列です。


タスク

小文字(またはより適切な場合は大文字)のみを含む文字列(少なくとも1文字)を指定すると、回文化された文字列を出力します


テストケース

Input     Output

abcb      abcba
hello     hellolleh
bonobo    bonobonob
radar     radar
hex       hexeh

これはであるため、バイト数が最小の提出が勝ちです!



6
反転した文字列を元の文字列にマージし、反転した文字列を右側にマージする必要があることを指定する必要があります。左に行くことができればobonobo、テストケースのより良い解決策になります。
レベルリバーセント


2
@LevelRiverSt +1「おぼのぼ」がこんなに素晴らしい言葉だからです
ナサニエル

1
@ナサニエルありがとうございますがbono b o nob、文全体です。神とボノの違いは何ですか?神はボノのふりをしてダブリンの周りをさまようことはありません;-)
レベルリバーセント

回答:


5

ゼリー、11 10バイト

ṫỤfU$Ḣœ^;U

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

使い方

ṫỤfU$Ḣœ^;U  Main link. Argument: s (string)

 Ụ          Yield all indices of s, sorted by their corr. character values.
ṫ           Tail; for each index n, remove all characters before thr nth.
            This yields the list of suffixes of s, sorted by their first character,
            then (in descending order) by length.
    $       Combine the two links to the left into a chain:
   U        Upend; reverse all suffixes.
  f         Filter; only keep suffixes that are also reversed suffixes.
            This gives the list of all palindromic suffixes. Since all of them
            start with the same letter, they are sorted by length.
     Ḣ      Head; select the first, longest palindromic suffix.
      œ^    Multiset symmetric difference; chop the selected suffix from s.
         U  Upend; yield s, reversed.
        ;   Concatenate the results to the left and to the right.

15

Pyth(コミットb93a874)、11バイト

.VkI_IJ+zbB

テストスイート

このコードは、現在のバージョンのPythのバグ、b93a874をコミットします。バグは、それがある_IJ+zbそれがあったかのように解析さq_J+zbJ+zbに相当する_I+zb+zb、(Pyth の設計意図によって)として解析されなければならない場合、q_J+zbJに相当します、_I+zb。これにより、バイトを節約できます.VkI_IJ+zbJB。バグが修正された後、正しいコードはになります。代わりにそのコードを説明します。

基本的に、コードにブルートフォースを使用すると、入力に追加して回文を形成できる最短の文字列が見つかるまで、可能なすべての文字列が強制的に処理され、結合された文字列が出力されます。

.VkI_IJ+zbJB
                z = input()
.Vk             For b in possible strings ordered by length,
       +zb      Add z and b,
      J         Store it in J,
    _I          Check if the result is a palindrome,
   I            If so,
          J     Print J (This line doesn't actually exist, gets added by the bug.
          B     Break.

そのようなコードをどのように思い付きますか?Pythに精通していない人にはほとんど読めず、まったく理解できません。そのような言語の目的は何ですか。
-anukul

5
@momo言語の目的は、楽しみのために短いコードを書くことです。それはレクリエーション活動です。たくさんの練習があり、言語を発明したので、それを書くことができます。言語を知らない人には理解できないことを知っているので、説明を含めました。
-isaacg

13

Python、46バイト

f=lambda s:s*(s==s[::-1])or s[0]+f(s[1:])+s[0]

文字列が回文の場合、それを返します。そうでない場合は、文字列の残りの部分の再帰結果の最初の文字を挟みます。

内訳の例:

f(bonobo)
b  f(onobo) b
b o f(nobo) o b 
b o n f(obo) n o b
b o n obo n o b

私は(あなたが逆の状態を使用する場合は、バイトを保存することができると思うs!=s[::-1]
aditsu

@aditsu動作しますが、乗算の使用はさらに短くなります。
XNOR

9

Haskell、36バイト

f s|s==reverse s=s|h:t<-s=h:f t++[h]

より読みやすい:

f s
 |s==reverse s = s
 |(h:t)<-s     = h:(f t)++[h]

文字列が回文の場合、それを返します。それ以外の場合は、文字列の末尾の再帰結果の周りに最初の文字を挟みます。

文字列sh:t2番目のガードで分割される1>0ため、この場合のフィラーは不要です。これはs@(h:t)、入力に対して行うよりも短いです。



5

Brachylog16 6 5バイト(非競合)

:Ac.r

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

最初の答えを投稿したとき、それはまだJavaの古い実装にありました。私はPrologですべてを再プログラムしたので、そもそも本来あるべきように動作します。

説明

(?):Ac.        Output is the concatenation of Input with another unknown string A
      .r(.)    The reverse of the Output is the Output

バックプロパゲーションにより、最初に有効な値Aが見つかるようになり、入力に連結して回文にすることができる最短になります。

代替ソリューション、5バイト

~@[.r

これは、上記の回答とほぼ同じですが、「出力は入力と文字列の連結」ではなく、「出力はA入力が出力のプレフィックスである文字列である」と述べている点が異なります。


4

JavaScript(ES6)、92バイト

(s,a=[...s],r=a.reverse().join``)=>s.slice(0,a.findIndex((_,i)=>r.startsWith(s.slice(i))))+r

元の文字列とその反転の間のオーバーラップを計算してスライスします。


4

網膜、 29 25

$
¶$_
O^#r`.\G
(.+)¶\1
$1

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

11バイト節約されたMartinに感謝します!

これは単に文字列の逆のコピーを作成し、それらを一緒に滑らかにします。これの唯一の本当に素晴らしい部分は、逆のメソッドです:O^#r`.\G、ソートモードを使用して行われます。2番目の文字列(改行ではなく、文字列の末尾から連続している文字\G)を数値で並べ替えます。数値はないため0です。次に、^オプションを使用したこの安定したソートの結果の順序。のファンシー使用のためのすべてのクレジットは\Gマーティンに属します:)


3

CJam、18歳

q__,,{1$>_W%=}#<W%

オンラインで試す

説明:

q         read the input
__        make 2 copies
,,        convert the last one to a range [0 … length-1]
{…}#      find the first index that satisfies the condition:
  1$>     copy the input string and take the suffix from that position
  _W%=    duplicate, reverse and compare (palindrome check)
<         take the prefix before the found index
W%        reverse that prefix
          at the end, the stack contains the input string and that reversed prefix

3

Lua、89 88バイト

Javascriptに勝ちました!\ o / @LeakyNunのおかげで1バイト保存されました^^

これは完全なプログラムであり、コマンドライン引数として入力を受け取ります。

i=1s=...r=s:reverse()while s:sub(i)~=r:sub(0,#r-i+1)do i=i+1 end print(s..r:sub(#r-i+2))

食べない

i=1                             -- initialise i at 1 as string are 1-indexed in lua
s=...                           -- use s as a shorthand for the first argument
r=s:reverse()                   -- reverse the string s and save it into r
while(s:sub(i)~=r:sub(0,#r-i+1))-- iterate while the last i characters of s
do                              -- aren't equals to the first i characters of r
  i=i+1                         -- increment the number of character to skip
end
print(s..r:sub(#r-i+2))         -- output the merged string

近くの括弧whileは削除できると思いますか?
リーキー修道女

彼らは^^できることを確認して@LeakyNun
Katenkyo

できませんi=i+1endか?
エリックアウトゴルファー16

1
@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ悲しいことに、私はできません。1end16進数として評価しようとします。一般的に、[abcdef]16進数と見なされない番号の直後に使用することはできません。もう1つ例外があり0xます。
かてんきょう

3

プロローグ、43バイト

a(S):-append(S,_,U),reverse(U,U),writef(U).

これは、入力としてコード文字列を必要とします(SWI-Prolog 7など)。 a(`hello`).

説明

これは基本的にBrachylogの回答の移植版です。

a(S) :-               % S is the input string as a list of codes
    append(S,_,U),    % U is a list of codes resulting in appending an unknown list to S
    reverse(U,U),     % The reverse of U is U
    writef(U).        % Write U to STDOUT as a list of codes

3

オクターブ、78 75バイト

EʀɪᴋᴛʜᴇGᴏʟғᴇʀのおかげで3バイト節約できました!

function p=L(s)d=0;while~all(diag(s==rot90(s),d++))p=[s fliplr(s(1:d))];end

ideoneは名前付き関数ではまだ失敗しますが、ここではプログラムとしてコードをテスト実行しています。


2

Perl、37バイト

xnorの答えに基づきます。

+2を含む -lp

STDINで入力して実行します。たとえば

palindromize.pl <<< bonobo

palindromize.pl

#!/usr/bin/perl -lp
s/.//,do$0,$_=$&.$_.$&if$_!~reverse



1

J、20バイト

,[|.@{.~(-:|.)\.i.1:

これは単項動詞です。ここで試してみてください。使用法:

   f =: ,[|.@{.~(-:|.)\.i.1:
   f 'race'
'racecar'

説明

Sの回文化がS + reverse(P)であるという事実を使用しています。ここで、PSの最短プレフィックスで、その除去により回文が発生します。Jでは、述語を満たす配列の最初の要素を検索するのは少し不格好です。したがって、インデックス作成。

,[|.@{.~(-:|.)\.i.1:  Input is S.
        (    )\.      Map over suffixes of S:
         -:             Does it match
           |.           its reversal? This gives 1 for palindromic suffixes and 0 for others.
                i.1:  Take the first (0-based) index of 1 in that array.
 [   {.~              Take a prefix of S of that length: this is P.
  |.@                 Reverse of P.
,                     Concatenate it to S.

1

Haskell、68バイト

import Data.List
f i=[i++r x|x<-inits i,i++r x==x++r i]!!0
r=reverse

使用例:f "abcb"-> "abcba"

回文を構築するために逆に追加されたものが見つかるまでinits、入力を検索しますi(例inits "abcb"-> ["", "a", "ab", "abc", "abcb"]i


r=reverse前に行く必要はありませんf i=...?
エリックアウトゴルファー16

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ:いいえ、どんな順序でも使用できます。
nimi

46バイトで管理しました。私はそれがもっと良くできるに違いない。
theonlygusti

@theonlygusti:xnorの答えをご覧ください。
nimi

1

MATL17 16バイト

@aditsuのCJamの回答に大いに影響を受けました。

`xGt@q:)PhttP=A~

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

説明

`        % Do...while loop
  x      %   Delete top of stack, which contains a not useful result from the
         %   iteration. Takes input implicitly on first iteration, and deletes it
  G      %   Push input
  t      %   Duplicate
  @q:    %   Generate range [1,...,n-1], where n is iteration index. On the  first
         %   iteration this is an empty array
  )      %   Use that as index into copy of input string: get its first n elements
  Ph     %   Flip and concatenate to input string
  t      %   Duplicate. This will be the final result, or will be deleted at the
         %   beginning of next iteration
  tP     %   Duplicate and flip
  =A~    %   Compare element-wise. Is there some element different? If so, the
         %   result is true. This is the loop condition, so go there will be a 
         %   new iteration. Else the loop is exited with the stack containing
         %   the contatenated string
         % End loop implicitly
         % Display stack contents implicitly


1

Oracle SQL 11.2、195バイト

SELECT MIN(p)KEEP(DENSE_RANK FIRST ORDER BY LENGTH(p))FROM(SELECT:1||SUBSTR(REVERSE(:1),LEVEL+1)p FROM DUAL WHERE SUBSTR(:1,-LEVEL,LEVEL)=SUBSTR(REVERSE(:1),1,LEVEL)CONNECT BY LEVEL<=LENGTH(:1));

ゴルフをしていない

SELECT MIN(p)KEEP(DENSE_RANK FIRST ORDER BY LENGTH(p))
FROM (
       SELECT :1||SUBSTR(REVERSE(:1),LEVEL+1)p 
       FROM   DUAL 
       WHERE  SUBSTR(:1,-LEVEL,LEVEL)=SUBSTR(REVERSE(:1),1,LEVEL)
       CONNECT BY LEVEL<=LENGTH(:1)
     );

1

真剣に、34バイト

╩╜lur`╜╨"Σ╜+;;R=*"£M`MΣ;░p╜;;R=I.

最後の文字は、改行なしスペース(ASCII 127または0x7F)です。

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

説明:

╩╜lur`╜╨"Σ╜+;;R=*"£M`MΣ;░p╜;;R=I.<NBSP>
╩                                        push inputs to registers (call the value in register 0 "s" for this explanation)
 ╜lur                                    push range(0, len(s)+1)
     `              `M                   map (for i in a):
      ╜╨                                   push all i-length permutations of s
        "        "£M                       map (for k in perms):
         Σ╜+                                 push s+''.join(k) (call it p)
            ;;R=                             palindrome test
                *                            multiply (push p if palindrome else '')
                      Σ                  summation (flatten lists into list of strings)
                       ;░                filter truthy values
                         p               pop first element (guaranteed to be shortest, call it x)
                          ╜;;R=I         pop x, push s if s is palindromic else x
                                .<NBSP>  print and quit

1

C#、202バイト

私は試した。

class P{static void Main(string[]a){string s=Console.ReadLine(),o=new string(s.Reverse().ToArray()),w=s;for(int i=0;w!=new string(w.Reverse().ToArray());){w=s.Substring(0,i++)+o;}Console.WriteLine(w);}}

ゴルフをしていない:

class P
{
    static void Main(string[] a)
    {
        string s = Console.ReadLine(), o = new string(s.Reverse().ToArray()), w = s;
        for(int i = 0; w!=new string(w.Reverse().ToArray());)
        {
            w = s.Substring(0, i++) + o;
        }
        Console.WriteLine(w);
        Console.ReadKey();
    }

}

.Reverse()。ToArray()への2つの呼び出しをグループ化するためのアイデアをだれでも提供できますか?別の方法は、より多くのバイトです。


0

QBIC、41バイト

;_FA|C=A{a=a+1~C=_fC||_XC\C=A+right$(B,a)

説明:

;_FA|    Read A$ from the cmd line, then flip it to create B$
C=A      Set C$ to be A$
{        Start an infinite DO-loop
a=a+1    Increment a (not to be confused with A$...)
~C=_fC|  If C$ is equal to its own reversed version
|_XC     THEN end, printing C$
\C=A+    ELSE, C$ is reset to the base A$, with
right$(B the right part of its own reversal
,a)      for length a (remember, we increment this each iteration
         DO and IF implicitly closed at EOF

0

Haskell、46バイト

f l|l==reverse l=l|(h:t)<-l=l!!0:(f$tail l)++[l!!0]

かっこを削除する方法があるかどうか疑問に思ってい(f$tail l)++[l!!0]ます...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.