Tekrar ediyor mu?


20

Eşdeğer iki ardışık alt dize içeriyorsa, bir karakter dizisi tekrarlanır.

Örneğin , art arda iki kez 2034384538452içerdiğinden tekrar eder 3845.

Bu nedenle, zorluğunuz bir dizenin yinelenen bir alt dize içerip içermediğine karar vermektir. Girişi dize veya karakter dizisi olarak alabilirsiniz.

Asla boş bir giriş almazsınız ve alt dizenin uzunluğu (varsa) 1 veya daha fazla olabilir.

Kullandığım 1ve 0burada benim truthy ve falsy değerler olarak, ancak yeter ki kendi dilinizde truthy ve falsy gibi, farklı değerler kullanabilir.

Örnekler:

abcab -> 0
bdefdefg -> 1
Hello, World! -> 1
pp.pp/pp -> 1
q -> 0
21020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021012102012101202102012021012102012021020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020120210201210120210201202101210201210120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120 -> 0

(Son örnek, Thue-Morse dizisindeki her bir sıfır arasındaki miktardan üretildi)


2
Hala uygun şekilde doğruluk veya falsey oldukları sürece tutarsız değerler kullanabilir miyim?
Outgolfer Erik

@EriktheOutgolfer Tabii ki
Okx

@trichoplax Sanırım uzun ardışık diziler anlamına geliyor> = 1.
Outgolfer Erik

@EriktheOutgolfer "ardışık" kaçırdığım kelime oldu. Teşekkür ederim - şimdi çok mantıklı.
trichoplax

Bunun yerine falsey için 1, doğruluk için 0 verebilir miyiz?
Kritixi Lithos

Yanıtlar:




7

Jöle , 6 5 bayt

Ẇµ;"f

Bu tam bir program. TIO, son test senaryosunu kesmeden işleyemez.

Çevrimiçi deneyin! (son test durumu 250 haneye kesildi)

Nasıl çalışır

Ẇµ;"f  Main link. Argument: s (string)

Ẇ      Words; generate all substrings of s.
 µ     New chain. Argument: A (substring array)
  ;"   Vectorized concatenation; concatenate each substring with itself.
    f  Filter; keep "doubled" substrings that are also substrings.
       This keeps non-empty string iff the output should be truthy, producing
       non-empty output (truthy) in this case and empty output (falsy) otherwise.

5

Mathematica, 32 bayt

StringMatchQ[___~~x__~~x__~~___]

Bu, yinelenen dize alt bölümlerinin bitişik olmasını gerektirmez mi?
DavidC

1
@Svetlana, haklısın! Abcab-> 0'ı dikkate almamıştım.
DavidC

1
StringContainsQ[x__~~x__]ve !StringFreeQ[#,x__~~x__]&ikisi de daha kısadır.
ngenisis


5

05AB1E , 5 bayt

Œ2×åZ

Çevrimiçi deneyin!

1 doğruluk değeri ve 0 yanlış değer olarak çıktılar

açıklama

Œ2×åZ
Œ     # Substrings of input
 2×   # duplicate them (vectorized)
   å  # Is the element in the input? (vectorized)
    Z # Maximum value from list of elements

4

Python , 38 bayt

import re
re.compile(r'(.+)\1').search

Çevrimiçi deneyin!

Esneme, bir normal ifade. Dizenin, daha fazla karakterden birinin dizesini ve .+ardından yakalanan dizenin tümünü içerip içermediğini kontrol eder . Kontrol edilebileceği gibi en az bir eşleşme varsa çıkış arama nesnesi Doğrudur bool.

compileBurada kullanmak lambda yazmaktan tasarruf sağlar:

lambda s:re.search(r'(.+)\1',s)

Python , 54 bayt

f=lambda s:s>''and(s in(s*2)[1:-1])|f(s[1:])|f(s[:-1])

Çevrimiçi deneyin!

Tarafından kontrol olarak, birleştirilmiş iki veya daha fazla eşit dizeleri oluşan bir alt dize arar s in(s*2)[1:-1]gibi bu cevap . İlk veya son karakteri kesmek seçilerek alt dizeler yinelemeli olarak oluşturulur. Bu üsteldir, bu nedenle büyük test durumunda zaman aşımına uğrar.

Yakından ıska:

f=lambda s,p='':s and(s==p)*s+f(s[1:],p+s[0])+f(s[:-1])
f=lambda s,i=1:s[i:]and(2*s[:i]in s)*s+f(s[1:])+f(s,i+1)

Birincisi inalt dizeleri kontrol etmek için Python'ları kullanmaz ve bu nedenle diğer dillere uyarlanabilir.


4

Pyth - 10 9 8 bayt

f}+TTQ.:

Yinelenen tüm alt dizelerin bir listesini döndürür (yoksa, boş olan boş bir listedir)

Dene

Açıklama:

f}+TTQ.:
      .:    # All substrings of the input (implicit):
f           # filter the list of substrings T by whether...
  +TT       # ...the concatenation of the substring with itself...
 }   Q      # ...is a substring of the input

1
f}+TTQ.:
Girdinin




2

Perl 6 , 11 bayt

{?/(.+)$0/}

Dene

Expanded:

{        # bare block lambda with implicit parameter 「$_」

  ?      # Boolify the following
         # (need something here so it runs the regex instead of returning it)

  /      # a regex that implicitly matches against 「$_」
    (.+) # one or more characters stored in $0
     $0  # that string of characters again
  /
}

2

PHP, 32 bayt

<?=preg_match('#(.+)\1#',$argn);

İle boru olarak çalıştırın -F. Üzgünüm Jörg ben Sen ettim ödediyse -ki aynı gönderildi .

normal olmayan sürüm, 84 82 bayt

    for($s=$argn;++$e;)for($i=0;~$s[$i];)substr($s,$i,$e)==substr($s,$e+$i++,$e)&&die

0bir tekrar için dönüş kodu ile çıkar, hiçbiri için zaman aşımına uğrar (ve hata ile çıkar). İle boru olarak çalıştırın -nr.
yazdırılabilir ASCII girişini varsayar; yerine ~sahip a&herhangi ASCII için.


1

JavaScript (ES6), 19 bayt

s=>/(.+)\1/.test(s)

Nasıl /(.+)\1/.test?
Luke

Elimde olan bu, @ Luka.
Shaggy

@Shaggy Bence /(.+)\1/.testtam bir teslim olma anlamına geliyor .
Leaky Nun

@ Luke /(.+)\1/.testbağlı değil (hayır this). f=/(.+)\1/.test;f('aa')örneğin, işe yaramaz. Sen gerekir/./.test.bind(/(.+)\1/)
Artyer

Golf sahası için: ::/(.+)\1/.test(15 bytes)
Downgoat


1

V , 6 bayt

ø¨.«©±

Çevrimiçi deneyin!

Test odası!

Program 0, falsey değerleri için ve pozitif değerler için pozitif bir tamsayı verir.

(Küçük bir hata olduğunu unutmayın, bu yüzden 1 bayt kazanmak zorunda kaldı. Şimdi bugfix sonra ben yerine mümkün olacak olan \x82)

açıklama

ø                     " This is a recent addition to V. This command takes in a regex
                      " and replaces the line with the number of matches of the regex
 ¨.«©±                " The compressed regex. This decompresses to \(.\+\)\1

1

Japt, 8 + 1 = 9 8 bayt

f"(.+)%1

Çevrimiçi deneyin . çıktılarnullFalsy ve doğruluk için yinelenen tüm dizeleri içeren bir dizi.

açıklama

 f"(.+)%1
Uf"(.+)%1" # Implicit input and string termination
Uf         # Find in the input
  "(.+)%1" #   a sequence followed by itself
 f         # and return the matched substring
           # output the return value

Tutarsız çıktı değerlerine izin verilir, böylece èeşleşme sayısını döndürmek ve bayrağı bırakmak için kullanabilirsiniz.
Shaggy

Evet. Ayrıca, maçın kendisini döndürmek için bayrağı bırakabilirim, çünkü hiçbir eşleşme geri dönmez null, ki bu falsidir.
Luke

Giriş 00için çıktı alır 00. Bunun Japt'te gerçek olduğundan emin misiniz?
Okx

@Okx Dize "00".
ETHproductions

@Okx; denemek bu . -QBayrak "prettyprints" Eğer tek bir dize içeren bir dizidir olduğunu çıkışı görebilirsiniz.
Shaggy

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.