Diberi dua angka N dan x, cari jumlah angka x-digit yang produk digitnya adalah N
limits: N(<10^6) and x(<12)
Sample Input:
8 3
Sample Output:
10
Diberi dua angka N dan x, cari jumlah angka x-digit yang produk digitnya adalah N
limits: N(<10^6) and x(<12)
Sample Input:
8 3
Sample Output:
10
Jawaban:
~10\?.10/\,>{10base{*}*1$=},,\;
Input: Mengharapkan angka N
dan x
sebagai argumen baris perintah (dipisahkan oleh spasi).
Program dapat diuji di sini .
Code took longer than 5 seconds to run, so it was aborted.
dengan parameter terbalik. :)
x
berjalan di atas 4. Misalnya, jika saya menjalankannya di mesin saya dengan parameter 3 5
saya mendapatkan hasilnya setelah 30+ detik. Jadi, 3 8
kurasa itu bisa berjam-jam ...
{h.&t~lℕẹ≜×}ᶜ
{h.&t~lℕẹ≜×}ᶜ
{ }ᶜ Count the number of
≜ values at this point
&t formed via taking the last element of the input,
ℕ generating an integer
~l of that length,
ẹ and splitting it into digits
× such that the product of those digits
h. is the first element of {the input}
Salah satu trik golf rapi yang digunakan di sini adalah tidak seperti hampir semua metapredicate, ᶜ
tidak peduli sama sekali tentang nilai aktual .
(yang biasanya digunakan untuk membangun output untuk metapredicate); dengan demikian, .
dapat digunakan seperti variabel lain (menyimpan byte karena itu muncul secara implisit sebelumnya }
). Tidak ada labelisasi implisit di mana pun di sini, jadi saya harus menambahkan labelisasi eksplisit menggunakan ≜
untuk memberikan ᶜ
sesuatu untuk dihitung.
def f(N:Int,x:Int,s:Int=1):Int=if(s==N&&x==0)1 else
if(s>N||x==0)0 else
((1 to 9).map(i=>f(N,x-1,s*i))).sum
ungolfed, versi debugfriendly:
def findProduct (N: Int, sofar: Int, togo:Int, collected:String=""):Int={
if (sofar == N && togo == 0) {
println (collected)
1
} else
if (sofar > N || togo == 0) 0 else
(1 to 9).map (x=> findProduct (N, sofar*x, togo-1, collected + " " + x)).sum
}
Doa dengan hasil debug:
scala> findProduct (3, 1, 8)
1 1 1 1 1 1 1 3
1 1 1 1 1 1 3 1
1 1 1 1 1 3 1 1
1 1 1 1 3 1 1 1
1 1 1 3 1 1 1 1
1 1 3 1 1 1 1 1
1 3 1 1 1 1 1 1
3 1 1 1 1 1 1 1
res175: Int = 8
scala> findProduct (8, 1, 3)
1 1 8
1 2 4
1 4 2
1 8 1
2 1 4
2 2 2
2 4 1
4 1 2
4 2 1
8 1 1
res176: Int = 10
int Z(int n,int x){var i=(int)Math.Pow(10,x-1);return Enumerable.Range(i,i*9).Count(j=>(j+"").Aggregate(1,(a,c)=>a*(c-48))==n);}
Metode C # ini mengembalikan jumlah x
angka -digit yang produk digitnya adalah n
. Ini membutuhkan ruang nama System
dan System.Linq
diimpor dalam konteks saat ini.
Versi online: http://ideone.com/0krup
[:+/[=[:*/"1(10#~])#:(10^<:@])}.[:i.10^]
Menghasilkan semua x
angka -digit, mengonversi masing-masing ke basis 10, kemudian menemukan produk dari masing-masing angka, dan menguji apakah setiap angka sama dengan sisi kiri, dan kemudian menemukan jumlah masing-masing boolean.
,’⁵*r/ḊDP€ċƓ
Mengambil x sebagai argumen baris perintah dan N pada input standar.
,’⁵*r/ḊDP€ċƓ
, On {the input} and
’ {the input} minus 1
⁵* take 10 to the power of each of those numbers
r/ then form a range between them
Ḋ without its first element;
D treat each element as a list of digits,
P€ take the product of each of those digit lists,
ċ then count the number of times
Ɠ the value from standard input appears
Bagian yang sulit adalah membuat daftar angka dengan x digit; angka terendah adalah 10 x −1 , tertinggi adalah 10 x −1. Kisaran di sini dihasilkan melalui pertama-tama menghasilkan pasangan ( x , x −1), kemudian mengambil 10 pangkat keduanya, dan kemudian menghasilkan kisaran di antara mereka. Rentang ini mencakup kedua titik akhir secara default; untuk berjaga-jaga jika N adalah 0, kita perlu menghapus ujung atas dari rentang (yang didahulukan karena itu adalah rentang "mundur") menggunakan Ḋ
.