Перевірте, чи рядок повністю виконаний з тієї ж підрядки


24

Це взято з цього питання (з дозволу курсу). Я цитую:

Створіть функцію, яка займає рядок, і вона повинна повертати true або false на основі того, чи вхід складається з лише повторюваної послідовності символів. Довжина заданого рядка завжди більша за 1, і послідовність символів повинна мати принаймні одне повторення.

Деякі приклади:

'aa' //true
'aaa' //true
'abcabcabc' //true
'aba' //false
'ababa' //false
'weqweqweqweqweqw' // false

Зокрема, перевірка рядка, строго складеного з повторюваних підрядів ( оновлення ), може виводити будь-яке істинне чи помилкове подання, але помилка виведення не буде, будь ласка. Суворо буквено-цифрові струни. В іншому випадку стандартні правила гольфу. Це Code Golf, тому найкоротша відповідь у байтах за кожну мову виграє.


4
Гм, я збирався закрити цей виклик, як дурність цього , але я помітив, що інший налічує кількість символів. Тож, можливо, нам слід закрити інший (він також має прийняту відповідь) замість цього.
Ерік Аутгольфер

Відповіді:


11

Брахілог , 4 3 байти

ġ=Ṁ

Спробуйте в Інтернеті!

Пояснення

ġ=Ṁ    Implicit input, say "abcabc"
ġ      Split into chunks of equal lengths (except maybe the last one): ["abc","abc"]
 =     Apply the constraint that all of the chunks are equal,
  Ṁ    and that there are multiple of them.

Програма друкує, true.якщо обмеження можуть бути задоволені, а false.якщо ні.


Я просто боровся, намагаючись отримати щось на кшталт ~j↙або =Ṁcпрацювати, перш ніж я помітив, що ви опублікували це годину тому
Непов’язаний рядок

4
О, так, це може бути на один байт коротше:ġ=Ṁ
Непов’язаний рядок

( є змінною, обмеженою списком двох або більше елементів)
Непов'язаний рядок

1
@UnrelatedString Чудово, дякую! Я не думав перевіряти сторінку wiki із змінними.
Згарб

1
Дуже багато чудових відповідей, і відповідь LUA займає особливе місце в моєму серці. Відповідь Арнаульда особливо мила, оскільки оригінальний питання, на якому я грунтувався на цьому (а не в дупі), насправді позначений Javascript. В основному вибираю цей лише тому, що він, як видається, є найкоротшим для всіх мов, і оскільки це моє перше питання, я отримую значок.
оуфлак

19

JavaScript (ES6), 22 байти

Повертає булеве значення.

s=>/^(.*)\1+$/.test(s)

Спробуйте в Інтернеті!


Без регулярного виразу  33  29 байт

Повертає або null(фальшивий), або предмет (truthy).

s=>(s+s).slice(1,-1).match(s)

Спробуйте в Інтернеті!

Примітка: Технічно с перетворюється на регулярний вираз для match () , тому вищевказаний заголос є брехнею.


9

греп, 19

grep -qxE '(.+)\1+'

Тест

while read; do 
  <<<"$REPLY" grep -qxE '(.+)\1+' && t="true" || t="false"
  echo "$REPLY: $t"
done < infile 

Вихід:

aa: true
aaa: true
abcabcabc: true
aba: false
ababa: false
weqweqweqweqweqw: false

9

Japt , 6 байт

²é ¤øU

Збережено один байт завдяки @Shaggy

Спробуйте в Інтернеті!

        Implicit input, stored in variable 'U'
²       U+U, "abcabc" -> "abcabcabcabc"
 é      Rotate 1 char to the right "abcabcabcabc" -> "cabcabcabcab"
   ¤    Remove first two chars, "cabcabcabcab" -> "bcabcabcab"
    øU  Check if U is in the above

Nice один :) Ви можете замінити p<space>з ²зберегти байт.
Кудлатий

9

Java, 25 24 байти

-1 байт завдяки Олів'є Грегоаре!
Нудна відповідь-виразка

s->s.matches("(.+)\\1+")

Спробуйте в Інтернеті!

Це просто на 1 байт довше, ніж відповідь пітона aaaaa, я зараз прив'язаний :)


3
Ви можете видалити остаточне, $оскільки matchesметод є точно збігом, а не збігом підрядків за замовчуванням.
Олів'є Грегоар

Я забув matchesдодає свою власну $формулу. Спасибі!
Бенджамін Уркхарт

7

Excel, 26 байт

=FIND(A1,A1&A1,2)<=LEN(A1)

Вхідні дані з A1, виводить у будь-яку клітинку, в якій ви введете цю формулу.


Ви можете зберегти 4 байти, якщо визначили ім'я діапазону з однією літерою (наприклад A) та встановите це як свій вхід.
i_saw_drones

@i_saw_drones - я вважаю, що це заборонено стандартними правилами вводу / виводу: ось посилання на метавідповідь, яка застосовуватиметься до цього методу; в даний час це -36 голосів.
Софія Лехнер

Вибачення Я не бачив цієї публікації, хоч і думав про неї, чи не є A1також "змінною", оскільки вона містить вхідне значення? :)
i_saw_drones

1
Я відчував би це так, якби я робив щось особливе з тим фактом, що це А1 конкретно, як якщо б я якось покладався на його ROW (_), який є 1. Як це, однак, це просто найприродніший спосіб надання функції Excel з довільне введення.
Софія Лехнер

7

R , 28 байт

grepl("(.+)\\1+$",scan(,''))

Спробуйте в Інтернеті!

Проста версія Regex. R (іноді) дуже схожий на Python, тому це схоже на відповідь на регулярний вираз Python 2 TFeld, хоч і коротший!

Питання (якщо хтось знає відповідь)

Я все ще плутаюсь, чому це працює, оскільки підрядка може бути будь-якої довжини і завжди працюватиме, і все ще працює, коли я додаю лист на передню частину дійсного рядка, наприклад "cABABABABAB". Якщо я особисто читаю регулярний вираз, я бачу (.+), що фіксує будь-яку групу будь-якої довжини. А потім, \\1+$яка повторює захоплену групу будь-яку кількість разів до кінця.

То чому він не захоплює просто "AB" і не виявляє, що він повторюється до кінця рядка, тим більше, що немає обмежень щодо того, де може починатися підрядка?


1
Цікаво, що, здається, це помилка в Rgex двигуні R. Додавання цього параметра perl=TRUEдозволяє збігатися з CABABAB, як ви і очікували. Запуск grep -E '(.*)\1+$'у bash також відповідає CABABAB, хоча він grep -Eвикористовує ERE, той же аромат Rgex R повинен підтримувати.
Grimmy

2
Я здогадуюсь, що це неправильно застосована оптимізація. Зміна .+на початку шаблону на ^.+- це важлива оптимізація, але якщо .+внутрішній захоплює парен, він перестає діяти.
Grimmy


6

Желе ,  5  4 байти

Зараз я бачу, що оптимальний спосіб - це слідувати методу xnor !

Ḋ;Ṗw

Монадічна посилання, яка приймає список символів і виводить ціле число - найкоротшу можливу довжину повторюваного фрагмента або нуля, якщо такої немає. Зауважте, що нуль - це фальси, тоді як ненульові числа є правдою в желе.

Спробуйте в Інтернеті!

Як?

Ḋ;Ṗw - Link: list of characters, S   e.g. "abcabcabc"   or "abababa"
Ḋ    - dequeue S                           "bcabcabc"       "bababa"
  Ṗ  - pop from S                         "abcabcab"       "ababab"
 ;   - concatenate                "bcabcabcabcabcab"       "bababaababab"
   w - first index of sublist     3  ^---here!             0  (not found)


4

Python 2 , 24 байти

lambda s:s in(s*2)[1:-1]

Спробуйте в Інтернеті!

Безсоромно вкрадено з відповіді xnor на оригінальне запитання.


Більш інтуїтивна версія:

Python 2 , 59 55 53 байт

lambda s:s in[len(s)/i*s[:i]for i in range(1,len(s))]

Спробуйте в Інтернеті!


Нудна версія регулярного вираження:

Python 2 , 44 байти

lambda s:re.match(r'(.+)\1+$',s)>0
import re

Спробуйте в Інтернеті!





3

PowerShell, 23 24 байти

+1 байт, щоб повністю відповідати правилам

"$args"-match"^(.+)\1+$"

Спробуйте в Інтернеті!

Досить нудно. На основі інших відповідей Regex. На щастя, PowerShell не використовується \як символ втечі!


повертається trueзаaabcabc
mazzy

1
@mazzy щойно виправлено!
Габріель Міллс

3

C # (Visual C # Interactive Compiler) , 70 байт

безсоромна адаптація xnor ( 46 байт )

s=>(s+s).Substring(1,s.Length*2-2).Contains(s)

Моє рішення не для Regex:

s=>s.Select((x,y)=>y).Count(z=>s.Replace(s.Substring(0,z+1),"")=="")>1

Пояснення:

Замініть всі можливі підрядки, що починаються з індексу 0, порожнім рядком. Якщо результат є порожнім рядком, рядок повністю складається з цієї підрядки. Оскільки це включає оцінку всього рядка з собою, кількість очікуваних результатів повинна бути більше 1.

Приклад: abcabc

Можливі підрядки, починаючи з індексу 0:

'a', 'ab', 'abc', 'abca', 'abcab', 'abcabc'

Якщо ми замінимо їх порожніми рядками

Substring          Result

'a'         =>     'bcbc'
'ab'        =>     'cc'
'abc'       =>     ''
'abca'      =>     'bc'
'abcab'     =>     'c'
'abcabc'    =>     ''

Оскільки існує підряд, окрім 'abcabc', який повертає порожню рядок, рядок повністю складається з іншої підрядки ('abc')

Спробуйте в Інтернеті!


3

Пітон 3 , 62 60 56 54 байт

-4 байти ніж Арбо

lambda s:s in(len(s)//l*s[:l]for l in range(1,len(s)))
  1. Ітерація над усіма можливими префіксами в рядку.
  2. Спробуйте побудувати рядок із префікса.
  3. Поверніть, чи це взагалі вдалося з будь-яким префіксом.

Спробуйте в Інтернеті!


1
Гарна відповідь! f=Може бути відкинуто; анонімні функції, як правило, дозволені. Також, перейшовши на Python 2 і перевіривши приналежність до списку замість anyконструкції, ви можете дістатися до 55 байт
ArBo

1
Приємний спійманий членство в списку, дякую! Я не перейду на Python 2, оскільки це як перемикання мови, що, очевидно, тут не суть;) Також, чи є зручний спосіб перевірити анонімну функцію в TIO, зберігаючи кількість байтів?
movatica

1
@movatica У заголовку поставте `f =` (\ - символ продовження рядка в python)
Артеміда підтримує Моніку

Прикро, \ також є символом втечі. Ось, що не має форматування коду, те, що вам слід покласти у шапку: f = \
Артеміда підтримує Моніку

2

Japt , 10 байт

Повертає додатне число, якщо truthy та 0 якщо falsey. Якщо ви хочете вивести bool, просто додайте прапор

å+ k@rXÃÊÉ

å+ k@rXÃÊÉ      Full program. Implicit input U.
                    e.g: U = "abcabcabc"
å+              Take all prefixes 
                         U = ["a","ab","abc","abca","abcab","abcabc","abcabca","abcabcab","abcabcabc"]
   k@           Filter U by:
     rXÃ        Values that return false (empty string)
                when replacing each prefix in U
                e.g: ["bcbcbc","ccc","","bcabc","cabc","abc","bc","c",""]
                                take ↑                             and ↑
                     U = ["abc","abcabcabc"]
         ÊÉ     Get U length and subtract 1. Then return the result

Спробуйте в Інтернеті!


2

Лушпиння , 6 байт

Ṡ€ȯhtD

Спробуйте в Інтернеті!

Я відчуваю, що це один байт більш ніж оптимальний, але я не зміг знайти розташування, яке склало би чітку композицію ȯ непотрібною.

Пояснення

Ṡ€      Find the argument in the result of applying the following function to the argument
  ȯhtD  Duplicate the argument, then remove the first and last elements.

2
€htD¹уникає ȯ.
Згарб

Це фантастично! Я задумався, λ€htD¹але не зрозумів, що лямбди будуть додані неявно
Софія Лехнер

2

Mathematica 11.x, 74 байти

{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&

де на всьому протязі #представляє вхідний рядок та

StringCases[#,<pattern>]

знаходить підрядки вхідного рядка, що відповідають шаблону

StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="") 

Цей шаблон вимагає відповідності, xповинен починатися з початку рядка і повинен задовольняти умові, що (1) збіг - це не весь вхідний рядок, і (2), якщо ми замінимо входження в відповідність рядку вхідного рядка порожнім рядком ми отримуємо порожню рядок. Нарешті, порівнюючи список збігів із порожнім списком,

{}!=

є True якщо Falseсписок збігів не порожній і якщо список збігів порожній.

Тестові приклади:

{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["aa"]
(*  True  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["aaa"]
(*  True  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["abcabc"]
(*  True  *)

і

{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["aba"]
(*  False  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["ababa"]
(*  False  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["weqweqweqweqweqw"]
(*  False  *)

2

Пітон 3, 84 байти

import textwrap
lambda s:any(len(set(textwrap.wrap(s,l)))<2 for l in range(1,len(s)))

Використовує textwrap.wrap(завдяки цій відповіді ), щоб розділити рядок на шматки довжини, nщоб перевірити кожну можливу довжину повторюваної підрядки. Потім розділені частини порівнюють один з одним, додаючи їх до набору. Якщо всі шматки рівні, а набір довжиною 1, то рядок повинен бути рядком, що повторюється. я використав<2 замість того, ==1що це економить байт, і довжина вхідного рядка гарантовано перевищує нуль.

Якщо немає, nдля якого повторювані підряди довжини nскладають всю нитку, то поверніть помилкову для всієї функції.


2

05AB1E , 5 байт

Метод xnor з попереднього питання видається оптимальним і в 05AB1E.

«¦¨så

Спробуйте в Інтернеті! або як тестовий набір

Пояснення

«       # append input to input
 ¦¨     # remove the first and last character of the resulting string
   så   # check if the input is in this string

1
Звичайно .. Я збирався зробити відповідь 05AB1E, коли побачив, що нікого там не було. Колега задав мені кілька питань і розповів про його відпустку. Я оглядаюсь на екран: одна нова відповідь. Тада, знову бий XD
Кевін Кройсейсен

@KevinCruijssen: Це типово.
Зі

2

Чисто , 73 байти

Не використовує регулярний вираз.

import StdEnv,Data.List
$s=or[isPrefixOf s(cycle t)\\t<-tl(tails s)|t>[]]

Спробуйте в Інтернеті!

Визначає $ :: [Char] -> Bool.
Перевіряє, чи даний рядок є префіксом повторення будь-якого підрядка, взятого з кінця.



1

Змінна QlikView, 27 байт

Це слід визначати як змінну, яка потім дозволяє передавати параметри, наприклад $1 як вхідне значення.

Він повертається 0або -1(еквівалентно TRUE()функції QlikView ).

=substringcount($1&$1,$1)>2

1

Свіфт, 196 байт

func r(s:String)->Bool{guard let k=s.dropFirst().firstIndex(where:{$0==s.first}) else{return false};let v=s[...k].dropLast();var w=v;while s.hasPrefix(w) && s.count>=(w+v).count{w+=v};return s==w}

Спробуйте в Інтернеті!


Я не використовую Swift, але впевнений, що зайвий пробіл можна видалити
Бенджамін Уркхарт,

193 байти, використовуючи пропозицію @ benjamin.
Артеміда підтримує Моніку

@ArtemisFowl або навіть 123 байти
Роман Подимов,




1

T-SQL, 47 байт

Використовуючи метод @ Xnor :

DECLARE @ varchar(max)='ababab'

PRINT sign(charindex(@,left(@+@,len(@)*2-1),2))

Тримайте стару відповідь, оскільки вона містить приємний гольф (67 байт):

DECLARE @y varchar(max)='abababa'

,@ INT=0WHILE
replace(@y,left(@y,@),'')>''SET
@+=1PRINT @/len(@y)^1

Пояснення: Цей скрипт неодноразово намагається замінити вхід "@y" першими символами "@" вводу "@y" нічим, збільшуючи "@".

якщо ви заміните "ab" на "ababab" нічим, у вас є порожня рядок

Згодом результат буде порожнім. Якщо це трапляється, коли змінна циклу дорівнює довжині варшара, то критерій хибний / 0, оскільки '@' = len (@y) (не було повторюваного варчара).

iif(@=len(@y),0,1)

можна в цьому пограти в гольф

@/len(@y)^1

тому що довжина "@y" не може бути 0, а "@" ніколи не перевищує довжину @y.

Спробуйте в Інтернеті

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.