Angka Friedman adalah angka yang dapat diekspresikan dengan menerapkan operasi matematika dasar (^, /, *, +, -) untuk semua digit itu. Operasi tidak perlu diterapkan ke setiap digit individu, tetapi semua digit harus dilibatkan. Artinya, 121 = 11 ^ 2 -> semua digit terlibat, tetapi 1 & 1 telah dipukuli bersama untuk menghasilkan 11.
Penggunaan tanda kurung diperbolehkan, tetapi solusi sepele x= (x)
bukan solusi yang valid. Juga tidak valid x= +x
,.
- 25 = 5 ^ 2
- 121 = 11 ^ 2
- 343 = (3 + 4) ^ 3
- 2048 = (8 ^ 4) / 2 + 0
Tulis program yang akan mengambil dua bilangan bulat positif dan mencetak jumlah angka Friedman dalam rentang itu (inklusif), dan angka-angka dengan ekspresi di baris berikutnya.
Memasukkan -
n m | n, m integers, n>=0, m>n
Keluaran -
count | number of Friedman numbers in the given range
fn1 exp1 | Friedman number, expression
fn2 exp2
fn3 exp3
.
.
.
Kode terpendek diposting oleh Minggu 29 Juli 00:00 GMT akan menjadi pemenang.
/
kerjanya? Misalnya apa1/3
?-5
?Jawaban:
Ruby,
456 438 408 390 370 349 344334 [diperbaiki]Keluaran:
Juga bekerja relatif cepat untuk jumlah yang lebih besar:
sumber
5 40
dan mendapat hasilnya:[11, "11**1", 21, "21**1", 31, "31**1", 41, "41**1"]
. Tidak ada tanda-tanda25
di sana dan saya pikir solusi yang tepat (misalnya untuk21
) adalah2*1
, tidak21**1
'+-*/'.chars.to_a+['','**']
dengan["+","-","*","/","","**"]
Python 2.7 -
380 378 372 371 367 363 357 354 352 348336 karakterHanya pencarian brute force sederhana.
Contoh dijalankan:
Penjelasan:
s(x)
adalah fungsi yang mengambil string yang berisi urutan digit dan mengembalikan semua ekspresi menggunakan digit tersebut dalam urutan itu.[x]['1'>x>'0':]
mengevaluasi ke daftar yang berisi x jika x adalah '0' atau urutan digit yang tidak dimulai dengan '0'; jika tidak, ia mengevaluasi ke daftar kosong. Pada dasarnya ini menangani kasus di mana saya menggabungkan semua angka.['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
pada dasarnya partisi x menjadi dua bagian (keduanya panjangnya tidak nol), memanggil s () pada setiap bagian dan menggabungkan semua hasil bersama beberapa operator di antara mereka, dengan menggunakan produk ().E(e)
pada dasarnya adalah eval yang aman. Ini mengembalikan nilai e jika e valid dan Tidak ada sebaliknya.Pada dasarnya, kode ini mencoba semua angka dalam rentang, membolehkan digitnya dan menguji setiap ekspresi yang dihasilkan () untuk permutasi itu, mengabaikan ekspresi pertama jika x tidak dimulai dengan '0', karena jika x tidak memulai dengan ' 0 'maka ekspresi pertama hanya akan menjadi x.
Versi alternatif - 397 karakter
Ini kode saya jika Anda diharuskan menggunakan pecahan:
sumber
if len(x)<2
fungsi tidak akan pernah benars
. Anda juga dapat menggantiformat
dengan"a[Fraction(%s)%s%s]='(%s%s%s)'"%(x[:i],o,v,x[:i],o,A)
untuk menyimpan 4 karakter.except:0
pintar .. sangat pintar. Saya akan ingatPython3
(436)(434)(443)Itu sulit. Saya dapat menyimpan beberapa karakter jika saya membuat output lebih asli.
Keluaran
sumber
"("+i+c+j+")"
dan menggantilen(n)>1
dengan1<len(n)
yang Anda dapat menghapus ruang setelah ekspresi itu.for j in r:print(r[j],j)
menyimpan 7 karakter.Mathematica
456416402404400396 karakterContoh :
Keluaran :
sumber