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

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.

19

Rubí 49 41

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

Editar: reemplazado gets.split por $ *


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 ...


+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.


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'

¿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


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.


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

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

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

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'

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

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)

2

Python, 71

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

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;

2

Rubí, 41

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

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

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

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

"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthrinde 56
usuario desconocido


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"


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

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

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)


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"

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.