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

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.

19

Rubis 49 41

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

Modifier: gets.split remplacé par $ *


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


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


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'

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


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.


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

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

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

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'

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

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)

2

Python, 71

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

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;

2

Rubis, 41

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

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

2

Q ( 50 43 caractères)

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

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

"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthdonne 56
utilisateur inconnu


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"


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

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

1

PHP, 82 caractères

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

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

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)


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"

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


Furthermore, instead of print+(qw/yes no/)[ you can probably write print qw(yes no)[ which is two characters shorter.
Timwi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.