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

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.

19

Ruby 49 41

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

Edit: substituído gets.split por $ *


Essa é uma ideia engenhosa.
Joey

Muito esperto. :)
st0le

$*é argv quando a pergunta foi especificada stdin.
Mathieu CAROFF


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.


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'

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


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.


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

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"

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

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

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'

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

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)

2

Python, 71

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

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;

2

Ruby, 41

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

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

2

Q ( 50 43 caracteres)

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

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

"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthproduz 56
usuário desconhecido


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"


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

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

1

PHP, 82 caracteres

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

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

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)


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"

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


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 #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.