กอล์ฟเพื่อค้นหาหมายเลขที่น่าเบื่อ


22

หากจำนวนเต็มมีตัวเลข / ลำดับของตัวเลขซึ่งทำซ้ำอย่างต่อเนื่อง (คุณจะเข้าใจว่าทำไมฉันถึงพูดว่า "ต่อเนื่อง") 5 ครั้งขึ้นไปเราเรียกมันว่า "น่าเบื่อ"

ตัวอย่างเช่น11111Boring 12345ไม่เป็นเช่นนั้น

คำแนะนำ

รับจำนวนเต็มเป็นอินพุต

ส่งออกค่าความจริงหากจำนวนเต็มน่าเบื่อและค่าเท็จถ้าจำนวนเต็มไม่น่าเบื่อ

ตัวอย่าง

11111=> trueหรือ1(1 ซ้ำ 5 ครั้ง)

12345=> falseหรือ0

1112111=> falseหรือ0

4242424242=> trueหรือ1(42 ซ้ำ 5 ครั้ง)

-11111=> trueหรือ1

3452514263534543543543543543876514264527473275=> trueหรือ1(543 ซ้ำ 5 ครั้ง)

หากคุณใช้ "ความจริง" และ "เท็จ" ประเภทอื่นให้ระบุ

กฎระเบียบ

บังคับใช้กฎพื้นฐานของ

โชคดี!


เป็นที่1112111น่าเบื่อ?
Leun Nun

1
เป็นที่4242424242น่าเบื่อ?
ทำให้เสียชีวิต

4242424242 เป็นที่น่าเบื่อ 1112111 ไม่ได้

22
ฉันเดาว่าวันนี้เป็นวันของตัวเลขที่ไม่มีใครชอบ :)
Seims

12
การพูดอย่างเคร่งครัดตัวเลขทั้งหมดน่าเบื่อเนื่องจากพวกเขาทั้งหมดสามารถเขียนได้ด้วยเลขศูนย์นำหน้าโดยพลการ :-)
celtschk

คำตอบ:


13

05AB1E , 8 ไบต์

รหัส:

Œv¹y5×åO

คำอธิบาย:

Œ         # Compute all substrings from the input.
 v        # For each substring.
   y5×    # Repeat the substring 5 times (42 × 5 = 4242424242).
  ¹   å   # Check if it's in the input string.
       O  # Sum up the result. Non-boring numbers should give 0.

ความจริงไม่ใช่ศูนย์และความเท็จเป็นศูนย์ ใช้การเข้ารหัสCP-1252

ลองออนไลน์!


1
การใช้งานที่ดีรวมกับŒ ×
Emigna

1
@Adnan การทำงานที่ดี! c =

23

เรติน่า 9 ไบต์

(.+)\1{4}

ยืนยันผลการทดสอบทั้งหมด! (แก้ไขเล็กน้อยเพื่อเรียกใช้การทดสอบทั้งหมดในครั้งเดียว)


4
เดี๋ยวก่อนคนกำลังทำสิ่งนี้เร็ว

ฉันช้าเกินไปที่จะโพสต์สิ่งนี้ รู้ Retina จะรักความท้าทายนี้ :)
Emigna

@Emigna ขอโทษ xd
Leaky Nun

1
@LuisMendo นั่นไม่ตรงกับ 5+ อะไรเลยไม่ว่าจะเหมือนกันหรือเปล่า? ตัวอย่างเช่นมันจะจับคู่12345
Emigna

4
@LuisMendo (.+){5}ขยายไป(.+)(.+)(.+)(.+)(.+)ในขณะที่การขยายตัวไป(.+)\1{4} (.+)\1\1\1\1
Leun Nun

7

Java 8, 52 ไบต์

s->s.matches(".*(.+)\\1{4}.*")

Outgolfed นี้ Java 8 คำตอบString#matchesด้วยโดยตรง

คำอธิบาย:

ลองที่นี่

s->              // Method with String parameter and boolean return-type
  s.matches(     //  Return whether the entire String matches the following regex:
    ".*          //   0 or more leading characters
     (.+)\\1{4}  //   group of 1 or more characters, repeated 5 times
     .*")        //   0 or more trailing characters


4

Lua, 35 ไบต์

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

print((...):match("(%d+)%1%1%1%1"))

4

JavaScript ขนาด 16 ไบต์

ใน node.js (60 ไบต์)

process.stdin.on('data',t=>console.log(/(.+)\1{4}/.test(t)))

การสิ้นเปลืองตันบนอินพุต / เอาต์พุต

JavaScript ES6 (33 ไบต์)

alert(/(.+)\1{4}/.test(prompt()))

การสูญเสียไบต์บนอินพุต / เอาต์พุตอีกครั้ง

ควรเป็นฟังก์ชั่นที่ไม่ระบุชื่อ (22 ไบต์)

n=>/(.+)\1{4}/.test(n)

หรือสั้นกว่า ( 16 ไบต์ )

/(.+)\1{4}/.test

ขอบคุณ @BusinessCat ที่ชี้ให้เห็นข้อผิดพลาดของฉัน


1
คุณสามารถใช้/(.+)\1{4}/.test(n)แทนการmatchบันทึกสองสามไบต์ นอกจากนี้ยังไม่ดูเหมือนว่าสิ่งนี้จะส่งออกจริง
แมวธุรกิจ

@ BusinessCat คุณพูดถูกฉันคิดว่าฉันคิดถึงคำถามนั้น ขอบคุณสำหรับคำแนะนำ
charredgrass

คุณไม่จำเป็นต้องใช้อินพุตมาตรฐานคุณสามารถใช้ฟังก์ชันอาร์กิวเมนต์
cat

2
Uncaught TypeError: Method RegExp.prototype.test called on incompatible receiver undefined. ฉันไม่แน่ใจว่าในทางเทคนิคแล้วนับเป็นคำตอบที่ถูกต้องมันจะต้องเป็นอะไร/./.test.bind(/(.+)\1{4}/)ไหม?
Patrick Roberts

คำถามระบุว่า "หมายเลขใด ๆ ซ้ำ ๆ 5 ครั้งขึ้นไป " คือ Boring
แปรงสีฟัน

3

Python 3.5, 49 43 ไบต์:

( -6 ไบต์ขอบคุณคำแนะนำจากMartin Ender ! )

import re;lambda u:re.search(r'(.+)\1{4}',u)

ใช้ Expression ปกติเพื่อจับคู่ลำดับการซ้ำของอักขระทั้งหมดตราบใดที่พวกเขาทำซ้ำอย่างต่อเนื่อง 5 ครั้งขึ้นไป ส่งคืนreออบเจ็กต์การจับคู่ (เช่น<_sre.SRE_Match object; span=(0, 10), match='4242424242'>) หากพบว่าการจับคู่เป็นค่าจริงและไม่มีสิ่งใดหรือNoneเป็นค่าเท็จ

ลองออนไลน์! (Ideone)


3
อาที่ regex ยิ่งใหญ่

2
แทนที่{4,}โดย{4}?
Leun Nun

@LeakyNun ใช่นั่นมันก็ใช้ได้เหมือนกัน
R. Kap

อะไรคือ\1สิ่งที่ต้องทำหลังจากที่กลุ่ม regex หรือไม่
speedplane

@speedplane จับคู่เหตุการณ์ที่เกิดขึ้นภายหลังของการแข่งขันจากกลุ่ม
R. Kap

2

Perl, 17 15 ไบต์

$_=/(.+)\1{4}/

+ pธง

(วิ่งด้วยperl -pe '$_=/(.+)\1{4}/')

ขอขอบคุณที่ Dom Hasting สำหรับแทน(.+)(\d+)

คำอธิบายหากจำเป็น: (.+)จะจับคู่ส่วนใดส่วนหนึ่งของตัวเลขและ\1{4}$ค้นหาว่ามีการซ้ำซ้อน 4 ครั้งหรือไม่


ดีมาก แต่มีนักกอล์ฟที่ดีกว่าอยู่ที่นั่น มันยังคงดีอยู่

4
ฉันไม่แน่ใจว่า Perl สามารถทำได้ดีกว่านั้น ... และฉันยังคงต้องการส่งโซลูชัน Perl ดังนั้นนี่คือ
Dada

คุณสามารถเพิ่มคำอธิบายได้ไหม?

ฉันคิดว่าคุณอาจต้องการ$_=/(\d+)\1{4}/แทนที่จะเป็นที่111112น่าเบื่อ แต่จะไม่จับมัน คุณอาจสามารถใช้งานได้/./ตามคำตอบของ Retina
Dom Hastings

1
ใช่คุณพูดถูกฉันกำลังพยายามจับคู่ "หมายเลขที่น่าเบื่อมาก" เมื่อมีเพียงคนที่น่าเบื่อก็พอ
Dada

1

C # - 93 38 ไบต์

s=>new Regex(@"(.+)\1{4}").IsMatch(s);

รับสตริงคืนเป็นจำนวนเต็ม

ขอบคุณaloisdgสำหรับการบันทึกจำนวนมาก!


คุณสามารถใช้อาร์กิวเมนต์เป็นสตริงได้ซึ่งควรจะช่วยคุณประหยัดบางไบต์
Leun Nun

1
จะไม่@"(.+)\1{4}"ทำงานเป็น regex ด้วยหรือไม่ ทำในสภาพแวดล้อม C # ของฉันอย่างน้อย
Emigna

คุณสามารถใช้แลมบ์ดา มันได้รับอนุญาต s=>Syst...
aloisdg พูดว่า Reinstate Monica

@Emigna - มันจะทำงานได้อย่างแน่นอนโดยไม่คำนึงถึงสภาพแวดล้อม C # สิ่งใดก็ตามที่มี> 5 ตัวอักษรติดต่อกันจะสามารถใช้ได้กับ 5 ตัวอักษรติดต่อกัน
charredgrass

1
นอกจากนี้ผมคิดว่าเราควรจะสามารถที่จะเขียนs=>new Regex(@"(.+)\1{4}").IsMatch(s);เพราะเราอยู่ใน .NET (ซึ่ง STDLIB ของเขาของเรา) และเราไม่เคยนับหรือusing System.Linq; using System.Collections.Generic
aloisdg พูดว่า Reinstate Monica

1

Pyth , 9 8 ไบต์

1 ไบต์ต้องขอบคุณ Maltysen

เอสเอ็ม} * 5DQ .:
F} * 5TQ .:

ค่า Truthy เป็นอาร์เรย์ที่ไม่ว่างเปล่า

ค่า Falsey คือ[](อาร์เรย์ว่าง)

ชุดทดสอบ

f}*5TQ.:   input as a string stored in Q
f}*5TQ.:Q  implicit arguments
        Q  input
      .:   all substrings of.
f   T      filter for this condition, keep those returning true:
  *5           repeat five times
 }   Q         in Q? (True/False)

รับ 8 ไบต์โดยแทนที่mด้วยfและนำออกผลรวม
Maltysen

1

Mathematica, 46 40 36 ไบต์

b=a__;StringContainsQ[b~~b~~b~~b~~b]

ฟังก์ชัน สตริงเป็นอินพุทและเอาท์พุทหรือTrue Falseทดสอบสตริงกับนิพจน์a__~~a__~~a__~~a__~~a__ซึ่งแสดงถึงลำดับอักขระเดียวกันซ้ำ 5 ครั้ง สำหรับการอ้างอิงโซลูชันที่สั้นที่สุดที่ใช้ regex มีความยาว 45 ไบต์:

StringContainsQ@RegularExpression@"(.+)\1{4}"

คุณสาปแช่ง Regular Expression!


ใช้รูปแบบการจับคู่ที่ดี
ไมล์

1

PHP, 37 33 ไบต์

ขอบคุณ NoOne ที่นี่ฉันลืมไปแล้ว <?=

โปรแกรมสำหรับ PHP <5.4, พิมพ์1สำหรับตัวเลขที่น่าเบื่อ, 0อื่น ๆ

<?=preg_match('/(.+)\1{4}/U',$n);

การใช้งาน:

  • ชุดregister_globals=1ในphp.iniสำหรับ PHP-cgi
    แล้วโทรphp-cgi <filename> n=<number>;echo""
  • สำหรับ PHP> = 5.4 ให้แทนที่$nด้วย$_GET[n]

วิธีการแก้ปัญหาที่ไม่ regexp, 152 147 140 ไบต์

<?for($e=$n+1;--$e;)for($f=$e;$f--;)for($a=str_split(substr($n,$f),$e),$k=$c='';strlen($v=array_pop($a));)$c-$v?$k=0&$c=$v:($k++<3?:die(1));
  • ส่งกลับรหัสทางออก 1 สำหรับตัวเลขที่น่าเบื่ออีก 0
    แทนที่die(1)ด้วยdie(print 1)และต่อท้ายecho 0;เพื่อพิมพ์แทน
  • การใช้งานเดียวกันกับข้างต้น แต่ยังตั้งshort_open_tags=1ถ้าปิดการใช้งาน
  • วงรอบนอกมีค่าเริ่มต้นที่ไม่สมเหตุสมผลในการเล่นกอล์ฟแทนที่$n+1ด้วยceil(strlen($n)/5)+1หรืออย่างน้อยก็strlen($n)เพื่อการทดสอบหรืออาจวนซ้ำตลอดไป

1
<?=preg_match... สั้นลงสักสองสามตัว
NoOneIs ที่นี่

1

Haskell, 80 (63?)

มันจะเป็น 63 ถ้าไม่มีคำสั่งนำเข้า

import Data.List
f x=or$tail[isInfixOf(concat$replicate 5 b)x|b<-subsequences x]

การใช้

f "11111211"
f "11111"
f "12345" 
f "1112111"
f "4242424242"
f "-11111"
f "3452514263534543543543543543876514264527473275"

โดยวิธีการติดต่อกันทำให้รู้สึกมากกว่าฉันอย่างต่อเนื่อง

(ขออภัยฉันยังไม่สามารถแสดงความคิดเห็นได้)


1
ฉันหวังว่า upvote ของฉันช่วยให้คุณสามารถแสดงความคิดเห็นได้

0

MATLAB, 26 หรือ 13 ไบต์

s=int2str(i);all(s==s(1))

สิ่งนี้ใช้ตัวแปรจำนวนเต็ม 'i' สตริงเป็นเพียงส่วนสุดท้าย:

all(s==s(1))

ฉันนับบรรทัดใหม่เป็นตัวละคร


คุณต้องระบุอินพุตเช่น นำไปใช้กับi=input('')หรือทำให้ทุกอย่างเป็นฟังก์ชัน (เช่น. @(i)...) BTW ฉันไม่คิดว่ามันจะยืดเกินไปที่จะใช้จำนวนเต็มเป็นสตริงแล้ว PS 211111ฉันคิดว่ามันล้มเหลวสำหรับกรณีการทดสอบที่ผ่านมาและยังง่าย
pajonk

ใครก็ตามที่แก้ไขคำถาม: อย่าทำอย่างนั้น หาก OP ไม่ตอบกลับหลังจากผ่านไประยะหนึ่ง (เช่นพรุ่งนี้) คุณสามารถลองแก้ไขได้ นอกจากนี้ยังจำเป็นต้องลบทิ้งไม่ใช่การแข่งขัน
Rɪᴋᴇʀ

0

TSQL, 151 ไบต์

แข็งแรงเล่นกอล์ฟ:

DECLARE @t varchar(99)='11111'

,@z bit=0,@a INT=1,@ INT=1WHILE @a<LEN(@t)SELECT @z=IIF(@t LIKE'%'+replicate(SUBSTRING(@t,@a,@),5)+'%',1,@z),@=IIF(@=20,1,@+1),@a+=IIF(@=1,1,0)PRINT @z

Ungolfed:

DECLARE @t varchar(99)='11111'

,@z bit=0,
@a INT=1,
@ INT=1
WHILE @a<LEN(@t)
  SELECT
    @z=IIF(@t LIKE'%'+replicate(SUBSTRING(@t,@a,@),5)+'%',1,@z),
    @=IIF(@=20,1,@+1),
    @a+=IIF(@=1,1,0)

PRINT @z

ซอ


0

PowerShell ขนาด 26 ไบต์

$args[0]-match"(.+)\1{4}"

ฉันไม่เคยเป็นผู้เชี่ยวชาญด้าน regex ดังนั้นให้เครดิตกับคำตอบอื่น ๆ


0

Clojure 24 ไบต์

#(re-find #"(.+)\1{4}"%)

ใช้ค่าเท็จของ clojure ของnil/ falseและค่าความจริงสำหรับทุกอย่างอื่น โดยเฉพาะอย่างยิ่งnilเมื่อไม่พบการแข่งขันที่เป็นเท็จและอาร์เรย์ที่[]เป็นจริงเมื่อพบการแข่งขันเช่นสำหรับ 11111 นั้น["11111" "1"]เป็นความจริง


0

JS ไม่มี regexes, 166

b=s=>{for(let i=0;i<s.length-4;i++){for(let n=1;n<=Math.floor((s.length-i)/5);n++){if([1,2,3,4].every(k=>s.slice(i,i+n)==s.slice(i+n*k,i+n*(k+1))))return 1}}return 0}

ไม่ย่อขนาด:

// test any start pos, and length
var b = s => {
    for (let i = 0; i <= s.length - 5; i++) {
        for (let n = 1; n <= Math.floor((s.length - i) / 5); n++) {
            // test if s is boring at position i, with length n
            if ([1, 2, 3, 4].every(k => s.slice(i, i + n) === s.slice(i + n * k, i + n * (k + 1)))) {
                return 1;
            }
        }
    }
    return 0;
};

console.log(b('11111'));
console.log(b('12345'));
console.log(b('1112111'));
console.log(b('-11111'));
console.log(b('3452514263534543543543543543876514264527473275'));

1
สวัสดีและยินดีต้อนรับสู่ PPCG! อย่างไรก็ตามสิ่งนี้สามารถตีกอล์ฟได้มากกว่านี้จริงๆ คุณสามารถลบพื้นที่ว่างพิเศษเพื่อให้ได้รหัสที่สั้นกว่ามาก กรุณาเล่นกอล์ฟเพิ่มหรือลบ
Rɪᴋᴇʀ

ฉันชอบความคิดในการหลีกเลี่ยง regex แทนที่ ([ 'น่าเบื่อ' 'ให้', 'เท็จ', 'ความจริง'] [ 'B', '', '0', '1'] นั่นตัด 20 ตัวอักษร
Coomie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.