JS, 1719/1694
ทฤษฎี
น่าเสียดายที่กฎที่คุณให้ไว้อาจไม่ใช่การตัดสินใจที่ชาญฉลาดจากมุมมองทางคณิตศาสตร์ ในความเป็นจริงการใช้กฎส่วนย่อยที่เล็กกว่านั้นคุณสามารถค้นหาวิธีแก้ปัญหาสำหรับทุกหมายเลขในช่วงเวลาที่กำหนด
ยกเว้น
ซึ่งไม่มีวิธีแก้ปัญหา
ชุดกฎที่ลดลง
พิจารณากฎย่อยต่อไปนี้:
- ใช้เฉพาะผู้ประกอบการ
plus
, และminus
times
- คุณไม่จำเป็นต้องใช้หลายเหตุการณ์
plus
หรือminus
ในนิพจน์ของคุณ
- คุณไม่จำเป็นต้องใช้ค่า
division
มิได้operator associativity
(เป็นชุดโซลูชั่นของพวกเขาได้รับการคุ้มครองแล้วโดยกฎข้อแรก)
เหตุผลที่ว่าทำไมงานนี้ก็คือว่าในขณะที่คุณกล่าวถึงก่อนหน้านี้ที่มี @Qwix คุณให้น่าเบื่อคำตอบ( times one)+$
ที่เป็นสำนวนที่ว่าจุดสิ้นสุดในการแสดงออกปกติ
การอนุญาตสิ่งนี้แต่ละหมายเลขในช่วงเวลาที่กำหนดจะมีทางออก
เมื่อคุณตอบในความคิดเห็นของคุณ
@Qwix ใช่; คำตอบที่น่าเบื่อเป็นที่ยอมรับแม้ว่าจะไม่สามารถใช้ได้กับ 104, 105, 106, 107, 108, 109, 110 หรือ 111
คุณพูดถูก: ไม่ได้ผลเมื่อคุณพยายามสร้างนิพจน์ของคุณโดยเริ่มจากตัวเลขเองone hundred four times one times one …
หรือตัวเลขอื่น ๆ
อย่างไรก็ตามหากการแสดงออกของคุณเริ่มต้นด้วยการแสดงออกซึ่งการประเมินเท่ากับหนึ่งในตัวเลขที่กำหนดคุณจะโชคไม่ดี ตัวอย่างเช่นให้สังเกตว่า17 + 87
เป็นจริง104
ดังนั้นเราจึงสามารถเขียน104
เป็น:
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
หากต้องการดูว่าชุดย่อยนี้ใช้งานได้ให้บันทึกไฟล์นี้num.js
และตรวจสอบให้แน่ใจว่าติดตั้ง SpiderMonkey ซึ่งเป็นเอ็นจิน JavaScript สำหรับบรรทัดคำสั่งบนระบบของคุณ
อัลกอริทึม
- ให้เรากำหนดสถานที่
K
สำหรับจำนวนเต็มบวกเป็นรัฐของจำนวนที่มีตัวอักษรและมีค่าของN
N
- ให้เรากำหนดคุณสมบัติเพิ่มเติม
F
สำหรับนิพจน์เนื่องจากสถานะของการแปลงคำ8k
นั้น - สั้นกว่าการประเมินด้วย k ∈ℕ F
ย่อมาจาก "fillable" และอธิบายหรือไม่ว่าเราสามารถเติมเต็มการแปลงคำในการแสดงออกที่มีการแสดงออกของความยาว 8 (คือ" times one"
) N
ดังกล่าวว่าการแสดงออกที่เกิดอาจได้รับทรัพย์สิน
จากนั้นเราจะดำเนินการดังนี้:
- แปลงหมายเลขอินพุตเป็นคำ
- ตรวจสอบว่าหมายเลขอินพุตมีคุณสมบัติ
K
หรือไม่
- หากเป็นเช่นนั้นให้ส่งคืนคำ (
4
เป็นตัวเลขเดียวกับคุณสมบัตินี้ขออภัย)
- หากไม่เป็นเช่นนั้นให้ดำเนินการต่อ
- สำหรับนิพจน์สองตัวถูกดำเนินการทั้งหมด (ส่วนเพิ่มเติมการลบและการคูณในลำดับนี้) ที่ส่งผลให้หมายเลขอินพุตตรวจสอบว่าการประเมินของพวกเขามีคุณสมบัติ
K
หรือไม่
- ถ้าเป็นเช่นนั้นส่งคืนคำ
N
ถ้ามันไม่ได้ตรวจสอบว่าการแสดงออกสองตัวถูกดำเนินการมีสถานที่ให้บริการ
- หากเป็นเช่นนั้นให้เติมนิพจน์ด้วย
" times one"
และตรวจสอบว่าการประเมินผลของนิพจน์ที่เกิดขึ้นมีคุณสมบัติK
หรือไม่
- ถ้าเป็นเช่นนั้นส่งคืนคำ
- หากไม่เป็นเช่นนั้นให้ดำเนินการต่อ
- หากไม่เป็นเช่นนั้นให้ดำเนินการต่อ
- ไปดื่มกาแฟ
การปฏิบัติ
num.js (สำหรับ SpiderMonkey / บรรทัดคำสั่ง)
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 (สำหรับเบราว์เซอร์)
โค้ดที่กำหนดจากด้านบนไม่สามารถใช้งานได้กับเบราว์เซอร์เนื่องจากคำสั่งสุดท้ายซึ่งคว้าอาร์กิวเมนต์บรรทัดคำสั่งเพื่อสร้างคำสั่งที่ดีจากสคริปต์ที่กำหนด
ในการเรียกใช้รหัส JavaScript โดยตรงจากภายในเบราว์เซอร์ของคุณให้เลือกรหัสข้างบนนี้:
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}
ตอนนี้วางลงในคอนโซล JavaScript ของเบราว์เซอร์เพื่อให้คุณสามารถสร้างผลลัพธ์เดียวกันจากภายในเบราว์เซอร์ของคุณด้วยตัวอย่างเช่น:
Y(1234);
ตัวอย่าง (บรรทัดคำสั่ง)
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
และเพื่อดูเคล็ดลับที่คุณสามารถทำให้ตัวเลขแต่ละตัวทำงานได้เพียงดูคำตอบที่น่าเบื่อสำหรับ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
รหัสที่จัดทำขึ้นจะสร้างโซลูชันที่ถูกต้องสำหรับช่วงเวลาที่กำหนด (และอาจสูงกว่านั้นคุณต้องเพิ่มค่าของตัวแปรL
)
สถิติ
ฉันสนใจ " นิพจน์ที่น่าเบื่อ " (หรือ: ใช้สตริงย่อยtimes one
ต่อนิพจน์ภายในอัลกอริทึมนี้เท่าใด) เนื่องจากส่วนนี้มีหน้าที่ในการค้นหาวิธีแก้ปัญหาสำหรับทุกจำนวนภายในช่วงเวลาที่กำหนด ดูตัวเอง:
x : นิพจน์ที่ n (ต่ำสุด 0, สูงสุด 10,000)
y : จำนวนสตริงย่อย "คูณหนึ่ง" ภายในนิพจน์ (ต่ำสุด 0, สูงสุด 1245)
สรุป:
- การแสดงออกมีแนวโน้มที่จะได้รับน่าเบื่อมากขึ้นในลักษณะเชิงเส้น
- โซลูชันกว่า 99% นั้นน่าเบื่อ
So for 1234 we can do (massive expression) times zero plus one thousand two hundred thirty four.
คุณอาจต้องการยกเว้นศูนย์ แล้วแต่คุณ.