将x-illion转换为标准格式


14

给定一个字符串,该字符串包括一个前缀,然后是“ illion”,请将此数字转换为标准格式。

例如:

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

该程序必须能够处理高达100%的输入,即10 ^ 303。可以在此处找到名称及其标准格式值的列表-请注意,这会为每10 ^ 3增量(直到10 ^ 63)给出值,但随后会以10 ^ 30增量给出值,但是这种模式非常简单。

该程序需要处理所有100种情况(甚至没有提供的网站明确给出的情况)-以下是一些示例:

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

输入可以通过STDIN,函数参数或硬编码为字符串来给出。

这是代码高尔夫球,所以最短的代码胜出!


10 ^ 70是多少?
Scimonster 2014年

3
10 ^ 70没有表示形式,因为3不是70的因数-但是10 ^ 69将是sexvigintillion。10 ^ 70将是10 sexvigintillion。
James Williams

实际上,doevigintillion = 10 ^ 69,而sexvigintillion = 10 ^ 81。
雷米2014年

@Remy我猜你会使用长刻度(如果是正确的话)?听起来这个问题使用的是小量表。
科尔·约翰逊

@Cole约翰逊:这个问题的提供的名单说vigintillion = 10 ^ 63,也显示了非加3的电能,doe,您好增加了6,性别增加18等
雷米

Answers:


11

蟒2(384 368 365 348 347字节)

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)

(该if行缩进一个制表符,其余缩进一个空格。)

c('million') == 10**6必须是特例,因为'novem'也以结尾'm'

例子:

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

感谢Falko将其混淆到350个字节。


为了练习,我尝试使用lambdas将其重写为单线。这是404 398 390 384 380 379个字节:

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用于滥用OP缺乏说明是否应打印 “ 10 ^ x” 或仅返回数值是否足够。
IngoBürk2014年

1
谢谢,虽然return'10^'+str(3*k)只会再增加4个字节。
雷米

1
由于这是python 2,因此您可以在第一级使用空格缩进,在第二级使用制表符。也可以同时移动ab进入功能作为关键字参数。
FryAmTheEggman 2014年

2
1000**k比短10**(3*k)。递增k3*d[p]也同样短暂。
xnor 2014年

2
通过避免使用if'm'==s:k=6;d=[]而不是第二个冗长的return语句来提前退出,可以节省一些字符。
Falko 2014年

9

JS(ES6),292 270

仅理解写在给定列表中的数字。OP不清楚其他人。

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))}

例:

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

您可以删除字符串中的零并替换split(0)match(/[A-Z][a-z]*/g)以使用正则表达式来匹配每个字符串。
NinjaBearMonkey 2014年

这仅处理十进制的“ un,doe,tre等”前缀。它还应处理unvigintillion = 10 ^ 66和novemnonagintillion = 10 ^ 300之类的事件
Remy

您可以使用ES6函数来缩短此时间=>
soktinpk

感谢您的提示。@雷米你确定吗?OP似乎并没有这么问
Xem

对我来说似乎很清楚,所有3的倍数都是必需的:“ ...这将为每10 ^ 3增量提供值,最高为10 ^ 63,但随后以10 ^ 30增量给出它们,但是模式相当简单” OP。OP在注释中还提供了一个“ sexvigintillion”的示例。
feersum 2014年

9

C,235

处理所有100箱。程序使用stdin和stdout。

谁需要用正则表达式进行驼峰分割?

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);
}

octoseptuagintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

1
这个东西看起来不再像C了……我很惊讶。
昆汀2014年

为什么使用空格(*U<95 ?)和所有换行符?
tomsmeding

@tomsmeding这个空间是一个疏忽。换行符使代码“可读”且不包括在计数中。
feersum 2014年

2

Clojure中,381个 377字节

(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)))

例:

(c "Septuagintillion") ;; 1.0E213


2

Haskell,204个字节(格式化字符串为+9)

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

在GHCi中:

*Main> x "decillion"
1000000000000000000000000000000000

替换10^("10^"++(show.会再增加9个字节:

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

在GHCi中:

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

编辑:我必须更正"quinquagintillion"其中包含"qua"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.