Обнаружить повернутые строки

20

Читать две строки из stdin.
Выведите, Yesесли одна строка является повернутой версией другой.
В противном случае выводNo

Testcases

вход

CodeGolf GolfCode

Выход

Yes

вход

stackexchange changestackex

Выход

Yes

вход

stackexchange changestack

Выход

No

вход

Hello World

Выход

No
gnibbler
источник
Так ( abcdefAB , ABabcdef ) это "ДА"?
Eelvex
Должно ли это быть вращение или комбинация тоже хороша? например. что Stackexchange Stackchangeexвернется?
jpjacobs
1
@ Двенадцать, да. @jpjacobs, это вернется No. Вращение - это сдвиг, как у этих светодиодных прокручиваемых знаков
gnibbler
Всегда ли строки свободны от пробелов и разделены пробелами?
Джои
Более конкретно, какие символы разрешены в этих строках?
Джои

Ответы:

7

APL (28)

Принимает входные данные в две строки.

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

Объяснение:

  • A←⍞: прочитать строку ввода и сохранить ее в A
  • ⌽∘A¨⍳⍴A: Поверните A на x, для каждого x в [1..length A]. Дает список, т.е.estT stTe tTes Test
  • (⊂⍞)∊: прочитайте еще одну строку ввода и посмотрите, есть ли она в этом списке.
  • 1+: добавить один к этому, давая 1, если строки не были повернуты и 2, если они были
  • 'No' 'Yes'[... ]: выберите первый или второй элемент из списка в 'No' 'Yes'зависимости от того, были ли строки повернуты или нет.
  • Это значение выводится автоматически.
Мэринус
источник
19

Руби 49 41

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

Изменить: заменяет gets.split на $ *

steenslag
источник
Это гениальная идея.
Джои
Очень умно. :)
st0le
$*это argv, когда вопрос, указанный, stdinхотя.
Матье КАРОФФ
7

Python, 70 байт

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

Тестирование ...

донкихотский
источник
+1 Отлично, выбор результата из массива - это умно! :-)
Тамара Вийсман
3
В вопросе говорится, что вы должны прочитать две строки stdin, чего нет в этом решении.
Вентеро
@Ventero: Исправлено.
Quixotic
Вы можете пропустить место вprint ['No
movatica
6

Python 70 символов

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

Спасибо gnibbler за трюк с ломтиками.

fR0DDY
источник
1
Та же проблема, что и у решения GolfScript: если вы введете nn nfn, вы получите Yes, что неправильно.
Тамара Вийсман
@ TomWij Спасибо, что нашли ошибку. Исправленный. Должен работать сейчас.
fR0DDY
Вы можете заменить <>на, -поскольку это также приведет к тому, 0что они будут одинаковой длины.
Тамара Вийсман
Но что, если они не одинаковой длины? Тогда это не так хорошо работает :-)
hallvabo
@hallvabo тогда строки не являются повернутыми версиями друг друга.
fR0DDY
5

J, 47

y=:>2{ARGV
(>1{ARGV e.1|.^:(i.#y)y){'No',:'Yes'
Eelvex
источник
Почему два J отвечают?
JB
@JB: потому что этот использует buildin rotate. Оба ответа su ^ H ^ H не так хороши, кстати. Здесь много места для игры в гольф.
Eelvex
почему другой, то, я испытываю желание спросить? :-)
JB
@JB: потому что я думал, что это едва ли законно (: p) [в то время как другое прекрасно распространяется на шутки. ]
Eelvex
ошибаешься ... другой, кажется, тоже читает ввод из командной строки
JB
5

Согласно спецификации (одинаковые длины строк):

Perl, 42 43 символа

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

Если разрешены строки разных размеров, решение будет таким:

Perl, 47 символов

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

БВ

резиновые сапоги
источник
Та же проблема, что и у решения GolfScript: если вы введете nn nfn, вы получите Yes, что неправильно.
Тамара Вийсман
1
кажется, все в порядке (я пропустил '!' в первой версии) "nn nfn" => нет "CodeGolf GolfCode" => да
резиновые сапоги
5

Гольфскрипт, 31

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

Сначала проверяйте длину, поэтому она должна работать как положено.

ВЫ
источник
:)и =)+1 для очень счастливого кода
TuxCrafting
4

J, 57

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

Образец использования:

$ 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
источник
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 нет канонического хоста, поэтому этот ответ записывается как функция двух аргументов. Счет возрастает до 60, если мы запрещаем функции JS 1.7 (замыкания выражений).

В оболочке SpiderMonkey это будет (для оценки 71):

[a,b]=readline().split(" ");print(a&&(a+a).replace(b,"")==a?"Yes":"No")
ecatmur
источник
5 лет спустя, и теперь вы можете использовать =>функцию обозначения;)
J Аткин
3

Python, 66 63

а, б = raw_input (). сплит ()
print'YNeos' [а! = (2 * а) .Надеть (б "") :: 2]

Еще одно решение за 69 символов

а, б = raw_input (). сплит ()
напечатайте ['Нет', 'Да'] [a в b * 2 и len (a) == len (b)]
Кодирующий человек
источник
2
print'YNeos'[a!=(2*a).replace(b,"")::2]
gnibbler
@gnibbler хороший трюк, спасибо за предложение. Я обновил код
Coding man
2

J, 84

y=:(>1{ARGV),:(>2{ARGV)
((0{y)e.(y&((]$0{[),(]-~[:}.[:$[)$1{[)/.i.}.$y)){'No',:'Yes'
Eelvex
источник
2

JavaScript (120 символов)

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

Выход:

f('CodeGolf','GolfCode'); //Yes
f('stackexchange','changestackex'); //Yes
f('stackexchange','changestack'); //No
f('Hello','World'); //No
f('nn','nBn'); //No
Серхио Чинос
источник
2

Ruby, 58 (62) символов

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

Это решение предполагает, что ввод содержит только буквенно-цифровые символы (фактически все, что не имеет специального значения внутри регулярного выражения, в порядке).

Решение, которое не имеет этого ограничения, на 4 символа длиннее

a,b=gets.split;$><<(a.size==b.size&&(b*2).index(a)?:Yes: :No)
Ventero
источник
2

Python, 71

a,b=raw_input().split()
print'Yes'if a in b*2and len(a)==len(b)else'No'
Тамара Вийсман
источник
Та же проблема, что и у решения GolfScript: если вы введете nn nfn, вы получите Yes, что неправильно.
Тимви
Проблема была решена, остается низкой ... :-)
Тамара Вийсман
Не читает из стандартного ввода, как указано.
Wooble
Теперь это делает ... :-)
Тамара Вийсман
2

PHP, 61

<?echo preg_match('/^(.+)(.*) \\2\\1$/',fgets(STDIN))?Yes:No;
Даниил
источник
2

Руби, 41

puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No
Даниил
источник
Ничего не печатает, приводит к ': Нет' для ввода 'aaa aaa' (на моей машине). Подход регулярного выражения может быть хорошей идеей.
Steenslag
Исправлена ​​ошибка, позволяющая печатать и вводить данные из stdin вместо args: puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No- увеличивает его до 41 символа.
Nemo157
2

Haskell ( 98 96 символов)

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 символа)

{`No`Yes x in((!)(#)y)rotate\:y}." "vs(0:)0
skeevey
источник
2

Scala 78

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

Обидно за проверку размера, без него счетчик падает до 54

val a=readLine split " "
print(a(0)+a(0)contains a(1))
Дон маккензи
источник
"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthдает 56
пользователь неизвестен
2

Баш 56

read a b
[[ $a$a =~ $b&&$b$b =~ $a ]]&&echo Yes||echo No
Пользователь неизвестен
источник
2

GolfScript, 25 байт

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

Как это устроено

             # 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

Луа 115 символов

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
источник
1

С программа - 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 символа

<?$s=split(" ",fgets(STDIN));echo str_replace($s[1],"",$s[0].$s[0])==$s[0]?Yes:No;
Кевин Браун
источник
1

Perl, 123 символа

@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
источник
1

Руби, 30 37

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

Версия, которая печатает «true» и «false» вместо «yes» и «no»:

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

Оба они работают со строками разной длины (в отличие от старого)

Lowjacker
источник
Работает, если две строки имеют одинаковую длину, но не работает при вводе, как «golfcode golf».
Steenslag
1

Python 2, 86 символов

a,b=raw_input().split()
print"Yes"if any(a==b[n:]+b[:n]for n in range(len(a)))else"No"
Джереми Бэнкс
источник
1

Perl (просто быстрое решение)

Исправление к решению резиновых сапог, будучи новым пользователем, я не могу комментировать, поэтому я просто отправлю новый ответ.

Поскольку в упомянутом методе используется регулярное выражение, созданное из пользовательского ввода, можно выполнить небольшое внедрение регулярного выражения следующим образом:

> perl -le '$. = pop; $ _ = (pop) x2; print + (qw / yes no /)[!/$./]' что-нибудь '. *'
да

Исправление заключается в использовании \ Q (также известного как quotemeta):

> perl -le '$. = pop; $ _ = (pop) x2; print + (qw / yes no /) [! / \ Q $. /]' что-нибудь '. *'
нет

Сам код может быть дополнительно сокращен с помощью «сказать», но это оставлено в качестве упражнения для читателя :)

китайский Perl гот
источник
Кроме того, вместо print+(qw/yes no/)[вас, вероятно, можно написать, print qw(yes no)[что на два символа короче.
Тимви,