มันซ้ำแล้วซ้ำอีก?


20

สตริงอักขระซ้ำหากมีสตริงย่อยสองรายการติดต่อกันที่เทียบเท่า

ตัวอย่างเช่น2034384538452ทำซ้ำเนื่องจากมี3845สองครั้งติดต่อกัน

ดังนั้นความท้าทายของคุณคือการตัดสินใจว่าสตริงมีสตริงย่อยที่ซ้ำกันหรือไม่ คุณอาจรับอินพุตเป็นสตริงหรืออาเรย์ของอักขระ

คุณจะไม่ได้รับอินพุตว่างเปล่าและความยาวของสตริงย่อย (ถ้ามี) อาจเป็น 1 หรือมากกว่า

ฉันใช้1และ0นี่เป็นค่าความจริงและเป็นเท็จของฉัน แต่คุณอาจใช้ค่าที่แตกต่างกันตราบใดที่พวกเขามีความจริงและเป็นเท็จในภาษาของคุณ

ตัวอย่าง:

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

(ตัวอย่างสุดท้ายถูกสร้างขึ้นจากจำนวนของแต่ละศูนย์ในลำดับ Thue-Morse)


2
ฉันสามารถใช้ค่าที่ไม่สอดคล้องกันได้ตราบใดที่พวกเขายังคงเป็นความจริงหรือเท็จ
Erik the Outgolfer

@EriktheOutgolfer แน่นอน
Okx

@trichoplax ฉันคิดว่าเขาหมายถึงความยาวที่เรียงกัน> = 1
Erik the Outgolfer

@EriktheOutgolfer "ติดต่อกัน" เป็นคำที่ฉันพลาด ขอบคุณ - มันสมเหตุสมผลดีในขณะนี้
trichoplax

เราสามารถส่งออก 1 สำหรับความเท็จและ 0 สำหรับความจริงแทน?
Kritixi Lithos

คำตอบ:




7

เยลลี่ , 6 5 ไบต์

Ẇµ;"f

นี่เป็นโปรแกรมเต็ม TIO ไม่สามารถจัดการกับกรณีทดสอบล่าสุดได้โดยไม่ต้องตัดทอน

ลองออนไลน์! (กรณีทดสอบล่าสุดถูกตัดเหลือ 250 หลัก)

มันทำงานอย่างไร

Ẇµ;"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 ไบต์

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

สิ่งนี้ไม่ต้องการหรือไม่ที่ส่วนย่อยของสตริงการทำซ้ำจะอยู่ติดกัน?
DavidC

1
@Svetlana คุณถูกต้อง! ฉันไม่ได้นำ abcab-> 0 มาพิจารณา
DavidC

1
StringContainsQ[x__~~x__]และ!StringFreeQ[#,x__~~x__]&สั้นกว่า
ngenisis


5

05AB1E , 5 ไบต์

Œ2×åZ

ลองออนไลน์!

เอาต์พุต 1 เป็นค่าจริงและ 0 เป็นค่าเท็จ

คำอธิบาย

Œ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 ไบต์

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

ลองออนไลน์!

หาว, regex ตรวจสอบว่าสตริงมีสตริงของอักขระอย่างน้อยหนึ่งตัว.+ตามด้วยสตริงเดียวกันกับที่เพิ่งถูกดักจับ วัตถุค้นหาผลลัพธ์เป็นความจริงหากมีอย่างน้อยหนึ่งรายการที่ตรงกันซึ่งสามารถตรวจสอบboolได้

การใช้compileที่นี่จะช่วยประหยัดมากกว่าการเขียนแลมบ์ดา:

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

Pythonขนาด 54 ไบต์

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

ลองออนไลน์!

ค้นหาสตริงย่อยที่ประกอบกันอย่างน้อยสองสตริงที่ต่อกันตามที่ตรวจสอบโดยs in(s*2)[1:-1]ในคำตอบนี้ สตริงย่อยถูกสร้างขึ้นซ้ำโดยเลือกที่จะตัดอักขระตัวแรกหรืออักขระสุดท้าย นี่เป็นเลขยกกำลังจึงหมดเวลาในกรณีทดสอบขนาดใหญ่

ใกล้คิดถึง:

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)

คนแรกไม่ได้ใช้ Python inเพื่อตรวจสอบสตริงย่อยและสามารถปรับใช้กับภาษาอื่นได้


4

Pyth - 10 9 8 ไบต์

f}+TTQ.:

ส่งคืนรายการของสตริงย่อยที่ทำซ้ำทั้งหมด (ซึ่งหากไม่มี) จะเป็นรายการว่างเปล่าซึ่งเป็นเท็จ

ลองมัน

คำอธิบาย:

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.:ทำงานได้ตั้งแต่ 1 ไบต์น้อยกว่า: ลิงก์
KarlKastor




2

Perl 6 , 11 ไบต์

{?/(.+)$0/}

ทดสอบมัน

ขยาย:

{        # 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 ไบต์

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

-Fทำงานเป็นท่อด้วย ขออภัยJörgผม hadn't สังเกตเห็นคุณได้โพสต์เดียวกัน

รุ่นที่ไม่ใช่ regex, 84 82 ไบต์

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

ออกด้วยรหัสส่งคืน0สำหรับการทำซ้ำหมดเวลา (และออกโดยมีข้อผิดพลาด) สำหรับไม่มี -nrทำงานเป็นท่อด้วย
ถือว่าอินพุต ASCII ที่พิมพ์ได้; แทนที่~ด้วยa&สำหรับ ASCII ใด ๆ


1

JavaScript (ES6), 19 ไบต์

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

แล้วไง/(.+)\1/.testล่ะ
ลุค

นั่นคือสิ่งที่ฉันมี @Luke
Shaggy

@Shaggy ฉันเชื่อว่าเขาหมายถึงว่า/(.+)\1/.testตัวเองเป็นคนสมบูรณ์แบบ
Leun Nun

@Luke /(.+)\1/.testไม่ได้ผูกไว้ (ไม่มีthis) f=/(.+)\1/.test;f('aa')ตัวอย่างเช่นจะไม่ทำงาน คุณจะต้อง/./.test.bind(/(.+)\1/)
Artyer

คุณสามารถเล่นกอล์ฟไปที่: ::/(.+)\1/.test(15 bytes)
Downgoat


1

V , 6 ไบต์

ø¨.«©±

ลองออนไลน์!

ชุดทดสอบ!

โปรแกรมแสดงผล0สำหรับค่าความผิดพลาดและจำนวนเต็มบวกสำหรับค่าบวก

(โปรดทราบว่ามีข้อผิดพลาดเล็ก ๆ ดังนั้นฉันต้องได้รับ 1 ไบต์ตอนนี้หลังจากแก้ไขข้อผิดพลาดฉันจะสามารถแทนที่ด้วย\x82)

คำอธิบาย

ø                     " 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 ไบต์

f"(.+)%1

ลองมันออนไลน์ เอาท์พุทnullสำหรับ falsy และอาร์เรย์ที่มีสตริงการทำซ้ำทั้งหมดสำหรับความจริง

คำอธิบาย

 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

อนุญาตให้ใช้ค่าเอาต์พุตที่ไม่สอดคล้องกันดังนั้นคุณสามารถใช้èเพื่อส่งคืนจำนวนการจับคู่และปล่อยแฟล็ก
Shaggy

ใช่. ฉันสามารถวางธงเพื่อคืนการแข่งขันเองได้เนื่องจากไม่มีการแข่งขันส่งคืนnullซึ่งเป็นเท็จ
ลุค

สำหรับการป้อนข้อมูลมันจะออกผลลัพธ์00 00คุณแน่ใจหรือว่านี่เป็นความจริงใน Japtup?
Okx

@Okx สตริง"00"คือ
ETHproductions

@Okx; ลองนี้ -Qธง "prettyprints" การส่งออกเพื่อให้คุณสามารถเห็นว่ามันเป็นอาร์เรย์ที่มีสายเดียว
Shaggy

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.