文字列が完全に同じ部分文字列で構成されているかどうかを確認します


24

これは(もちろん許可を得て)この質問から取られています。引用します:

文字列を受け取る関数を作成します。入力が繰り返し文字シーケンスのみで構成されているかどうかに基づいて、trueまたはfalseを返す必要があります。指定された文字列の長さは常に1より大きく、文字シーケンスには少なくとも1回の繰り返しが必要です。

いくつかの例:

'aa' //true
'aaa' //true
'abcabcabc' //true
'aba' //false
'ababa' //false
'weqweqweqweqweqw' // false

具体的には、厳密に繰り返し部分文字列で構成される文字列のチェック(Update)は、trueまたはfalseの表現を出力できますが、エラー出力はしないでください。厳密に英数字の文字列。それ以外の場合は、標準のゴルフ規則。これはコードゴルフであるため、各言語のバイト単位の最短回答が優先されます。


4
フム、私はだまされやすい人のように、この挑戦を閉鎖するつもりだった1つが、私は文字カウントに他の1得点ということに気づきました。そのため、代わりにこの1つをだまして、もう1つ(受け入れられた回答もある)を閉じる必要があります。
アウトゴルファーのエリック

回答:


11

Brachylog4 3バイト

ġ=Ṁ

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

説明

ġ=Ṁ    Implicit input, say "abcabc"
ġ      Split into chunks of equal lengths (except maybe the last one): ["abc","abc"]
 =     Apply the constraint that all of the chunks are equal,
  Ṁ    and that there are multiple of them.

プログラムはtrue.、制約が満たされる場合とfalse.そうでない場合に印刷します。


私はちょうどのようなものを取得しようとして苦しんでいた~j↙か、=Ṁc私が気づいた前に働いて、あなたは時間前の投稿
無関係のString

4
:ああ、うん、これは短い1つのバイトかもしれないġ=Ṁ
無関係な文字列

2つ以上の要素のリストに制限される変数です)
無関係な文字列

1
@UnrelatedStringありがとうございます!変数wikiページをチェックするつもりはありませんでした。
ズガルブ

1
たくさんの素晴らしい答え、そしてLUAの答えは私の心の中に特別な場所があります。Arnauldの答えは、私がこれに基づいた元の質問(だまされていない)が実際にJavascriptでタグ付けされているため、特に甘いです。主にこれを選択するのは、それがすべての言語にとって全体的に最も短いように見えるからです。これが私の最初の質問なので、バッジを取得します。
ouflak


9

grep、19

grep -qxE '(.+)\1+'

テスト

while read; do 
  <<<"$REPLY" grep -qxE '(.+)\1+' && t="true" || t="false"
  echo "$REPLY: $t"
done < infile 

出力:

aa: true
aaa: true
abcabcabc: true
aba: false
ababa: false
weqweqweqweqweqw: false

9

Japt、6バイト

²é ¤øU

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

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

        Implicit input, stored in variable 'U'
²       U+U, "abcabc" -> "abcabcabcabc"
 é      Rotate 1 char to the right "abcabcabcabc" -> "cabcabcabcab"
   ¤    Remove first two chars, "cabcabcabcab" -> "bcabcabcab"
    øU  Check if U is in the above

ニース1 :)あなたは置き換えることができp<space>²バイトを保存します。
シャギー

9

Java、25 24バイト

オリビエ・グレゴワールのおかげで-1バイト!
退屈な正規表現の答え

s->s.matches("(.+)\\1+")

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

Pythonの答えaaaaaよりも1バイト長いだけです。


3
メソッドはデフォルトでは部分文字列の一致ではなく完全一致であるため、final $を削除できmatchesます。
オリビエグレゴワール

私は正規表現にmatches独自のもの$を追加するのを忘れていました。ありがとう!
ベンジャミンアーカート

7

Excel、26バイト

=FIND(A1,A1&A1,2)<=LEN(A1)

A1からの入力、この数式を配置したセルへの出力。


1文字の範囲名(例:)を定義し、Aそれを入力として設定すると、4バイト節約できます。
i_saw_drones

@i_saw_drones-これは標準のI / Oルールでは禁止されていると思います。そのメソッドに適用されるメタアンサーへのリンクです。現在-36票です。
ソフィア・レヒナー

私はその投稿を見たことがありませんでしたが、それについて考えましA1たが、入力値が含まれているので「変数」でもありませんか?:)
i_saw_drones

1
ROW(_)が1であることになんらかの理由で依存している場合のように、A1であるという事実で特別なことをしている場合、そのように感じます。任意の入力。
ソフィア・レヒナー

7

R、28バイト

grepl("(.+)\\1+$",scan(,''))

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

単純な正規表現バージョン。Rは(時には)Pythonに非常に似ているため、これはTFeldのPython 2正規表現の答えに似ていますが、短くなります!

質問(誰かが答えを知っている場合)

部分文字列は任意の長さで、常に機能し、「cABABABABAB」などの有効な文字列の前に文字を追加しても機能するため、これがなぜ機能するのか、まだ混乱しています。個人的に正規表現を読んだ場合(.+)、任意の長さのグループをキャプチャするが表示されます。そして\\1+$、最後までキャプチャされたグループを何回も繰り返します。

では、なぜ「AB」だけをキャプチャして、文字列の最後まで繰り返されることがわかりません。特に、部分文字列の開始位置に関する制限がないためです。


1
興味深いことに、これはRの正規表現エンジンのバグのようです。オプションperl=TRUEを追加すると、予想どおりcABABABと一致します。grep -E '(.*)\1+$'bashでの実行もcABABABと一致しますが、たとえgrep -EEREを使用しても、同じ正規表現フレーバーRがサポートすることになっています。
グリムミー

2
私の推測では、これは誤って適用された最適化です。.+パターンの開始時にを変更すること^.+は重要な最適化ですが、が.+括弧をキャプチャする内部にある場合、有効ではなくなります。
グリムミー


6

ゼリー 5  4 バイト

最適な方法はxnorの方法に従うことです!

Ḋ;Ṗw

文字のリストを受け入れて整数を出力する単項リンク-繰り返しスライスの可能な限り短い長さ、または存在しない場合はゼロ。ゼリーではゼロは偽であり、ゼロ以外の数字は真実です。

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

どうやって?

Ḋ;Ṗw - Link: list of characters, S   e.g. "abcabcabc"   or "abababa"
Ḋ    - dequeue S                           "bcabcabc"       "bababa"
  Ṗ  - pop from S                         "abcabcab"       "ababab"
 ;   - concatenate                "bcabcabcabcabcab"       "bababaababab"
   w - first index of sublist     3  ^---here!             0  (not found)


4

Python 2、24バイト

lambda s:s in(s*2)[1:-1]

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

元の質問に対するxnorの回答から恥知らずに盗まれた。


より直感的なバージョン:

パイソン259の 55、53バイト

lambda s:s in[len(s)/i*s[:i]for i in range(1,len(s))]

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


退屈な正規表現バージョン:

Python 2、44バイト

lambda s:re.match(r'(.+)\1+$',s)>0
import re

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






3

C#(Visual C#Interactive Compiler)、70バイト

xnorの恥知らずな適応(46バイト

s=>(s+s).Substring(1,s.Length*2-2).Contains(s)

私の非正規表現ソリューション:

s=>s.Select((x,y)=>y).Count(z=>s.Replace(s.Substring(0,z+1),"")=="")>1

説明:

インデックス0で始まるすべての可能な部分文字列を空の文字列で置き換えます。結果が空の文字列の場合、文字列は完全にその部分文字列で構成されます。これには文字列全体の評価が含まれるため、予想される結果の量は1より大きくなければなりません。

例:abcabc

インデックス0から始まる可能性のあるサブストリング:

'a', 'ab', 'abc', 'abca', 'abcab', 'abcabc'

それらを空の文字列に置き換えた場合

Substring          Result

'a'         =>     'bcbc'
'ab'        =>     'cc'
'abc'       =>     ''
'abca'      =>     'bc'
'abcab'     =>     'c'
'abcabc'    =>     ''

空の文字列を返す「abcabc」以外の部分文字列があるため、文字列は完全に別の部分文字列(「abc」)で構成されます

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


3

Pythonの362の 60 56 54バイト

ArBoへの-4バイト

lambda s:s in(len(s)//l*s[:l]for l in range(1,len(s)))
  1. 文字列内のすべての可能なプレフィックスを反復処理します。
  2. プレフィックスから文字列を構築してみてください。
  3. プレフィクスを使用してこれが成功するかどうかを返します。

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


1
いい答えだ!f=ドロップすることができます。通常、匿名関数が許可されます。また、Python 2に切り替えて、anyコンストラクトではなくリストのメンバーシップを確認すると、55バイトを
ArBo

1
リストのメンバーシップに感謝します、ありがとう!これは言語の切り替えに似ているため、Python 2には切り替えません。これは明らかにここではポイントではありません。
movatica

1
@movaticaヘッダーに `f =`を入れます(\はpythonの行継続文字です)
ArtemisはMonica

厄介なことに、\はエスケープ文字でもあります。ここで、コードの書式を設定せずに、ヘッダーに配置する必要があります。f = \
ArtemisはMonica

2

Japt、10バイト

真実であれば正の数を返し、偽であれば0を返します。ブール出力が必要な場合は、フラグを追加してください

å+ k@rXÃÊÉ

å+ k@rXÃÊÉ      Full program. Implicit input U.
                    e.g: U = "abcabcabc"
å+              Take all prefixes 
                         U = ["a","ab","abc","abca","abcab","abcabc","abcabca","abcabcab","abcabcabc"]
   k@           Filter U by:
     rXÃ        Values that return false (empty string)
                when replacing each prefix in U
                e.g: ["bcbcbc","ccc","","bcabc","cabc","abc","bc","c",""]
                                take ↑                             and ↑
                     U = ["abc","abcabcabc"]
         ÊÉ     Get U length and subtract 1. Then return the result

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


2

、6バイト

Ṡ€ȯhtD

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

これは最適なものよりも1バイト多いように感じますが、明示的な構成をȯ不要にする配置を見つけることができませんでした。

説明

Ṡ€      Find the argument in the result of applying the following function to the argument
  ȯhtD  Duplicate the argument, then remove the first and last elements.

2
€htD¹を回避しȯます。
ズガーブ

それは素晴らしいです!私は考えてλ€htD¹いましたが、ラムダが暗黙的に追加されることに気づいていませんでした
Sophia Lechner

2

Mathematica 11.x、74バイト

{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&

ここで、全体を通して、#入力文字列を表し、

StringCases[#,<pattern>]

パターンに一致する入力文字列の部分文字列を検索します

StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="") 

このパターンには一致が必要xです。文字列の先頭から開始し、(1)一致が入力文字列全体ではなく、(2)入力文字列での一致の出現を空の文字列で置き換える場合の条件を満たす必要があります。空の文字列を取得します。最後に、一致するリストを空のリストと比較し、

{}!=

あるTrue試合のリストが空でない場合やFalseマッチのリストが空の場合。

テストケース:

{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["aa"]
(*  True  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["aaa"]
(*  True  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["abcabc"]
(*  True  *)

そして

{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["aba"]
(*  False  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["ababa"]
(*  False  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["weqweqweqweqweqw"]
(*  False  *)

2

Python 3、84バイト

import textwrap
lambda s:any(len(set(textwrap.wrap(s,l)))<2 for l in range(1,len(s)))

用途textwrap.wrap(のおかげで、この答えの長さの部分に文字列を分割する)n部分文字列を繰り返し、各可能な長さをテストします。分割されたピースは、セットに追加することで互いに比較されます。すべてのピースが等しく、セットの長さが1の場合、文字列は繰り返し文字列でなければなりません。バイトを節約し、入力文字列の長さがゼロより大きいことが保証されているため、<2代わりに使用しました==1

n長さの繰り返し部分文字列が文字列n全体を構成するものがない場合、関数全体に対してfalseを返します。


2

05AB1E、5バイト

前の質問のxnorの方法は、05AB1Eでも最適であると思われます。

«¦¨så

オンラインでお試しください! またはテストスイートとして

説明

«       # append input to input
 ¦¨     # remove the first and last character of the resulting string
   så   # check if the input is in this string

1
もちろん..そこに誰もいなかったとき、私は05AB1Eの回答をしようとしていました。同僚が私にいくつか質問をし、彼の休暇について話しました。画面を振り返ると、新しい答えが1つあります。多田、再びXDを破る
ケビン・クルーッセン

@KevinCruijssen:それは典型的です。私にも何度も起こりました;)
エミグナ

2

クリーン、73バイト

正規表現を使用しません。

import StdEnv,Data.List
$s=or[isPrefixOf s(cycle t)\\t<-tl(tails s)|t>[]]

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

を定義し$ :: [Char] -> Boolます。
指定された文字列が、末尾から取得したサブ文字列の繰り返しのプレフィックスであるかどうかを確認します。



1

QlikView変数、27バイト

これは変数として定義する必要があります。これにより$1、入力値などのパラメーターを渡すことができます。

0または-1(QlikViewのTRUE()関数と同等)を返します。

=substringcount($1&$1,$1)>2

1

Swift、196バイト

func r(s:String)->Bool{guard let k=s.dropFirst().firstIndex(where:{$0==s.first}) else{return false};let v=s[...k].dropLast();var w=v;while s.hasPrefix(w) && s.count>=(w+v).count{w+=v};return s==w}

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


私はSwiftを使用しませんが、余分な空白を削除できると確信しています
Benjamin Urquhart

@benjaminの提案を使用して193バイト
アルテミスはモニカを

@ArtemisFowlあるいは123バイト
ローマPodymov




1

T-SQL、47バイト

@Xnorのメソッドを使用する

DECLARE @ varchar(max)='ababab'

PRINT sign(charindex(@,left(@+@,len(@)*2-1),2))

素敵なゴルフ(67バイト)が含まれているため、古い回答を保持します。

DECLARE @y varchar(max)='abababa'

,@ INT=0WHILE
replace(@y,left(@y,@),'')>''SET
@+=1PRINT @/len(@y)^1

説明:このスクリプトは、入力「@y」を入力「@y」の最初の「@」文字に置き換え、「@」を増やすことを繰り返し試みています。

「ababab」の「ab」を何も置き換えない場合、空の文字列があります

最終的に結果は空になります。ループ変数がvarcharの長さに等しいときにこれが発生した場合、「@」= len(@y)(繰り返しvarcharがなかったため)の基準はfalse / 0です。

iif(@=len(@y),0,1)

これにゴルフすることができます

@/len(@y)^1

「@y」の長さを0にすることはできず、「@」が長さ@yを超えることはないためです。

オンラインで試す

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