Một regex để khớp ba số nguyên liên tiếp với số nguyên thứ ba là tổng của hai số nguyên đầu tiên


27

Viết biểu thức chính quy khớp với một chuỗi đã cho gồm ba số nguyên không âm, được phân tách bằng dấu cách nếu và chỉ khi số nguyên cuối cùng là tổng của hai số trước. Câu trả lời có thể dành cho số nguyên của bất kỳ hệ số nào có cơ số từ 2 đến 10.

Các trường hợp thử nghiệm

Những điều này sẽ thất bại:

0 1 2
10 20 1000

Những cái này phải phù hợp:

10 20 30
28657 46368 75025
0 0 0

Quy tắc

Câu trả lời của bạn nên bao gồm một regex duy nhất, không có bất kỳ mã bổ sung nào (ngoại trừ, tùy chọn, một danh sách các sửa đổi regex cần thiết để làm cho giải pháp của bạn hoạt động). Bạn không được sử dụng các tính năng của hương vị regex của ngôn ngữ cho phép bạn gọi mã bằng ngôn ngữ lưu trữ (ví dụ: công cụ sửa đổi điện tử của Perl).

Vui lòng xác định hương vị regex của bạn trong câu trả lời của bạn.

Đây là regex golf, vì vậy regex ngắn nhất tính bằng byte thắng. Nếu ngôn ngữ của bạn yêu cầu các dấu phân cách (thường là /.../) để biểu thị các biểu thức chính quy, đừng tự đếm các dấu phân cách. Nếu giải pháp của bạn yêu cầu sửa đổi, hãy thêm một byte cho mỗi sửa đổi.

Tín dụng cho Martin Enderjaytea cho các quy tắc chơi golf regex.


Tôi có lý do để tin rằng có thể dựa trên giải pháp của Martin Ender để tìm và tăng số nguyên với regex .


1
Bạn có thể sử dụng bất kỳ hương vị regex nào tồn tại trước thử thách này Quy tắc này không phản ánh sự đồng thuận hiện tại, điều này nói rằng các ngôn ngữ (và do đó là hương vị regex) được tạo hoặc cập nhật sau khi thử thách được đăng vẫn có thể cạnh tranh.
Erik the Outgolfer

1
Liên quan. (Tôi nghi ngờ câu trả lời cho điều này sẽ trông hơi giống với câu trả lời của .NET.)
Martin Ender

@EriktheOutgolfer thực sự có sự đồng thuận rằng các ngôn ngữ được tạo ra sau thử thách có thể TẠO? Điều đó hoàn toàn vô nghĩa
edc65


Công cụ /esửa đổi của Perl 5 chỉ áp dụng cho các thay thế và không phải là cách duy nhất để chạy mã bên ngoài. Ngoài ra, điều này không đủ tiêu chuẩn Perl 6 vì regex chỉ là một phương thức với cú pháp bổ sung. (Lý do là nó làm cho regexes dễ đọc và viết hơn) Kết quả là tất cả các tính năng cần thiết trong regex cổ xưa không cần (hoặc bao gồm) khi bạn chỉ cần nhập mã Perl 6. (có nghĩa là nó có lẽ là không thể làm được thách thức này nếu bạn chỉ cần hạn chế để mã cụ thể regex) /^(\d+)**3%' '$ <?{$0[2]==[+] $0[0,1]}>/hoặc /^(\d+)' '(\d+)' '(\d+)$ <?{$2==$0+$1}>/hoặc/^(\d+)' '(\d+){}" {$0+$1}"$/
Brad Gilbert b2gills

Câu trả lời:


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

Hãy thử trực tuyến!

Tôi đã sẵn sàng cho những thử thách khó khăn sau một thời gian gián đoạn từ regex, và tình cờ gặp phải sự cố này. Xác minh bổ sung (với Perl / PCRE) là điều tôi đã nghĩ đến trước đây, nhưng ngay lập tức bị loại bỏ vì không thể hoặc vượt quá khả năng của tôi. Tuy nhiên, bây giờ tôi đã có một vết nứt khác và tôi khá hồi hộp khi nói rằng tôi đã thực sự làm nó!

Tôi đã không thực sự chơi golf này ngoài việc xem xét các thuật toán ngắn và kỹ thuật kết hợp tổng thể khi tôi viết nó. Tôi thực sự hạnh phúc tôi đã hoàn thành nó: D

Nếu mọi người quan tâm, tôi có thể thêm ý kiến ​​và giải thích cách hoạt động của nó.

Chỉnh sửa: Tôi đã tạo một bài viết chi tiết trên blog của mình về điều này, với lời giải thích và bình luận :) hãy tận hưởng: http://www.drregex.com/2018/09/a-regex-i-submit-to-reddit-climbed.html


4
Chắc chắn quan tâm đến một số giải thích!
etene

2
@etene Tôi đã chỉnh sửa bài đăng với một liên kết đến một bài viết kỹ lưỡng: D
jaytea

1
Cảm ơn bạn, đó sẽ là một đọc thú vị!
etene

6

Hương vị .NET, 139 111 106 + 1 = 107 byte

Cần RightToLeftsửa đổi r. Đầu vào nhị phân.

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

Hãy thử trực tuyến! (Sử dụng võng mạc .)

Yay cho các nhóm cân bằng. Tôi sẽ giải thích điều này sau ...

Phiên bản thập phân, 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}))+$

Hãy thử trực tuyến!


3
"Tôi sẽ giải thích điều này sau" Bao nhiêu sau?
urous

3
@ Urous nhiều sau khi nó bật ra.
Martin Ender

1

.NET, 96 byte

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

Cờ: r

Hãy thử trực tuyến!

Phiên bản thập phân, 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}))+$

Cờ: r

Hãy thử trực tuyến!

Tương tự như câu trả lời của Martin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.