Sprawdź, czy ciąg znaków jest w całości wykonany z tego samego podciągu


24

To pochodzi z tego pytania (za zgodą oczywiście). Zacytuję:

Utwórz funkcję, która pobiera ciąg znaków i powinna zwracać wartość true lub false w zależności od tego, czy dane wejściowe składają się tylko z powtarzanej sekwencji znaków. Długość podanego ciągu jest zawsze większa niż 1, a sekwencja znaków musi mieć co najmniej jedno powtórzenie.

Kilka przykładów:

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

W szczególności sprawdzenie łańcucha ściśle złożonego z powtarzających się podciągów ( Aktualizacja ) może wygenerować dowolną prawdziwą lub fałszywą reprezentację, ale proszę nie dać wyniku błędu. Ciągi ściśle alfanumeryczne. W przeciwnym razie standardowe zasady gry w golfa. To jest Code Golf, więc wygrywa najkrótsza odpowiedź w bajtach dla każdego języka.


4
Hm, miałem zamiar zakończyć to wyzwanie jako duplikat tego , ale zauważyłem, że drugi zdobywa punkty pod względem liczby postaci. Może więc powinniśmy zamknąć ten drugi (ma również zaakceptowaną odpowiedź) jako duplikat tego.
Erik the Outgolfer

Odpowiedzi:


11

Brachylog , 4 3 bajty

ġ=Ṁ

Wypróbuj online!

Wyjaśnienie

ġ=Ṁ    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.

Program drukuje, true.czy ograniczenia mogą być spełnione, a false.jeśli nie.


Właśnie walczyłem, próbując zdobyć coś takiego ~j↙lub =Ṁcpracując, zanim zauważyłem, że opublikowałeś to godzinę temu
Niepowiązany ciąg

4
Och, tak, może to być jeden bajt krótszy:ġ=Ṁ
Niepowiązany ciąg

( jest zmienną ograniczoną do listy dwóch lub więcej elementów)
Niepowiązany ciąg

1
@UnrelatedString Świetnie, dziękuję! Nie pomyślałem o sprawdzeniu strony wiki zmiennych.
Zgarb

1
Wiele świetnych odpowiedzi, a odpowiedź LUA ma szczególne miejsce w moim sercu. Odpowiedź Arnaulda jest szczególnie słodka, ponieważ pierwotne pytanie, na którym je oparłem (nie dupe), jest tak naprawdę oznaczone Javascript. Głównie wybranie tego tylko dlatego, że wydaje się być najkrótszy dla wszystkich języków, a ponieważ jest to moje pierwsze pytanie, dostaję odznakę.
ouflak

19

JavaScript (ES6), 22 bajty

Zwraca wartość logiczną.

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

Wypróbuj online!


Bez wyrażenia regularnego  33  29 bajtów

Zwraca albo null(fałsz), albo obiekt (prawda).

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

Wypróbuj online!

NB: Technicznie, s jest konwertowane na wyrażenie regularne dla match () , więc powyższy tytuł jest kłamstwem.


9

grep, 19

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

Test

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

Wydajność:

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

9

Japt , 6 bajtów

²é ¤øU

Oszczędność jednego bajtu dzięki @Shaggy

Wypróbuj online!

        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

Nieźle :) Można wymienić p<space>z ²zapisać bajt.
Kudłaty

9

Java, 25 24 bajtów

-1 bajt dzięki Olivier Grégoire!
Nudna odpowiedź regularna

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

Wypróbuj online!

To tylko 1 bajt dłużej niż odpowiedź pytona aaaaa Jestem teraz związany :)


3
Możesz usunąć finał, $ponieważ matchesmetoda jest dopasowaniem ścisłym, a nie dopasowaniem podłańcuchowym domyślnie.
Olivier Grégoire

Zapomniałem, że matchesdodaje własne $do wyrażenia regularnego. Dzięki!
Benjamin Urquhart

7

Excel, 26 bajtów

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

Dane wejściowe z A1, dane wyjściowe do dowolnej komórki, w której umieścisz tę formułę.


Możesz zapisać 4 bajty, jeśli zdefiniowałeś jednoznakową nazwę zakresu (np. A) I ustawiłeś ją jako swoją wartość wejściową.
i_saw_drones

@i_saw_drones - Myślę, że jest to zabronione przez standardowe reguły I / O: oto link do meta odpowiedzi, która miałaby zastosowanie do tej metody; obecnie ma -36 głosów.
Sophia Lechner

Przepraszam, że nie widziałem tego postu, choć o tym myślę, nie jest A1też „zmienną”, ponieważ zawiera wartość wejściową? :)
i_saw_drones

1
Czułbym to w ten sposób, gdybym robił coś specjalnego z faktem, że jest to konkretnie A1, na przykład, gdybym w jakiś sposób polegał na tym, że ROW (_) ma wartość 1. Jest to jednak najbardziej naturalny sposób na zapewnienie funkcji Excel z dowolne dane wejściowe.
Sophia Lechner,

7

R , 28 bajtów

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

Wypróbuj online!

Prosta wersja Regex. R jest (czasami) bardzo podobny do Pythona, więc jest podobny do odpowiedzi wyrażeń regularnych w Pythonie 2 TFeld, choć krótszy!

Pytanie (jeśli ktoś zna odpowiedź)

Nadal jestem zdezorientowany, dlaczego to działa, ponieważ podłańcuch może mieć dowolną długość i zawsze będzie działać, i nadal działa, gdy dodam literę z przodu prawidłowego ciągu, na przykład „cABABABABAB”. Jeśli osobiście przeczytam regex, widzę (.+), że przechwytuje on dowolną grupę dowolnej długości. A następnie, \\1+$która powtarza przechwyconą grupę dowolną liczbę razy do końca.

Dlaczego więc nie przechwytuje tylko „AB” i nie stwierdza, że ​​jest powtarzane aż do końca łańcucha, tym bardziej, że nie określono ograniczeń co do tego, gdzie może zaczynać się podłańcuch?


1
Co ciekawe, wydaje się, że jest to błąd w silniku wyrażeń regularnych R. Dodanie opcji perl=TRUEsprawia, że ​​pasuje do cABABAB, jak można się spodziewać. Uruchamianie grep -E '(.*)\1+$'w bash również pasuje do cABABAB, nawet jeśli grep -Eużywa ERE, ten sam regexowy smak R ma wspierać.
Grimmy,

2
Domyślam się, że jest to niepoprawnie zastosowana optymalizacja. Zmiana .+na początku wzorca na ^.+jest ważną optymalizacją, ale jeśli .+jest on w środku przechwytywania parens, przestaje być ważny.
Grimmy,


6

Galaretka ,  5  4 bajtów

Widzę teraz, że optymalnym sposobem jest zastosowanie metody xnor !

Ḋ;Ṗw

Monadyczny link, który przyjmuje listę znaków i zwraca liczbę całkowitą - najkrótszą możliwą długość powtarzającego się wycinka lub zero, jeśli nie istnieje. Zauważ, że zero to falsey, podczas gdy niezerowe liczby są prawdziwe w Jelly.

Wypróbuj online!

W jaki sposób?

Ḋ;Ṗ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)






3

PowerShell, 23 24 bajty

+1 bajt, aby w pełni dopasować reguły

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

Wypróbuj online!

Strasznie nudne. Na podstawie innych odpowiedzi Regex. Na szczęście PowerShell nie używa \jako znaku ucieczki!


wraca truedoaabcabc
mazzy

1
@mazzy właśnie naprawione!
Gabriel Mills,

3

C # (interaktywny kompilator Visual C #) , 70 bajtów

bezwstydna adaptacja xnora ( 46 bajtów )

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

Moje rozwiązanie bez Regex:

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

Wyjaśnienie:

Zastąp każdy możliwy podciąg rozpoczynający się od indeksu 0 pustym ciągiem. Jeśli wynikiem jest pusty ciąg, ciąg jest w całości wykonany z tego podłańcucha. Ponieważ obejmuje to ocenę całego łańcucha za pomocą samego siebie, liczba oczekiwanych wyników musi być większa niż 1.

Przykład: abcabc

Możliwe podciągi zaczynające się od indeksu 0:

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

Jeśli zastąpimy je pustymi ciągami

Substring          Result

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

Ponieważ istnieje podciąg inny niż „abcabc”, który zwraca pusty ciąg, ciąg jest w całości wykonany z innego podłańcucha („abc”)

Wypróbuj online!


3

Python 3 , 62 60 56 54 bajtów

-4 bajty dzięki dla ArBo

lambda s:s in(len(s)//l*s[:l]for l in range(1,len(s)))
  1. Iteruj po wszystkich możliwych prefiksach ciągu.
  2. Spróbuj zbudować ciąg z prefiksu.
  3. Zwróć, czy w ogóle uda się to z dowolnym prefiksem.

Wypróbuj online!


1
Niezła odpowiedź! f=Można usunąć; funkcje anonimowe są ogólnie dozwolone. Ponadto, przechodząc do Pythona 2 i sprawdzając członkostwo listy zamiast anykonstrukcji, można uzyskać do 55 bajtów
ArBo

1
Niezły chwyt z członkostwem w liście, dzięki! Nie przestawię się na Python 2, ponieważ jest to jak zmiana języka, co oczywiście nie ma tutaj sensu;) Czy jest też wygodny sposób przetestowania anonimowej funkcji w TIO, zachowując liczbę bajtów?
movatica

1
@movatica W nagłówku wstaw `f =` (\ jest znakiem kontynuacji linii w pythonie)
Artemis obsługuje Monikę

Irytujące jest to, że jest także ucieczką. Tutaj, bez formatowania kodu, należy umieścić w nagłówku: f = \
Artemis obsługuje Monikę

2

Japt , 10 bajtów

Zwraca liczbę dodatnią, jeśli jest prawdą, i 0, jeśli falsey. Jeśli chcesz otrzymać wynik bool, po prostu dodaj flagę

å+ 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

Wypróbuj online!


2

Łuska , 6 bajtów

Ṡ€ȯhtD

Wypróbuj online!

Wydaje mi się, że jest to jeden bajt więcej niż optymalny, ale nie mogłem znaleźć aranżacji, która stworzyłaby wyraźną kompozycję ȯ zbędna.

Wyjaśnienie

Ṡ€      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¹unika ȯ.
Zgarb

To fantastycznie! Myślałem o tym, λ€htD¹ale nie zdawałem sobie sprawy, że lambdy zostaną dodane pośrednio
Sophia Lechner

2

Mathematica 11.x, 74 bajty

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

gdzie w całości #reprezentuje ciąg wejściowy, oraz

StringCases[#,<pattern>]

znajduje podciągi ciągu wejściowego pasujące do wzorca

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

Ten wzorzec wymaga dopasowań, xmusi zaczynać się na początku łańcucha i musi spełniać warunek, że (1) dopasowanie nie jest całym łańcuchem wejściowym i (2), jeśli zastąpimy wystąpienia dopasowania w łańcuchu wejściowym pustym łańcuchem otrzymujemy pusty ciąg. Wreszcie, porównując listę dopasowań z pustą listą,

{}!=

jest, Truejeśli lista dopasowań nie jest pusta iFalse jeśli lista dopasowań jest pusta.

Przypadki testowe:

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

i

{}!=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

Python 3, 84 bajtów

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

Używa textwrap.wrap(dzięki tej odpowiedzi ) do podzielenia łańcucha na kawałki długości w ncelu przetestowania każdej możliwej długości powtarzającego się podłańcucha. Podzielone elementy są następnie porównywane ze sobą poprzez dodanie ich do zestawu. Jeśli wszystkie elementy są równe, a zestaw ma długość 1, łańcuch musi być ciągiem powtarzalnym. Użyłem <2zamiast, ==1ponieważ zapisuje bajt, a długość łańcucha wejściowego była gwarantowana większa niż zero.

Jeśli nie ma żadnego, ndla którego powtarzające się podciągi długości nskładają się na cały ciąg, to zwróć false dla całej funkcji.


2

05AB1E , 5 bajtów

Metoda xnor z poprzedniego pytania wydaje się również optymalna w 05AB1E.

«¦¨så

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

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

1
Oczywiście .. Już miałem udzielić odpowiedzi 05AB1E, gdy zobaczyłem, że nie było. Kolega zadał mi kilka pytań i opowiedział o swoich wakacjach. Patrzę wstecz na ekran: jedna nowa odpowiedź. Tada, pokonaj ponownie XD
Kevin Cruijssen

@KevinCruijssen: To typowe. Zdarzyło mi się też kilka razy;)
Emigna,

2

Czysty , 73 bajty

Nie używa wyrażenia regularnego.

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

Wypróbuj online!

Definiuje $ :: [Char] -> Bool.
Sprawdza, czy podany ciąg jest prefiksem powtórzenia dowolnego podciągu pobranego od końca.


2

C ++ (gcc) , 36 bajtów

#define f(x)(x+x).find(x,1)<x.size()

Wypróbuj online!

Kolejny port rozwiązania xnor. Używa makra, aby rozwinąć argument do wyrażenia. Przyjmuje się, że argument jest typu std::string.


1

Zmienna QlikView, 27 bajtów

Należy to zdefiniować jako zmienną, która następnie pozwala przekazać parametry, np $1 Jako wartość wejściową.

Zwraca 0lub -1(odpowiednik TRUE()funkcji QlikView ).

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





1

T-SQL, 47 bajtów

Używając metody @ Xnor :

DECLARE @ varchar(max)='ababab'

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

Zachowując starą odpowiedź, ponieważ zawiera trochę dobrej gry w golfa (67 bajtów):

DECLARE @y varchar(max)='abababa'

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

Objaśnienie: Ten skrypt wielokrotnie próbuje zastąpić wejście „@y” pierwszymi znakami „@” wejścia „@y” niczym, jednocześnie zwiększając „@”.

jeśli zastąpisz „ab” w „ababab” niczym, masz pusty ciąg

Ostatecznie wynik będzie pusty. Jeśli dzieje się tak, gdy zmienna pętli jest równa długości varchara, kryterium jest fałszywe / 0, ponieważ „@” = len (@y) (nie było powtarzającego się varchara).

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

można w to zagrać w golfa

@/len(@y)^1

ponieważ długość „@y” nie może wynosić 0, a „@” nigdy nie przekroczy długości @y.

Wypróbuj online

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.