Nguyên tố Palindromic


8

Tôi đang giải quyết nhiệm vụ, trong đó:

Đầu vào:

Một số như một số nguyên.

Đầu ra:

Số nguyên tố palindromic lớn nhất gần nhất như một số nguyên.

Tôi sẽ đánh giá cao gợi ý làm thế nào để làm cho giải pháp của tôi ngắn hơn. Hoặc hướng nếu thay đổi cách tiếp cận sẽ có lợi.

golf=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)

Đối xứng:

x==int(`x`[::-1])

nguyên tố:

all(x%d for d in r(2,x))

3
Trước khi mọi người bỏ phiếu này, vì đó không phải là một thách thức: những thứ như thế này hiện đang là chủ đề . Điều duy nhất tôi tự hỏi là nếu điều này không phù hợp hơn vì hai câu hỏi riêng biệt "Làm thế nào tôi có thể kiểm tra các số palindromic ngắn hơn?" và "Làm thế nào tôi có thể làm cho việc kiểm tra các số nguyên tố ngắn hơn?" (@Martin, đừng làm vậy, cho đến khi bạn nhận được nhiều phản hồi xác nhận điều này.)
Martin Ender

@ m.buettner, ok cảm ơn.
Martin Rajnoha

Câu trả lời:


7

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

`x`[::-1]

vào cùng loại?

Ngoài ra, and x>lbit đó ở 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?

nextchứ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.


int for x== x[:: - 1], tiếp theo cho chỉ mục [0] ... vẫn đang suy nghĩ và x> l
Martin Rajnoha

@MartinRajnoha GỢI Ý: hãy nhìn sâu hơn vào rangechức năng.
BeetDemGuise

Thx, các bạn tôi thấy rằng :) Tình trạng hiện tại -10chars. Tuyệt quá!
Martin Rajnoha

@MartinRajnoha Là một điểm tham chiếu nhanh, tôi đã có thể (trong thời gian ngắn chơi mã của bạn) để xóa 12 ký tự.
BeetDemGuise

@BeetDemGuise bây giờ bạn đang trêu chọc tôi :) OK, bạn đã quản lý nó như thế nào?
Martin Rajnoha
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.