JS, 1719/1694
Học thuyết
Thật không may, bộ quy tắc mà bạn cung cấp có thể không phải là một quyết định sáng suốt từ quan điểm toán học. Trong thực tế, bằng cách sử dụng một tập hợp quy tắc nhỏ hơn, bạn có thể tìm ra giải pháp cho mọi số trong khoảng đã cho
ngoại trừ
mà không có giải pháp.
Bộ quy tắc giảm
Hãy xem xét các tập hợp con sau đây của quy tắc:
- Chỉ sử dụng các toán tử
plus
, minus
và times
.
- Bạn không cần phải thực hiện nhiều lần xuất hiện
plus
hoặc minus
trong biểu thức của mình.
- Bạn không cần phải thực hiện không
division
hay operator associativity
(như bộ giải pháp của họ đã được bao phủ bởi các quy tắc đầu tiên).
Lý do tại sao điều này hoạt động là vì, như bạn đã thảo luận trước đó với @Qwix, bạn cho phép các câu trả lời nhàm chán , nghĩa là các biểu thức kết thúc bằng biểu thức chính quy
( times one)+$
. Cho phép điều này, mỗi số trong khoảng nhất định sẽ có một giải pháp.
Khi bạn trả lời một trong những bình luận của bạn,
@Qwix Có; câu trả lời nhàm chán được chấp nhận, mặc dù câu trả lời không hoạt động cho 104, 105, 106, 107, 108, 109, 110 hoặc 111. -
bạn hoàn toàn đúng: Điều này không hiệu quả khi bạn đang cố gắng xây dựng biểu thức của mình bắt đầu bằng chính các số đó, one hundred four times one times one …
hoặc bất kỳ số nào khác.
Tuy nhiên, nếu biểu thức của bạn bắt đầu bằng một biểu thức có đánh giá bằng một trong các số đã cho, bạn sẽ không gặp may. Ví dụ, lưu ý đó 17 + 87
là thực sự 104
, vì vậy chúng tôi có thể viết 104
như sau:
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
Để thấy rằng tập hợp con này hoạt động, hãy lưu tệp này dưới dạng num.js
và đảm bảo rằng SpiderMonkey, một công cụ JavaScript cho các dòng lệnh, được cài đặt trên hệ thống của bạn.
Thuật toán
- Hãy để chúng tôi xác định thuộc tính
K
cho số nguyên dương là trạng thái của số có N
chữ cái và có giá trị N
.
- Chúng ta hãy định nghĩa thêm thuộc tính
F
cho một biểu thức là trạng thái chuyển đổi từ của nó là 8k
-times ngắn hơn so với đánh giá của nó với k ∈. F
là viết tắt của "fillable" và mô tả liệu chúng ta có thể điền vào chuyển đổi từ của biểu thức với các biểu thức có độ dài 8 (nghĩa là " times one"
) để biểu thức kết quả có thể có được thuộc tính hay không N
.
Sau đó chúng tôi tiến hành như sau:
- Chuyển đổi số đầu vào thành từ.
- Kiểm tra xem số đầu vào có thuộc tính không
K
.
- Nếu có, hãy trả lại các từ (
4
là số duy nhất có thuộc tính này, không may).
- Nếu không, tiến hành.
- Đối với tất cả các biểu thức hai toán hạng (phép cộng, phép trừ và phép nhân theo thứ tự này) dẫn đến số đầu vào, hãy kiểm tra xem đánh giá của chúng có thuộc tính không
K
.
- Nếu có, trả lại các từ.
- Nếu không, kiểm tra xem biểu thức hai toán hạng có thuộc tính không
N
.
- Nếu có, điền biểu thức vào
" times one"
và kiểm tra xem đánh giá biểu thức kết quả có thuộc tính không K
.
- Nếu có, trả lại các từ
- Nếu không, tiến hành
- Nếu không, tiến hành
- Đi uống cà phê
Thực hành
num.js (đối với SpiderMonkey / dòng lệnh)
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 (dành cho trình duyệt)
Mã đã cho từ phía trên không thể hoạt động cho các trình duyệt do lệnh cuối cùng của nó, lấy các đối số dòng lệnh để tạo một lệnh đẹp từ tập lệnh đã cho.
Để chạy mã JavaScript trực tiếp từ trong trình duyệt của bạn, hãy chọn đoạn mã trên:
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}
Bây giờ, dán nó vào bảng điều khiển JavaScript của trình duyệt của bạn, để bạn có thể tạo ra kết quả tương tự từ bên trong trình duyệt của mình với, ví dụ:
Y(1234);
Ví dụ (dòng lệnh)
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
Và để xem mẹo mà bạn có thể làm cho mỗi số hoạt động, chỉ cần xem câu trả lời nhàm chán cho 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
Các mã được cung cấp tạo ra các giải pháp hợp lệ cho khoảng thời gian nhất định (và thậm chí ở trên, bạn chỉ phải tăng giá trị của biến L
).
Số liệu thống kê
Tôi đã quan tâm đến "mức độ nhàm chán " của các biểu thức (hoặc: bao nhiêu chuỗi con times one
được sử dụng cho mỗi biểu thức trong thuật toán này), vì phần này chịu trách nhiệm tìm giải pháp cho mọi số trong khoảng đã cho. Xem cho chính mình:
x : biểu thức thứ n (tối thiểu 0, tối đa 10.000)
y : số lần xuất hiện của chuỗi con "lần một" trong biểu thức (tối thiểu 0, tối đa 1245)
Kết luận:
- Các biểu thức có xu hướng ngày càng nhàm chán theo cách tuyến tính.
- Hơn 99% giải pháp là nhàm chán.
So for 1234 we can do (massive expression) times zero plus one thousand two hundred thirty four.
Bạn có thể muốn loại trừ không. Tùy bạn