Detectar cordas giradas

20

Leia duas strings de stdin.
Saída Yesse uma string é uma versão rotacionada da outra.
Caso contrário, saídaNo

Casos de teste

Entrada

CodeGolf GolfCode

Resultado

Yes

Entrada

stackexchange changestackex

Resultado

Yes

Entrada

stackexchange changestack

Resultado

No

Entrada

Hello World

Resultado

No
mordedor
fonte
Então ( abcdefAB , ABabcdef ) é um "SIM"?
Eelvex 9/03/11
Realmente deveria ser uma rotação ou uma combinação também é boa? por exemplo. o que vai Stackexchange Stackchangeexvoltar?
jpjacobs
11
@ Eelvex, sim. @jpjacobs, voltaria No. A rotação é uma mudança, como os LED rolagem sinais
gnibbler
As strings são sempre livres de espaço em branco e separadas por espaço em branco?
Joey
Mais especificamente, quais caracteres são permitidos nessas strings?
Joey

Respostas:

7

APL (28)

Recebe entrada em duas linhas.

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

Explicação:

  • A←⍞: leia uma linha de entrada e armazene-a em A
  • ⌽∘A¨⍳⍴A: Gire A por x, para cada x em [1 .. comprimento A]. Dá uma lista, ou seja,estT stTe tTes Test
  • (⊂⍞)∊: leia outra linha de entrada e veja se está nesta lista.
  • 1+: adicione um a isso, fornecendo 1 se as seqüências de caracteres não foram giradas e 2 se elas foram
  • 'No' 'Yes'[... ]: selecione o primeiro ou o segundo elemento da lista, 'No' 'Yes'dependendo se as seqüências de caracteres foram giradas ou não.
  • Este valor é gerado automaticamente.
marinus
fonte
19

Ruby 49 41

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

Edit: substituído gets.split por $ *

steenslag
fonte
Essa é uma ideia engenhosa.
Joey
Muito esperto. :)
st0le
$*é argv quando a pergunta foi especificada stdin.
Mathieu CAROFF
7

Python, 70 bytes

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

A testar ...

Quixotesco
fonte
+1 Bom, selecionar o resultado de uma matriz é inteligente! :-)
Tamara Wijsman
3
A pergunta afirma que você deve ler duas cadeias stdin, das quais esta solução não.
Ventero 9/03/11
@ Ventero: Fixo.
Quixotic
Você pode pular o espaço emprint ['No
movatica
6

Python 70 caracteres

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

Obrigado ao gnibbler pelo truque da fatia.

fR0DDY
fonte
11
Mesmo problema que a solução GolfScript: Se você digitar nn nfn, receberá Yes, o que está errado.
Tamara Wijsman
@ TomWij Obrigado por encontrar o bug. Corrigido. Deve funcionar agora.
FR0DDY
Você pode substituir <>por, -pois isso também resultará 0se eles tiverem o mesmo comprimento.
Tamara Wijsman
Mas e se eles não tiverem o mesmo comprimento? Então ele não funciona tão bem :-)
hallvabo
@hallvabo então as strings não são rodadas uma da outra.
FR0DDY 13/03/11
5

J, 47

y=:>2{ARGV
(>1{ARGV e.1|.^:(i.#y)y){'No',:'Yes'
Eelvex
fonte
Por que os dois J respondem?
JB
@ JB: porque este usa o buildin rotate. Ambas as respostas su ^ H ^ H não são tão boas assim. Há muito espaço para jogar golfe.
Eelvex
por que o outro, então, estou tentado a perguntar? :-)
JB
@JB: porque eu pensei que este é apenas legal (: p) [enquanto o outro se estende muito bem para cagar. ]
Eelvex
errr ... o outro parece ler a entrada de linha de comando bem
JB
5

De acordo com a especificação (mesmos comprimentos de string):

Perl, 42 43 caracteres

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

Se cadeias de tamanhos diferentes forem permitidas, a solução seria:

Perl, 47 caracteres

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

rbo

botas de borracha
fonte
Mesmo problema que a solução GolfScript: Se você digitar nn nfn, receberá Yes, o que está errado.
Tamara Wijsman
11
parece ser ok (eu perdi o na primeira versão '!') "nn NFN" => nenhum "CodeGolf GolfCode" => sim
botas de borracha
5

Golfscript, 31

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

Esse comprimento de verificação primeiro, portanto, deve funcionar conforme o esperado.

VOCÊ
fonte
:)e =)+1 para código muito feliz
TuxCrafting 30/10
4

J, 57

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

Uso da amostra:

$ 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
fonte
3

Windows PowerShell, 76

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

JavaScript, 51

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

O JavaScript não possui um host canônico, portanto, essa resposta é escrita em função de dois argumentos. A pontuação sobe para 60 se não permitirmos os recursos do JS 1.7 (fechamento de expressões).

No shell SpiderMonkey, seria (para uma pontuação de 71):

[a,b]=readline().split(" ");print(a&&(a+a).replace(b,"")==a?"Yes":"No")
ecatmur
fonte
5 anos mais tarde e agora você pode usar a =>função de notação;)
J Atkin
3

Python, 66 63

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

Outra solução em 69 caracteres

a, b = raw_input (). split ()
print ['Não', 'Sim'] [a em b * 2e len (a) == len (b)]
Homem de codificação
fonte
2
print'YNeos'[a!=(2*a).replace(b,"")::2]
Gnibbler 19/10/2013
@gnibbler bom truque, obrigado pela sugestão. Atualizei o código
Coding man
2

J, 84

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

JavaScript (120 caracteres)

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

Resultado:

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

Ruby, 58 (62) caracteres

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

Esta solução pressupõe que a entrada contenha apenas caracteres alfanuméricos (na verdade, tudo o que não tem um significado especial dentro de uma expressão regular está ok).

Uma solução que não tem essa restrição tem 4 caracteres a mais

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

Python, 71

a,b=raw_input().split()
print'Yes'if a in b*2and len(a)==len(b)else'No'
Tamara Wijsman
fonte
Mesmo problema que a solução GolfScript: Se você digitar nn nfn, receberá Yes, o que está errado.
Timwi
Problema foi resolvido, permanece baixo ... :-)
Tamara Wijsman
Não lê de stdin conforme especificado.
Wooble 9/03/11
Agora ele faz ... :-)
Tamara Wijsman
2

PHP, 61

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

Ruby, 41

puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No
Daniel
fonte
Não imprime nada, resulta em ': Não' para a entrada 'aaa aaa' (na minha máquina). A abordagem regexp pode ser uma boa ideia.
23411 steve_ag
Correção para realmente imprimir e inserir a partir de stdin em vez de args: puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No- aumenta para 41 caracteres.
Nemo157
2

Haskell ( 98 96 caracteres)

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

fonte
2

Q ( 50 43 caracteres)

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

Scala 78

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

É uma pena a verificação do tamanho, sem ela a contagem cai para 54

val a=readLine split " "
print(a(0)+a(0)contains a(1))
Don Mackenzie
fonte
"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthproduz 56
usuário desconhecido
2

festança 56

read a b
[[ $a$a =~ $b&&$b$b =~ $a ]]&&echo Yes||echo No
Usuário desconhecido
fonte
2

GolfScript, 25 bytes

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

Como funciona

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

Programa 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
fonte
1

PHP, 82 caracteres

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

perl, 123 caracteres

@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
fonte
1

Ruby, 30 37

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

Uma versão que imprime "true" e "false" em vez de "yes" e "no":

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

Ambos trabalham com strings de comprimento diferente (ao contrário do antigo)

Lowjacker
fonte
Funciona se as duas strings tiverem o mesmo comprimento, mas falharem na entrada como 'golfcode golf'.
steenslag
1

Python 2, 86 caracteres

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

Perl (apenas uma solução rápida)

Uma correção para a solução das botas de borracha, sendo um novo usuário que eu sou, ainda não posso comentar, então vou postar uma nova resposta.

Como o método mencionado usa uma expressão regular criada a partir da entrada do usuário, é possível executar uma pequena injeção de regex, da seguinte maneira:

> perl -le '$. = pop; $ _ = (pop) x2; print + (qw / yes no /)[!/$./]' qualquer coisa '. *'
sim

A correção é usar \ Q (também conhecido como quotemeta):

> perl -le '$. = pop; $ _ = (pop) x2; print + (qw / yes no /) [! / \ Q $. /]' qualquer coisa '. *'
não

O código em si pode ser ainda mais reduzido usando 'say', mas isso é deixado como um exercício para o leitor :)

gótico chinês do perl
fonte
Além disso, em vez de print+(qw/yes no/)[você provavelmente pode escrever print qw(yes no)[quais são dois caracteres mais curtos.
Timwi #