Chuyển đổi x-illion thành dạng chuẩn


14

Đưa ra một chuỗi, bao gồm một tiền tố và sau đó "illion", chuyển đổi số này thành dạng chuẩn.

Ví dụ:

"million" -> 10^6
"trillion" -> 10^12
"quattuordecillion" -> 10^45

Chương trình cần có khả năng xử lý đầu vào lên tới Centillion, tức là 10 ^ 303. Có thể tìm thấy danh sách các tên và giá trị biểu mẫu chuẩn của chúng ở đây - lưu ý rằng điều này mang lại giá trị cho mỗi gia số 10 ^ 3 lên đến 10 ^ 63, nhưng sau đó cung cấp cho chúng theo gia số 10 ^ 30, tuy nhiên mẫu này khá đơn giản.

Chương trình cần xử lý tất cả 100 trường hợp (ngay cả những trường hợp không được cung cấp rõ ràng bởi trang web được cung cấp) - đây là một số ví dụ về điều này:

"sexvigintillion" -> 10^81
"unnonagintillion" -> 10^276
"octotrigintillion" -> 10^117

Đầu vào có thể được cung cấp thông qua STDIN, đối số chức năng hoặc mã hóa cứng dưới dạng chuỗi.

Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng!


10 ^ 70 sẽ là gì?
Scimonster

3
10 ^ 70 không có đại diện vì 3 không phải là hệ số 70 - nhưng 10 ^ 69 sẽ là giới tính. 10 ^ 70 sẽ là 10 sexvigintillion.
James Williams

Trên thực tế, doevigintillion = 10 ^ 69 và sexvigintillion = 10 ^ 81.
Rémy

@Remy Tôi đoán bạn sử dụng thang đo dài (nếu đúng)? Có vẻ như câu hỏi này sử dụng quy mô ngắn.
Cole Johnson

@Cole Johnson: Danh sách tên được cung cấp của câu hỏi cho biết vigintillion = 10 ^ 63, và cho thấy rằng không thêm 3 vào sức mạnh, doe- thêm 6, sex- thêm 18, v.v.
Remy

Câu trả lời:


11

Python 2 ( 384 368 365 348 347 byte)

def c(s):
 s=s[:-6].replace('int','');k=0;d=dict(un=1,doe=2,tre=3,quattuor=4,quin=5,sex=6,septen=7,octo=8,novem=9,b=3,tr=4,quadr=5,qu=6,sext=7,sept=8,oct=9,non=10,dec=11,vig=21,trig=31,quadrag=41,quinquag=51,sexag=61,septuag=71,octog=81,nonag=91,cent=101)
 for p in(s!='m')*list(d)*2:
    if s.endswith(p):s=s[:-len(p)];k+=3*d[p]
 return 10**(k or 6)

( ifDòng được thụt lề với một tab duy nhất và phần còn lại với các khoảng trắng đơn.)

Đây c('million') == 10**6phải là một trường hợp đặc biệt vì 'novem'cũng kết thúc bằng 'm'.

Ví dụ:

c('million') == 10**6
c('trillion') == 10**12
c('quattuordecillion') == 10**45
c('novemnonagintillion') == 10**300
c('centillion') == 10**303

Cảm ơn Falko vì đã làm giảm nó xuống còn 350 byte.


Để thực hành, tôi đã thử viết lại nó như là một lớp lót bằng lambdas. Đó là 404 398 390 384 380 379 byte:

c=lambda s:(lambda t=[s[:-5].replace('gint',''),0],**d:([t.__setslice__(0,2,[t[0][:-len(p)],t[1]+3*d[p]])for p in 2*list(d)if t[0].endswith(p)],10**t[1])[1])(un=1,doe=2,tre=3,quattuor=4,quin=5,sex=6,septen=7,octo=8,novem=9,mi=2,bi=3,tri=4,quadri=5,qui=6,sexti=7,septi=8,octi=9,noni=10,deci=11,vii=21,trii=31,quadrai=41,quinquai=51,sexai=61,septuai=71,octoi=81,nonai=91,centi=101)

2
+1 cho việc lạm dụng thiếu thông số kỹ thuật của OP về việc có nên in "10 ^ x" hay chỉ trả về giá trị số là đủ.
Ingo Bürk

1
Cảm ơn, mặc dù return'10^'+str(3*k)sẽ chỉ có 4 byte nữa.
Rémy

1
Vì đây là python 2, bạn có thể sử dụng thụt lề không gian cho cấp độ đầu tiên và tab cho cấp độ thứ hai. Bạn cũng có thể di chuyển cả hai abvào hàm dưới dạng đối số từ khóa.
FryAmTheEggman

2
1000**kngắn hơn 10**(3*k). Tăng ktheo 3*d[p]cũng ngắn không kém.
xnor

2
Bạn có thể lưu một vài ký tự bằng cách tránh thoát sớm bằng cách sử dụng câu lệnh if'm'==s:k=6;d=[]dài thứ hai return.
Falko

9

JS (ES6), 292 270

Chỉ hiểu những con số được viết trong danh sách đã cho. OP không rõ ràng về những người khác.

z=b=>{a="M0B0Tr0Quadr0Quint0Sext0Sept0Oct0Non0Dec0Undec0Doedec0Tredec0Quattuordec0Quindec0Sexdec0Septendec0Octodec0Novemdec0Vigint0Trigint0Quadragint0Quinquagint0Sexagint0Septuagint0Octogint0Nonagint0Cent".split(0);for(i in a)if(~b.indexOf(a[i]))return"10^"+(20>i?3*i+6:93+30*(i-20))}

Thí dụ:

z("Billion") // "10^9"
z("Centillion") // "10^303"

Bạn có thể xóa các số 0 trong chuỗi và thay thế split(0)bằng match(/[A-Z][a-z]*/g)để sử dụng biểu thức chính quy để khớp với từng chuỗi.
NinjaBearMonkey

Điều này chỉ xử lý các tiền tố "un, doe, tre, v.v." cho hàng tỷ. Nó cũng nên xử lý các trường hợp như unvigintillion = 10 ^ 66 và novemnonagintillion = 10 ^ 300
Remy

Bạn có thể rút ngắn điều này bằng cách sử dụng các chức năng ES6 =>.
soktinpk

cảm ơn vì những lời khuyên. @Remy bạn có chắc không? OP dường như không hỏi điều đó
xem

Dường như rõ ràng với tôi rằng tất cả bội số của 3 là bắt buộc: "... điều này mang lại giá trị cho mỗi gia số 10 ^ 3 lên đến 10 ^ 63, nhưng sau đó cung cấp cho chúng theo gia số 10 ^ 30, tuy nhiên mô hình khá đơn giản" trong OP. OP cũng đưa ra một ví dụ về "sexvigintillion" trong một bình luận.
frageum

9

C, 235

Xử lý tất cả 100 trường hợp. Chương trình sử dụng stdin và stdout.

Ai cần regexes để tách trường hợp lạc đà?

char*Z="UUUi+W<)E(<7-7-++*)('&%$,*$&%$",u[999]="\0MBRilDriPtiNiUnOeReTtUiXTeCtVeCiGRigRaUagInquiXaXsexPtuOgOoNaCeCeK1",s[99],*U=u+67;
main(n){
for(gets(s);*--U;)
*U<95?
*U|=32,
n+=!!strstr(s,U)*(*Z++-35),
*U=0:
3;puts(memset(u+68,48,3*n)-1);
}

Thí dụ

octoseptuagintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

1
Thứ này thậm chí không còn giống C nữa ... Tôi ngạc nhiên.
Quentin

Tại sao không gian ( *U<95 ?) và tất cả các dòng mới?
tomsmeding

@tomsmeding Không gian là một sự giám sát. Các dòng mới làm cho mã "có thể đọc được" và không được tính vào số lượng.
frageum

2

Clojure, 381 377 byte

(defn c[x](let[l{"M"6"B"9"Tr"12"Quadr"15"Quint"18"Sext"21"Sept"24"Oct"27"Non"30"Dec"33"Undec"36"Doedec"39"Tredec"42"Quattuordec"45"Quindec"48"Sexdec"51"Septendec"54"Octodec"57"Novemdec"60"Vigint"63"Trigint"93"Googol"100"Quadragint"123"Quinquagint"153"Sexagint"183"Septuagint"213"Octogint"243"Nonagint"273"Cent"303}v(l(clojure.string/replace x #"illion$" ""))](Math/pow 10 v)))

Thí dụ:

(c "Septuagintillion") ;; 1.0E213


2

Haskell, 204 byte (+9 cho Chuỗi được định dạng)

import Data.List
x s=10^(f$[a|k<-tails s,i<-inits k,(b,a)<-zip["ce","ad","un","do","b","mi","vi","tr","at","ui","x","p","oc","no","ec","g"]$100:4:1:2:2:[1..],b==i])
f[]=3
f(x:11:r)=30*x+f r
f(x:r)=3*x+f r

Trong GHCi:

*Main> x "decillion"
1000000000000000000000000000000000

Thay thế 10^(bằng "10^"++(show.thêm 9 byte:

import Data.List
x s="10^"++(show.f$[a|k<-tails s,i<-inits k,(b,a)<-zip["ce","ad","un","do","b","mi","vi","tr","at","ui","x","p","oc","no","ec","g"]$100:4:1:2:2:[1..],b==i])
f[]=3
f(x:11:r)=30*x+f r
f(x:r)=3*x+f r

Trong GHCi:

*Main> x "decillion"
"10^33"

Chỉnh sửa: Tôi đã phải sửa cho "quinquagintillion"có chứa "qua".

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.