Biểu thức bằng chiều dài của nó


14

Cho một số, tìm một biểu thức trong các từ bằng số đó, với độ dài của số đó.

Do đó, với đầu vào 15, bạn có thể xuất ra sixteen minus one, có mười lăm ký tự (không tính khoảng trắng). Nếu nhiều giải pháp tồn tại, in bất cứ điều gì bạn muốn. Nếu không tồn tại, inimpossible

Chỉ sử dụng các nhà khai thác plus, minus, times, và divided by. Các nhà khai thác được đánh giá từ trái sang phải.

Định dạng 1234 như one thousand two hundred thirty four. Lưu ý sự vắng mặt của "và" và không có dấu gạch ngang hoặc dấu phẩy.

Đầu vào và tất cả các số được sử dụng trong đầu ra phải là số nguyên dương nhỏ hơn 10.000.

Đầu vào sẽ được đưa ra dưới dạng đối số dòng lệnh. In ra đầu ra tiêu chuẩn.

Ví dụ

1: impossible
4: four
7: impossible
13: eight plus five (you could also output "five plus eight")
18: one plus two times six (note that operators are evaluated from left to right)
25: one thousand divided by forty

4
số nguyên không âm? 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
Cấp sông St

@steveverrill Điểm tốt; Tôi đã thay đổi nó thành "số nguyên dương".
Ypnypn

4
thật ... one hundred three times one times one times one times one times one times one times one times one times one times one times onecó hợp lệ không?
Qwix

@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.
Ypnypn

Câu trả lời:


1

Javascript, 434 ký tự

function f(s){return s.replace(/[A-Z]/g,function(t){return{O:'one',T:'two',H:'three',F:'four',I:'five',S:'six',E:'seven',G:'eight',N:'nine',Z:'ten',P:' plus ',M:' minus ',U:' times ',X:'teen',A:'thir',B:'twenty'}[t]})}A='TPAX|GeenMT|EXUO|B FMS|F|GPSUT|ZPHPG|BPFMT|AXPFPS|BPGMF|EUOPGeen|NPT|B GMSPI|GPI|EPE'.split('|');O=26640;function S(n){return n<15&&!(O>>n&1)?'Invalid':f(A[v=n%15])+(new Array(~~(n/15)+(O>>v&1))).join(f('PSPN'))}

Mang lại một hàm trong không gian tên toàn cục, Schấp nhận bất kỳ số nguyên không âm nào và trả về chuỗi yêu cầu hoặc "Invalid"nếu số nguyên không thể được biểu diễn trong các thông số kỹ thuật.

Tôi dường như đã sử dụng cách tiếp cận tương tự như @optokopper, đã thực hiện cùng một quan sát đó "plus six plus nine"là chuỗi đệm ngắn nhất có thể, và tất cả các số lớn hơn 27 có thể được biểu thị bằng cách nối một trong 15 chuỗi cơ sở với các bản sao lặp lại của pad.

Phải nói rằng, các bảng của các chuỗi cơ sở chúng tôi sử dụng khác nhau và giải pháp của tôi phụ thuộc vào việc xoay vòng bit và toán tử còn lại ( %). Nó cũng bao gồm "multiplied by"như là một hoạt động có thể. Và một cách tự nhiên các cơ chế về cách các chuỗi được xây dựng là hoàn toàn khác nhau do sự khác biệt giữa C và Javascript.

Đó là nỗ lực tốt nhất của tôi, ở mức nào. ;)

Đặc biệt cảm ơn @chiru, người thảo luận về những con số có thể đạt được đã giúp ngăn chặn việc tìm kiếm không có kết quả.


22

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

Tôi = [1;  10000]

ngoại trừ

X = [1;  3] ∪ [5;  10] {12}

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, minustimes.
  • Bạn không cần phải thực hiện nhiều lần xuất hiện plushoặc minustrong biểu thức của mình.
  • Bạn không cần phải thực hiện không divisionhay 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 + 87là thực sự 104, vì vậy chúng tôi có thể viết 104như 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.jsvà đả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 Kcho số nguyên dương là trạng thái của số có Nchữ cái và có giá trị N.
  • Chúng ta hãy định nghĩa thêm thuộc tính Fcho 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 ∈. Flà 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ừ ( 4là 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)

Đồ thị

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.

2
Một giải pháp cho 4 tồn tại trên mạngfour
FUZxxl

@FUZxxl Tôi không bao giờ phủ nhận điều đó. Trong trường hợp bạn đang phản hồi If it does, return the words (4 is the only number with this property, unfortunately), bạn có thể đã hiểu nhầm phần này. Nó nói rằng đó 4là biểu thức duy nhất không có toán tử tạo thành giải pháp riêng của nó.
Chiru

@FUZxxl ơi, được rồi. Tôi chỉ phát hiện ra rằng trong phần đầu, tôi đã nói rằng không có giải pháp nào trong X = [0; 10] {12}, mặc dù sau này, tôi nói rằng 4có một giải pháp. Tôi đã sửa chữa khoảng thời gian, cảm ơn. :)
Chiru

6

C, 450 ký tự

Chỉnh sửa: đã xóa zero

Chỉnh sửa: chỉ sử dụng plusminus

Tôi đã tìm kiếm biểu thức ngắn nhất có thêm ký tự và giữ điều kiện đúng. Tôi tìm thấy plus ten plus fivelà 15 dài và thêm 15 vào chuỗi.

Tôi chỉ cần biểu thức cho 15 số đầu tiên không phải là không thể, để thể hiện bất kỳ số nào có thể. 12 là số không thể lớn nhất, do đó, nó đủ cho số mã cứng nhỏ hơn 28.

4 = bốn
11 = sáu cộng năm
13 = tám cộng năm
14 = hai mươi trừ sáu
15 = hai mươi trừ năm
16 = mười tám trừ hai
17 = mười bốn cộng ba
18 = hai mươi hai trừ bốn
20 = ba mươi hai trừ mười hai
21 = hai mươi cộng hai trừ một
22 = hai mươi cộng bốn trừ hai
23 = ba mươi trừ tám cộng một
24 = hai mươi cộng tám trừ bốn
25 = hai mươi cộng tám trừ ba
27 = hai mươi tám trừ sáu cộng năm

Chúng ta có thể viết mỗi số> 27 dưới dạng x * 15 + một trong những số trên.

Chơi gôn

#define P" plus "
#define M" minus "
#define U"four"
#define F"five"
#define E"eight"
#define W"twenty"
#define A"ten"P F P
*e[]={0,0,0,0,U,0,0,0,0,0,0,F P"six",0,E P F,W M"six",W M F,E"een"M"two",U"teen"P"three",W" two"M U,A U,"thirty two"M"twelve",W P"two"M"one",W M"two"P U,"thirty"P"one"M E,W P E M U,W M"three"P E,A F P"six",W" "E M"six"P F};main(n){n=atoi(1[(int*)1[&n]]);for(printf("%d: ",n);n>27;n-=15)printf(A);puts(e[n]?e[n]:"impossible");}

Mã có thể đọc được

#include <stdio.h>
#include <stdlib.h>

// add fifteen to string, both as value and as character count (without spaces)
const char *add_fifteen = "plus ten plus five";

// table with hardcoded expressions
// NOTE: we could calculate 19, 26, 28 and 29 from 4, 11, 13 and 14
// but we would need more logic, so we hardcode those 4 numbers too.
const char *expressions[30]={"impossible", "impossible", "impossible", "impossible",
    "four", "impossible", "impossible", "impossible", "impossible",
    "impossible", "impossible", "five plus six", "impossible",
    "eight plus five", "twenty minus six",
    "fourteen plus one", "eighteen minus two", "fourteen plus three",
    "twenty two minus four", "four plus ten plus five",
    "thirty two minus twelve", "nine plus seven plus five",
    "twenty plus four minus two", "twelve plus seven plus four",
    "twenty plus eight minus four", "twenty plus eight minus three",
    "five plus six plus ten plus five", "twenty eight minus six plus five",
    "eight plus five plus ten plus five", "seven plus seven plus ten plus five"};

int main(int argc,char *argv[])
{
    int n = strtol(argv[1], NULL, 0);
    int fifteens = 0;

    printf("%d: ", n);

    // how many times do we need to add fifteen?
    if(n>29){
        fifteens=(n/15) - 1;
        n -= fifteens*15; // ensure 30 > n >= 15, so we don't get "impossible"
    }

    // look up the expression for n
    printf("%s", expressions[n]);

    // add fifteens till we are done
    while(fifteens-- > 0) {
        printf(" %s", add_fifteen);
    }

    printf("\n");
    return 0;
}

2
Không hoàn toàn chắc chắn làm thế nào mã của bạn hoạt động, nhưng vì câu hỏi nói rằng all numbers used in the output must be positive integers, bạn có thể xóa #define Z "zero"mã khỏi mã của mình cùng với các phiên bản của Z vì bạn không bao giờ nên sử dụng nó?
Qwix

"cộng mười hai" là 12 chữ cái. Điều đó sẽ giúp rút ngắn mã của bạn?
isaacg

Tôi sẽ làm cho nó ngắn hơn, than ôi không gian, plus twelvechỉ có 10 chữ cái
Optokopper

OK, tôi đọc sai các quy tắc.
isaacg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.