회전 한 줄 감지


20

에서 두 개의 문자열을 읽습니다 stdin. 한 문자열이 다른 문자열의 회전 된 버전 인 경우
출력 Yes됩니다.
그렇지 않으면 출력No

테스트 케이스

입력

CodeGolf GolfCode

산출

Yes

입력

stackexchange changestackex

산출

Yes

입력

stackexchange changestack

산출

No

입력

Hello World

산출

No

따라서 ( abcdefAB , ABabcdef )는 "YES"입니까?
Eelvex

실제로 회전해야합니까, 아니면 조합도 괜찮습니까? 예. 무엇을 Stackexchange Stackchangeex반환할까요?
jpjacobs

1
@ 엘 벡스, 예. @jpjacobs, 반환 No합니다. 회전은 LED 스크롤 표시와 같은 변화입니다
gnibbler

문자열은 항상 공백이없고 공백으로 구분됩니까?
Joey

보다 구체적으로, 해당 문자열에는 어떤 문자가 허용됩니까?
Joey

답변:


7

APL (28)

두 줄에 입력을받습니다.

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

설명:

  • A←⍞: 입력 줄을 읽고 A에 저장하십시오.
  • ⌽∘A¨⍳⍴A: [1 .. 길이 A]의 x마다 A를 x 씩 회전시킵니다. 예를 들어 목록을 제공합니다estT stTe tTes Test
  • (⊂⍞)∊: 다른 입력 행을 읽고이 목록에 있는지 확인하십시오.
  • 1+: 이것에 하나를 추가하여 문자열이 회전하지 않은 경우 1을, 문자열이 회전하지 않은 경우 2를 제공하십시오
  • 'No' 'Yes'[... ]: 'No' 'Yes'문자열의 회전 여부에 따라 목록에서 첫 번째 또는 두 번째 요소를 선택합니다 .
  • 이 값은 자동으로 출력됩니다.

19

루비 49 41

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

편집 : gets.split을 $ *로 바꿨습니다.


독창적 인 아이디어입니다.
Joey

매우 영리한. :)
st0le

$*질문이 지정되면 argv stdin입니다.
Mathieu CAROFF

7

파이썬, 70 바이트

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

테스트 ...


+1 Nice, 배열에서 결과를 선택하는 것이 영리합니다! :-)
Tamara Wijsman

3
이 질문에서는에서 두 개의 문자열을 읽어야한다고 말하지만 stdin이 솔루션에서는 그렇지 않습니다.
Ventero

@Ventero : 고정.
Quixotic

print ['No
movatica

6

파이썬 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습니다.
Tamara Wijsman

@TomWij 버그를 찾아 주셔서 감사합니다. 수정되었습니다. 지금 작동해야합니다.
fR0DDY

당신은 대체 할 수 <>에 의해 -그 또한 발생하므로 0그들이 동일한 길이의 경우.
Tamara Wijsman

그러나 길이가 같지 않으면 어떻게됩니까? 그렇다면 잘 작동하지 않습니다 :-)
hallvabo

@hallvabo 그러면 문자열이 서로 회전되지 않습니다.
fR0DDY

5

J, 47

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

두 J가 왜 대답합니까?
JB

@ JB : 이것은 buildin 회전을 사용하기 때문입니다. 두 대답 모두 su ^ H ^ H는 그렇게 좋지 않습니다. 골프를위한 공간 이 많이 있습니다.
Eelvex

왜 다른 사람이 물어보고 싶은 유혹이 있습니까? :-)
JB

@ JB : 나는 이것이 합법적이라고 생각했기 때문에 (: p) [다른 하나는 lisp로 멋지게 확장됩니다. ]
Eelvex

errr ... 다른 하나도 명령 줄에서 입력을 읽는 것 같습니다
JB

5

사양에 따라 (같은 문자열 길이) :

펄, 42 43 문자

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

다른 크기의 문자열이 허용되면 해결책은 다음과 같습니다.

펄, 47 자

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

rbo


GolfScript 솔루션과 동일한 문제 :를 입력 nn nfn하면을 얻 Yes습니다.
Tamara Wijsman

1
괜찮을 것 같다 (내가 놓친 첫 번째 버전에 '를!') "윈 NFN"=> 없음 "CodeGolf GolfCode"=>
고무 장화

5

골프 스크립트, 31

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

이 길이는 먼저 확인되므로 예상대로 작동합니다.


:)그리고 =)한 매우 행복 코드
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

윈도우 PowerShell, 76

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

3

자바 스크립트, 51

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

JavaScript에는 정식 호스트가 없으므로이 답변은 두 가지 인수의 함수로 작성됩니다. JS 1.7 기능 (표현식 폐쇄)을 허용하지 않으면 점수가 60까지 올라갑니다.

SpiderMonkey 쉘에서 (71 점) :

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

5 년 후, 이제 =>함수 표기법을 사용할 수 있습니다 .)
J Atkin

3

파이썬, 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에서 b * 2 및 len (a) == len (b)]

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

@gnibbler 좋은 트릭, 제안 주셔서 감사합니다. 나는 코드를 업데이트했다
Coding man

2

J, 84

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

2

자바 스크립트 (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

PHP, 61

<?echo preg_match('/^(.+)(.*) \\2\\1$/',fgets(STDIN))?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

하스켈 ( 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

스칼라 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

루아 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

PHP, 82 자

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

1

펄, 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$/

이 두 가지 모두 다른 길이의 문자열로 작동합니다 (이전 문자열과 달리)


두 문자열의 길이가 동일하지만 'golfcode golf'와 같은 입력에 실패하면 작동합니다.
steenslag

1

파이썬 2, 86 자

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

1

펄 (빠른 수정)

내가 아직 언급 할 수없는 새로운 사용자 인 고무 장화 솔루션에 대한 수정은 새로운 답변을 게시 할 것입니다.

언급 된 방법은 사용자 입력으로 구성된 정규식을 사용하므로 다음과 같이 작은 정규식 주입을 수행 할 수 있습니다.

> perl -le '$. = pop; $ _ = (pop) x2; print + (qw / yes no /)[!/$./]'무엇이든 '. *'
예

해결 방법은 \ Q (quotmeta라고도 함)를 사용하는 것입니다.

> perl -le '$. = pop; $ _ = (pop) x2; print + (qw / yes no /) [! / \ Q $. /]'무엇이든 '. *'
아니

'say'를 사용하여 코드 자체를 더 단축 할 수는 있지만 독자에게 연습으로 남겨 둡니다. :)


또한 두 글자보다 짧은 문자를 print+(qw/yes no/)[쓸 수도 있습니다 print qw(yes no)[.
Timwi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.