JS, 1719/1694
Teori
Sayangnya, aturan yang Anda berikan mungkin bukan keputusan bijak dari sudut pandang matematika. Bahkan, menggunakan subset aturan yang lebih kecil, Anda dapat menemukan solusi untuk setiap angka dalam interval yang diberikan
kecuali untuk
yang tidak ada solusinya.
Set aturan yang dikurangi
Pertimbangkan subet aturan berikut:
- Gunakan hanya operator
plus
, minus
dan times
.
- Anda tidak perlu menerapkan beberapa kejadian
plus
atau minus
dalam ekspresi Anda.
- Anda tidak perlu mengimplementasikan keduanya
division
atau operator associativity
(karena set solusi mereka sudah dicakup oleh aturan pertama).
Alasan mengapa ini berhasil adalah, seperti yang Anda diskusikan sebelumnya dengan @Qwix, Anda mengizinkan jawaban yang membosankan , yaitu, ekspresi yang diakhiri dengan ekspresi reguler
( times one)+$
. Mengizinkan ini, setiap angka dalam interval yang diberikan akan memiliki solusi.
Ketika Anda menjawab di salah satu komentar Anda,
@ Kwik Ya; jawaban yang membosankan dapat diterima, meskipun jawaban itu tidak berlaku untuk 104, 105, 106, 107, 108, 109, 110, atau 111. -
Anda benar sekali: Ini tidak berfungsi ketika Anda mencoba membangun ekspresi Anda dimulai dengan angka itu sendiri, yaitu one hundred four times one times one …
atau angka-angka lainnya.
Namun, jika ekspresi Anda dimulai dengan ekspresi yang evaluasinya sama dengan salah satu angka yang diberikan, Anda kurang beruntung. Misalnya, perhatikan itu 17 + 87
memang 104
, jadi kita bisa menulis 104
sebagai:
104: seventeen plus eighty seven times one times one times one times one times one times one times one times one times one times one
Untuk melihat bahwa bagian ini berfungsi, simpan file ini sebagai num.js
dan pastikan bahwa SpiderMonkey, mesin JavaScript untuk baris perintah, diinstal pada sistem Anda.
Algoritma
- Mari kita mendefinisikan properti
K
untuk bilangan bulat positif sebagai keadaan angka yang memiliki N
huruf dan memiliki nilaiN
.
- Mari kita lebih lanjut mendefinisikan properti
F
untuk ekspresi sebagai keadaan konversi kata menjadi 8k
-kali lebih pendek dari evaluasinya dengan k ∈ ℕ. F
singkatan dari "dapat diisi" dan menjelaskan apakah kita dapat mengisi kata konversi dari ekspresi dengan ekspresi panjang 8 (yaitu " times one"
) sehingga ekspresi yang dihasilkan mungkin mendapatkan properti N
.
Kami kemudian melanjutkan sebagai berikut:
- Ubah nomor input menjadi kata-kata.
- Periksa apakah nomor input memiliki properti
K
.
- Jika ya, kembalikan kata-kata tersebut (
4
sayangnya hanya nomor yang memiliki properti ini).
- Jika tidak, lanjutkan.
- Untuk semua ekspresi dua operan (penambahan, pengurangan, dan perkalian dalam urutan ini) yang menghasilkan nomor input, periksa apakah evaluasinya memiliki properti
K
.
- Jika ya, kembalikan kata-katanya.
- Jika tidak, periksa apakah ekspresi dua operan memiliki properti
N
.
- Jika ya, isi ekspresi dengan
" times one"
dan periksa apakah evaluasi ekspresi yang dihasilkan memiliki properti K
.
- Jika ya, kembalikan kata-katanya
- Jika tidak, lanjutkan
- Jika tidak, lanjutkan
- Pergi minum kopi
Praktek
num.js (untuk SpiderMonkey / baris perintah)
function X(e,t){return e+": "+t}function P(e){var n,t;for(n=1;.5*e+(e%2===0?1:0)>n;++n){if(t=C.s(n)+" plus "+C.s(e-n),t.replace(/\s/g,"").length===e)return t;if(F(e,t)&&e>t.length)return G(e,t)}return!1}function M(e){var t,n;for(t=L;t>1;--t){if(0>t-e)return!1;if(n=C.s(t)+" minus "+C.s(t-e),n.replace(/\s/g,"").length===e)return n;if(F(e,n)&&e>n.length)return G(e,n)}return!1}function F(e,t){return(e-t.replace(/\s/g,"").length)%8===0}function G(r,t){var e,i=(r-t.replace(/\s/g,"").length)/8,n="";for(e=0;i>e;++e)n+=" times one";return t+n}function T(e){var t,n,r;if(F(e,C.s(e)))return G(e,C.s(e));for(t=1,n=1;t<Math.floor(Math.sqrt(e));++t){for(;e>tn;)++n;if(tn===e&&(r=C.s(t)+" times "+C.s(n),r.replace(/\s/g,"").length===e))return r}return!1}function Y(e){var n,r,t;return e===C.s(e).length?X(e,C.s(e)):(n=P(e))?X(e,n):(r=M(e))?X(e,r):(t=T(e),t?X(e,t):X(e,"impossible"))}var L=1e4,C=new function(){return this.o=["","one","two","three","four","five","six","seven","eight","nine"],this.t=["","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"],this.T=["ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"],this.s=function(e){return e?this.m(e):"zero"},this.m=function(e){return e>=1e6?this.m(Math.floor(e/1e6))+" million"+(e%1e6!==0?" "+this.Z(e%1e6):""):this.Z(e)},this.Z=function(e){return e>=1e3?this.h(Math.floor(e/1e3))+" thousand"+(e%1e3!==0?" "+this.h(e%1e3):""):this.h(e)},this.h=function(e){return e>99?this.o[Math.floor(e/100)]+" hundred"+(e%100!==0?" "+this.U(e%100):""):this.U(e)},this.U=function(e){return 10>e?this.o[e]:e>=10&&20>e?this.T[e-10]:this.t[Math.floor(e/10)]+(e%10!==0?" "+this.o[e%10]:"")},this};print(Y(0|arguments[0]))
num.js (untuk browser)
Kode yang diberikan dari atas tidak dapat berfungsi untuk browser karena perintah terakhirnya, yang mengambil argumen baris perintah untuk membuat perintah yang bagus dari skrip yang diberikan.
Untuk menjalankan kode JavaScript langsung dari dalam browser Anda, pilih bagian dari kode di atas:
function X(e,t){return e+": "+t}function P(e){var n,t;for(n=1;.5*e+(e%2===0?1:0)>n;++n){if(t=C.s(n)+" plus "+C.s(e-n),t.replace(/\s/g,"").length===e)return t;if(F(e,t)&&e>t.length)return G(e,t)}return!1}function M(e){var t,n;for(t=L;t>1;--t){if(0>t-e)return!1;if(n=C.s(t)+" minus "+C.s(t-e),n.replace(/\s/g,"").length===e)return n;if(F(e,n)&&e>n.length)return G(e,n)}return!1}function F(e,t){return(e-t.replace(/\s/g,"").length)%8===0}function G(r,t){var e,i=(r-t.replace(/\s/g,"").length)/8,n="";for(e=0;i>e;++e)n+=" times one";return t+n}function T(e){var t,n,r;if(F(e,C.s(e)))return G(e,C.s(e));for(t=1,n=1;t<Math.floor(Math.sqrt(e));++t){for(;e>tn;)++n;if(tn===e&&(r=C.s(t)+" times "+C.s(n),r.replace(/\s/g,"").length===e))return r}return!1}function Y(e){var n,r,t;return e===C.s(e).length?X(e,C.s(e)):(n=P(e))?X(e,n):(r=M(e))?X(e,r):(t=T(e),t?X(e,t):X(e,"impossible"))}var L=1e4,C=new function(){return this.o=["","one","two","three","four","five","six","seven","eight","nine"],this.t=["","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"],this.T=["ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"],this.s=function(e){return e?this.m(e):"zero"},this.m=function(e){return e>=1e6?this.m(Math.floor(e/1e6))+" million"+(e%1e6!==0?" "+this.Z(e%1e6):""):this.Z(e)},this.Z=function(e){return e>=1e3?this.h(Math.floor(e/1e3))+" thousand"+(e%1e3!==0?" "+this.h(e%1e3):""):this.h(e)},this.h=function(e){return e>99?this.o[Math.floor(e/100)]+" hundred"+(e%100!==0?" "+this.U(e%100):""):this.U(e)},this.U=function(e){return 10>e?this.o[e]:e>=10&&20>e?this.T[e-10]:this.t[Math.floor(e/10)]+(e%10!==0?" "+this.o[e%10]:"")},this}
Sekarang, rekatkan ke konsol JavaScript browser Anda, sehingga Anda dapat menghasilkan hasil yang sama dari dalam browser Anda dengan, misalnya:
Y(1234);
Contoh (baris perintah)
chiru@chiru ~ $ js num.js 28
28: fourteen plus fourteen times one
chiru@chiru ~ $ js num.js 7
7: impossible
chiru@chiru ~ $ js num.js 42
42: nine thousand sixty minus nine thousand eighteen
Dan untuk melihat trik yang dapat digunakan untuk membuat setiap angka berfungsi, lihat saja jawaban yang membosankan untuk js num.js 1337
:
1337: ten plus one thousand three hundred twenty seven times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one
Kode yang diberikan menghasilkan solusi yang valid untuk interval yang diberikan (dan mungkin bahkan di atas, Anda hanya perlu menaikkan nilai variabel L
).
Statistik
Saya tertarik pada "betapa membosankan " ekspresi itu (atau: seberapa banyak substring times one
digunakan per ekspresi dalam algoritma ini), karena bagian ini bertanggung jawab untuk menemukan solusi untuk setiap angka dalam interval yang diberikan. Lihat sendiri:
x : n-th ekspresi (min. 0, maks. 10.000)
y : jumlah kemunculan substring "kali satu" dalam ekspresi (min. 0, maks. 1245)
Kesimpulan:
- Ekspresi cenderung semakin membosankan dalam cara yang linier.
- Lebih dari 99% solusi membosankan.
So for 1234 we can do (massive expression) times zero plus one thousand two hundred thirty four.
Anda mungkin ingin mengecualikan nol. Terserah kamu.