regex เพื่อจับคู่เลขจำนวนเต็มสามตัวหากจำนวนเต็มตัวที่สามเป็นผลรวมของสองตัวแรก


27

เขียนนิพจน์ปกติที่ตรงกับสตริงที่กำหนดซึ่งประกอบด้วยจำนวนเต็มสามจำนวนที่ไม่เป็นลบคั่นด้วยช่องว่างถ้าหากจำนวนเต็มสุดท้ายเป็นผลรวมของสองรายการก่อนหน้า คำตอบอาจเป็นจำนวนเต็มของระบบตัวเลขใด ๆ ด้วย radix ระหว่าง 2 ถึง 10

กรณีทดสอบ

สิ่งเหล่านี้ควรล้มเหลว:

0 1 2
10 20 1000

สิ่งเหล่านี้ควรตรงกัน:

10 20 30
28657 46368 75025
0 0 0

กฎระเบียบ

คำตอบของคุณควรประกอบด้วย regex เพียงหนึ่งเดียวโดยไม่มีรหัสเพิ่มเติมใด ๆ (ยกเว้นเป็นทางเลือกรายการของตัวดัดแปลง regex ที่จำเป็นสำหรับการแก้ปัญหาของคุณ) คุณต้องไม่ใช้คุณสมบัติของรสชาติ regex ของภาษาที่อนุญาตให้คุณเรียกใช้รหัสในภาษาโฮสติ้ง (เช่นตัวดัดแปลง e ของ Perl)

โปรดระบุรสชาติของ regex ในคำตอบของคุณ

นี่คือสนามกอล์ฟ regex ดังนั้น regex ที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ หากภาษาของคุณต้องการตัวคั่น (โดยปกติ /.../) เพื่อแสดงว่านิพจน์ทั่วไปไม่นับตัวคั่น หากโซลูชันของคุณต้องการตัวดัดแปลงให้เพิ่มหนึ่งไบต์ต่อตัวดัดแปลง

มอบเครดิตให้แก่Martin Enderและjayteaสำหรับกฎ regex-golfing


ฉันมีเหตุผลที่จะเชื่อว่ามันเป็นไปได้ขึ้นอยู่กับการแก้ปัญหาของมาร์ตินเอนเดอร์สำหรับการค้นหาและการเพิ่มจำนวนเต็มกับ regex


1
คุณสามารถใช้รสชาติของ regex ใด ๆ ที่มีอยู่ก่อนความท้าทายนี้กฎนี้ไม่ได้สะท้อนถึงฉันทามติปัจจุบันซึ่งบอกว่าภาษา (และดังนั้นรสชาติของ regex) ที่สร้างหรืออัปเดตหลังจากการโพสต์ความท้าทายยังคงสามารถแข่งขันได้
Erik the Outgolfer

1
ที่เกี่ยวข้อง (ฉันสงสัยว่าคำตอบสำหรับสิ่งนี้จะมีลักษณะคล้ายกับคำตอบ. NET ของ jimmy ที่นั่น)
Martin Ender

@EriktheOutgolfer มีความเห็นเป็นเอกฉันท์ว่าภาษาที่สร้างขึ้นหลังจากความท้าทายสามารถแข่งขันได้หรือไม่ นั่นเป็นเรื่องไร้สาระโดยสิ้นเชิง
edc65


/eตัวดัดแปลงของ Perl 5 จะใช้กับการแทนที่เท่านั้นและไม่ใช่วิธีเดียวในการรันโค้ดภายนอก นอกจากนี้สิ่งนี้จะตัดสิทธิ์ Perl 6 ทั้งหมดเนื่องจาก regex เป็นเพียงวิธีการที่มีไวยากรณ์เพิ่มเติม (เหตุผลคือทำให้การอ่านและเขียน regexes ง่ายขึ้น) ดังนั้นคุณสมบัติทั้งหมดที่จำเป็นใน regexes แบบเก่าจึงไม่จำเป็น (หรือรวมอยู่ด้วย) เมื่อคุณใส่รหัส Perl 6 (หมายถึงมันอาจจะเป็นไปไม่ได้ที่จะทำความท้าทายนี้ถ้าคุณเพียงแค่ จำกัด รหัสเฉพาะ regex) /^(\d+)**3%' '$ <?{$0[2]==[+] $0[0,1]}>/หรือ/^(\d+)' '(\d+)' '(\d+)$ <?{$2==$0+$1}>/หรือ/^(\d+)' '(\d+){}" {$0+$1}"$/
แบรดกิลเบิร์ b2gills

คำตอบ:


15

Perl / PCRE: 2,685 ไบต์

^ (?! (?! 0 * + (? = (\ d *?)) ((?: (? = \ d + 0 * + (\ d *?)) (\ (4 (4) \ 4)) 0 * (\ d *?) (\ d \ 6? +) $) \ d) +)) (? = (? (?! \ 1 (?: (=: \ \ + 0 * \ 3) (\ 7? +) \ d)) (? = \ d (\ d * 0 * \ 3 \ 8)) (? = 0 \ 9 [9] | 1 \ 9 [8] | 2 \ 9 [7] | 3 \ 9 [6] | 4 \ 9 [5] | 5 \ 9 [4] | 6 \ 9 [3] | 7 \ 9 [2] | 8 \ 9 [1] | 9 \ 9 [0]) \ D) * + (? = \ d (\ d * 0 * \ 3 \ 8? +)) (? = [5-9] \ 10 [5-9] | 1 \ 10 [9] | 2 \ 10 [89] | 3 \ 10 [7-9] | 4 \ 10 [6-9] | 6 \ 10 [4] | 7 \ 10 [34] | 8 \ 10 [2-4] | 9 \ 10 [1-4]) ) (? = \ d + \ d + 0 * \ 1 \ 3 \ 6 $) | (? (?!. * + \ 3) \ d +) (? = \ d * (\ 2 | \ 4) (. *? 0 * +) \ d + $) (? (? = 9 * \ 11) (?: 9 (? = \ d * \ 12 [1] (\ 13? +0)) * * (? = \ 11) \ 11 \ 12 [1] \ 13 + \ $ 6? | (:? (\ D) (= \ d * \ 12 (\ 15 + \ 14))) * (= \ d (\ d *? \ 12 \ 15 +)) (= 0 \ 16 [1] |? 1 \ 16 [2] | 2 \ 16 [3] | 3 \ 16 [4] | 4 \ 16 [5] | 5 \ 16 [ 6] | 6 \ 16 [7] | 7 \ 16 [8] | 8 \ 16 [9]) \ d (:? 9 (= \ d * \ 12 \ 15 + \ d (\ 17 0? ))) *? \ 11 \ 12 \ 15? + \ d \ 17? + \ 6 $))) \ 1 (?: (? = (\ d) \ d * 0 * + \ 3 ((19) +) \ d) \ d * 0 * + \ 5 ((21? +) \ d)) (? = \ d (\ d * 0 * + \ 3 \ 20) \ d (\ d * 0 * + \ 5 \ 22)) (? (?! \ 18 (?:(? = \ d + 0 * + \ 3 \ 19 ((\ 25? +) \ d)) (? = \ d (\ d * 0 * + \ 3 \ 19 \ 26)) (? = 0 \ 27 [ 9] | 1 \ 27 [8] | 2 \ 27 [7] | 3 \ 27 [6] | 4 \ 27 [5] | 5 \ 27 [4] | 6 \ 27 [3] | 7 \ 27 [2 ] | 8 \ 27 [1] | 9 \ 27 [0]) \ d) * + (? = \ d (\ d * 0 * + \ 3 \ 19 \ 26? +)) (? = [5-9 ] \ 28 [5-9] | 1 \ 28 [9] | 2 \ 28 [89] | 3 \ 28 [7-9] | 4 \ 28 [6-9] | 6 \ 28 [4] | 7 \ 28 [34] | 8 \ 28 [2-4] | 9 \ 28 [1-4])) (= 1 \ 23 (?:? 1 \ 24 [2] | 2 \ 24 [3] | 3 \ 24 [4] | 4 \ 24 [5] | 5 \ 24 [6] | 6 \ 24 [7] | 7 \ 24 [8] | 8 \ 24 [9] | 9 \ 24 [0]) | 2 \ 23 (? 1 \ 24 [3] | 2 \ 24 [4] | 3 \ 24 [5] | 4 \ 24 [6] | 5 \ 24 [7] | 6 \ 24 [8] | 7 \ 24 [9 ] | 8 \ 24 [0] | 9 \ 24 [1]) | 3 \ 23 (?: 1 \ 24 [4] | 2 \ 24 [5] | 3 \ 24 [6] | 4 \ 24 [7] | 5 \ 24 [8] | 6 \ 24 [9] | 7 \ 24 [0] | 8 \ 24 [1] | 9 \ 24 [2]) | 4 \ 23 (?: 1 \ 24 [5] | 2 \ 24 [6] | 3 \ 24 [7] | 4 \ 24 [8] | 5 \ 24 [9] | 6 \ 24 [0] | 7 \ 24 [1] | 8 \ 24 [2] | 9 \ 24 [3]) | 5 \ 23 (?: 1 \ 24 [6] | 2 \ 24 [7] | 3 \ 24 [8] | 4 \ 24 [9] | 5 \ 24 [0] | 6 \ 24 [1] | 7 \ 24 [2] | 8 \ 24 [3] | 9 \ 24 [4]) | 6 \ 23 (?: 1 \ 24 [7] | 2 \ 24 [8] | 3 \ 24 [9] | 4 \ 24 [0] | 5 \ 24 [1] | 6 \ 24 [2] | 7 \ 24 [3] | 8 \ 24 [4] | 9 \ 24 [5]) | 7 \ 23 (? 1 \ 24 [8] | 2 \ 24 [9] | 3 \ 24 [0] | 4 \ 24 [1] | 5 \ 24 [2] | 6 \ 24 [3] | 7 \ 24 [4 ] | 8 \ 24 [5] | 9 \ 24 [6]) | 8 \ 23 (?:1 \ 24 [9] | 2 \ 24 [0] | 3 \ 24 [1] | 4 \ 24 [2] | 5 \ 24 [3] | 6 \ 24 [4] | 7 \ 24 [5] | 8 \ 24 [6] | 9 \ 24 [7]) | 9 \ 23 (?: 1 \ 24 [0] | 2 \ 24 [1] | 3 \ 24 [2] | 4 \ 24 [3] | 5 \ 24 [4] | 6 \ 24 [5] | 7 \ 24 [6] | 8 \ 24 [7] | 9 \ 24 [8]) | 0 \ 23 (\ d) \ 24 \ 29 | (\ D) \ 23 [0] \ 24 \ 30) | (= 1 \ 23 (?:? 0 \ 24 [2] | 1 \ 24 [3] | 2 \ 24 [4] | 3 \ 24 [5] | 4 \ 24 [6] | 5 \ 24 [7] | 6 \ 24 [8] | 7 \ 24 [9] | 8 \ 24 [0] | 9 \ 24 [1]) | 2 \ 23 (: 0 \ 24? [3] | 1 \ 24 [4] | 2 \ 24 [5] | 3 \ 24 [6] | 4 \ 24 [7] | 5 \ 24 [8] | 6 \ 24 [9] | 7 \ 24 [ 0] | 8 \ 24 [1] | 9 \ 24 [2]) | 3 \ 23 (?: 0 \ 24 [4] | 1 \ 24 [5] | 2 \ 24 [6] | 3 \ 24 [7 ] | 4 \ 24 [8] | 5 \ 24 [9] | 6 \ 24 [0] | 7 \ 24 [1] | 8 \ 24 [2] | 9 \ 24 [3]) | 4 \ 23 (? : 0 \ 24 [5] | 1 \ 24 [6] | 2 \ 24 [7] | 3 \ 24 [8] | 4 \ 24 [9] | 5 \ 24 [0] | 6 \ 24 [1] | 7 \ 24 [2] | 8 \ 24 [3] | 9 \ 24 [4]) | 5 \ 23 (?: 0 \ 24 [6] | 1 \ 24 [7] | 2 \ 24 [8] | 3 \ 24 [9] | 4 \ 24 [0] | 5 \ 24 [1] | 6 \ 24 [2] | 7 \ 24 [3] | 8 \ 24 [4] | 9 \ 24 [5]) | 6 \ 23 (: 0 \ 24 [7] | 1 \ 24 [8] | 2 \ 24 [9] | 3 \ 24 [0] | 4 \ 24 [1] | 5 \ 24 [2] | 6 \ 24? [3] | 7 \ 24 [4] | 8 \ 24 [5] | 9 \ 24 [6]) | 7 \ 23 (?: 0 \ 24 [8] | 1 \ 24 [9] | 2 \ 24 [ 0] | 3 \ 24 [1] | 4 \ 24 [2] | 5 \ 24 [3] | 6 \ 24 [4] | 7 \ 24 [5] | 8 \ 24 [6] | 9 \ 24 [7 ]) | 8 \ 23 (?:0 \ 24 [9] | 1 \ 24 [0] | 2 \ 24 [1] | 3 \ 24 [2] | 4 \ 24 [3] | 5 \ 24 [4] | 6 \ 24 [5] | 7 \ 24 [6] | 8 \ 24 [7] | 9 \ 24 [8]) | 9 \ 23 (?: 0 \ 24 [0] | 1 \ 24 [1] | 2 \ 24 [2] | 3 \ 24 [3] | 4 \ 24 [4] | 5 \ 24 [5] | 6 \ 24 [6] | 7 \ 24 [7] | 8 \ 24 [8] | 9 \ 24 [9]) | 0 \ 23 (: 0 \ 24 [1] | 1 \ 24 [2] | 2 \ 24 [3] | 3 \ 24 [4] | 4 \ 24 [5] | 5 \ 24 [6] | 6 \ 24 [? 7] | 7 \ 24 [8] | 8 \ 24 [9] | 9 \ 24 [0]))) \ d) + \ | ^ 0 + \ 0 * (\ d +) \ 0 * \ g {-1 } $ | ^ 0 * (\ d +) \ 0+ \ 0 * \ g {-1} $)). +

ลองออนไลน์!

ฉันได้รับการด้อม ๆ มองๆสำหรับความท้าทายที่ยากลำบากหลังจากที่หายไปจาก regex และเพิ่งเกิดขึ้นสะดุดข้าม doozy นี้ การยืนยันการเพิ่ม (ด้วย Perl / PCRE) เป็นสิ่งที่ฉันคิดไว้ก่อนหน้านี้ แต่ถูกไล่ออกว่าเป็นไปไม่ได้หรือเกินความสามารถของฉันทันที อย่างไรก็ตามตอนนี้ฉันก็แตกอีกแล้วและฉันก็ค่อนข้างตื่นเต้นที่จะบอกว่าฉันได้ทำมันจริงๆ!

ฉันไม่ได้ตีกอล์ฟตัวอื่นนอกจากการพิจารณาอัลกอริธึมสั้น ๆ และเทคนิคการจับคู่โดยรวมเมื่อฉันเขียนมัน ฉันมีความสุขจริงๆที่ได้ทำ: D

หากผู้คนสนใจฉันสามารถเพิ่มความคิดเห็นและอธิบายวิธีการทำงาน

แก้ไข: ฉันได้โพสต์รายละเอียดในบล็อกของฉันเกี่ยวกับเรื่องนี้พร้อมคำอธิบายและความคิดเห็น :) เพลิดเพลิน: http://www.drregex.com/2018/09/a-regex-i-submitted-to-reddit-climbed.html


4
สนใจคำอธิบายบางอย่างแน่นอน!
etene

2
@etene ฉันแก้ไขโพสต์พร้อมลิงก์ไปยังบทความอย่างละเอียด: D
jaytea

1
ขอบคุณที่จะอ่านที่น่าสนใจ!
etene

6

.NET flavor, 139 111 106 + 1 = 107 bytes

ต้องการปรับปรุงRightToLeft rอินพุตในไบนารี

(?(2)!)^\5 \7 ((?(2)()(?(2)!)(?<-2>){2})(0|(?<-2>1))(?<=(((0|(?<2>1)|\b)(?=.*(?<=(\5).*))?\7?) \d*){2}))+$

ลองออนไลน์! (ใช้Retina )

Yay สำหรับการสร้างสมดุลในกลุ่ม ฉันจะอธิบายเรื่องนี้ในภายหลัง ...

เวอร์ชันทศนิยม340 3403 + 1 = 244 ไบต์

(?(2)!)^\5 \7 ((?(2)()(?(2)!)(?<-2>){10})(0|(?<-2>1|(?<-2>2|(?<-2>3|(?<-2>4|(?<-2>5|(?<-2>6|(?<-2>7|(?<-2>8|(?<-2>9))))))))))(?<=(((0|(?<2>1|(?<2>2|(?<2>3|(?<2>4|(?<2>5|(?<2>6|(?<2>7|(?<2>8|(?<2>9)))))))))|\b)(?=.*(?<=(\5).*))?\7?) \d*){2}))+$

ลองออนไลน์!


3
"ฉันจะอธิบายเรื่องนี้ในภายหลัง" เท่าไหร่ในภายหลัง
Οurous

3
@ Οururมากในภายหลังตามที่เปิดออก
Martin Ender

1

.NET, 96 ไบต์

^\4 \6((?(2)()(?(2)^)(?<-2>){2}| ?)(0|(?<-2>1))(?<=((0|(?<2>1)|)\4?) .*((0|(?<2>1)|)\6?) .*))+$

ธง: r

ลองออนไลน์!

เวอร์ชันทศนิยม 238 ไบต์

^\5 \6(?<-6>)((?(2)()(?(2)^)(?<-2>){10}| ?)((?<-2>[1469]|(?<-2>[27]))|[0358])(?([5-9])(?<-2>){5})(?([3489])(?<-2>){3})(?<=(((((?=[5-9](?<2>){5}|)(?=[3489](?<2>){3}|)((?<2>[1469]|(?<2>[27]))|.))?(?( .*)\6?(?<-6>)?|\5?(?<-5>)))) .*){2}))+$

ธง: r

ลองออนไลน์!

คล้ายกับคำตอบของ Martin

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