Perdana palindrom

8

Saya sedang menyelesaikan tugas, di mana:

Memasukkan:

Angka sebagai bilangan bulat.

Keluaran:

Prime palindromic terbesar terdekat sebagai bilangan bulat.

Saya akan sangat menghargai petunjuk bagaimana membuat solusi saya lebih pendek. Atau arahan jika perubahan pendekatan akan bermanfaat.

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)

palindromik:

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

utama:

all(x%d for d in r(2,x))
Martin Rajnoha
sumber
3
Sebelum orang tutup memilih ini, karena ini bukan tantangan: hal-hal seperti ini sudah menjadi topik pembicaraan sekarang . Satu-satunya hal yang saya pikirkan adalah apakah ini tidak lebih cocok sebagai dua pertanyaan terpisah, "Bagaimana saya bisa membuat memeriksa nomor palindrom lebih pendek?" dan "Bagaimana saya bisa membuat memeriksa bilangan prima lebih pendek?" (@Martin, jangan lakukan itu, sampai Anda mendapatkan lebih banyak umpan balik untuk mengonfirmasi hal ini.)
Martin Ender
@ m.buettner, ok terima kasih.
Martin Rajnoha

Jawaban:

7

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>lbit pada akhirnya adalah banyak karakter. Apakah ada cara untuk mempersingkatnya? Hilangkan kebutuhan untuk itu dengan mengubah sesuatu yang lain?

Apakah nextfungsi 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.

isaacg
sumber
int untuk x== x[:: - 1], selanjutnya untuk indeks [0] ... masih memikirkan dan x> l
Martin Rajnoha
@MartinRajnoha PETUNJUK: perhatikan fungsi ini lebih dalam range.
BeetDemGuise
Terima kasih, teman-teman saya menemukan itu :) Status saat ini -10chars. Bagus!
Martin Rajnoha
@MartinRajnoha Sebagai titik referensi cepat, saya dapat (dalam waktu singkat menggunakan kode Anda) untuk menghapus 12 karakter.
BeetDemGuise
@BeetDemGuise sekarang Anda menggodaku :) OK, bagaimana Anda mengaturnya?
Martin Rajnoha