Détecter les chaînes tournées

20

Lisez deux chaînes de stdin.
Sortie Yessi une chaîne est une version pivotée de l'autre.
Sinon, sortieNo

Cas de test

Contribution

CodeGolf GolfCode

Production

Yes

Contribution

stackexchange changestackex

Production

Yes

Contribution

stackexchange changestack

Production

No

Contribution

Hello World

Production

No
grignoteur
la source
Donc ( abcdefAB , ABabcdef ) est un "OUI"?
Eelvex
Faut-il vraiment que ce soit une rotation ou une combinaison aussi? par exemple. qu'est-ce qui Stackexchange Stackchangeexreviendra?
jpjacobs
1
@Eelvex, oui. @jpjacobs, il reviendrait No. La rotation est un décalage, comme ces signes de défilement LED
gnibbler
Les chaînes sont-elles toujours sans espace et séparées par un espace?
Joey
Plus précisément, quels caractères sont autorisés dans ces chaînes?
Joey

Réponses:

7

APL (28)

Prend l'entrée sur deux lignes.

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

Explication:

  • A←⍞: lire une ligne d'entrée et la stocker dans A
  • ⌽∘A¨⍳⍴A: Faites pivoter A de x, pour chaque x dans [1..longueur A]. Donne une liste, c.-à-d.estT stTe tTes Test
  • (⊂⍞)∊: lire une autre ligne d'entrée, et voir si elle est dans cette liste.
  • 1+: ajoutez-en un, en donnant 1 si les cordes n'ont pas été tournées et 2 si elles étaient
  • 'No' 'Yes'[... ]: Sélectionnez le premier ou le deuxième élément dans la liste 'No' 'Yes'selon que les chaînes ont été tournées ou non.
  • Cette valeur est sortie automatiquement.
marinus
la source
19

Rubis 49 41

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

Modifier: gets.split remplacé par $ *

steenslag
la source
Voilà une idée ingénieuse.
Joey
Très intelligent. :)
st0le
$*est argv quand la question spécifiée stdincependant.
Mathieu CAROFF
7

Python, 70 octets

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

Test ...

Chimérique
la source
+1 Bien, sélectionner le résultat dans un tableau est intelligent! :-)
Tamara Wijsman
3
La question indique que vous devez lire deux chaînes stdin, ce que cette solution ne fait pas.
Ventero
@Ventero: corrigé.
Quixotic
Vous pouvez ignorer l'espace dansprint ['No
movatica
6

Python 70 caractères

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

Merci à gnibbler pour le truc de tranche.

fR0DDY
la source
1
Même problème que la solution GolfScript: si vous saisissez nn nfn, vous obtenez Yes, ce qui est faux.
Tamara Wijsman
@TomWij Merci d'avoir trouvé le bogue. Corrigée. Devrait fonctionner maintenant.
fR0DDY
Vous pouvez remplacer <>par -car cela entraînera également 0s'ils sont de longueur égale.
Tamara Wijsman
Mais que se passe-t-il s'ils ne sont pas de longueur égale? Alors ça ne marche pas si bien :-)
hallvabo
@hallvabo alors les chaînes ne sont pas tournées l'une de l'autre.
fR0DDY
5

J, 47

y=:>2{ARGV
(>1{ARGV e.1|.^:(i.#y)y){'No',:'Yes'
Eelvex
la source
Pourquoi les deux réponses J?
JB
@JB: parce que celui-ci utilise la rotation de buildin. Les deux réponses su ^ H ^ H ne sont pas si bonnes d'ailleurs. Il y a beaucoup de place pour le golf.
Eelvex
pourquoi l'autre, alors, je suis tenté de demander? :-)
JB
@JB: parce que je pensais que celui-ci est à peine légal (: p) [tandis que l'autre s'étend bien au lisp. ]
Eelvex
errr ... l'autre semble également lire les entrées de la ligne de commande
JB
5

Selon la spécification (mêmes longueurs de chaîne):

Perl, 42 43 caractères

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

Si des chaînes de tailles différentes sont autorisées, la solution serait:

Perl, 47 caractères

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

rbo

bottes en caoutchouc
la source
Même problème que la solution GolfScript: si vous saisissez nn nfn, vous obtenez Yes, ce qui est faux.
Tamara Wijsman
1
semble être ok (j'ai raté le '!' dans la première version) "nn nfn" => non "CodeGolf GolfCode" => oui
bottes en caoutchouc
5

Golfscript, 31

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

Celui-ci vérifie d'abord la longueur, il devrait donc fonctionner comme prévu.

VOUS
la source
:)et =)+1 pour un code très heureux
TuxCrafting
4

J, 57

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

Exemple d'utilisation:

$ 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
la source
3

Windows PowerShell, 76

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

JavaScript, 51

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

JavaScript n'a pas d'hôte canonique, donc cette réponse est écrite en fonction de deux arguments. Le score monte à 60 si nous interdisons les fonctionnalités JS 1.7 (fermetures d'expression).

Dans le shell SpiderMonkey ce serait (pour un score de 71):

[a,b]=readline().split(" ");print(a&&(a+a).replace(b,"")==a?"Yes":"No")
ecatmur
la source
5 ans plus tard et maintenant vous pouvez utiliser la =>notation de fonction;)
J Atkin
3

Python, 66 63

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

Une autre solution en 69 caractères

a, b = raw_input (). split ()
imprimer ['Non', 'Oui'] [a en b * 2 et len ​​(a) == len (b)]
Homme de codage
la source
2
print'YNeos'[a!=(2*a).replace(b,"")::2]
gnibbler
@gnibbler belle astuce, merci pour la suggestion. J'ai mis à jour le code
Coding man
2

J, 84

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

JavaScript (120 caractères)

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

Production:

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

Rubis, 58 (62) caractères

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

Cette solution suppose que l'entrée ne contient que des caractères alphanumériques (en fait, tout ce qui n'a pas de signification particulière dans une expression régulière est correct).

Une solution qui n'a pas cette contrainte est plus longue de 4 caractères

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

Python, 71

a,b=raw_input().split()
print'Yes'if a in b*2and len(a)==len(b)else'No'
Tamara Wijsman
la source
Même problème que la solution GolfScript: si vous saisissez nn nfn, vous obtenez Yes, ce qui est faux.
Timwi
Le problème a été résolu, reste faible ... :-)
Tamara Wijsman
Ne lit pas depuis stdin comme spécifié.
Wooble
Maintenant c'est le cas ... :-)
Tamara Wijsman
2

PHP, 61

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

Rubis, 41

puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No
Daniel
la source
N'imprime rien, entraîne ': Non' pour l'entrée 'aaa aaa' (sur ma machine). L'approche regexp pourrait être une bonne idée cependant.
steenslag
Correction de l'impression et de la saisie à partir de stdin au lieu d'arg: puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No- augmente la valeur à 41 caractères.
Nemo157
2

Haskell ( 98 96 caractères)

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

la source
2

Q ( 50 43 caractères)

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

Scala 78

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

C'est dommage pour la vérification de la taille, sans elle le nombre tombe à 54

val a=readLine split " "
print(a(0)+a(0)contains a(1))
Don Mackenzie
la source
"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthdonne 56
utilisateur inconnu
2

bash 56

read a b
[[ $a$a =~ $b&&$b$b =~ $a ]]&&echo Yes||echo No
Utilisateur inconnu
la source
2

GolfScript, 25 octets

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

Comment ça fonctionne

             # 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
la source
1

Lua 115 caractères

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
la source
1

Programme 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
la source
1

PHP, 82 caractères

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

perl, 123 caractères

@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
la source
1

Rubis, 30 37

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

Une version qui affiche "vrai" et "faux" au lieu de "oui" et "non":

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

Ces deux fonctionnent avec des chaînes de longueur différente (contrairement à l'ancien)

Lowjacker
la source
Fonctionne si les deux chaînes ont la même longueur, mais échoue à l'entrée comme «golfcode golf».
steenslag
1

Python 2, 86 caractères

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

Perl (juste une solution rapide)

Une solution à la solution des bottes en caoutchouc, étant un nouvel utilisateur que je suis, je ne peux pas encore commenter donc je vais juste poster une nouvelle réponse.

Comme la méthode mentionnée utilise une expression régulière construite à partir d'une entrée utilisateur, il est possible d'effectuer une petite injection d'expression régulière, comme suit:

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

Le correctif consiste à utiliser \ Q (également appelé quotemeta):

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

Le code lui-même pourrait être encore raccourci en utilisant «dire» mais cela est laissé au lecteur comme exercice :)

perl chinois goth
la source
Furthermore, instead of print+(qw/yes no/)[ you can probably write print qw(yes no)[ which is two characters shorter.
Timwi