Regex untuk mencocokkan tiga bilangan bulat berturut-turut jika bilangan bulat ketiga adalah jumlah dari dua bilangan bulat pertama

27

Tulis ekspresi reguler yang cocok dengan string yang diberikan yang terdiri dari tiga bilangan bulat tidak-negatif, jika dan hanya jika bilangan bulat terakhir adalah jumlah dari dua bilangan sebelumnya. Jawaban mungkin untuk bilangan bulat dari sistem angka apa pun dengan radix antara 2 dan 10.

Uji kasus

Ini harus gagal:

0 1 2
10 20 1000

Ini harus cocok:

10 20 30
28657 46368 75025
0 0 0

Aturan

Jawaban Anda harus terdiri dari satu regex, tanpa kode tambahan (kecuali, secara opsional, daftar pengubah regex yang diperlukan untuk membuat solusi Anda berfungsi). Anda tidak boleh menggunakan fitur-fitur dari rasa regex bahasa Anda yang memungkinkan Anda untuk memanggil kode dalam bahasa hosting (mis. Pengubah e Perl).

Silakan tentukan rasa regex Anda dalam jawaban Anda.

Ini adalah golf regex, jadi regex terpendek yang menang. Jika bahasa Anda membutuhkan pembatas (biasanya / .../) untuk menunjukkan ekspresi reguler, jangan hitung pembatas itu sendiri. Jika solusi Anda memerlukan pengubah, tambahkan satu byte per pengubah.

Penghargaan untuk Martin Ender dan jaytea untuk peraturan golf regex.


Saya punya alasan untuk percaya itu mungkin berdasarkan solusi dari Martin Ender untuk menemukan dan menambah bilangan bulat dengan regex .

Josh Withee
sumber
1
Anda dapat menggunakan rasa regex apa pun yang ada sebelum tantangan ini aturan ini tidak mencerminkan konsensus saat ini, yang mengatakan bahwa bahasa (dan karenanya rasa regex) yang dibuat atau diperbarui setelah tantangan telah diposting masih dapat bersaing.
Erik the Outgolfer
1
Terkait (Saya menduga jawaban untuk ini akan terlihat agak mirip dengan jawaban .NET jimmy di sana.)
Martin Ender
@EriktheOutgolfer benar-benar ada konsensus bahwa bahasa yang dibuat setelah tantangan dapat BERKESEP? Itu benar-benar omong kosong
edc65
3
@ edc65 Pada setengah tahun yang lalu.
Martin Ender
/ePengubah Perl 5 hanya berlaku untuk substitusi, dan bukan satu-satunya cara untuk menjalankan kode eksternal. Juga ini mendiskualifikasi Perl 6 sepenuhnya sebagai sebuah regex hanya sebuah metode dengan sintaks tambahan. (Alasannya adalah itu membuat regex lebih mudah untuk membaca dan menulis) Akibatnya semua fitur yang diperlukan dalam regex kuno tidak diperlukan (atau termasuk) karena Anda baru saja memasukkan kode Perl 6. (artinya mungkin tidak mungkin untuk melakukan tantangan ini jika Anda hanya membatasi untuk regex kode tertentu) /^(\d+)**3%' '$ <?{$0[2]==[+] $0[0,1]}>/atau /^(\d+)' '(\d+)' '(\d+)$ <?{$2==$0+$1}>/atau/^(\d+)' '(\d+){}" {$0+$1}"$/
Brad Gilbert b2gills

Jawaban:

15

Perl / PCRE: 2,685 byte

^ (?! (?! 0 * + (? = (\ D *?) ((?: (? = \ D + 0 * + (\ d *?) (\ D (? (4) \ 4)) 0 * (\ d *?) (\ d \ 6? +) $) \ d) +)) (? = (? (?! \ 1 (?: (? = \ d + 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} $)). +

Cobalah online!

Saya telah mencari mangsa untuk tantangan sulit setelah absen dari regex, dan kebetulan tersandung di doozy ini. Memverifikasi penambahan (dengan Perl / PCRE) adalah sesuatu yang telah saya pikirkan sebelumnya, tetapi segera dianggap sebagai tidak mungkin atau di luar kemampuan saya. Namun, saya mengambil celah lagi sekarang dan saya sangat senang mengatakan bahwa saya benar-benar melakukannya!

Saya tidak benar-benar bermain golf ini selain mempertimbangkan algoritma pendek dan teknik pencocokan keseluruhan ketika saya menulisnya. Saya sangat senang telah menyelesaikannya: D

Jika orang tertarik, saya bisa menambahkan komentar dan menjelaskan cara kerjanya.

Sunting: Saya membuat posting rinci di blog saya tentang ini, dengan penjelasan dan komentar :) selamat menikmati: http://www.drregex.com/2018/09/a-regex-i-submitted-to-reddit-climbed.html

jaytea
sumber
4
Sangat tertarik pada beberapa penjelasan!
etene
2
@etene Saya mengedit posting dengan tautan ke penulisan menyeluruh: D
jaytea
1
Terima kasih, itu akan menjadi bacaan yang menarik!
etene
6

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

Membutuhkan RightToLeftpengubah r. Masukan dalam biner.

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

Cobalah online! (Menggunakan Retina .)

Yay untuk menyeimbangkan grup. Saya akan jelaskan ini nanti ...

Versi desimal, 340 243 + 1 = 244 byte

(?(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}))+$

Cobalah online!

Martin Ender
sumber
3
"Aku akan menjelaskan ini nanti" Berapa lama kemudian?
Οurous
3
@ Οurous lama kemudian ternyata.
Martin Ender
1

.NET, 96 byte

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

Bendera: r

Cobalah online!

Versi desimal, 238 byte

^\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}))+$

Bendera: r

Cobalah online!

Mirip dengan jawaban Martin.

jimmy23013
sumber