Controlla se una stringa è interamente realizzata con la stessa sottostringa


24

Questo è tratto da questa domanda (con il permesso del corso). Citerò:

Creare una funzione che accetta una stringa e dovrebbe restituire vero o falso in base al fatto che l'input sia costituito solo da una sequenza di caratteri ripetuta. La lunghezza di una determinata stringa è sempre maggiore di 1 e la sequenza di caratteri deve avere almeno una ripetizione.

Qualche esempio:

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

In particolare, il controllo per una stringa rigorosamente composta da sottostringhe ripetute ( Aggiornamento ) può generare qualsiasi rappresentazione vera o falsa, ma per favore nessun output di errore. Stringhe rigorosamente alfanumeriche. Altrimenti regole standard per il golf del codice. Questo è Code Golf, quindi vince la risposta più breve in byte per ogni lingua.


4
Hm, stavo per chiudere questa sfida come un duplicato di quella , ma ho notato che l'altro segna sul conteggio dei personaggi. Quindi forse dovremmo chiudere l'altro (ha anche una risposta accettata) come duplicato di questo invece.
Erik the Outgolfer,

Risposte:


11

Brachylog , 4 3 byte

ġ=Ṁ

Provalo online!

Spiegazione

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

Il programma stampa true.se i vincoli possono essere soddisfatti e in false.caso contrario.


Stavo solo lottando per cercare di ottenere qualcosa di simile ~j↙o di =Ṁclavoro prima che mi accorgessi che lo hai pubblicato un'ora fa
Unrelated String

4
Oh, sì, questo potrebbe essere più corto di un byte:ġ=Ṁ
Stringa non correlata

( è una variabile vincolata ad un elenco di due o più elementi)
Stringa non correlata

1
@UnrelatedString Ottimo, grazie! Non pensavo di controllare la pagina wiki delle variabili.
Zgarb,

1
Molte grandi risposte, e la risposta LUA ha un posto speciale nel mio cuore. La risposta di Arnauld è particolarmente dolce poiché la domanda originale su cui ho basato questo (non il dupe) è in realtà taggata Javascript. Selezionando principalmente questo solo perché sembra essere il più breve per tutte le lingue e, poiché questa è la mia prima domanda, ottengo un badge.
ouflak,

19

JavaScript (ES6), 22 byte

Restituisce un valore booleano.

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

Provalo online!


Senza un'espressione regolare,  33  29 byte

Restituisce null(falsa) o un oggetto (verità).

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

Provalo online!

NB: Tecnicamente, s viene convertito in un'espressione regolare per match () , quindi il titolo sopra è una bugia.


9

grep, 19

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

Test

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

Produzione:

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

9

Japt , 6 byte

²é ¤øU

Salvato un byte grazie a @Shaggy

Provalo 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

Bello :) È possibile sostituire il p<space>con ²per salvare un byte.
Shaggy

9

Java, 25 24 byte

-1 byte grazie a Olivier Grégoire!
Risposta regex noiosa

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

Provalo online!

È solo 1 byte più lungo della risposta python aaaaa Sono legato ora :)


3
È possibile rimuovere il finale $poiché il matchesmetodo è una corrispondenza esatta, non una corrispondenza di sottostringa per impostazione predefinita.
Olivier Grégoire,

Ho dimenticato di matchesaggiungere il proprio $al regex. Grazie!
Benjamin Urquhart,

7

Excel, 26 byte

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

Ingressi da A1, output in qualunque cella metti questa formula.


È possibile salvare 4 byte se si definisce un nome di intervallo di una sola lettera (ad es. A) E lo si imposta come input.
i_saw_drones,

@i_saw_drones - Penso che non sia consentito dalle regole I / O standard: ecco un link alla meta risposta che si applicherebbe a quel metodo; è attualmente a -36 voti.
Sophia Lechner,

Scuse che non avevo visto quel post, anche se a pensarci bene, non è A1anche una "variabile" poiché contiene il valore di input? :)
i_saw_drones il

1
Mi sentirei in questo modo se stessi facendo qualcosa di speciale con il fatto che è specificamente A1, come se mi fossi affidato in qualche modo al suo ROW (_) essendo 1. Come è, tuttavia, è solo il modo più naturale di fornire una funzione Excel con un input arbitrario.
Sophia Lechner,

7

R , 28 byte

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

Provalo online!

Versione Regex semplice. R è (a volte) molto simile a Python, quindi è simile alla risposta regex di TFeld Python 2, anche se più breve!

Domanda (se qualcuno conosce la risposta)

Sono ancora confuso perché questo funziona, poiché la sottostringa può essere di qualsiasi lunghezza e funzionerà sempre, e funziona ancora quando aggiungo una lettera all'inizio di una stringa valida, come "cABABABABAB". Se leggo personalmente la regex, vedo (.+), che cattura qualsiasi gruppo di qualsiasi lunghezza. E poi \\1+$che ripete il gruppo catturato un numero qualsiasi di volte fino alla fine.

Quindi perché non cattura solo "AB" e scopre che viene ripetuto fino alla fine della stringa, soprattutto perché non è stata specificata alcuna restrizione su dove può iniziare la sottostringa?


1
Interessante, questo sembra essere un bug nel motore regex di R. L'aggiunta dell'opzione perl=TRUEfa corrispondere cABABAB, come ci si aspetterebbe. L'esecuzione grep -E '(.*)\1+$'in bash corrisponde anche a cABABAB, anche se grep -Eusa ERE, lo stesso sapore regex che R dovrebbe supportare.
Grimmy,

2
La mia ipotesi è che si tratti di un'ottimizzazione applicata in modo errato. Cambiare .+all'inizio di un modello in ^.+è un'ottimizzazione importante, ma se .+è dentro l'acquisizione di parentesi, smette di essere valida.
Grimmy,


6

Gelatina ,  5  4 byte

Vedo ora che il modo ottimale è seguire il metodo di xnor !

Ḋ;Ṗw

Un collegamento monadico che accetta un elenco di caratteri e genera un numero intero: la lunghezza più breve possibile di una sezione ripetuta o zero se non esiste. Nota che zero è falso mentre i numeri diversi da zero sono veri in Jelly.

Provalo online!

Come?

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

+1 byte per abbinare completamente le regole

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

Provalo online!

Piuttosto noioso. Basato sulle altre risposte Regex. Fortunatamente PowerShell non usa \come personaggio di escape!


ritorna trueperaabcabc
mazzy

1
@mazzy ha appena risolto!
Gabriel Mills,

3

C # (compilatore interattivo Visual C #) , 70 byte

adattamento spudorato di xnor ( 46 byte )

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

La mia soluzione non Regex:

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

Spiegazione:

Sostituisci ogni possibile sottostringa che inizia all'indice 0 con una stringa vuota. Se il risultato è una stringa vuota, la stringa è interamente composta da quella sottostringa. Poiché ciò include la valutazione dell'intera stringa con se stessa, la quantità di risultati previsti deve essere maggiore di 1.

Esempio: abcabc

Possibili sottostringhe a partire dall'indice 0:

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

Se li sostituiamo con stringhe vuote

Substring          Result

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

Poiché esiste una sottostringa diversa da "abcabc" che restituisce una stringa vuota, la stringa è interamente costituita da un'altra sottostringa ("abc")

Provalo online!


3

Python 3 , 62 60 56 54 byte

-4 byte grazie ad ArBo

lambda s:s in(len(s)//l*s[:l]for l in range(1,len(s)))
  1. Scorrere su tutti i possibili prefissi nella stringa.
  2. Prova a costruire la stringa fuori dal prefisso.
  3. Restituisci se questo ha successo con qualsiasi prefisso.

Provalo online!


1
Bella risposta! Il f=può essere lasciato cadere; Le funzioni anonime sono generalmente consentite. Inoltre, passando a Python 2 e controllando l'appartenenza a un elenco anziché al anycostrutto, è possibile arrivare a 55 byte
ArBo,

1
Bella cattura con l'appartenenza alla lista, grazie! Non passerò a Python 2, poiché è come cambiare la lingua, che ovviamente non è il punto qui;) Inoltre, c'è un modo conveniente per testare una funzione anonima in TIO, mantenendo il conteggio dei byte?
movatica,

1
@movatica Nell'intestazione, inserisci `f =` (\ è il carattere di continuazione della linea in python)
Artemis supporta Monica il

In modo fastidioso, \ è anche un personaggio di fuga. Qui, senza la formattazione del codice, è quello che dovresti mettere nell'intestazione: f = \
Artemis supporta Monica il

2

Japt , 10 byte

Restituisce un numero positivo se verità e 0 se falsa. Se vuoi un output bool, aggiungi semplicemente 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

Provalo online!


2

Buccia , 6 byte

Ṡ€ȯhtD

Provalo online!

Sento che questo è un byte in più rispetto all'ottimale, ma non sono riuscito a trovare un accordo che rendesse ȯsuperflua la composizione esplicita .

Spiegazione

Ṡ€      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¹evita il ȯ.
Zgarb,

È fantastico! Ci avevo pensato λ€htD¹ma non mi ero reso conto che Lambdas sarebbe stato aggiunto implicitamente
Sophia Lechner

2

Mathematica 11.x, 74 byte

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

dove, in tutto, #rappresenta la stringa di input e

StringCases[#,<pattern>]

trova sottostringhe della stringa di input corrispondenti al modello

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

Questo modello richiede corrispondenze, xdeve iniziare all'inizio della stringa e deve soddisfare la condizione che (1) la corrispondenza non sia l'intera stringa di input e (2) se sostituiamo le occorrenze della corrispondenza nella stringa di input con la stringa vuota otteniamo la stringa vuota. Infine, confrontando l'elenco delle corrispondenze con l'elenco vuoto,

{}!=

è Truese l'elenco delle corrispondenze è vuoto e Falsese l'elenco delle corrispondenze è vuoto.

Casi test:

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

e

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

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

Utilizza textwrap.wrap(grazie a questa risposta ) per dividere la stringa in pezzi di lunghezza nper testare ogni possibile lunghezza di sottostringa ripetuta. I pezzi divisi vengono quindi confrontati tra loro aggiungendoli a un set. Se tutti i pezzi sono uguali e il set è di lunghezza 1, la stringa deve essere una stringa ripetuta. Ho usato <2invece ==1perché salva un byte e la lunghezza della stringa di input è stata garantita maggiore di zero.

Se non esiste un numero nper cui le sottostringhe ripetute di lunghezza ncompongono l'intera stringa, restituisce false per l'intera funzione.


2

05AB1E , 5 byte

Il metodo di xnor della domanda precedente sembra essere ottimale anche in 05AB1E.

«¦¨så

Provalo online! o come una suite di test

Spiegazione

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

1
Certo .. Stavo per fare una risposta 05AB1E quando ho visto che non c'erano nessuno. Il collega mi ha fatto alcune domande e ha parlato della sua vacanza. Ripenso allo schermo: una nuova risposta. Tada, batti ancora XD
Kevin Cruijssen il

@KevinCruijssen: è tipico. Mi è successo anche un sacco di volte;)
Emigna il

2

Pulito , 73 byte

Non usa regex.

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

Provalo online!

Definisce $ :: [Char] -> Bool.
Verifica se la stringa specificata è un prefisso della ripetizione di qualsiasi sottostringa presa dalla fine.


2

C ++ (gcc) , 36 byte

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

Provalo online!

Un'altra porta della soluzione di xnor. Utilizza una macro per espandere l'argomento nell'espressione. Si presume che l'argomento sia di tipo std::string.


1

Variabile QlikView, 27 byte

Questo dovrebbe essere definito come una variabile, che consente quindi di passare parametri, ad esempio $1come valore di input.

Restituisce 0o -1(equivalente alla TRUE()funzione di QlikView ).

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





1

T-SQL, 47 byte

Usando il metodo di @ Xnor :

DECLARE @ varchar(max)='ababab'

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

Mantenere la vecchia risposta in quanto contiene un bel golf (67 byte):

DECLARE @y varchar(max)='abababa'

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

Spiegazione: Questo script tenta ripetutamente di sostituire l'input "@y" con i primi caratteri "@" dell'input "@y" con nulla, aumentando al contempo "@".

se sostituisci "ab" in "ababab" con nulla hai una stringa vuota

Alla fine il risultato sarà vuoto. Se ciò accade quando la variabile del ciclo è uguale alla lunghezza di varchar, i criteri sono falsi / 0 perché '@' = len (@y) (non c'era ripetizione varchar).

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

può essere giocato a golf in questo

@/len(@y)^1

perché la lunghezza di '@y' non può essere 0 e '@' non supererà mai la lunghezza @y.

Provalo online

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.