Converti x-illion in forma standard


14

Data una stringa, composta da un prefisso e quindi da "illion", converti questo numero in forma standard.

Per esempio:

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

Il programma deve essere in grado di gestire l'input fino a Centilioni, che è 10 ^ 303. Un elenco di nomi ed i loro valori di forma standard, può essere trovato qui - nota che questo dà i valori per ogni 10 ^ 3 incremento fino a 10 ^ 63, ma poi dà loro in 10 ^ 30 incrementi, ma il modello è abbastanza semplice.

Il programma deve gestire tutti i 100 casi (anche quelli non esplicitamente indicati dal sito Web fornito) - ecco alcuni esempi di questo:

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

L'input può essere fornito tramite STDIN, argomento della funzione o hardcoded come stringa.

Questo è code-golf, quindi vince il codice più corto!


Cosa sarebbe 10 ^ 70?
Scimonster,

3
10 ^ 70 non ha una rappresentazione perché 3 non è un fattore 70 - ma 10 ^ 69 sarebbe sexvigintillion. 10 ^ 70 sarebbero 10 sexvigintillion.
James Williams,

In realtà, doevigintillion = 10 ^ 69 e sexvigintillion = 10 ^ 81.
Remy,

@Remy Immagino che tu usi la scala lunga (se è giusto)? Sembra che questa domanda usi la scala corta.
Cole Johnson,

@Cole Johnson: l'elenco dei nomi fornito dalla domanda dice vigintillion = 10 ^ 63, e mostra che un- aggiunge 3 al potere, doe aggiunge 6, sesso- aggiunge 18, ecc.
Remy,

Risposte:


11

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

(La ifriga è rientrata con una singola scheda e il resto con spazi singoli.)

Qui c('million') == 10**6deve esserci un caso speciale perché 'novem'finisce anche in 'm'.

Esempi:

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

Grazie a Falko per averlo offuscato fino a 350 byte.


Per la pratica ho provato a riscrivere questo come una riga usando lambda. Sono 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 per abusare della mancanza di specificazione da parte di OP della necessità di stampare "10 ^ x" o di restituire il valore numerico.
Ingo Bürk,

1
Grazie, anche se return'10^'+str(3*k)sarebbe solo 4 byte in più.
Remy,

1
Dato che si tratta di Python 2, è possibile utilizzare un rientro dello spazio per il primo livello e una scheda per il secondo. Puoi anche spostare entrambi ae bnella funzione come argomenti di parole chiave.
FryAmTheEggman,

2
1000**kè più corto di 10**(3*k). Incrementare kda 3*d[p]è anche altrettanto breve.
xnor

2
È possibile salvare alcuni caratteri evitando l'uscita anticipata utilizzando if'm'==s:k=6;d=[]anziché una seconda returnistruzione lunga .
Falko,

9

JS (ES6), 292 270

Comprende solo i numeri scritti nell'elenco fornito. L'OP non è chiaro sugli altri.

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

Esempio:

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

Puoi rimuovere gli zeri nella stringa e sostituirli split(0)con match(/[A-Z][a-z]*/g)per usare regex per abbinare ogni stringa.
NinjaBearMonkey,

Questo gestisce solo i prefissi "un, doe, tre, ecc" per i decilioni. Dovrebbe anche gestire casi come unvigintillion = 10 ^ 66 e novemnonagintillion = 10 ^ 300
Remy,

È possibile accorciarlo utilizzando le funzioni ES6 =>.
soktinpk,

grazie per i suggerimenti. @Remy sei sicuro? l'OP non sembra chiederlo
xem

Mi sembra chiaro che sono richiesti tutti i multipli di 3: "... questo dà valori per ogni incremento di 10 ^ 3 fino a 10 ^ 63, ma poi li dà con incrementi di 10 ^ 30, tuttavia il modello è abbastanza semplice" nel OPERAZIONE. Anche OP fornisce un esempio di "sexvigintillion" in un commento.
feersum

9

C, 235

Gestisce tutti e 100 i casi. Il programma utilizza stdin e stdout.

Chi ha bisogno di regex per la divisione del caso di cammello?

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

Esempio

octoseptuagintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

1
Questa cosa non sembra nemmeno più C ... Sono stupito.
Quentin,

Perché lo spazio ( *U<95 ?) e tutte le nuove linee?
tomsmeding,

@tomsmeding Lo spazio era una svista. Le nuove righe rendono il codice "leggibile" e non sono inclusi nel conteggio.
feersum

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

Esempio:

(c "Septuagintillion") ;; 1.0E213


2

Haskell, 204 byte (+9 per stringa formattata)

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

Sostituzione 10^(con"10^"++(show. aggiunge altri 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

In GHCi:

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

Modifica: ho dovuto correggere per "quinquagintillion"quale contiene "qua".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.