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


20

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

Testcases

вход

CodeGolf GolfCode

Выход

Yes

вход

stackexchange changestackex

Выход

Yes

вход

stackexchange changestack

Выход

No

вход

Hello World

Выход

No

Так ( 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'зависимости от того, были ли строки повернуты или нет.
  • Это значение выводится автоматически.


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 за трюк с ломтиками.


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'

Почему два 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


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

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'

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)

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

Руби, 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

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

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

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

1

Руби, 30 37

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

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

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

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


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


1

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

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

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

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

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

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

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


Кроме того, вместо print+(qw/yes no/)[вас, вероятно, можно написать, print qw(yes no)[что на два символа короче.
Тимви,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.