Konvertieren Sie x-illion in Standardform

14

Konvertieren Sie diese Zahl mit einem String, der aus einem Präfix und dann "illion" besteht, in die Standardform.

Beispielsweise:

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

Das Programm muss in der Lage sein, Eingaben bis zu Centillion (10 ^ 303) zu verarbeiten. Eine Liste mit Namen und ihre Standard - Formularwerte gefunden werden kann hier - beachten Sie, dass diese 63 bis 10 ^ jeder für 10 ^ 3 Zuwachs auf Werte gibt, aber dann gibt sie in 10 ^ 30 Schritten, aber das Muster ist recht unkompliziert.

Das Programm muss alle 100 Fälle behandeln (auch diejenigen, die nicht ausdrücklich auf der bereitgestellten Website angegeben sind) - hier einige Beispiele dafür:

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

Die Eingabe kann über STDIN, Funktionsargument oder als Zeichenfolge erfolgen.

Das ist Code-Golf, also gewinnt der kürzeste Code!

James Williams
quelle
Was wäre 10 ^ 70?
Scimonster
3
10 ^ 70 hat keine Darstellung, weil 3 kein Faktor von 70 ist - aber 10 ^ 69 wäre sexvigintillion. 10 ^ 70 wäre 10 sexvigintillion.
James Williams
Tatsächlich ist doevigintillion = 10 ^ 69 und sexvigintillion = 10 ^ 81.
Remy
@ Remy Ich würde vermuten, dass Sie die lange Skala verwenden (wenn das richtig ist)? Es klingt so, als ob diese Frage die kurze Skala verwendet.
Cole Johnson
@Cole Johnson: In der bereitgestellten Namensliste der Frage steht vigintillion = 10 ^ 63 und es wird angezeigt, dass die Potenz um 3 erhöht wird, die Potenz um 6 erhöht wird, das Geschlecht um 18 erhöht wird usw.
Remy

Antworten:

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)

(Die ifZeile wird mit einem einzelnen Tabulator eingerückt, der Rest mit einzelnen Leerzeichen.)

Hier c('million') == 10**6muss ein Sonderfall sein, denn 'novem'auch in 'm'.

Beispiele:

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

Vielen Dank an Falko für die Verschleierung auf 350 Bytes.


Zum Üben habe ich versucht, dies als Einzeiler mit Lambdas umzuschreiben. Es ist 404 398 390 384 380 379 Bytes:

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)
Remy
quelle
2
+1 für den Missbrauch der fehlenden Angabe von OP, ob "10 ^ x" gedruckt werden soll oder ob nur die Rückgabe des numerischen Werts ausreicht.
Ingo Bürk
1
Danke, obwohl return'10^'+str(3*k)nur 4 Bytes mehr wären.
Remy
1
Da dies Python 2 ist, können Sie einen Leerzeicheneinzug für die erste Ebene und einen Tabulator für die zweite Ebene verwenden. Sie können sowohl aals auch bals Schlüsselwortargumente in die Funktion verschieben.
FryAmTheEggman
2
1000**kist kürzer als 10**(3*k). Ebenso kurz ist das Inkrementieren kum 3*d[p].
Xnor
2
Sie können einige Zeichen speichern, indem Sie if'm'==s:k=6;d=[]anstelle einer zweiten langen returnAnweisung das vorzeitige Beenden vermeiden .
Falko
9

JS (ES6), 292 270

Versteht nur die in der angegebenen Liste angegebenen Zahlen. Das OP ist nicht klar über die anderen.

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

Beispiel:

z("Billion") // "10^9"
z("Centillion") // "10^303"
xem
quelle
Sie können die Nullen in der Zeichenfolge entfernen und ersetzen split(0)mit match(/[A-Z][a-z]*/g)zu verwenden Regexes jede Zeichenfolge übereinstimmen.
NinjaBearMonkey
Dies behandelt nur die Präfixe "un, doe, tre, etc" für Dezillionen. Es sollte auch Fälle wie unvigintillion = 10 ^ 66 und novemnonagintillion = 10 ^ 300 behandeln
Remy
Sie können dies mit ES6-Funktionen verkürzen =>.
Soktinpk
danke für die Tipps. @ Remy bist du sicher? das OP scheint das nicht zu fragen
xem
Mir scheint klar zu sein, dass alle Vielfachen von 3 erforderlich sind: "... dies gibt Werte für jedes 10 ^ 3-Inkrement bis zu 10 ^ 63, gibt sie dann aber in 10 ^ 30-Inkrementen an, das Muster ist jedoch ziemlich einfach." OP. Auch OP gibt ein Beispiel für "sexvigintillion" in einem Kommentar.
Feersum
9

C 235

Behandelt alle 100 Fälle. Das Programm benutzt stdin und stdout.

Wer braucht reguläre Ausdrücke für das Aufteilen von Kamelkisten?

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

Beispiel

octoseptuagintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Feersum
quelle
1
Dieses Ding sieht nicht einmal mehr wie C aus ... Ich bin erstaunt.
Quentin
Warum das Leerzeichen ( *U<95 ?) und alle Zeilenumbrüche?
Tomsmeding
@tomsmeding Der Raum war ein Versehen. Die Zeilenumbrüche machen den Code "lesbar" und gehen nicht in die Zählung ein.
Feersum
2

Clojure, 381 377 Bytes

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

Beispiel:

(c "Septuagintillion") ;; 1.0E213

Schulleiterquall
quelle
2

Haskell, 204 Byte (+9 für formatierten String)

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

In GHCi:

*Main> x "decillion"
1000000000000000000000000000000000

Durch Ersetzen 10^(durch werden "10^"++(show.weitere 9 Bytes hinzugefügt:

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

In GHCi:

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

Edit: Ich musste korrigieren, "quinquagintillion"was enthält "qua".

AplusKminus
quelle