Apakah ini berulang?

20

Sederetan karakter berulang jika berisi dua substring berturut-turut yang setara.

Misalnya, 2034384538452ulangi karena mengandung 3845dua kali, berturut-turut.

Oleh karena itu, tantangan Anda adalah memutuskan apakah string berisi substring berulang. Anda dapat mengambil input sebagai string atau array karakter.

Anda tidak akan pernah menerima input kosong, dan panjang substring (jika ada) mungkin 1 atau lebih.

Saya menggunakan 1dan di 0sini sebagai nilai-nilai kebenaran dan kepalsuan saya, tetapi Anda dapat menggunakan nilai-nilai yang berbeda, selama mereka benar dan salah dalam bahasa Anda.

Contoh:

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

(Contoh terakhir dihasilkan dari jumlah yang di antara setiap nol dalam urutan Thue-Morse)

Okx
sumber
2
Bisakah saya menggunakan nilai yang tidak konsisten, asalkan masih benar atau salah?
Erik the Outgolfer
@EriktheOutgolfer Tentu saja
Okx
@trichoplax Saya pikir maksudnya adalah berturut-turut urutan panjang> = 1.
Erik the Outgolfer
@EriktheOutgolfer "consecutive" adalah kata yang saya lewatkan. Terima kasih - sangat masuk akal sekarang.
trichoplax
Bisakah kita menghasilkan 1 untuk falsey dan 0 untuk kebenaran?
Kritixi Lithos

Jawaban:

12

Retina , 6 byte

(.+)\1

Cobalah online!

Nilai positif untuk kebenaran; nol untuk falsey.

Bagaimana itu bekerja

Mengembalikan jumlah kecocokan regex /(.+)\1/g.

Biarawati Bocor
sumber
10

Brachylog , 3 byte

s~j

Cobalah online!

s~j
s    exists a sublist of input
 ~j  which is the result of a juxtaposition of something
Biarawati Bocor
sumber
7

Jelly , 6 5 byte

Ẇµ;"f

Ini adalah program lengkap. TIO tidak dapat menangani test case terakhir tanpa memotongnya.

Cobalah online! (test case terakhir dipotong hingga 250 digit)

Bagaimana itu bekerja

Ẇµ;"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.
Dennis
sumber
5

Mathematica, 32 byte

StringMatchQ[___~~x__~~x__~~___]
alephalpha
sumber
Tidakkah ini mengharuskan subsegmen string berulang berdekatan?
DavidC
1
@Svetlana, Anda benar! Saya belum memperhitungkan abcab-> 0.
DavidC
1
StringContainsQ[x__~~x__]dan !StringFreeQ[#,x__~~x__]&keduanya lebih pendek.
ngenisis
5

Java, 27 byte

a->a.matches(".*(.+)\\1.*")

Cukup banyak duplikat dari jawaban Retina , tetapi tidak mungkin Java semakin pendek.

Nathan Merrill
sumber
5

05AB1E , 5 byte

Œ2×åZ

Cobalah online!

Output 1 sebagai nilai kebenaran dan 0 sebagai nilai palsu

Penjelasan

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

Python , 38 byte

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

Cobalah online!

Menguap, sebuah regex. Cek apakah string berisi string salah satu karakter lebih .+diikuti oleh string yang sama yang baru saja diambil. Objek pencarian output adalah Truthy jika setidaknya ada satu kecocokan, seperti yang bisa diperiksa oleh bool.

Menggunakan di compilesini menghemat daripada menulis lambda:

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

Python , 54 byte

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

Cobalah online!

Mencari substring yang terdiri dari dua atau lebih string yang sama digabungkan, sebagaimana dicentang s in(s*2)[1:-1]seperti dalam jawaban ini . Substring dihasilkan secara rekursif dengan memilih untuk memotong karakter pertama atau terakhir. Ini eksponensial, sehingga habis pada kasus uji besar.

Hampir celaka:

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)

Yang pertama tidak menggunakan Python inuntuk memeriksa substring, dan bisa disesuaikan dengan bahasa lain.

Tidak
sumber
4

Pyth - 10 9 8 byte

f}+TTQ.:

Mengembalikan daftar semua substring berulang (yang jika tidak ada, adalah daftar kosong, yang palsu)

Cobalah

Penjelasan:

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
Maria
sumber
1
Jika Anda menganggap bahwa input dalam tanda kutip f}+TTQ.:bekerja dari 1 Byte kurang: tautan
KarlKastor
3

Cheddar , 60 byte

n->(|>n.len).any(i->(|>i).any(j->n.index(n.slice(j,i)*2)+1))

Cobalah online!

Biarawati Bocor
sumber
Anda dapat bermain golf:@.test(/(.+)\1/)
Downgoat
@Downgoat Anda harus mengirimkannya sebagai jawaban lain, sungguh.
Leaky Nun
3

PHP , 32 byte

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

Cobalah online!

PHP , 38 byte

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

Cobalah online!

Jörg Hülsermann
sumber
2

Perl 6 , 11 byte

{?/(.+)$0/}

Menguji

Diperluas:

{        # 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
  /
}
Brad Gilbert b2gills
sumber
2

PHP, 32 byte

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

Jalankan sebagai pipa dengan -F. Maaf Jorg, saya tidak memperhatikan Anda telah memposting yang sama .

versi non-regex, 84 82 byte

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

keluar dengan kode pengembalian 0untuk pengulangan, waktu habis (dan keluar dengan kesalahan) untuk tidak ada. Jalankan sebagai pipa dengan -nr.
mengasumsikan input ASCII yang dapat dicetak; menggantikan~ dengan a&untuk ASCII.

Titus
sumber
1

JavaScript (ES6), 19 byte

s=>/(.+)\1/.test(s)
Shaggy
sumber
Bagaimana dengan /(.+)\1/.test?
Luke
Itu yang saya miliki, @ Lukas.
Shaggy
@ Shaggy, saya yakin maksudnya /(.+)\1/.testadalah pengiriman lengkap.
Leaky Nun
@ Lukas /(.+)\1/.testtidak terikat (tidak memiliki this). f=/(.+)\1/.test;f('aa')tidak akan bekerja, misalnya. Anda perlu/./.test.bind(/(.+)\1/)
Artyer
Anda dapat bermain golf ke: ::/(.+)\1/.test(15 byte)
Downgoat
1

V , 6 byte

ø¨.«©±

Cobalah online!

Test Suite!

Output program 0untuk nilai falsey, dan bilangan bulat positif untuk nilai positif.

(Perhatikan bahwa ada bug kecil, jadi saya harus mendapatkan 1 byte. Sekarang setelah perbaikan bug, saya akan dapat mengganti dengan \x82)

Penjelasan

ø                     " 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
Kritixi Lithos
sumber
1

Japt, 8 + 1 = 9 8 byte

f"(.+)%1

Cobalah online . Output nulluntuk falsy, dan array yang berisi semua string berulang untuk kebenaran.

Penjelasan

 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
Luke
sumber
Nilai output yang tidak konsisten diizinkan sehingga Anda dapat menggunakan èuntuk mengembalikan jumlah kecocokan dan menjatuhkan bendera.
Shaggy
Ya. Saya juga bisa menjatuhkan bendera untuk mengembalikan pertandingan itu sendiri, karena tidak ada pertandingan yang kembali null, yang palsu.
Luke
Untuk input 00, output 00. Apakah Anda yakin ini benar di Japt?
Okx
@ OKK String "00"adalah.
ETHproduk
@Okx; coba ini . The -Qbendera "prettyprints" output sehingga Anda dapat melihat bahwa itu array yang berisi sebuah string tunggal.
Shaggy
0

Cheddar, 16 byte

@.test(/(.+)\1/)

Ini sebuah fungsi. Cobalah online!

Downgoat
sumber