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

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.



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.


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'

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


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.


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

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

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

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'

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

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)

2

Python, 71

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

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;

2

Ruby, 41

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

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


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

"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthdaje 56
użytkownik nieznany


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"


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

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

1

PHP, 82 znaki

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

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

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)


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"

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.