Convertir X-Illion en forme standard


14

Étant donné une chaîne, composée d'un préfixe puis de "illion", convertissez ce nombre en forme standard.

Par exemple:

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

Le programme doit être capable de gérer les entrées allant jusqu'à Centillion, soit 10 ^ 303. Une liste de noms et de leurs valeurs de formulaire standard peut être trouvée ici - notez que cela donne des valeurs pour chaque incrément de 10 ^ 3 jusqu'à 10 ^ 63, mais les donne ensuite par incréments de 10 ^ 30, cependant le modèle est assez simple.

Le programme doit gérer les 100 cas (même ceux qui ne sont pas explicitement indiqués par le site Web fourni) - en voici quelques exemples:

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

L'entrée peut être donnée via STDIN, argument de fonction ou codée en dur sous forme de chaîne.

C'est le code-golf, donc le code le plus court gagne!


Que serait 10 ^ 70?
Scimonster

3
10 ^ 70 n'a pas de représentation car 3 n'est pas un facteur de 70 - mais 10 ^ 69 serait sexvigintillion. 10 ^ 70 serait 10 sexvigintillion.
James Williams

En fait, doevigintillion = 10 ^ 69 et sexvigintillion = 10 ^ 81.
Remy

@Remy, je suppose que vous utilisez la longue échelle (si c'est vrai)? Il semble que cette question utilise l'échelle courte.
Cole Johnson

@Cole Johnson: La liste de noms fournie dans la question indique vigintillion = 10 ^ 63, et montre que dé- ajoute 3 au pouvoir, biche- ajoute 6, sexe- ajoute 18, etc.
Remy

Réponses:


11

Python 2 ( 384 368 365 348 347 octets)

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)

(La ifligne est en retrait avec un seul onglet et le reste avec des espaces simples.)

Ici c('million') == 10**6doit être un cas spécial car 'novem'se termine également 'm'.

Exemples:

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

Merci à Falko de l'avoir obscurci jusqu'à 350 octets.


Pour m'entraîner, j'ai essayé de réécrire cela en une ligne avec des lambdas. C'est 404 398 390 384 380 379 octets:

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 pour avoir abusé du manque de spécification de OP quant à savoir si "10 ^ x" doit être imprimé ou s'il suffit de renvoyer la valeur numérique.
Ingo Bürk

1
Merci, mais return'10^'+str(3*k)ne serait que de 4 octets de plus.
Remy

1
Comme il s'agit de python 2, vous pouvez utiliser un retrait d'espace pour le premier niveau et un onglet pour le second. Vous pouvez également déplacer à la fois aet bdans la fonction comme arguments de mot clé.
FryAmTheEggman

2
1000**kest plus court que 10**(3*k). L'incrémentation kde 3*d[p]est également également courte.
2014

2
Vous pouvez enregistrer quelques caractères en évitant la sortie anticipée en utilisant if'm'==s:k=6;d=[]au lieu d'une deuxième longue returninstruction.
Falko

9

JS (ES6), 292 270

Comprend uniquement les nombres écrits dans la liste donnée. Le PO n'est pas clair sur les autres.

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

Exemple:

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

Vous pouvez supprimer les zéros de la chaîne et les remplacer split(0)par match(/[A-Z][a-z]*/g)pour utiliser des expressions rationnelles correspondant à chaque chaîne.
NinjaBearMonkey

Cela ne gère que les préfixes "un, doe, tre, etc" pour le décillion. Il devrait également gérer des cas comme unvigintillion = 10 ^ 66 et novemnonagintillion = 10 ^ 300
Remy

Vous pouvez raccourcir cela en utilisant les fonctions ES6 =>.
soktinpk

Merci pour les conseils. @Remy êtes-vous sûr? le PO ne semble pas demander ça
xem

Il me semble clair que tous les multiples de 3 sont requis: "... cela donne des valeurs pour chaque incrément de 10 ^ 3 jusqu'à 10 ^ 63, mais les donne ensuite par incréments de 10 ^ 30, mais le schéma est assez simple" dans le OP. OP donne également un exemple de "sexvigintillion" dans un commentaire.
feersum

9

C, 235

Gère les 100 cas. Le programme utilise stdin et stdout.

Qui a besoin d'expressions régulières pour le fractionnement des caisses de chameaux?

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

Exemple

octoseptuagintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

1
Cette chose ne ressemble même plus à C ... Je suis étonné.
Quentin

Pourquoi l'espace ( *U<95 ?) et toutes les nouvelles lignes?
tomsmeding

@tomsmeding L'espace était un oubli. Les sauts de ligne rendent le code "lisible" et ne sont pas inclus dans le décompte.
feersum

2

Clojure, 381 377 octets

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

Exemple:

(c "Septuagintillion") ;; 1.0E213


2

Haskell, 204 octets (+9 pour la chaîne formatée)

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

Dans GHCi:

*Main> x "decillion"
1000000000000000000000000000000000

Le remplacement 10^(par "10^"++(show.ajoute encore 9 octets:

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

Dans GHCi:

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

Edit: je devais corriger pour"quinquagintillion" ce qui contient "qua".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.