Mendeteksi string yang diputar

20

Baca dua string dari stdin.
Output Yesjika satu string adalah versi yang dirotasi dari string lainnya.
Jika tidak, outputNo

Testcases

Memasukkan

CodeGolf GolfCode

Keluaran

Yes

Memasukkan

stackexchange changestackex

Keluaran

Yes

Memasukkan

stackexchange changestack

Keluaran

No

Memasukkan

Hello World

Keluaran

No
gnibbler
sumber
Jadi ( abcdefAB , ABabcdef ) adalah "YA"?
Eelvex
Haruskah itu benar-benar rotasi atau kombinasi juga baik? misalnya. apa yang akan Stackexchange Stackchangeexkembali?
jpjacobs
1
@Eelvex, ya. @ jpjacobs, Ini akan kembali No. Rotasi adalah pergeseran, seperti tanda
gnibbler
Apakah senar selalu bebas spasi dan dipisahkan oleh spasi?
Joey
Lebih khusus lagi, karakter apa yang diizinkan dalam string itu?
Joey

Jawaban:

7

APL (28)

Mengambil input pada dua baris.

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

Penjelasan:

  • A←⍞: baca sebaris input dan simpan di A
  • ⌽∘A¨⍳⍴A: Putar A demi x, untuk setiap x dalam [1..panjang A]. Memberikan daftar, yaituestT stTe tTes Test
  • (⊂⍞)∊: baca baris input lain, dan lihat apakah ada dalam daftar ini.
  • 1+: tambahkan satu ke ini, berikan 1 jika string tidak diputar dan 2 jika itu
  • 'No' 'Yes'[... ]: Pilih elemen pertama atau kedua dari daftar 'No' 'Yes'tergantung pada apakah string diputar atau tidak.
  • Nilai ini dikeluarkan secara otomatis.
marinus
sumber
19

Ruby 49 41

a,b=$*;puts (a*2).sub(b,'')==a ?:yes: :no

Edit: ganti gets.split dengan $ *

steenslag
sumber
Itu ide yang cerdik.
Joey
Sangat pintar. :)
st0le
$*argv ketika pertanyaannya ditentukan stdin.
Mathieu CAROFF
7

Python, 70 byte

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

Menguji ...

Pemurah
sumber
+1 Bagus, memilih hasil dari array itu pintar! :-)
Tamara Wijsman
3
Pertanyaannya menyatakan Anda harus membaca dua string dari stdinmana solusi ini tidak.
Ventero
@Ventero: Diperbaiki.
Quixotic
Anda dapat melewati ruang diprint ['No
movatica
6

Python 70 Karakter

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

Berkat gnibbler untuk trik slice.

fR0DDY
sumber
1
Masalah yang sama dengan solusi GolfScript: Jika Anda memasukkan nn nfn, Anda Yessalah, yang mana salah.
Tamara Wijsman
@ TomWij Terima kasih telah menemukan bug. Dikoreksi. Harusnya bekerja sekarang.
fR0DDY
Anda dapat mengganti <>dengan -karena itu juga akan menghasilkan 0jika mereka memiliki panjang yang sama.
Tamara Wijsman
Tetapi bagaimana jika mereka tidak sama panjang? Maka itu tidak bekerja dengan baik :-)
hallvabo
@hallvabo maka versi string tidak diputar satu sama lain.
fR0DDY
5

J, 47

y=:>2{ARGV
(>1{ARGV e.1|.^:(i.#y)y){'No',:'Yes'
Eelvex
sumber
Mengapa keduanya menjawab?
JB
@ JP: karena ini menggunakan rotasi buildin. Kedua jawaban itu sama sekali tidak bagus. Ada banyak ruang untuk bermain golf.
Eelvex
mengapa yang lain, lalu, saya tergoda untuk bertanya? :-)
JB
@ JP: karena saya pikir yang ini hampir tidak legal (: p) [sementara yang lain meluas dengan baik ke lisp. ]
Eelvex
errr ... yang lain sepertinya membaca input dari command-line juga
JB
5

Menurut spec (panjang tali yang sama):

Perl, 42 43 karakter

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

Jika string ukuran yang berbeda diperbolehkan, solusinya adalah:

Perl, 47 karakter

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

rbo

sepatu karet
sumber
Masalah yang sama dengan solusi GolfScript: Jika Anda memasukkan nn nfn, Anda Yessalah, yang mana salah.
Tamara Wijsman
1
tampaknya baik-baik saja (saya melewatkan '!' di versi pertama) "nn nfn" => tidak "CodeGolf GolfCode" => ya
sepatu karet
5

Golfscript, 31

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

Yang ini periksa panjangnya dulu, jadi harus bekerja seperti yang diharapkan.

KAMU
sumber
:)dan =)+1 untuk kode yang sangat menyenangkan
TuxCrafting
4

J, 57

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

Penggunaan sampel:

$ 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
JB
sumber
3

Windows PowerShell, 76

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

JavaScript, 51

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

JavaScript tidak memiliki inang kanonik, jadi jawaban ini ditulis sebagai fungsi dari dua argumen. Skor naik hingga 60 jika kita melarang fitur JS 1.7 (penutupan ekspresi).

Dalam shell SpiderMonkey ini akan menjadi (untuk skor 71):

[a,b]=readline().split(" ");print(a&&(a+a).replace(b,"")==a?"Yes":"No")
ecatmur
sumber
5 tahun kemudian dan sekarang Anda dapat menggunakan =>notasi fungsi;)
J Atkin
3

Python, 66 63

a, b = raw_input (). split ()
print'YNeos '[a! = (2 * a). ganti (b, "") :: 2]

Solusi lain dalam 69 char

a, b = raw_input (). split ()
cetak ['Tidak', 'Ya'] [a dalam b * 2 dan len (a) == len (b)]
Pria pengkodean
sumber
2
print'YNeos'[a!=(2*a).replace(b,"")::2]
gnibbler
@gnibbler trik yang bagus, terima kasih atas sarannya. Saya memperbarui kode
Coding man
2

J, 84

y=:(>1{ARGV),:(>2{ARGV)
((0{y)e.(y&((]$0{[),(]-~[:}.[:$[)$1{[)/.i.}.$y)){'No',:'Yes'
Eelvex
sumber
2

JavaScript (120 karakter)

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';}

Keluaran:

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

Ruby, 58 (62) karakter

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

Solusi ini mengasumsikan input hanya berisi karakter alfanumerik (sebenarnya semua yang tidak memiliki arti khusus di dalam ekspresi reguler adalah ok).

Solusi yang tidak memiliki batasan ini adalah 4 karakter lebih lama

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

Python, 71

a,b=raw_input().split()
print'Yes'if a in b*2and len(a)==len(b)else'No'
Tamara Wijsman
sumber
Masalah yang sama dengan solusi GolfScript: Jika Anda memasukkan nn nfn, Anda Yessalah, yang mana salah.
Timwi
Masalah telah dipecahkan, tetap rendah ... :-)
Tamara Wijsman
Tidak membaca dari stdin seperti yang ditentukan.
Wooble
Sekarang berhasil ... :-)
Tamara Wijsman
2

PHP, 61

<?echo preg_match('/^(.+)(.*) \\2\\1$/',fgets(STDIN))?Yes:No;
Daniel
sumber
2

Ruby, 41

puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No
Daniel
sumber
Tidak mencetak apa pun, menghasilkan ': Tidak' untuk input 'aaa aaa' (di komputer saya). Pendekatan regexp bisa jadi ide yang bagus.
steenslag
Perbaiki untuk benar-benar mencetak dan memasukkan dari stdin daripada args: puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No- tingkatkan menjadi 41 karakter.
Nemo157
2

Haskell ( 98 96 karakter)

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

sumber
2

Q ( 50 43 karakter)

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

Scala 78

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

Sayang sekali tentang ukuran cek, tanpa itu hitungannya turun menjadi 54

val a=readLine split " "
print(a(0)+a(0)contains a(1))
Don Mackenzie
sumber
"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthmenghasilkan 56
pengguna tidak diketahui
2

pesta 56

read a b
[[ $a$a =~ $b&&$b$b =~ $a ]]&&echo Yes||echo No
Pengguna tidak diketahui
sumber
2

GolfScript, 25 byte

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

Bagaimana itu bekerja

             # 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"
Dennis
sumber
1

Lua 115 karakter

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")
jpjacobs
sumber
1

Program 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");}
Joey Adams
sumber
1

PHP, 82 karakter

<?$s=split(" ",fgets(STDIN));echo str_replace($s[1],"",$s[0].$s[0])==$s[0]?Yes:No;
Kevin Brown
sumber
1

perl, 123 karakter

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

Ruby, 30 37

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

Versi yang mencetak "benar" dan "salah" alih-alih "ya" dan "tidak":

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

Keduanya bekerja dengan string dengan panjang berbeda (tidak seperti yang lama)

Lowjacker
sumber
Tidak berfungsi jika kedua string memiliki panjang yang sama, tetapi gagal pada input seperti 'golfcode golf'.
steenslag
1

Python 2, 86 Karakter

a,b=raw_input().split()
print"Yes"if any(a==b[n:]+b[:n]for n in range(len(a)))else"No"
Jeremy Banks
sumber
1

Perl (hanya perbaikan cepat)

Solusi untuk memperbaiki sepatu bot karet, menjadi pengguna baru yang saya belum bisa berkomentar, jadi saya hanya akan mengirim jawaban baru.

Karena metode yang disebutkan menggunakan ekspresi reguler yang dibangun dari input pengguna, dimungkinkan untuk melakukan injeksi regex kecil, sebagai berikut:

> perl -le '$. = pop; $ _ = (pop) x2; cetak + (qw / ya tidak /)[!/$./]' apa saja '. *'
Iya

Cara mengatasinya adalah dengan menggunakan \ Q (dikenal juga sebagai quotemeta):

> perl -le '$. = pop; $ _ = (pop) x2; cetak + (qw / ya tidak /) [! / \ Q $. /]' apapun '. *'
tidak

Kode itu sendiri dapat dipersingkat lebih lanjut menggunakan 'katakan' tetapi ini dibiarkan sebagai latihan untuk pembaca :)

perl Cina goth
sumber
Selain itu, alih-alih print+(qw/yes no/)[Anda mungkin dapat menulis print qw(yes no)[yang dua karakter lebih pendek.
Timwi