セミパリンドロームパズル


23

回文とは、それ自体が逆の言葉です。

今ではパリンドロームのように見えるかもしれないがそうではない単語がいくつかあります。たとえば、単語 はパリンドロームsheeshsheeshはありません。その逆はhseehsどちらが異なるかを考えshてみましょう。しかし、単一の文字と考えると、逆はになりsheeshます。この種の単語をセミパリンドロームと呼びます。

具体的には、単語をいくつかのチャンクに分割して、チャンクの順序が逆になったときに元の単語が形成される場合、単語はセミパリンドロームです。(sheeshこれらのチャンクはsh e e sh)単語の両方の半分からの文字を含むチャンクも必要ありません(そうでない場合、すべての単語はセミパリンドロームになります)。たとえば、元の単語の両側の文字を含むチャンク()があるrearため、セミパリンドロームではありません。奇数の長さの単語の中心文字は単語のどちら側にもないと考えます。したがって、奇数の長さの単語の場合、中心文字は常に独自のチャンクになければなりません。r ea rea

あなたの仕事は、正の整数のリストを取得し、それらがセミパリンドロームかどうかを判断することです。コードは、入力がセミパリンドロームの場合とそうでない場合の2つの一貫した等しくない値を出力する必要があります。ただし、コードのバイトシーケンスはセミパリンドロームそのものでなければなりません

回答はバイト単位でスコアリングされ、バイト数が少ないほど優れています。

テストケース

[] -> True
[1] -> True
[2,1,2] -> True
[3,4,2,2,3,4] -> True
[3,5,1,3,5] -> True
[1,2,3,1] -> False
[1,2,3,3,4,1] -> False
[11,44,1,1] -> False
[1,3,2,4,1,2,3] -> False

より多くのテストケースを生成するプログラム。


恐ろしいことは、これらが一般化されたスマランダチェ回文に似ていることを指摘した。したがって、さらに読みたい場合は、1つの場所から始めてください。


2
文字列を使用してセミパリンドロームを定義したのに、入力が整数の配列であるのはなぜですか?紛らわしいことに加えて、これは、独自のプログラムを使用してソースコードをテストできないことを意味します。
BradC

@BradC Palindromesなどは、言葉で説明されることがよくあります。そうするのが少し簡単だからです。
エリックアウトゴルファー

@BradC文字列は、特に文字とバイトの点で奇妙なエッジケースを導入する傾向があります。数字を選んだのは、それらがより単純だからです。説明のためには言葉の方が簡単だと思いました。
小麦ウィザード

2
これらのタイプのパリンドロームは、文献では一般化されたスマランダチェパリンドロームとして知られています。
ひどい

1
@RosLuPはい、「真の」パリンドロームはセミパリンドロームでもあり、追加の「チャンク」なしで各文字/整数をそのまま扱います。
BradC

回答:


6

網膜0.8.285の 69バイト

M`^(.+,)*(\d+,)?(?<-1>\1)*$(?(1)^)|M`^(.+,)*(\d+,)?(?<-1>\1)*$(?(1)^)

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

M`

一致モードを選択します。実際、Retinaは単一行のプログラムではデフォルトで一致モードになっていますが、これらの余分な文字が一致しない場合、コードの2番目のコピーは常に一致します。

^

試合は最初から始めなければなりません。

(.+,)*

多数のキャラクターの実行をキャプチャします。各実行はコンマで終了する必要があります。

(\d+,)?

オプションで、一連の数字とコンマを一致させます。

(?<-1>\1)*

オプションで、すべてのキャプチャを逆の順序で一致させ、一致するたびにそれぞれをポップします。

$

試合は最後で終わる必要があります。

(?(1)^)

すべてのキャプチャがポップされない限り、バックトラックします。ポップされていないキャプチャがある場合、一致が文字列の先頭にあることを要求することで機能しますが、これは不可能です。


5

ゼリー27 23バイト

ṖUṁ@Ƒ€ṚẸHḢŒŒHḢŒṖUṁ@Ƒ€ṚẸ

戻り値1半回文のため、0そう。

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

使い方

ṖUṁ@Ƒ€ṚẸHḢŒŒHḢŒṖUṁ@Ƒ€ṚẸ  Main link. Argument: A (array)

          Π             Invalid token. Everything to its left is ignored.
           ŒH            Halve; divide A into two halves similar lengths. The middle
                         element (if there is one) goes into the first half.
             Ḣ           Head; extract the first half.
              ŒṖ         Generate all partitions of the first half.
                U        Upend; reverse each chunk of each partition.
                         Let's call the result C.

                     Ṛ   Yield R, A reversed.
                   Ƒ€    Fixed each; for each array P in C, call the link to the left
                         with arguments P and R.
                         Return 1 if the result is P, 0 if not.
                 ṁ@          Mold swapped; replace the n integers of C, in reading
                             order, with the first n integers of R.
                     Ẹ   Exists; check if one of the calls returned 1.


4

05AB1E59 47 43 41 バイト

2äøø€.œ`âʒ`RQ}gĀIg_^q2äøø€.œ`âʒ`RQ}gĀIg_^

@Emignaのおかげで-12バイト。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

2ä               # Split the input into two parts
                 #  i.e. [3,4,2,0,2,3,4] → [[3,4,2,0],[2,3,4]]
  øø             # Zip twice without filler
                 # This will remove the middle item for odd-length inputs
                 #  i.e. [[3,4,2,0],[2,3,4]] → [[3,2],[4,3],[2,4]] → [[3,4,2],[2,3,4]]
    €.œ          #  Then take all possible partitions for each inner list
                 #   i.e. [[3,4,2],[2,3,4]]
                 #    → [[[[3],[4],[2]],[[3],[4,2]],[[3,4],[2]],[[3,4,2]]],
                 #       [[[2],[3],[4]],[[2],[3,4]],[[2,3],[4]],[[2,3,4]]]]
`                # Push both lists of partitions to the stack
 â               # Take the cartesian product (all possible combinations) of the partitions
                 #  i.e. [[[[3],[4],[2]],[[2],[3],[4]]],
                 #        [[[3],[4],[2]],[[2],[3,4]]],
                 #        ...,
                 #        [[[3,4,2]],[[2,3,4]]]]
  ʒ   }          # Filter this list of combinations by:
   `             #  Push both parts to the stack
    RQ           #  Check if the second list reversed, is equal to the first
                 #   i.e. [[3,4],[2]] and [[2],[3,4]] → 1 (truthy)
       gĀ        # After the filter, check if there are any combinations left
                 #  i.e. [[[[3,4],[2]],[[2],[3,4]]]] → 1 (truthy)
         Ig_     # Check if the length of the input was 0 (empty input-list edge-case)
                 #  i.e. [3,4,2,0,2,3,4] → 7 → 0 (falsey)
            ^    # Bitwise-XOR
                 #  i.e. 1 XOR 0 → 1 (truthy)
             q   # Stop the program (and then implicitly output the top of the stack)
2äøø€.œ`âʒ`RQ}gĀIg_^
                 # Everything after the `q` are no-ops to comply to the challenge rules

øøε.œ} ` を使用すると、奇数の長さのリストで問題を回避でき、6バイト節約できます。また、30個の未使用バイトが残っているようです...
Emigna

@Emigna最後のノーオペレーションは、チャレンジの制限されたソース要件に準拠することです
Kamil Drakari

@KamilDrakari:そうそう。その部分を忘れました。
幸いな

@Emignaダブルジップトリックで非常にスマート。私はその部分に満足していませんでしたが、これははるかに良いです!ところで、Elixirは2バイトのコマンドを書き換えるため、の代わりに使用できますε }。:)
ケビンクルーイッセン

@KevinCruijssen:すごい。知りませんでした。
エミグナ

4

05AB1E、37 バイト

ジョナサンが思いついたのとほぼ同じ手法を利用します。

.œʒ€gηOZ;îå}εÂQ}ZĀqĀZ}QÂε}åî;ZOηg€ʒ.œ

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


.œʒ€gηOZ;îå}εÂQ}ZĀqĀZ}QÂε}åî;ZOηg€ʒ.œ

完全なプログラム。STDINからリストを受け取り、1または0をSTDOUTに出力します。

.œʒ        }

満たすパーティションをフィルターキープ...

   €gηOZ;îå

この条件:各(€g)の長さはリストに保存され、そのプレフィックス(η)が合計(O)されるため、長さリストの累積合計が得られます。次に、そのリストの最大値の半分になった部分がスタックにプッシュされますが、元のリストもそのまま保持されZ;îå)、累積合計で発生した場合()、関数は真偽を返します。

εÂQ}

それぞれについて、(比較Q)とによってスタックに別々にプッシュされ、逆。0秒と1秒のリストを返します。Â

ZĀq

最大。いずれかが真実であれば、1 else 0です。実行を終了します。続くものはすべて完全に無視されます。


3

Pythonの2275の 251 205バイト

@KevinCruijssenのおかげで-24バイト

@PostLeftGhostHunterのおかげで-44バイト

-KevinCruijssenのおかげでさらに2バイト増加

def s(x):
 l=len(x)
 if l<2:return 1>0
 for i in range(1,l/2+1):
	if x[l-i:]==x[:i]:return s(x[i:l-i])
def s(x):
 l=len(x)
 if l<2:return 1>0
 for i in range(1,l/2+1):
	if x[l-i:]==x[:i]:return s(x[i:l-i])

セミパリンドロームの場合はTrue、そうでない場合はNoneを返します

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


1
または単に1を返す
ジョーキング

s(x)が2回定義されているのはなぜですか?
Dr Y Wit

彼らは回文として数えると言うが...同じ名前で1つの関数を定義することが可能だから?
RosLuP

@RosLuPはい、できます。2番目のものは最初のものを上書きするだけです
ジョーキング

3

ゼリー 33  32 バイト

-1 Erik the Outgolferに
感謝します。バグ修正とJellyの実装詳細の変更を検討してくれたDennisにも感謝します。

ẸƇŒḂƇƊ$ƊĊHṀċÄẈṖŒŒṖẈÄċṀHĊƊ$ƊƇŒḂƇẸ

セミパリンドロームの収量1、他の収量0

O(2n)

または、テストスイートを参照してください。

唯一のチャンクはŒḂs({ 3rd&4 th } vs {29 th&30 th }バイト)で、コードを解析できるようにするためです。

どうやって?

すべての作業は右側で実行されます-「メインリンク」:

ŒṖẈÄċṀHĊƊ$ƊƇŒḂƇẸ - Main Link: list
ŒṖ               - all partitions
           Ƈ     - filter keep those for which this is truthy (i.e. non-zero):
          Ɗ      -   last three links as a monad:
  Ẉ              -     length of each
         $       -     last two links as a monad:
   Ä             -       cumulative addition
        Ɗ        -       last three links as a monad:
     Ṁ           -         maximum
      H          -         halve
       Ċ         -         ceiling
    ċ            -     count
              Ƈ  - filter keep those for which this is truthy:
            ŒḂ   -   is palindrome?
               Ẹ - any?

3

Perl 6の87の 79バイト

ジョー・キングの答えからのいくつかのトリックを含む-8バイト

$!={/\s/&&/^(.+)\s[(.+)\s]*$0$/&&$1.$!}#$!={/\s/&&/^(.+)\s[(.+)\s]*$0$/&&$1.$!}

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

tshのJavaScriptの答えのポート。2つの異なるRegexオブジェクトを返します。




1

C(gcc)(X86)、216バイト

p(L,a,n)int*a;{return n?(memcmp(a,a+L-n,n*4)|p(L-2*n,a+n,L/2-n))&&p(L,a,n-1):1<L;}
#define p(L,a)p(L,a,L/2)//p(L,a,n)int*a;{return n?(memcmp(a,a+L-n,n*4)|p(L-2*n,a+n,L/2-n))&&p(L,a,n-1):1<L;}
#define p(L,a)p(L,a,L/2)

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

p(L,a,n)a長さの配列がLセミパリンドロームの場合は0 、それ以外の場合は1を返します。lengthのすべてのプレフィックス>nが既にチェックされている場合、lengthのプレフィックスとlength nのサフィックスを比較しますnp(L,a)エントリポイントです。

残念ながら、より興味深いソリューションはより長くなります。

224バイト

(f(L,a,n))//#define p(L,a)(n=L/2,
int*a,n;
{return n?(memcmp(a,a+L-n,n*4)|f(L-2*n,a+n,L/2-n))&&f(L,a,n-1):1<L;}//{return n?(memcmp(a,a+L-n,n*4)|f(L-2*n,a+n,L/2-n))&&f(L,a,n-1):1<L;}
int*a,n;
#define p(L,a)(n=L/2,f(L,a,n))//(

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

ゴルフをしていない:

(f(L,a,n)) //#define p(L,a)(n=L/2,
int*a,n;
{
  return n 
    ? (memcmp(a, a+L-n, n*4) | f(L-2*n, a+n, L/2-n)) &&
      f(L,a,n-1)
    : 1 < L;
} // { ... } 
int*a,n;
#define p(L,a)(n=L/2,f(L,a,n)) //(

1

Japt、66バイト


@¯X eUsXn}a1 "
ʧV?UÊ<2:ßUéV sVÑ
@¯X eUsXn}a1 "
ʧV?UÊ<2:ßUéV sVÑ

ジャプト通訳

このバージョンは大幅に改善されており、実際にはほとんどの実用的な言語に勝っています。以前の方法にはバグがあったため、整数の配列で動作するようになりました。

説明:

@        }a1         Find the first number n > 0 such that...
 ¯X                   the first n elements
     UsXn             and the last n elements
    e                 are the same

"
ʧV?UÊ<2:ßUéV sVÑ    String literal to make it a Semi-palindrome
@¯X eUsXn}a1 "

ʧV?                 If n >= length of input...
    UÊ<2              return true if the length is less than 2
        :            Otherwise...
          UéV         move n elements from the end of the input to the start
              sVÑ     remove the first 2*n elements
         ß            and repeat on the remaining elements

0

PHP 237バイト

function f($a){for($x=2>$c=count($a);++$i<=$c/2;)$x|=($s=array_slice)($a,0,$i)==$s($a,-$i)&f($s($a,$i,-$i));return$x;}#function f($a){for($x=2>$c=count($a);++$i<=$c/2;)$x|=($s=array_slice)($a,0,$i)==$s($a,-$i)&f($s($a,$i,-$i));return$x;}

再帰関数、戻り値true(2つ未満の要素を含む入力の場合)または1偽、
0偽の場合。 オンラインで試してください(故障が含まれています)。

実際のコード長は118バイトです。コードの複製によって作成されたセミパリンドローム。

パフォーマンスを向上させるには、に置き換え&ての前に&&挿入!$x&&++$iます。


0

Scala、252バイト

def^(s:Seq[Int]):Int={val l=s.size;if(l>1)(1 to l/2).map(i=>if(s.take(i)==s.takeRight(i))^(s.slice(i,l-i))else 0).max else 1}//def^(s:Seq[Int]):Int={val l=s.size;if(l>1)(1 to l/2).map(i=>if(s.take(i)==s.takeRight(i))^(s.slice(i,l-i))else 0).max else 1}

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

PS。どうやら、ソリューションは、ソースコードもセミパリンドロームであるという要件を満たすためだけに2倍長くなります。

PPS。コードゴルフの候補ではありませんが、パターンマッチングを使用した純粋に機能的なソリューションです。

  def f(s:Seq[Int], i:Int=1):Int = {
    (s, i) match {
      case (Nil ,_) => 1
      case (Seq(_), _) => 1
      case (l, _) if l.take(i) == l.takeRight(i) => f(l.slice(i,l.size-i), 1)
      case (l, j) if j < l.size/2 => f(l, i+1)
      case (_, _) => 0
    }
  }

この課題では、コードもセミパリンドロームにする必要があります。それがチャレンジの中で一番楽しいです。
小麦ウィザード

@PostLeftGhostHunter、要件を満たすために元のソースコードをコメントに追加しました。ところで、ソースコードのセミパリンドロームを作る楽しさは何ですか?私が間違っていなければ、このスレッドのすべてのソリューションは、この要件なしで2倍短くなります。そうでない解決策を知っていますか?
博士Yウィット

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