Phát hiện chuỗi xoay


20

Đọc hai chuỗi từ stdin.
Đầu ra Yesnếu một chuỗi là phiên bản xoay của chuỗi kia.
Nếu không thì đầu raNo

Tủ thử

Đầu vào

CodeGolf GolfCode

Đầu ra

Yes

Đầu vào

stackexchange changestackex

Đầu ra

Yes

Đầu vào

stackexchange changestack

Đầu ra

No

Đầu vào

Hello World

Đầu ra

No

Vậy ( abcdefAB , ABabcdef ) là "CÓ"?
Eelvex

Nó thực sự nên là một vòng quay hay là một sự kết hợp tốt quá? ví dụ. Điều gì sẽ Stackexchange Stackchangeextrở lại?
jpjacobs

1
@Eelvex, vâng. @jpjacobs, Nó sẽ trở lại No. Xoay là một sự thay đổi, giống như các dấu hiệu cuộn LED
gnibbler

Các chuỗi luôn luôn có khoảng trắng và cách nhau bởi khoảng trắng?
Joey

Cụ thể hơn, những ký tự nào được phép trong các chuỗi đó?
Joey

Câu trả lời:


7

APL (28)

Đưa đầu vào trên hai dòng.

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

Giải trình:

  • A←⍞: đọc một dòng đầu vào và lưu trữ trong A
  • ⌽∘A¨⍳⍴A: Xoay A theo x, với mỗi x trong [1..length A]. Đưa ra một danh sách, tức làestT stTe tTes Test
  • (⊂⍞)∊: đọc một dòng đầu vào khác và xem nó có trong danh sách này không.
  • 1+: thêm một vào đây, cho 1 nếu các chuỗi không được xoay và 2 nếu chúng được
  • 'No' 'Yes'[... ]: Chọn phần tử thứ nhất hoặc thứ hai từ danh sách 'No' 'Yes'tùy thuộc vào việc chuỗi có được xoay hay không.
  • Giá trị này là đầu ra tự động.

19

Ruby 49 41

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

Chỉnh sửa: thay thế get.split bằng $ *


Đó là một ý tưởng khéo léo.
Joey

Rất thông minh. :)
st0le

$*là argv khi câu hỏi được chỉ định stdinmặc dù.
Mathieu CAROFF

7

Python, 70 byte

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

Đang kiểm tra ...


+1 Đẹp, chọn kết quả từ một mảng là thông minh! :-)
Tamara Wijsman

3
Câu hỏi cho biết bạn nên đọc hai chuỗi từ stdin, mà giải pháp này không có.
Ventero

@Ventero: Đã sửa.
Quixotic

Bạn có thể bỏ qua không gian trongprint ['No
Movatica

6

Python 70 ký tự

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

Cảm ơn gnibbler cho các mẹo cắt lát.


1
Vấn đề tương tự như giải pháp GolfScript: Nếu bạn nhập nn nfn, bạn nhận được Yes, đó là sai.
Tamara Wijsman

@TomWij Cảm ơn bạn đã tìm ra lỗi. Đã sửa. Nên làm việc bây giờ.
fR0DDY

Bạn có thể thay thế <>bởi -vì điều đó cũng sẽ dẫn đến 0nếu chúng có độ dài bằng nhau.
Tamara Wijsman

Nhưng nếu chúng không có độ dài bằng nhau thì sao? Sau đó, nó không hoạt động tốt :-)
hallvabo

@hallvabo thì các chuỗi không được xoay phiên bản của nhau.
fR0DDY

5

J, 47

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

Tại sao hai J trả lời?
JB

@JB: bởi vì cái này sử dụng xoay buildin. Cả hai câu trả lời su ^ H ^ H không tốt lắm btw. Có rất nhiều phòng để chơi gôn.
Eelvex

Tại sao một người khác, sau đó, tôi muốn hỏi? :-)
JB

@JB: bởi vì tôi nghĩ rằng cái này hầu như không hợp pháp (: p) [trong khi cái kia mở rộng độc đáo thành lisp. ]
Eelvex

errr ... một cái khác dường như cũng đọc đầu vào từ dòng lệnh
JB

5

Theo thông số kỹ thuật (cùng độ dài chuỗi):

Perl, 42 43 ký tự

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

Nếu các chuỗi có kích thước khác nhau được cho phép, giải pháp sẽ là:

Perl, 47 ký tự

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

rbo


Vấn đề tương tự như giải pháp GolfScript: Nếu bạn nhập nn nfn, bạn nhận được Yes, đó là sai.
Tamara Wijsman

1
có vẻ ổn (tôi đã bỏ lỡ '!' trong phiên bản đầu tiên) "nn nfn" => không "CodeGolf GolfCode" =>
ủng cao su

5

Golf, 31

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

Cái này kiểm tra độ dài trước, vì vậy nó sẽ hoạt động như mong đợi.


:)=)+1 cho mã rất hạnh phúc
TuxCrafting

4

J, 57

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

Sử dụng mẫu:

$ 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 không có máy chủ chính tắc, vì vậy câu trả lời này được viết dưới dạng hàm của hai đối số. Điểm số lên tới 60 nếu chúng tôi không cho phép các tính năng của JS 1.7 (đóng biểu thức).

Trong shell SpiderMonkey, nó sẽ là (cho số điểm 71):

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

5 năm sau và bây giờ bạn có thể sử dụng =>ký hiệu hàm;)
J Atkin

3

Con trăn, 66 63

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

Một giải pháp khác trong 69 char

a, b = raw_input (). split ()
in ['Không', 'Có'] [a trong b * 2 và len (a) == len (b)]

2
print'YNeos'[a!=(2*a).replace(b,"")::2]
gnibbler

@gnibbler lừa đẹp, cảm ơn đã gợi ý. Tôi đã cập nhật mã
Mã hóa người đàn ông

2

J, 84

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

2

JavaScript (120 ký tự)

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

Đầu ra:

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

2

Ruby, 58 (62) ký tự

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

Giải pháp này giả sử đầu vào chỉ chứa các ký tự chữ và số (thực ra mọi thứ không có ý nghĩa đặc biệt bên trong biểu thức chính quy đều ổn).

Một giải pháp không có ràng buộc này dài hơn 4 ký tự

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

2

Con trăn, 71

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

Vấn đề tương tự như giải pháp GolfScript: Nếu bạn nhập nn nfn, bạn nhận được Yes, đó là sai.
Timwi

Vấn đề đã được giải quyết, vẫn còn thấp ... :-)
Tamara Wijsman

Không đọc từ stdin như được chỉ định.
Wooble

Bây giờ nó ... :-)
Tamara Wijsman

2

PHP, 61

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

2

Ruby, 41

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

Không in bất cứ điều gì, kết quả là ': Không' cho đầu vào 'aaa aaa' (trên máy của tôi). Cách tiếp cận regrec có thể là một ý tưởng tốt mặc dù.
steenslag

Khắc phục để thực sự in và nhập từ stdin thay vì args: puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No- tăng nó lên 41 ký tự.
Nemo157

2

Haskell ( 98 96 ký tự)

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

Scala 78

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

Thật xấu hổ về việc kiểm tra kích thước, nếu không có nó, số lượng giảm xuống còn 54

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

"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthmang lại 56
người dùng chưa biết


2

GolfScript, 25 byte

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

Làm thế nào nó hoạt động

             # 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 chars

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

Chương trình 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 ký tự

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

1

perl, 123 ký tự

@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

Hồng ngọc, 30 37

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

Một phiên bản in "đúng" và "sai" thay vì "có" và "không":

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

Cả hai đều hoạt động với các chuỗi có độ dài khác nhau (không giống như chuỗi cũ)


Không hoạt động nếu hai chuỗi có cùng độ dài, nhưng không thành công ở đầu vào như 'golfcode golf'.
steenslag

1

Python 2, 86 ký tự

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

1

Perl (chỉ là một sửa chữa nhanh chóng)

Cách khắc phục giải pháp của giày cao su, là người dùng mới mà tôi chưa thể nhận xét nên tôi sẽ chỉ đăng câu trả lời mới.

Vì phương thức được đề cập sử dụng biểu thức chính quy được xây dựng từ đầu vào của người dùng, nên có thể thực hiện một phép tiêm regex nhỏ, như sau:

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

Cách khắc phục là sử dụng \ Q (còn được gọi là trích dẫn):

> perl -le '$. = pop; $ _ = (pop) x2; print + (qw / yes no /) [! / \ Q $. /]' bất cứ điều gì '. *'
Không

Bản thân mã có thể được rút ngắn hơn nữa bằng cách sử dụng 'say' nhưng điều này được để lại như một bài tập cho người đọc :)


Hơn nữa, thay vì print+(qw/yes no/)[bạn có thể viết print qw(yes no)[ngắn hơn hai ký tự.
Timwi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.