x-illionを標準形式に変換する


14

接頭辞と「illion」で構成される文字列を指定すると、この数値が標準形式に変換されます。

例えば:

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

プログラムは、Centillion(10 ^ 303)までの入力を処理できる必要があります。名前とその標準形式の値のリストはここにあります -これは、10 ^ 3ごとに10 ^ 63までの値を提供しますが、10 ^ 30の増分でそれらを提供しますが、パターンは非常に簡単です。

プログラムは、100のケースすべてを提供する必要があります(提供されているWebサイトで明示的に指定されていないものも含む)-以下に例を示します。

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

入力は、STDIN、関数の引数、または文字列としてハードコード化することで指定できます。

これはコードゴルフなので、最短のコードが勝ちです!


10 ^ 70はどうなりますか?
Scimonster 14年

3
3は70の因数ではないため、10 ^ 70には表現がありませんが、10 ^ 69は6桁になります。10 ^ 70は10の6メガバイトになります。
ジェームズウィリアムズ14年

実際、doevigintillion = 10 ^ 69、sexvigintillion = 10 ^ 81です。
レミー14年

@Remy長いスケールを使用していると思います(そうであれば)。この質問では短い尺度を使用しているようです。
コールジョンソン14年

@Coleジョンソン:名前の質問者に提供リストはvigintillion = 10 ^ 63が言うと、未6を追加しdoe-電源に3を追加していることを示し、性別等、18を追加
レミー

回答:


11

Python 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

350バイトに難読化してくれたFalkoに感謝します。


練習のために、ラムダを使用してこれをワンライナーとして書き直してみました。それはです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
「10 ^ x」を印刷すべきかどうか、または数値を返すだけで十分かどうかのOPの仕様の欠如を悪用する+1 。
インゴバーク14年

1
おかげで、return'10^'+str(3*k)たった4バイト増えます。
レミー14年

1
これはpython 2なので、最初のレベルにスペースインデントを使用し、2番目のレベルにタブを使用できます。また、両方を移動することができますaし、bキーワード引数として関数に。
FryAmTheEggman 14年

2
1000**kはより短い10**(3*k)。インクリメントkによっては、3*d[p]また同じように短いです。
xnor 14年

2
if'm'==s:k=6;d=[]2番目の長いreturnステートメントの代わりに早期終了を回避することにより、数文字を保存できます。
ファルコ14年

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 14年

これは、decの「un、doe、treなど」プレフィックスのみを処理します。また、unvigintillion = 10 ^ 66およびnovemnonagintillion = 10 ^ 300のようなケースを処理する必要があります
Remy 14年

ES6関数を使用してこれを短縮できます=>
soktinpk 14年

ヒントをありがとう。@Remyよろしいですか?OPはそれを求めていないようです
xem 14年

3のすべての倍数が必要であることは私には明らかなようです:「...これは10 ^ 63まで10 ^ 3の増分ごとに値を与えますが、10 ^ 30の増分でそれらを与えますが、パターンはかなり単純です」 OP また、OPはコメントで「sexvigintillion」の例を示しています。
feersum 14年

9

C、235

100件すべてを処理します。プログラムは標準入力と標準出力を使用します。

ラクダケースの分割に正規表現が必要なのは誰ですか?

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のようには見えません...私は驚いています。
クエンティン14年

なぜスペース(*U<95 ?)とすべての改行があるのですか?
tomsmeding

@tomsmedingスペースは見落としでした。改行はコードを「読み取り可能」にし、カウントには含まれません。
feersum 14年

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"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.