Detectar cadenas rotadas

20

Leer dos cadenas de stdin.
Salida Yessi una cadena es una versión rotada de la otra.
De lo contrario salidaNo

Casos de prueba

Entrada

CodeGolf GolfCode

Salida

Yes

Entrada

stackexchange changestackex

Salida

Yes

Entrada

stackexchange changestack

Salida

No

Entrada

Hello World

Salida

No
gnibbler
fuente
Entonces ( abcdefAB , ABabcdef ) es un "SÍ"?
Eelvex
¿Debería ser realmente una rotación o una combinación también? p.ej. ¿Qué volverá Stackexchange Stackchangeex?
jpjacobs
1
@Eelvex, sí. @jpjacobs, volvería No. La rotación es un cambio, como los LED de desplazamiento signos
gnibbler
¿Las cadenas están siempre libres de espacios en blanco y separadas por espacios en blanco?
Joey
Más específicamente, ¿qué caracteres están permitidos en esas cadenas?
Joey

Respuestas:

7

APL (28)

Toma entrada en dos líneas.

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

Explicación:

  • A←⍞: lee una línea de entrada y la almacena en A
  • ⌽∘A¨⍳⍴A: Gire A por x, para cada x en [1..length A]. Da una lista, es decirestT stTe tTes Test
  • (⊂⍞)∊: lea otra línea de entrada y vea si está en esta lista.
  • 1+: agregue uno a esto, dando 1 si las cadenas no se giraron y 2 si lo fueran
  • 'No' 'Yes'[... ]: Seleccione el primer o segundo elemento de la lista 'No' 'Yes'dependiendo de si las cadenas se giraron o no.
  • Este valor se emite automáticamente.
marinus
fuente
19

Rubí 49 41

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

Editar: reemplazado gets.split por $ *

steenslag
fuente
Esa es una idea ingeniosa.
Joey
Muy inteligente. :)
st0le
$*es argv cuando la pregunta especificada stdinsin embargo.
Mathieu CAROFF
7

Python, 70 bytes

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

Prueba ...

Quijotesco
fuente
+1 ¡Agradable, seleccionar el resultado de una matriz es inteligente! :-)
Tamara Wijsman
3
La pregunta indica que debe leer dos cadenas stdin, de las cuales esta solución no.
Ventero
@Ventero: fijo.
Quixotic
Puede omitir el espacio enprint ['No
movatica
6

Personajes de Python 70

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

Gracias a gnibbler por el truco del corte.

fR0DDY
fuente
1
El mismo problema que la solución GolfScript: si ingresa nn nfn, obtiene Yes, lo cual está mal.
Tamara Wijsman
@TomWij Gracias por encontrar el error. Corregido Debería funcionar ahora.
fR0DDY
Puede reemplazar <>por -ya que eso también dará como resultado 0si son de igual longitud.
Tamara Wijsman
Pero, ¿y si no tienen la misma longitud? Entonces no funciona tan bien :-)
hallvabo
@hallvabo, entonces las cadenas no son versiones rotadas entre sí.
fR0DDY
5

J, 47

y=:>2{ARGV
(>1{ARGV e.1|.^:(i.#y)y){'No',:'Yes'
Eelvex
fuente
¿Por qué responden las dos J?
JB
@JB: porque este usa el buildin rotate. Ambas respuestas su ^ H ^ H no son tan buenas por cierto. Hay mucho espacio para jugar al golf.
Eelvex
¿Por qué el otro, entonces, tengo la tentación de preguntar? :-)
JB
@JB: porque pensé que este es apenas legal (: p) [mientras que el otro se extiende muy bien hasta lisp. ]
Eelvex
errr ... el otro parece leer la entrada de la línea de comandos también
JB
5

Según la especificación (mismas longitudes de cadena):

Perl, 42 43 caracteres

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

Si se permiten cadenas de diferentes tamaños, la solución sería:

Perl, 47 caracteres

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

rbo

botas de goma
fuente
El mismo problema que la solución GolfScript: si ingresa nn nfn, obtiene Yes, lo cual está mal.
Tamara Wijsman
1
parece estar bien (me perdí el '!' en la primera versión) "nn nfn" => no "CodeGolf GolfCode" =>
botas de goma el
5

Golfscript, 31

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

Esta longitud de verificación primero, por lo que debería funcionar como se esperaba.


fuente
:)y =)+1 para un código muy feliz
TuxCrafting
4

J, 57

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

Uso de la muestra:

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

Windows PowerShell, 76

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

JavaScript, 51

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

JavaScript no tiene un host canónico, por lo que esta respuesta se escribe en función de dos argumentos. El puntaje sube a 60 si no permitimos las características de JS 1.7 (cierres de expresiones).

En el shell SpiderMonkey esto sería (para un puntaje de 71):

[a,b]=readline().split(" ");print(a&&(a+a).replace(b,"")==a?"Yes":"No")
ecatmur
fuente
5 años después y ahora puede usar la =>notación de función;)
J Atkin
3

Python, 66 63

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

Otra solución en 69 char

a, b = raw_input (). split ()
print ['No', 'Yes'] [a en b * 2 y len (a) == len (b)]
Coding man
fuente
2
print'YNeos'[a!=(2*a).replace(b,"")::2]
gnibbler
@gnibbler buen truco, gracias por su sugerencia. Actualicé el código
Coding man
2

J 84

y=:(>1{ARGV),:(>2{ARGV)
((0{y)e.(y&((]$0{[),(]-~[:}.[:$[)$1{[)/.i.}.$y)){'No',:'Yes'
Eelvex
fuente
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';}

Salida:

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

Ruby, 58 (62) personajes

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

Esta solución asume que la entrada contiene solo caracteres alfanuméricos (en realidad, todo lo que no tiene un significado especial dentro de una expresión regular está bien).

Una solución que no tiene esta restricción es 4 caracteres más larga

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

Python, 71

a,b=raw_input().split()
print'Yes'if a in b*2and len(a)==len(b)else'No'
Tamara Wijsman
fuente
El mismo problema que la solución GolfScript: si ingresa nn nfn, obtiene Yes, lo cual está mal.
Timwi
El problema se ha resuelto, sigue siendo bajo ... :-)
Tamara Wijsman
No lee de stdin como se especifica.
Wooble
Ahora sí ... :-)
Tamara Wijsman
2

PHP, 61

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

Rubí, 41

puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No
Daniel
fuente
No imprime nada, da como resultado ': No' para la entrada 'aaa aaa' (en mi máquina). Sin embargo, el enfoque regexp podría ser una buena idea.
steenslag
Arreglo para imprimir e ingresar desde stdin en lugar de args: puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No- sube a 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

fuente
2

Q ( 50 43 caracteres)

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

Scala 78

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

Es una pena el control de tamaño, sin él el recuento cae a 54

val a=readLine split " "
print(a(0)+a(0)contains a(1))
Don Mackenzie
fuente
"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthrinde 56
usuario desconocido
2

bash 56

read a b
[[ $a$a =~ $b&&$b$b =~ $a ]]&&echo Yes||echo No
usuario desconocido
fuente
2

GolfScript, 25 bytes

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

Cómo 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
fuente
1

Lua 115 caracteres

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
fuente
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
fuente
1

PHP, 82 caracteres

<?$s=split(" ",fgets(STDIN));echo str_replace($s[1],"",$s[0].$s[0])==$s[0]?Yes:No;
Kevin Brown
fuente
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
fuente
1

Rubí, 30 37

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

Una versión que imprime "verdadero" y "falso" en lugar de "sí" y "no":

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

Ambos funcionan con cadenas de diferente longitud (a diferencia del anterior)

Lowjacker
fuente
Funciona si las dos cadenas tienen la misma longitud, pero falla en la 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
fuente
1

Perl (solo una solución rápida)

Una solución a la solución de las botas de goma, siendo un nuevo usuario que soy, no puedo comentar aún, así que simplemente publicaré una nueva respuesta.

Como el método mencionado utiliza una expresión regular construida a partir de la entrada del usuario, es posible realizar una pequeña inyección de expresiones regulares, de la siguiente manera:

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

La solución es usar \ Q (conocido también como quotemeta):

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

El código en sí podría acortarse aún más usando 'decir', pero esto se deja como un ejercicio para el lector :)

perl chino goth
fuente
Además, en lugar de print+(qw/yes no/)[usted, probablemente pueda escribir print qw(yes no)[cuál es dos caracteres más cortos.
Timwi