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)


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:




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.

5

Mathematica, 32 byte

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

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

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

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.


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

1
Jika Anda menganggap bahwa input dalam tanda kutip f}+TTQ.:bekerja dari 1 Byte kurang: tautan
KarlKastor




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
  /
}

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.


1

JavaScript (ES6), 19 byte

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

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

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.