回転した文字列を検出する


20

から2つの文字列を読み取りますstdin。一方の文字列が他方の文字列の回転バージョンである場合に
出力Yesされます。
それ以外の場合は出力No

テストケース

入力

CodeGolf GolfCode

出力

Yes

入力

stackexchange changestackex

出力

Yes

入力

stackexchange changestack

出力

No

入力

Hello World

出力

No

abcdefABABabcdef)は「YES」ですか?
エルベックス

それは本当に回転である必要がありますか、それとも組み合わせも素晴らしいですか?例えば。何がStackexchange Stackchangeex返されますか?
jpjacobs

1
@Eelvex、はい。@jpjacobs、を返しNoます。回転は、それらのLEDスクロール記号のようなシフトです
ニブラー

文字列には常に空白がなく、空白で区切られていますか?
ジョーイ

より具体的には、これらの文字列ではどの文字が許可されますか
ジョーイ

回答:


7

APL(28)

2行で入力します。

'No' 'Yes'[1+(⊂⍞)∊⌽∘A¨⍳⍴A←⍞]

説明:

  • A←⍞:入力行を読み取り、Aに保存します
  • ⌽∘A¨⍳⍴A:[1..length A]の各xに対して、Aをx回転します。リストを与える、すなわちestT stTe tTes Test
  • (⊂⍞)∊:入力の別の行を読み取り、それがこのリストにあるかどうかを確認します。
  • 1+:これに1を追加します。文字列が回転していない場合は1、回転している場合は2を与えます
  • 'No' 'Yes'[... ]'No' 'Yes'文字列が回転したかどうかに応じて、リストから最初または2番目の要素を選択します。
  • この値は自動的に出力されます。


7

Python、70バイト

a,b=raw_input().split()
print ['No','Yes'][a in b*2and len(a)==len(b)]

テスト...


+1ニース、配列から結果を選択するのは賢明です!:-)
タマラウィスマン

3
質問ではstdin、から2つの文字列を読み取る必要がありますが、このソリューションはそうではありません。
ヴェンテロ

@Ventero:修正済み。
キクソチック

スペースをスキップできますprint ['No
movatica

6

Python 70キャラクター

a,b=raw_input().split()
print'YNeos'[len(a)<>len(b)or a not in 2*b::2]

スライストリックを提供してくれたgnibblerに感謝します。


1
GolfScriptソリューションと同じ問題:を入力するとnn nfn、が表示されますがYes、これは間違っています。
タマラWijsman

@TomWijバグを見つけてくれてありがとう。修正しました。今すぐ動作するはずです。
fR0DDY

あなたは置き換えることができます<>によって-それはまたになりますよう0、彼らは同じ長さであれば。
タマラWijsman

しかし、それらが同じ長さでない場合はどうでしょうか?その後、それはあまりうまく動作しません:
hallvabo

@hallvaboの場合、文字列は互いに回転したバージョンではありません。
fR0DDY

5

J、47

y=:>2{ARGV
(>1{ARGV e.1|.^:(i.#y)y){'No',:'Yes'

なぜ2人のJが答えますか?
JB

@JB:これはbuildin rotateを使用するためです。両方の答えsu ^ H ^ Hはあまり良くありません。ゴルフの余地はたくさんあります。
エルベックス

なぜ他のものは、私は尋ねたいと思うのですか?:-)
JB

@JB:私はこれがかろうじて合法だと思ったので(:p)[もう一方はLispにうまく拡張されています。]
エルベックス

errr ...もう一つは、コマンドラインから入力を読み込むように見えるだけでなく
JB

5

仕様によると(同じ文字列の長さ):

Perl、42 43文字

$.=pop;$_=(pop)x2;print+(qw'yes no')[!/$./]

異なるサイズの文字列が許可されている場合、解決策は次のとおりです。

Perl、47文字

$.=(pop)x8;$_=(pop)x9;print+(qw'yes no')[!/$./]

rbo


GolfScriptソリューションと同じ問題:を入力するとnn nfn、が表示されますがYes、これは間違っています。
タマラWijsman

1
大丈夫のようです(最初のバージョンでは「!」を逃しました)「nn nfn」=> no 「CodeGolf GolfCode」=> yes
ラバーブーツ

5

Golfscript、31

' '/:)~,\,=)~.+\/,(&'Yes''No'if

これは最初に長さをチェックするため、期待どおりに機能するはずです。


:)そして、=)非常に満足してコードの1
TuxCrafting

4

J、57

{&('No';'Yes')@-:/@:((/:~@(|."0 _~i.&$))&.>)&.(;:&stdin)_

使用例:

$ echo -n CodeGolf GolfCode | jconsole rotate.ijs
Yes
$ echo -n stackexchange changestackex | jconsole rotate.ijs
Yes
$ echo -n stackexchange changestack | jconsole rotate.ijs
No
$ echo -n Hello World | jconsole rotate.ijs
No

3

Windows PowerShell、76

$a,$b=-split$input
('No','Yes')[+!($a.length-$b.length)*"$b$b".contains($a)]

3

JavaScript、51

function f(a,b)a&&(a+a).replace(b,"")==a?"Yes":"No"

JavaScriptには正規のホストがないため、この回答は2つの引数の関数として記述されています。JS 1.7機能(式のクロージャー)を許可しない場合、スコアは60になります。

SpiderMonkeyシェルでは、次のようになります(スコア71)。

[a,b]=readline().split(" ");print(a&&(a+a).replace(b,"")==a?"Yes":"No")

5年後、=>関数表記を使用できるようになりました;)
Jアトキン

3

Python、66 63

a、b = raw_input()。split()
print'YNeos '[a!=(2 * a).replace(b、 ""):: 2]

69文字の別のソリューション

a、b = raw_input()。split()
print ['No'、 'Yes'] [a in b * 2and len(a)== len(b)]

2
print'YNeos'[a!=(2*a).replace(b,"")::2]
ニブラー

@gnibblerのすてきなトリック、提案をありがとう。コードを更新しました
コーディングマン


2

JavaScript(120文字)

function f(a,b) {for (i=0,A=a.split("");A.join("")!=b&&i++<a.length;A.push(A.shift()));return A.join("")==b?'Yes':'No';}

出力:

f('CodeGolf','GolfCode'); //Yes
f('stackexchange','changestackex'); //Yes
f('stackexchange','changestack'); //No
f('Hello','World'); //No
f('nn','nBn'); //No

2

ルビー、58(62)文字

a,b=gets.split;$><<(a.size==b.size&&/#{a}/=~b*2?:Yes: :No)

このソリューションは、入力に英数字のみが含まれていることを前提としています(実際、正規表現内で特別な意味を持たないものはすべて問題ありません)。

この制約がないソリューションは4文字長くなります

a,b=gets.split;$><<(a.size==b.size&&(b*2).index(a)?:Yes: :No)



2

ルビー、41

puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No

何も印刷せず、入力(aaa aaa)に対して(私のマシン上で) ':No'になります。しかし、正規表現のアプローチは良いアイデアかもしれません。
-steenslag

argsの代わりにstdinから実際に印刷および入力するように修正します。puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No-41文字に上げます。
-Nemo157

2

Haskell(98 96文字)

g x y@(t:r)(z:w)|x==y="Yes"|1>0=g x(r++[t])w
g _ _[]="No"
f(x:y:_)=g x y y
main=interact$f.words

2

Q(50 43文字)

{`No`Yes x in((!)(#)y)rotate\:y}." "vs(0:)0

2

Scala 78

val b=readLine split " "
print(b(0).size==b(1).size&&(b(0)+b(0)contains b(1)))

サイズチェックが残念です。これがないと、カウントは54になります。

val a=readLine split " "
print(a(0)+a(0)contains a(1))

"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".length収量56
ユーザー不明


2

GolfScript、25バイト

' '/~.2*@/''+='Yes''No'if

使い方

             # STACK: "CodeGolf GolfCode"
' '/         # Split input string by spaces.
             # STACK: [ "CodeGolf" "GolfCode" ]
~            # Dump the array.
             # STACK: "CodeGolf" "GolfCode"
.            # Duplicate the topmost string.
             # STACK: "CodeGolf" "GolfCode" "GolfCode"
2*           # Repeat the topmost string.
             # STACK: "CodeGolf" "GolfCode" "GolfCodeGolfCode"
@            # Rotate the three topmost strings.
             # STACK: "GolfCode" "GolfCodeGolfCode" "CodeGolf"
/            # Split the second topmost string around the topmost one.
             # STACK: "GolfCode" [ "Golf" "Code" ]
''+          # Flatten the array of strings.
             # STACK: "GolfCode" "GolfCode"
=            # Check for equality.
             # STACK: 1
'Yes''No'if  # Push 'Yes' for 1, 'No' for 0.
             # STACK: "Yes"


1

Lua 115文字

a,b=io.read():match"(%w+) (%w+)"c=b repeat c=c:sub(2,-1)..c:sub(1,1) s=s or a==c until b==c print(s and"Yes"or"No")

1

Cプログラム-146

char b[99],c[99],*p,*q;main(n){q=(p=b+(n=strlen(gets(c))))+n;sprintf(b,"%s%s"
,c,c);for(gets(c);p>b&&strcmp(p,c);--p,*--q=0);puts(p>b?"Yes":"No");}


1

perl、123文字

@s1=split(//,shift);
$s2=shift;
$i=0;
while($i<=@s1){
    if(join("",@s1) eq $s2){die "yes";}
    unshift @s1,pop @s1;
    $i++;
}
die "no";

1

ルビー、30 37

gets
puts~/^(.+)(.*) \2\1$/?:Yes: :No

「yes」と「no」の代わりに「true」と「false」を出力するバージョン:

gets
p !! ~/^(.+)(.*) \2\1$/

これらは両方とも異なる長さの文字列で動作します(古いものとは異なります)


2つの文字列の長さが同じでも機能しますが、「ゴルフコードゴルフ」のような入力では失敗します。
-steenslag


1

Perl(簡単な修正)

ラバーブーツのソリューションの修正。新しいユーザーであるため、まだコメントできませんので、新しい回答を投稿します。

前述の方法では、ユーザー入力から構築された正規表現を使用するため、次のように小さな正規表現の挿入を実行できます。

> perl -le '$。= pop; $ _ =(pop)x2; print +(qw / yes no /)[!/$./]' anything '。*'
はい

修正するには、\ Q(quotmetaとも呼ばれます)を使用します。

> perl -le '$。= pop; $ _ =(pop)x2; print +(qw / yes no /)[!/ \ Q $。/]' anything '。*'
いや

「say」を使用してコード自体をさらに短縮することもできますが、これは読者の演習として残しておきます:)


さらに、代わりに、print+(qw/yes no/)[おそらくprint qw(yes no)[2文字短い文字を書くことができます。
ティムウィ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.