Sekarang, untuk beberapa perbaikan besar. Program asli Anda adalah 97 karakter:
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)
Dengan peningkatan di bawah ini, Anda bisa mencapai 90 karakter:
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)))
Dengan trik untuk menghilangkan tanda kurung di sekitar pernyataan pemeriksaan palindrome, Anda bisa mencapai 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)))
Namun, saya punya solusi dalam 80 karakter. Untuk mendapatkannya, fokuslah pada mengubah gambaran besar, bukan komponen individu. Pikirkan kembali pilihan paling dasar Anda untuk sampai ke titik ini. Kenapa lambda? Mengapa min dari rentang yang difilter? Mungkin ada cara yang lebih baik.
Menggunakan int()
dalam perbandingan palindrome banyak karakter - dapatkah Anda melihat cara yang lebih pendek untuk berbelok
x
dan
`x`[::-1]
dalam tipe yang sama?
Juga, and x>l
bit pada akhirnya adalah banyak karakter. Apakah ada cara untuk mempersingkatnya? Hilangkan kebutuhan untuk itu dengan mengubah sesuatu yang lain?
Apakah next
fungsi yang tepat untuk pekerjaan itu? Ingat, ini kode golf, runtime tidak relevan.
Fungsi pemeriksaan prima terlihat tepat.
Juga, dan ini hanya estetika, saya tidak suka fungsi aliasing, seperti yang Anda lakukan dengan range, ketika itu tidak menyimpan karakter apa pun, seperti dalam kasus ini.