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

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.

19

Ruby 49 41

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

Edit: gets.split durch $ * ersetzt


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


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


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'

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


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.


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

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

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

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'

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

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)

2

Python, 71

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

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;

2

Rubin, 41

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

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

2

Q ( 50 43 Zeichen)

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

"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthergibt 56
Benutzer unbekannt


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"


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

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

1

PHP, 82 Zeichen

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

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

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)


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"

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


Außerdem kann man stattdessen print+(qw/yes no/)[wahrscheinlich print qw(yes no)[zwei Zeichen kürzer schreiben .
Timwi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.