Menerapkan hubungan perulangan ini sebagai fungsi atau program yang menginput dan mengeluarkan integer non-negatif:
F (0) = 0
F (N) = bilangan bulat terkecil lebih besar dari F (N-1) sehingga jumlah dan / atau produk dari basis-10 digitnya adalah N
N adalah input program Anda dan F (N) hasilnya.
Agar jelas, jumlah digit dalam angka seperti 913 adalah 9 + 1 + 3 = 13. Produk ini 9 × 1 × 3 = 27. Untuk angka satu digit, jumlah dan produk adalah angka yang sama. Angka yang mengandung 0 tentu saja memiliki produk 0.
Hasil melalui F (70) adalah:
N F(N)
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 19
11 29
12 34
13 49
14 59
15 69
16 79
17 89
18 92
19 199
20 225
21 317
22 499
23 599
24 614
25 799
26 899
27 913
28 1147
29 2999
30 3125
31 4999
32 5999
33 6999
34 7999
35 8999
36 9114
37 19999
38 29999
39 39999
40 41125
41 59999
42 61117
43 79999
44 89999
45 91115
46 199999
47 299999
48 311128
49 499999
50 511125
51 699999
52 799999
53 899999
54 911116
55 1999999
56 2111147
57 3999999
58 4999999
59 5999999
60 6111125
61 7999999
62 8999999
63 9111117
64 11111188
65 29999999
66 39999999
67 49999999
68 59999999
69 69999999
70 71111125
Kode terpendek dalam byte menang. Kudos jika Anda dapat menunjukkan bahwa kode Anda memanfaatkan efisiensi.
Jawaban:
05AB1E ,
2012 byteDisimpan 8 byte berkat Osable !
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
µNSDOsP‚¾>å½
. Tampaknya berfungsi untuk angka yang dipilih secara acak.Mathematica, 71 byte, 68 karakter
Untuk hanya 4 byte lagi, inilah versi yang menyimpan nilai-nilai
±n
:Dengan versi yang terakhir, sebelum Anda mengevaluasi
±n
,PlusMinus
akan ada dua nilai turun:Sekarang jika kita mengevaluasi
±20
:Ini secara dramatis mempercepat perhitungan di masa depan karena Mathematica tidak akan lagi menghitung nilai antara
0
dan20
secara rekursif. Waktu yang dihemat lebih dramatis dengann
meningkatnya:sumber
C #,
155159135 byteSuper tidak efisien, butuh waktu lama untuk adilN>=14
. Akan mencoba untuk mendapatkan solusi yang lebih efisien, tetapi lebih lama.Oke, jauh lebih baik sekarang, tetapi 4 byte lebih lama. Oh well, aku bisa melakukannya
N<=50
dengan cepat sekarang. Terima kasih @milk karena telah menghemat 24 byte!sumber
for(;;)
dan foreach withforeach(var c in++i+"")
. -22 byte untuk menggantikanint.Parse(c+"")
denganc-48
.Pyth -
1817 byteSatu byte disimpan berkat @Jakube!
Penggunaan mengurangi untuk melakukan hal yang rekursif.
Test Suite .
sumber
sM*FBjT;
juga menghasilkan jumlah digit dan produk dan 1 byte lebih pendek.R,
124112 byteGagal pada N = 45 karena R bersikeras menulis 10.000 sebagai 1e + 05, yang tidak dihargai oleh
as.numeric()
, ini dapat diperbaiki dengan menggunakanas.integer()
dengan biaya 12 byte:Sebagai bahasa pemrograman statistik, R memiliki cara bertele-tele yang menjengkelkan dalam membagi angka menjadi vektor angka. Terutama karena semuanya harus dikonversi kembali dari string ke nilai numerik secara eksplisit.
12 byte disimpan berkat billywob.
sumber
as.double(el(strsplit(c(x,""),"")))
untuk membagi integer menjadi vektor digit-digitnya. Namun, Anda masih mengalami masalah pemformatan tapi itu bisa seperti dalam jawaban Anda dipecahkan olehas.integer()
sprintf()
format bilangan bulat menjadi string tanpa nol tambahan langsung:as.double(el(strsplit(sprintf("%1.f",x),"")))
dan lewati penggunaanas.integer()
x=x+1
dan ini dijamin akan dievaluasi sekali, karena pada awaly=F(N-1)
yang pasti tidak sama denganN
.JavaScript (ES6)
1091071059189 Bytessumber
JavaScript (ES6), 84
86Sunting: 2 byte disimpan thx @Arnauld
Uji Catatan di atas 50 itu akan menggunakan CPU Anda terlalu banyak, klik 'Sembunyikan hasil' untuk berhenti sebelum terlambat
sumber
for(v=n&&f(n-1),p=s=n+1;s&&p-1;)[...++v+''].map(d=>(p/=d,s-=d),p=s=n);v
harus menyimpan 2 byte. Saya menduga itu bisa dipersingkat lagi, tapi saya tidak bisa mengetahuinya sejauh ini.p /= d
menghasilkan hasil yang tepat ketikad
sebenarnya adalah pembagip
. Kecuali saya salah, ini berlaku untuk semuad <= p <= Number.MAX_SAFE_INTEGER
. Kami akan mendapatkan kesalahan pembulatan titik mengambang kapanp % d != 0
, tetapi itu harus aman.eval`1+1`
) (inilah mengapa codegolf.stackexchange.com/a/52204/21348 : baca komentar pertama)Mathematica, 67 byte
Fungsi, dinamai
a
. Mengambil nomor sebagai input dan mengembalikan nomor sebagai output. Terinspirasi oleh solusi Mathematica sebelumnya, tetapi menggunakan mekanisme pengulangan yang berbeda.sumber
C, 240 byte
Mencoba mengeksploitasi beberapa properti matematika dari urutan.
sumber
PowerShell v3 +, 114 byte
Solusi berulang, tanpa cara mudah untuk mengubah angka menjadi jumlah / produk dari digitnya, jadi ini sedikit lebih lama dari jawaban JavaScript.
Mengambil input
$n
, set$i
ke array dengan just0
(ini adalah kumpulanF()
, dan set$l
sama dengan1
(ini adalah yang terbaruF
) .Kami kemudian loop ke atas dari1
ke$n
, setiap iterasi mengeksekusifor
loop.The
for
bersyarat loop mengambil$l
nomor atest, dalam sebuah string"$l"
, maka melemparkan bahwa sebagaichar
-array, dan toko yang array menjadi variabel temp$b
. Kami kemudian-join
angka-angka bersama dengan+
dan pipa itu keiex
(kependekan dariInvoke-Expression
dan mirip denganeval
). Selain itu, kami juga melakukan hal serupa*
. Kedua angka tersebut dienkapsulasi dalam parens dan diperlakukan sebagai argumen array untuk-notin
operator terhadap jumlah saat ini$_
dari loop luar (yaitu,for
loop berjalan selama salah satu+
dan*
berbeda dari$_
). Tubuhfor
loop hanya bertambah$l++
.Setelah kami keluar dari
for
lingkaran dalam itu , kami menambahkan kami$l
sebagai elemen baru$i
. Setelah kami sepenuhnya menyelesaikan rentang loop, kami hanya menempatkan$i[$n]
di pipeline, dan output tersirat.NB - Mendapat cukup lambat untuk mengeksekusi di atas
20
, hanya karena struktur loop. Sebagai contoh,N=40
membutuhkan sekitar dua menit pada mesin saya, dan saya bahkan tidak pernah repot pengujianN>50
.sumber
Pyke, 17 byte
Coba di sini!
Atau 13 byte tidak kompetitif
first_n
sekarang menempatkan jumlah item yang sudah ditemukan ditambah satui
jika digunakan.Coba di sini!
sumber
Python 2 , 77 byte
Cobalah online!
sumber
Bertanya-tanya , 49 byte
Pencocokan pola ftw! Pemakaian:
Lebih mudah dibaca:
Ini pada dasarnya hanyalah implementasi spesifikasi kata demi kata.
sumber
BASH, 107 byte
dengan lipat + tempel + bc
sumber
Befunge, 101 byte
Cobalah online! Tetapi perhatikan bahwa itu akan menjadi sangat lambat begitu Anda memasuki usia empat puluhan. Jika Anda ingin menguji jangkauan penuh, Anda benar-benar harus menggunakan kompiler Befunge.
Penjelasan
sumber
PHP , 110 byte
Cobalah online!
sumber