Beberapa angka, seperti , adalah palindrom di basis 10: jika Anda menulis angka dalam urutan terbalik, Anda mendapatkan nomor yang sama.
Beberapa angka adalah jumlah dari 2 palindrom; misalnya, , atau .
Untuk nomor lain, 2 palindrom tidak cukup; misalnya, 21 tidak dapat ditulis sebagai jumlah dari 2 palindrom, dan yang terbaik yang dapat Anda lakukan adalah 3: .
Tulis fungsi atau program yang mengambil input bilangan bulat n
dan mengeluarkan angka n
ke-2 yang tidak dapat didekomposisi sebagai jumlah dari 2 palindrom. Ini sesuai dengan OEIS A035137 .
Digit tunggal (termasuk 0) adalah palindrom.
Aturan standar untuk urutan berlaku:
- input / output fleksibel
- Anda dapat menggunakan 0- atau 1- pengindeksan
- Anda dapat menampilkan
n
istilah th, ataun
istilah pertama , atau urutan yang tak terbatas
(Sebagai sidenote: semua bilangan bulat dapat didekomposisi sebagai jumlah paling banyak 3 palindrom.)
Kasus uji (1-diindeks):
1 -> 21
2 -> 32
10 -> 1031
16 -> 1061
40 -> 1103
Ini kode-golf, jadi jawaban terpendek menang.
n
, cetak urutan ke-n dari urutan OEIS An? Kedengarannya menjanjikan ...Jawaban:
JavaScript (ES6),
93 83 8079 byteDisimpan 1 byte berkat @tsh
Mengembalikan istilah ke-n , 1-diindeks.
Cobalah online!
Bagaimana?
Diberikann , kami menguji apakah ada 1≤k≤n sedemikian rupa sehingga k dan n−k adalah palindrom. Jika kita menemukan k seperti itu , maka n adalah jumlah dari dua palindrom.
Kuncinya di sini adalah untuk memprosesk dan n−k pada saat yang sama dengan menguji satu string yang terbuat dari gabungan k , n−k dan k .
Contoh:
Untukn=2380 :
Berkomentar
NB: Ini adalah versi tanpa
eval()
keterbacaan.sumber
i=>eval("for(n=k=1;k=(s=[...k+[n-k]+k])+''!=s.reverse()?k-1||i--&&++n:++n;);n")
79 bytei=>eval("...")
, ES6 memungkinkan Anda untuk menggunakani=>eval`...`
, menghemat 2 byte;n
di akhir.eval()
karena tidak memaksa argumennya menjadi string. Menghapus;n
akan menyebabkan kesalahan sintaks dan menghapus hanyan
akan menyebabkan fungsi kembaliundefined
.Jelly ,
16 109 byte-1 byte terima kasih kepada Erik the Outgolfer . Menghasilkann istilah pertama .
Cobalah online!
Saya mencoba untuk datang dengan ide yang berbeda dibandingkan dengan pendekatan awal saya. Mari kita tinjau proses berpikir:
Awalnya, tes bekerja sebagai berikut: Ini menghasilkan partisi bilangan bulat dari angka itu, kemudian menyaring yang juga mengandung non-palindrom, kemudian menghitung berapa panjang-2 daftar yang memenuhi syarat ada. Ini jelas tidak terlalu efisien dalam hal panjang kode.
Menghasilkan partisi integerN dan kemudian menyaring memiliki 2 kelemahan utama: efisiensi panjang dan waktu. Untuk mengatasi masalah itu, saya pikir saya pertama kali akan datang dengan metode untuk menghasilkan hanya pasangan bilangan bulat (x,y) yang menjumlahkan ke N (tidak semua daftar panjang sewenang-wenang) dengan ketentuan bahwa kedua angka harus palindrom.
Tapi tetap saja, saya tidak puas dengan "cara klasik" tentang ini. Saya beralih pendekatan: daripada menghasilkan pasangan , mari kita fokus pada palindrom idividual . Dengan cara ini, seseorang dapat dengan mudah menghitung semua palindromx bawah N , dan jika N−x juga palindrom, maka kita selesai.
Penjelasan Kode
* Angka non-nol lainnya berfungsi, dalam hal ini.
sumber
Jelly , 11 byte
Cobalah online!
Program lengkap kira-kira berfungsi seperti ini:
Anda mungkin curiga bahwa langkah 5 tidak benar-benar melakukan pekerjaan yang seharusnya. Kita seharusnya benar-benar tidak mengurangi z jika semua pasangan yang menjumlahkan x adalah palindromik. Namun, kami dapat membuktikan bahwa ini tidak akan pernah terjadi:
Mari kita pertama memilih integerk sehingga 10≤k≤x . Kami selalu dapat melakukannya, karena, pada langkah 2, kami menginisialisasi x menjadi 10 .
Jikak bukan palindrome, maka kita memiliki pasangan (k,x−k) , di mana k+(x−k)=x , oleh karena itu tidak semua pasangan memiliki dua palindrom.
Sebaliknya, jikak adalah palindrom, maka kita dapat membuktikan bahwa k−1 bukanlah palindrom. Biarkan digit pertama dan terakhir k menjadi DF dan DL masing-masing. Karena k adalah palindrome, DF=DL>0 . Biarkan digit pertama dan terakhir k−1 masing-masing menjadi D′F dan D′L Karena DL>0 , D′L=D′F−1≠D′F . Karenanya,k−1 bukanlah palindrom, dan kami memiliki pasangan(k−1,x−(k−1)) , di mana(k−1)+(x−(k−1))=k−1+x−k+1=x .
Kami menyimpulkan bahwa, jika kita mulai dengan menetapkan x ke nilai yang lebih besar dari atau sama dengan 10 , kita tidak akan pernah memiliki semua pasangan bilangan bulat non-negatif yang dijumlahkan x menjadi pasangan palindrom.
sumber
ŻŒḂ€aṚ$Ṁ¬µ#
Retina ,
135102 byteCobalah online! Terlalu lambat untuk
n
10 atau lebih. Penjelasan:Mulailah dengan mencoba 0.
Ulangi
n
kali.Ubah nilai uji coba saat ini menjadi unary dan tambahkan.
Buat semua pasangan bilangan bulat non-negatif yang menjumlahkan nilai uji coba baru.
Ulangi sementara ada setidaknya satu pasangan yang mengandung dua bilangan palindromik.
Tambahkan dan kembangkan nilai uji coba lagi.
Ekstrak nilai akhir.
sumber
Haskell,
686763 byteMengembalikan urutan yang tak terbatas.
Kumpulkan semua di
n
manaa
ataun-a
bukan palindrome untuk semuaa <- [0..n]
.Cobalah online!
sumber
Perl 5
-MList::Util=any -p
,5955 byte-3 byte terima kasih kepada @NahuelFouilleul
Cobalah online!
Catatan:
any
bisa diganti dengangrep
dan menghindari-M
saklar baris perintah, tetapi di bawah aturan penilaian saat ini, itu akan menelan biaya satu byte lagi.sumber
+
setelahwhile
.R ,
115111 byte-4 Terima kasih kepada Giuseppe
Cobalah online!
Sebagian besar pekerjaan dikemas ke dalam argumen fungsi untuk menghapus
{}
panggilan fungsi multi-pernyataan, dan untuk mengurangi tanda kurung yang diperlukan dalam mendefinisikan objekr
Strategi dasarnya adalah menemukan semua palindrom hingga batas yang diberikan (termasuk 0), menemukan semua jumlah berpasangan, dan kemudian mengambil angka ke-n tidak dalam output itu.
Batasan
n*1000
dipilih murni dari tebakan yang berpendidikan, jadi saya mendorong siapa pun untuk membuktikan / membuktikannya sebagai pilihan yang valid.r=0:(n*1e3)
mungkin dapat ditingkatkan dengan ikatan yang lebih efisien.Map(paste,Map(rev,strsplit(a,"")),collapse="")
robek dari jawaban Markus di sini , dan sangat pintar bagi saya.r[!r%in%outer(p,p,'+')][n]
membaca sedikit tidak efisien untuk saya.sumber
C # (Visual C # Interactive Compiler) , 124 byte
Cobalah online!
sumber
J , 57/60 byte
Cobalah online!
Versi yang ditautkan menambahkan 3 byte dengan total 60 untuk disimpan sebagai fungsi yang dapat dipanggil footer.
Dalam REPL, ini dihindari dengan menelepon langsung:
Penjelasan
Struktur umum adalah teknik ini dari jawaban oleh Miles :
Ini menghemat beberapa byte daripada teknik perulangan asli saya, tetapi karena fungsi inti adalah upaya pertama saya untuk menulis J, ada kemungkinan masih banyak yang dapat ditingkatkan.
sumber
1&(_:1&((e.((*&(-:|.)&":"0>:)&i.-))+])+)*
05AB1E ,
1512 byte-3 byte terima kasih kepada @Grimy .
Diindeks 0.
Sangat lambat, sehingga waktu habis untuk sebagian besar kasus uji.
Cobalah secara online atau verifikasi beberapa kasus pertama dengan menghapus
Iè
.Jauh lebih cepat versi 15 byter sebelumnya:
1-diindeks.
Cobalah secara online atau hasilkan yang pertaman nilai-nilai .
Penjelasan:
sumber
°LDʒÂQ}ãOKIè
(mungkin ada batas atas yang lebih baik dari 10 ^ x untuk kecepatan). Saya kira∞DʒÂQ}ãOK
secara teknis angka 9, tetapi sudah habis sebelum output pertama.Iè
) seperti:[1,21,32,43,54,65,76,87,98,111,131,141,151,...]
tetapi seharusnya seperti[*,21,32,43,54,65,76,87,98,201,1031,1041,1051,1052,...]
(yang pertama1
/*
dapat diabaikan karena kami menggunakan input 1-diindeks).L
0 .. :)Merah , 142 byte
Cobalah online!
Mengembalikan istilah ke-n, 1-diindeks
sumber
Python 3 , 107 byte
Cobalah online!
Melawan pemeriksaan palindrom disimpan 2 byte :)
Untuk referensi, cek positif langsung ke depan (109 byte):
sumber
APL (NARS), 486 byte
Apa kata untuk break the loop? Sepertinya itu ": pergi", kan?
{k≡⌽k←⍕⍵}
di p adalah tes untuk palindrome. Fungsi di atas dalam loop menyimpan semua palindrome yang ditemukan di set P, jika untuk beberapa elemen w dari P sedemikian rupa sehingga iw ada di P juga ini berarti bahwa i tidak benar dan kita memiliki kenaikan i. Hasil:sumber