Виявити обертові рядки


20

Прочитайте два рядки з stdin.
Виведіть, Yesякщо одна рядок є поворотною версією іншої.
В іншому випадку виведітьNo

Тестові шафи

Вхідні дані

CodeGolf GolfCode

Вихідні дані

Yes

Вхідні дані

stackexchange changestackex

Вихідні дані

Yes

Вхідні дані

stackexchange changestack

Вихідні дані

No

Вхідні дані

Hello World

Вихідні дані

No

Отже ( abcdefAB , ABabcdef ) - це "ТАК"?
Ельвенкс

Чи дійсно це має бути обертання чи це теж комбінація? напр. що Stackexchange Stackchangeexповернеться?
jpjacobs

1
@Eelvex, так. @jpjacobs, Це повернеться No. Обертання - це зсув, як у тих світлодіодних прокручувальних знаків
гніблер

Чи завжди рядки без пробілів і розділені пробілом?
Джої

Більш конкретно, які символи дозволено в цих рядках?
Джої

Відповіді:


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

Пітон, 70 байт

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

Тестування ...


+1 Приємно, вибір результату з масиву розумний! :-)
Тамара Війсман

3
Питання стверджує, що ви повинні прочитати два рядки, від stdinяких це рішення не відповідає.
Вентеро

@ Вентеро: виправлено.
Кіхот

Пропустити місце можна вprint ['No
movatica

6

Пітон 70 символів

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

Завдяки гніблеру за трюк з фрагментами.


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. Обидві відповіді su ^ H ^ H не дуже хороші, але Тут є багато місця для гольфу.
Ельвекс

чому інший, тоді я спокусився запитати? :-)
JB

@JB: тому що я подумав, що цей ледве легальний (: p) [в той час як інший приємно поширюється, щоб лізнути. ]
Ельвекс

Помилка ... інший, здається, також читає введення з командного рядка
JB

5

Відповідно до специфікації (однакові довжини рядків):

Перл, 42 43 ч

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

Якщо дозволено різний розмір рядків, рішенням буде:

Perl, 47 чол

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

rbo


Така ж проблема, як і рішення 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

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

Через 5 років і тепер ви можете використовувати =>позначення функції;)
J Atkin,

3

Пітон, 66 63

a, b = raw_input (). split ()
print'YNeos '[a! = (2 * a) .замінити (b, "") :: 2]

Ще одне рішення в 69 char

a, b = raw_input (). split ()
print ['Ні', 'Так'] [a в b * 2і len (a) == len (b)]

2
print'YNeos'[a!=(2*a).replace(b,"")::2]
гніблер

@gnibbler приємний трюк, дякую за пропозицію. Я оновив код
Кодування людина


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

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

Пітона, 71

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

Така ж проблема, як і рішення GolfScript: Якщо ви вводите nn nfn, ви отримуєте Yes, що неправильно.
Тімві

Проблема вирішена, залишається невисокою ... :-)
Тамара Війсман

Не читається з stdin, як зазначено.
Wooble

Зараз це ... :-)
Тамара Війсман


2

Рубі, 41

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

Нічого не друкує, призводить до ": Ні" для введення "aaa aaa" (на моїй машині). Хоча підхід регулярного вибору може бути хорошою ідеєю.
steenslag

Виправити фактичне друк та введення з stdin замість args: puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No- збільшує його до 41 символу.
Nemo157

2

Хаскелл ( 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

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

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" замість "так" і "ні":

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

Обидва вони працюють із струнами різної довжини (на відміну від старої)


Працює, якщо дві струни мають однакову довжину, але не вдається при введенні, як "гольф-код гольфу".
steenslag


1

Perl (лише швидке виправлення)

Виправлення рішення про гумові чоботи, будучи новим користувачем, який я є, я поки не можу коментувати, тому я просто опублікую нову відповідь.

Оскільки згаданий метод використовує регулярний вираз, побудований з введення користувача, можна виконати невелику інжекцію регулярного вираження таким чином:

> perl -le '$. = pop; $ _ = (pop) x2; print + (qw / так ні /) зроблено! /$./]' що-небудь '. *'
так

Виправлення полягає у використанні \ Q (відомому також як quometa):

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

Сам код можна додатково скоротити за допомогою "сказати", але це залишається читачеві як вправа :)


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