Bây giờ, đối với một số cải tiến thực sự lớn. Chương trình ban đầu của bạn là 97 ký tự:
n=lambda l,r=range:next(x for x in r(10**6)if(x==int(`x`[::-1]))&all(x%d for d in r(2,x))and x>l)
Với những cải tiến bên dưới, bạn có thể nhận được tới 90 ký tự:
n=lambda l,r=range:min(x for x in r(l+1,10**6)if(`x`==`x`[::-1])&all(x%d for d in r(2,x)))
Với một mẹo để loại bỏ các dấu ngoặc đơn xung quanh câu lệnh kiểm tra palindrom, bạn có thể đến 87:
n=lambda l,r=range:min(x for x in r(l+1,10**4)if`x`==`x`[::-1]*all(x%d for d in r(2,x)))
Tuy nhiên, tôi có một giải pháp trong 80 ký tự. Để có được nó, tập trung vào việc thay đổi bức tranh lớn, không phải các thành phần riêng lẻ. Xem xét lại các lựa chọn cơ bản nhất của bạn trong việc đi đến điểm này. Tại sao một lambda? Tại sao một phút của một phạm vi được lọc? Có thể có một cách tốt hơn.
Sử dụng int()
trong so sánh palindrom có rất nhiều ký tự - bạn có thể thấy một cách ngắn hơn để biến
x
và
`x`[::-1]
vào cùng loại?
Ngoài ra, and x>l
bit đó ở cuối là rất nhiều nhân vật. Có cách nào chúng ta có thể rút ngắn nó? Loại bỏ sự cần thiết cho nó bằng cách thay đổi một cái gì đó khác?
Là next
chức năng phù hợp cho công việc? Hãy nhớ rằng, đây là mã golf, thời gian chạy là không liên quan.
Các chức năng kiểm tra chính nhìn tại chỗ, mặc dù.
Ngoài ra, và đây chỉ đơn thuần là thẩm mỹ, tôi không thích các hàm răng cưa, như cách bạn đang làm với phạm vi, khi nó không lưu bất kỳ ký tự nào, như trong trường hợp này.