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

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.

19

Ruby 49 41

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

Edit: ganti gets.split dengan $ *


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 ...


+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.


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'

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


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.


:)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

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 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")

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)]

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'

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

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)

2

Python, 71

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

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;

2

Ruby, 41

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

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

2

Q ( 50 43 karakter)

{`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)))

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

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

"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthmenghasilkan 56
pengguna tidak diketahui


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"


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")

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");}

1

PHP, 82 karakter

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

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";

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)


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"

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 :)


Selain itu, alih-alih print+(qw/yes no/)[Anda mungkin dapat menulis print qw(yes no)[yang dua karakter lebih pendek.
Timwi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.