弦の回転対称性


9

ローテーションは、「文字列を2つに分割し、その順序を逆にすることによって行われます」。オブジェクトは、その操作を適用した後でオブジェクトが変更されていない場合、操作の下で対称的です。したがって、「回転対称性」とは、「回転」後も文字列が変化しないという事実です。

sからaまでの文字のみで構成される空でない文字z列を指定すると、文字列の回転対称性の最高次数が出力されます。

テストケース:

input        output
a            1
abcd         1
abab         2
dfdfdfdfdfdf 6

これはです。バイト単位の最短回答が優先されます。標準の抜け穴が適用されます。



1
以前にCMCとして尋ねられたもの:chat.stackexchange.com/transcript/message/37509699#37509699
John Dvorak

これは、弦のサイズよりも小さい対称回転の数を見つけることと同じです。@ 0が指摘するように、それらは循環グループを形成するため、最高次数を見つけることはグループのサイズを見つけることと同じです。これにより、現在かなり不明確なタスクの説明がはるかに明確になります。
アドホックガーフハンター2018

回答:


8

Retina、15バイト

(^.+?|\1)+$
$#1

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

部分文字列を繰り返して文字列全体を照合し(短めの部分文字列はungreedyのため優先されます.+?)、文字列全体を使用した繰り返しの数で置き換えます。


ああ、もちろん、貪欲ではありません。そしてここで私は苦労していました.*(.+)$(?<=^(\1)*)...
Neil

5

おめでとう!
Leaky Nun

@LeakyNunそれがあなたの解決策でしたよね?
Erik the Outgolfer 2017年

確かにそうだった。
Leaky Nun

あなたの名前はガントレット参照ですか?
user2357112は2017

@ user2357112いいえ、それはアウトゴルフを指します。つまり、投稿された別のソリューションより短いソリューションを投稿した場合です。
Erik the Outgolfer 2017年



2

プロローグ(SWI)、64バイト

A+B:-findall(X,(append(X,Y,A),append(Y,X,A)),[_|Z]),length(Z,B).

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

+/2文字列(文字コードのリストの形式)を最初の引数(A)として受け取り、2番目の引数(B)を最高次数の対称ローテーションの順序に設定する述語を定義します。

説明

このプログラムは、文字列の対称回転のセットが循環グループであり、対称回転のセットの順序が最高次の対称回転の順序と等しいという事実を利用しています。したがって、プログラムは、入力文字列の対称回転の総数を見つけることにより、目的の結果を計算できます。

コード説明

重労働の大部分は、findall/3述部への呼び出しによって行われます。findall/3述語発見(最初の引数の全ての異なる可能な値はX2番目の引数として与えられた式は、(真であることをここでは)そのような(append(X,Y,A),append(Y,X,A))後、その上より)。最後に、これらの可能な値のそれぞれをXリストとして最後の引数([_|Z])に格納します。

findall/32番目のarugmentとして渡される式(append(X,Y,A),append(Y,X,A))は、append/3述語を使用して、X未定義の文字列と連結された文字列が入力文字列と等しくなければならず、同じ文字列と連結されている文字列もとY等しくなければならないことを指定します。これは、が前から削除されて後ろに追加された場合、結果の文字列がと同じになるようにするためのプレフィックスである必要があることを意味します。このプロパティを持つのセットは、の対称回転とほぼ 1対1で対応します。空の文字列との両方がプレフィックスであるという事実が原因で、二重カウントが必ず1つだけ発生します。AYXAXAAAXAAAの0回転に対応しAます。の0-rotation Aは常に対称であるため、結果のXsのリストの長さは、findall/3の対称回転の数よりも1つ大きくなりAます。

二重カウントの問題を解決するために、findall/3述語の3番目の引数にパターンマッチングを使用します。Prologでは、リストは頭(最初の要素)と尾(残り)のペアとして表されます。したがって[_|Z]、末尾が等しいに等しいリストを表しZます。つまり、の長さはZfindall/3述語によって検出されたプレフィックスの数よりも1つ少ないため、の対称ローテーションの数と等しくなりAます。最後に、length/2述語を使用Bしての長さに設定しZます。


2

JavaScript(ES6)、42 41バイト

@ l4m2のおかげで1バイト節約

s=>s.length/s.match`(.+?)\\1*$`[1].length

テストケース


f=s=>s.length/s.match`(.+?)\\1*$`[1].length
l4m2

1

Japt、7バイト

¬x@¥UéY

オンラインでテストしてください!

説明

 ¬ x@   ¥ UéY
 q xXY{ ==UéY}  // Expanded
Uq xXY{U==UéY}  // Variable introduction
                // Implicit: U = input string
Uq              // Split U into chars.
   xXY{      }  // Map each item X and index Y by this function, then sum the results:
       U==UéY   //   Return U equals (U rotated by Y characters).
                // Implicit: output result of last expression



0

Haskell、49バイト

g x=sum[1|a<-[1..length x],drop a x++take a x==x]

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

Haskell、49バイト

g x=sum[1|(a,_)<-zip[1..]x,drop a x++take a x==x]

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

説明

これは指摘された単純なソリューション@ 0 'を使用します。文字列の回転は循環グループを形成するため、最高次数の要素はグループのサイズと同じであり、対称回転の数を見つけることで単位の次数を取得できます。

単純なコードはリスト内包を行い、元の文字列を保持する回転数をカウントします。


このように3バイトを節約するために使用するdrop<>take代わりにを使用できます。(++)
ბიმო

@BMO (<>)はプレリュードではなく、私が使用しているHaskellのバージョンです。
アドホックガーフハンター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.