Wykryj obrócone struny

20

Przeczytaj dwa ciągi z stdin.
Dane wyjściowe, Yesjeśli jeden ciąg jest obróconą wersją drugiego.
W przeciwnym razie wyjścieNo

Przypadki testowe

Wejście

CodeGolf GolfCode

Wynik

Yes

Wejście

stackexchange changestackex

Wynik

Yes

Wejście

stackexchange changestack

Wynik

No

Wejście

Hello World

Wynik

No
gnibbler
źródło
Więc ( abcdefAB , ABabcdef ) to „TAK”?
Eelvex
Czy naprawdę powinien to być obrót, czy też kombinacja też jest w porządku? na przykład. co Stackexchange Stackchangeexwróci?
jpjacobs
1
@Eelvex, tak. @jpjacobs, to wróci No. Obrót jest przesunięciem, podobnie jak te przewijające się znaki LED
gnibbler
Czy ciągi znaków są zawsze wolne od białych znaków i oddzielone białymi znakami?
Joey,
Mówiąc dokładniej, jakie znaki są dozwolone w tych ciągach?
Joey,

Odpowiedzi:

7

APL (28)

Pobiera dane wejściowe w dwóch wierszach.

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

Wyjaśnienie:

  • A←⍞: przeczytaj wiersz danych wejściowych i zapisz go w A
  • ⌽∘A¨⍳⍴A: Obróć A o x, dla każdego x w [1.. długości A]. Daje listę, tjestT stTe tTes Test
  • (⊂⍞)∊: przeczytaj inny wiersz danych wejściowych i sprawdź, czy jest na tej liście.
  • 1+: dodaj jeden do tego, dając 1, jeśli łańcuchy nie zostały obrócone i 2, jeśli były
  • 'No' 'Yes'[... ]: Wybierz pierwszy lub drugi element z listy w 'No' 'Yes'zależności od tego, czy łańcuchy zostały obrócone, czy nie.
  • Ta wartość jest generowana automatycznie.
marinus
źródło
19

Ruby 49 41

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

Edycja: zastąpiono gets.split przez $ *

steenslag
źródło
To genialny pomysł.
Joey,
Bardzo mądry. :)
st0le 18.03.11
$*jest argumentem argv, gdy pytanie jest określone stdin.
Mathieu CAROFF,
7

Python, 70 bajtów

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

Testowanie ...

Donkiszotowski
źródło
+1 Fajnie, wybór wyniku z tablicy jest sprytny! :-)
Tamara Wijsman,
3
Pytanie mówi, że powinieneś przeczytać dwa ciągi znaków, z stdinktórych to rozwiązanie nie.
Ventero,
@Ventero: Naprawiono.
Kichot,
Możesz pominąć miejsce wprint ['No
movatica
6

Python 70 znaków

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

Dzięki gnibbler za trick trick.

fR0DDY
źródło
1
Ten sam problem, co rozwiązanie GolfScript: jeśli wpiszesz nn nfn, otrzymasz Yes, co jest złe.
Tamara Wijsman,
@TomWij Dzięki za znalezienie błędu. Poprawione Powinien działać teraz.
fR0DDY
Możesz zastąpić <>, -ponieważ spowoduje to również, że będą 0one równej długości.
Tamara Wijsman,
Ale co, jeśli nie będą one równej długości? Więc to nie działa tak dobrze :-)
hallvabo 13.03.11
@hallvabo to łańcuchy nie są obróconą wersją.
fR0DDY 13.03.11
5

J, 47

y=:>2{ARGV
(>1{ARGV e.1|.^:(i.#y)y){'No',:'Yes'
Eelvex
źródło
Dlaczego dwie odpowiedzi J?
JB
@JB: ponieważ ten używa wbudowanego obracania. Obie odpowiedzi su ^ H ^ H nie są tak dobre. Jest dużo miejsca na grę w golfa.
Eelvex
skąd więc ten drugi, mam ochotę zapytać? :-)
JB
@JB: ponieważ myślałem, że ten jest ledwie legalny (: p) [podczas gdy drugi ładnie obejmuje seplenienie. ]
Eelvex
errr ... ten drugi również odczytuje dane wejściowe z wiersza poleceń
JB
5

Zgodnie ze specyfikacją (te same długości łańcucha):

Perl, 42 43 znaki

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

Jeśli dozwolone są łańcuchy o różnych rozmiarach, rozwiązaniem byłoby:

Perl, 47 znaków

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

rbo

kalosze
źródło
Ten sam problem, co rozwiązanie GolfScript: jeśli wpiszesz nn nfn, otrzymasz Yes, co jest złe.
Tamara Wijsman,
1
wydaje się być w porządku (brakowało mi „!” w pierwszej wersji) „nn nfn” => nie „CodeGolf GolfCode” => tak
kalosze
5

Golfscript, 31

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

Najpierw ta długość kontroli, więc powinna działać zgodnie z oczekiwaniami.

TY
źródło
:)i =)+1 za bardzo szczęśliwy kod
TuxCrafting
4

J, 57

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

Przykładowe użycie:

$ 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
źródło
3

Windows PowerShell, 76

$a,$b=-split$input
('No','Yes')[+!($a.length-$b.length)*"$b$b".contains($a)]
Joey
źródło
3

JavaScript, 51

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

JavaScript nie ma hosta kanonicznego, więc ta odpowiedź jest napisana jako funkcja dwóch argumentów. Wynik wzrośnie do 60, jeśli nie uwzględnimy funkcji JS 1.7 (zamykanie wyrażeń).

W powłoce SpiderMonkey byłoby to (dla wyniku 71):

[a,b]=readline().split(" ");print(a&&(a+a).replace(b,"")==a?"Yes":"No")
ecatmur
źródło
5 lat później i teraz możesz użyć =>notacji funkcji;)
J Atkin
3

Python, 66 63

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

Kolejne rozwiązanie w 69 znakach

a, b = raw_input (). split ()
print [„Nie”, „Tak”] [a in b * 2 i len (a) == len (b)]
Kodowanie człowieka
źródło
2
print'YNeos'[a!=(2*a).replace(b,"")::2]
gnibbler,
@gnibbler fajna sztuczka, dzięki za sugestie. Zaktualizowałem kod
Człowiek
2

J, 84

y=:(>1{ARGV),:(>2{ARGV)
((0{y)e.(y&((]$0{[),(]-~[:}.[:$[)$1{[)/.i.}.$y)){'No',:'Yes'
Eelvex
źródło
2

JavaScript (120 znaków)

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

Wynik:

f('CodeGolf','GolfCode'); //Yes
f('stackexchange','changestackex'); //Yes
f('stackexchange','changestack'); //No
f('Hello','World'); //No
f('nn','nBn'); //No
Sergio Cinos
źródło
2

Rubinowy, 58 (62) znaków

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

To rozwiązanie zakłada, że ​​dane wejściowe zawierają tylko znaki alfanumeryczne (w rzeczywistości wszystko, co nie ma specjalnego znaczenia w wyrażeniu regularnym, jest w porządku).

Rozwiązanie, które nie ma tego ograniczenia, ma 4 znaki dłużej

a,b=gets.split;$><<(a.size==b.size&&(b*2).index(a)?:Yes: :No)
Ventero
źródło
2

Python, 71

a,b=raw_input().split()
print'Yes'if a in b*2and len(a)==len(b)else'No'
Tamara Wijsman
źródło
Ten sam problem, co rozwiązanie GolfScript: jeśli wpiszesz nn nfn, otrzymasz Yes, co jest złe.
Timwi
Problem został rozwiązany, pozostaje niski ... :-)
Tamara Wijsman,
Nie czyta ze standardowego wejścia, jak określono.
Wooble,
Teraz robi ... :-)
Tamara Wijsman,
2

PHP, 61

<?echo preg_match('/^(.+)(.*) \\2\\1$/',fgets(STDIN))?Yes:No;
Daniel
źródło
2

Ruby, 41

puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No
Daniel
źródło
Nic nie drukuje, powoduje „: Nie” dla danych wejściowych „aaa aaa” (na moim komputerze). Podejście regularne może być dobrym pomysłem.
steenslag
Naprawiono faktyczne drukowanie i wprowadzanie ze standardowego wejścia zamiast argumentów: puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No- podnosi go do 41 znaków.
Nemo157,
2

Haskell ( 98 96 znaków)

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

źródło
2

Q ( 50 43 znaków)

{`No`Yes x in((!)(#)y)rotate\:y}." "vs(0:)0
skeevey
źródło
2

Scala 78

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

Szkoda, jeśli chodzi o sprawdzanie rozmiaru, bez tego liczba spada do 54

val a=readLine split " "
print(a(0)+a(0)contains a(1))
Don Mackenzie
źródło
"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthdaje 56
użytkownik nieznany
2

bash 56

read a b
[[ $a$a =~ $b&&$b$b =~ $a ]]&&echo Yes||echo No
nieznany użytkownik
źródło
2

GolfScript, 25 bajtów

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

Jak to działa

             # 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
źródło
1

Lua 115 znaków

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
źródło
1

Program 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
źródło
1

PHP, 82 znaki

<?$s=split(" ",fgets(STDIN));echo str_replace($s[1],"",$s[0].$s[0])==$s[0]?Yes:No;
Kevin Brown
źródło
1

perl, 123 znaki

@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
źródło
1

Ruby, 30 37

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

Wersja, która drukuje „prawda” i „fałsz” zamiast „tak” i „nie”:

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

Oba działają z łańcuchami o różnej długości (w przeciwieństwie do starego)

Lowjacker
źródło
Działa, jeśli dwa ciągi mają tę samą długość, ale nie działa na wejściu, jak „golfcode golf”.
steenslag
1

Python 2, 86 znaków

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

Perl (tylko szybka poprawka)

Poprawka rozwiązania gumowych butów, ponieważ jestem nowym użytkownikiem, którego nie mogę jeszcze komentować, więc opublikuję nową odpowiedź.

Ponieważ wspomniana metoda wykorzystuje wyrażenie regularne zbudowane na podstawie danych wprowadzonych przez użytkownika, możliwe jest wykonanie małego wstrzyknięcia wyrażenia regularnego w następujący sposób:

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

Rozwiązaniem jest użycie \ Q (znanego również jako quotemeta):

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

Sam kod można dodatkowo skrócić za pomocą polecenia „powiedz”, ale pozostawia to zadanie czytelnikowi :)

goth chiński perl
źródło
Co więcej, zamiast print+(qw/yes no/)[ciebie prawdopodobnie możesz napisać, print qw(yes no)[który jest o dwa znaki krótszy.
Timwi