Erkennen Sie gedrehte Saiten

20

Lesen Sie zwei Zeichenfolgen aus stdin. Wird
ausgegeben, Yeswenn ein String eine gedrehte Version des anderen ist.
Sonst AusgabeNo

Testfälle

Eingang

CodeGolf GolfCode

Ausgabe

Yes

Eingang

stackexchange changestackex

Ausgabe

Yes

Eingang

stackexchange changestack

Ausgabe

No

Eingang

Hello World

Ausgabe

No
Knabberzeug
quelle
Also ( abcdefAB , ABabcdef ) ist ein "JA"?
Eelvex
Sollte es wirklich eine Rotation sein oder ist eine Kombination auch in Ordnung? z.B. Was wird Stackexchange Stackchangeexzurückkehren?
Jpjacobs
1
@Eelvex, ja. @jpjacobs, Es würde zurückkehren No. Die Drehung ist eine Verschiebung, wie diese LED-Bildlaufzeichen
Knabberer
Sind die Zeichenfolgen immer frei von Leerzeichen und durch Leerzeichen getrennt?
Joey
Welche Zeichen sind in diesen Zeichenfolgen zulässig?
Joey

Antworten:

7

APL (28)

Nimmt Eingaben in zwei Zeilen vor.

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

Erläuterung:

  • A←⍞: Lies eine Eingabezeile und speichere sie in A
  • ⌽∘A¨⍳⍴A: A für jedes x in [1. Länge A] um x drehen. Gibt eine Liste, dhestT stTe tTes Test
  • (⊂⍞)∊: Lesen Sie eine weitere Eingabezeile und prüfen Sie, ob sie in dieser Liste enthalten ist.
  • 1+: addiere eins dazu und gib 1, wenn die Saiten nicht gedreht wurden und 2, wenn sie gedreht wurden
  • 'No' 'Yes'[... ]: Wählen Sie entweder das erste oder das zweite Element aus der Liste aus, 'No' 'Yes'je nachdem, ob die Zeichenfolgen gedreht wurden oder nicht.
  • Dieser Wert wird automatisch ausgegeben.
Marinus
quelle
19

Ruby 49 41

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

Edit: gets.split durch $ * ersetzt

steenslag
quelle
Das ist eine geniale Idee.
Joey
Sehr schlau. :)
st0le
$*ist argv, wenn die Frage angegeben ist stdin.
Mathieu CAROFF
7

Python, 70 Bytes

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

Testen ...

Quixotic
quelle
+1 Schön, das Ergebnis aus einem Array auszuwählen ist clever! :-)
Tamara Wijsman
3
Die Frage besagt, dass Sie zwei Zeichenfolgen lesen sollten, aus stdindenen diese Lösung nicht besteht.
Ventero
@Ventero: Behoben.
Quixotic
Sie können das Leerzeichen inprint ['No
movatica
6

Python 70 Zeichen

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

Danke an Gnibbler für den Slice-Trick.

fR0DDY
quelle
1
Gleiches Problem wie bei der GolfScript-Lösung: Wenn du eingibst nn nfn, bekommst du Yes, was falsch ist.
Tamara Wijsman
@TomWij Danke, dass du den Fehler gefunden hast. Korrigiert Sollte jetzt funktionieren.
9.
Sie können ersetzen <>durch -wie in auch zur Folge haben wird , 0wenn sie gleich lang sind.
Tamara Wijsman
Aber was ist, wenn sie nicht gleich lang sind? Dann
klappt
@hallvabo dann sind die strings nicht version gegeneinander gedreht.
Freitag,
5

J, 47

y=:>2{ARGV
(>1{ARGV e.1|.^:(i.#y)y){'No',:'Yes'
Eelvex
quelle
Warum antworten die beiden J?
JB
@JB: weil dieser das buildin rotate benutzt. Beide Antworten sind übrigens nicht so gut. Es gibt viel Platz zum Golfen.
Eelvex
Warum bin ich dann versucht, den anderen zu fragen? :-)
JB
@JB: weil ich dachte, dass dies kaum legal ist (: p) [während die andere sich schön bis lisp erstreckt. ]
Eelvex
errr ... der andere scheint ebenfalls Eingaben von der Kommandozeile zu lesen
JB
5

Entsprechend der Spezifikation (gleiche Schnurlängen):

Perl, 42 43 Zeichen

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

Wenn Zeichenfolgen unterschiedlicher Größe zulässig sind, lautet die Lösung:

Perl, 47 Zeichen

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

rbo

Gummistiefel
quelle
Gleiches Problem wie bei der GolfScript-Lösung: Wenn du eingibst nn nfn, bekommst du Yes, was falsch ist.
Tamara Wijsman
1
scheint in Ordnung zu sein (ich habe das '!' in der ersten Version verpasst) "nn nfn" => nein "CodeGolf GolfCode" => ja
Gummistiefel
5

Golfscript, 31

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

Diese eine Länge zuerst überprüfen, so sollte es wie erwartet funktionieren.

SIE
quelle
:)und =)+1 für sehr glücklichen Code
TuxCrafting
4

J, 57

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

Beispielgebrauch:

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

Windows PowerShell, 76

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

JavaScript, 51

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

JavaScript hat keinen kanonischen Host, daher wird diese Antwort in Abhängigkeit von zwei Argumenten geschrieben. Die Punktzahl steigt auf 60, wenn wir JS 1.7-Features (Ausdrucksschließungen) nicht zulassen.

In der SpiderMonkey-Shell wäre dies (für eine Punktzahl von 71):

[a,b]=readline().split(" ");print(a&&(a+a).replace(b,"")==a?"Yes":"No")
ecatmur
quelle
5 Jahre später und jetzt können Sie die =>Funktionsnotation verwenden;)
J Atkin
3

Python, 66 63

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

Eine andere Lösung in 69 char

a, b = raw_input (). split ()
print ['Nein', 'Ja'] [a in b * 2und len (a) == len (b)]
Codierung Mann
quelle
2
print'YNeos'[a!=(2*a).replace(b,"")::2]
Knabberzeug
@ Gnibbler netter Trick, danke für den Vorschlag. Ich habe den Code aktualisiert
Coding Man
2

J 84

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

JavaScript (120 Zeichen)

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

Ausgabe:

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

Ruby, 58 (62) Zeichen

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

Diese Lösung setzt voraus, dass die Eingabe nur alphanumerische Zeichen enthält (eigentlich ist alles in Ordnung, was in einem regulären Ausdruck keine besondere Bedeutung hat).

Eine Lösung, für die diese Einschränkung nicht gilt, ist 4 Zeichen länger

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

Python, 71

a,b=raw_input().split()
print'Yes'if a in b*2and len(a)==len(b)else'No'
Tamara Wijsman
quelle
Gleiches Problem wie bei der GolfScript-Lösung: Wenn du eingibst nn nfn, bekommst du Yes, was falsch ist.
Timwi
Problem wurde gelöst, bleibt niedrig ... :-)
Tamara Wijsman
Liest nicht wie angegeben aus stdin.
Wooble
Jetzt tut es ... :-)
Tamara Wijsman
2

PHP, 61

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

Rubin, 41

puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No
Daniel
quelle
Gibt nichts aus, führt zu ': Nein' für die Eingabe 'aaa aaa' (auf meinem Computer). Der regexp-Ansatz könnte jedoch eine gute Idee sein.
Steenslag
Fix für das Drucken und Eingeben von stdin anstelle von args: puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No- erhöht es auf 41 Zeichen.
Nemo157
2

Haskell ( 98 96 Zeichen)

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

quelle
2

Q ( 50 43 Zeichen)

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

Scala 78

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

Es ist eine Schande über die Größenüberprüfung, ohne sie fällt die Zählung auf 54

val a=readLine split " "
print(a(0)+a(0)contains a(1))
Don Mackenzie
quelle
"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthergibt 56
Benutzer unbekannt
2

Bash 56

read a b
[[ $a$a =~ $b&&$b$b =~ $a ]]&&echo Yes||echo No
Benutzer unbekannt
quelle
2

GolfScript, 25 Bytes

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

Wie es funktioniert

             # 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
quelle
1

Lua 115 Zeichen

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

C-Programm - 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
quelle
1

PHP, 82 Zeichen

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

Perl, 123 Zeichen

@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
quelle
1

Rubin, 30 37

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

Eine Version, die "true" und "false" anstelle von "yes" und "no" ausgibt:

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

Beide arbeiten mit unterschiedlich langen Saiten (im Gegensatz zu den alten)

Lowjacker
quelle
Funktioniert, wenn die beiden Saiten die gleiche Länge haben, aber bei Eingaben wie 'golfcode golf' nicht funktionieren.
Steenslag
1

Python 2, 86 Zeichen

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

Perl (nur eine schnelle Lösung)

Ein Fix für die Gummistiefel-Lösung. Als neuer Benutzer kann ich noch keinen Kommentar abgeben. Ich werde einfach eine neue Antwort posten.

Da die erwähnte Methode einen regulären Ausdruck verwendet, der aus Benutzereingaben besteht, ist es wie folgt möglich, eine kleine Regex-Injektion durchzuführen:

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

Das Update besteht darin, \ Q (auch als Quotemeta bekannt) zu verwenden:

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

Der Code selbst könnte mit 'say' weiter verkürzt werden, dies ist jedoch eine Übung für den Leser :)

chinesischer Perl Goth
quelle
Außerdem kann man stattdessen print+(qw/yes no/)[wahrscheinlich print qw(yes no)[zwei Zeichen kürzer schreiben .
Timwi