Ubah x-illion menjadi bentuk standar

14

Diberikan string, yang terdiri dari awalan dan kemudian "illion", ubah angka ini menjadi bentuk standar.

Sebagai contoh:

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

Program ini harus mampu menangani input hingga Centillion, yaitu 10 ^ 303. Daftar nama dan nilai formulir standarnya dapat ditemukan di sini - perhatikan bahwa ini memberikan nilai untuk setiap kenaikan 10 ^ 3 hingga 10 ^ 63, tetapi kemudian berikan dalam kenaikan 10 ^ 30, namun polanya cukup mudah.

Program perlu menangani semua 100 kasus (bahkan yang tidak secara eksplisit diberikan oleh situs web yang disediakan) - berikut adalah beberapa contohnya:

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

Input dapat diberikan melalui STDIN, argumen fungsi atau hard-coded sebagai string.

Ini kode-golf, jadi kode terpendek menang!

James Williams
sumber
Akan jadi 10 ^ 70?
Scimonster
3
10 ^ 70 tidak memiliki representasi karena 3 bukan merupakan faktor 70 - tetapi 10 ^ 69 akan menjadi sexvigintillion. 10 ^ 70 akan menjadi 10 sexvigintillion.
James Williams
Sebenarnya, doevigintillion = 10 ^ 69, dan sexvigintillion = 10 ^ 81.
Remy
@ Musuh Saya kira Anda menggunakan skala panjang (jika itu benar)? Kedengarannya pertanyaan ini menggunakan skala pendek.
Cole Johnson
@Cole Johnson: Daftar nama pertanyaan yang disediakan mengatakan vigintillion = 10 ^ 63, dan menunjukkan bahwa tidak menambah 3 kekuatan, menambah 6, jenis kelamin menambahkan 18, dll.
Remy

Jawaban:

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)

( ifBaris diberi indentasi dengan satu tab, dan sisanya dengan spasi tunggal.)

Ini c('million') == 10**6harus menjadi kasus khusus karena 'novem'juga berakhir pada 'm'.

Contoh:

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

Terima kasih kepada Falko karena mengaburkannya hingga 350 byte.


Untuk latihan saya mencoba menulis ulang ini sebagai one-liner menggunakan lambdas. Ini 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)
Remy
sumber
2
+1 untuk menyalahgunakan kurangnya spesifikasi OP apakah "10 ^ x" harus dicetak atau apakah hanya mengembalikan nilai numerik sudah cukup.
Ingo Bürk
1
Terima kasih, meskipun return'10^'+str(3*k)hanya akan menjadi 4 byte lagi.
Remy
1
Karena ini adalah python 2, Anda bisa menggunakan spasi indentasi untuk tingkat pertama, dan tab untuk yang kedua. Anda juga dapat memindahkan keduanya adan bke dalam fungsi sebagai argumen kata kunci.
FryAmTheEggman
2
1000**klebih pendek dari 10**(3*k). Bertambah kdengan 3*d[p]juga sama pendek.
xnor
2
Anda dapat menyimpan beberapa karakter dengan menghindari keluar awal menggunakan if'm'==s:k=6;d=[]alih-alih returnpernyataan panjang kedua .
Falko
9

JS (ES6), 292 270

Hanya mengerti angka-angka yang tertulis dalam daftar yang diberikan. OP tidak jelas tentang yang lain.

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

Contoh:

z("Billion") // "10^9"
z("Centillion") // "10^303"
xem
sumber
Anda dapat menghapus nol di string dan menggantinya split(0)dengan match(/[A-Z][a-z]*/g)menggunakan regex untuk mencocokkan setiap string.
NinjaBearMonkey
Ini hanya menangani awalan "un, doe, tre, dll" untuk decillion. Ini juga harus menangani kasus seperti undvigintillion = 10 ^ 66 dan novemnonagintillion = 10 ^ 300
Remy
Anda dapat mempersingkat ini dengan menggunakan fungsi ES6 =>.
soktinpk
terima kasih untuk tipsnya. @Remy kamu yakin? OP tampaknya tidak menanyakan hal itu
xem
Tampak jelas bagi saya bahwa semua kelipatan dari 3 diperlukan: "... ini memberikan nilai untuk setiap kenaikan 10 ^ 3 hingga 10 ^ 63, tetapi kemudian memberi mereka dalam kenaikan 10 ^ 30, namun polanya cukup mudah" di OP. OP juga memberikan contoh "sexvigintillion" dalam komentar.
feersum
9

C, 235

Menangani semua 100 kasing. Program menggunakan stdin dan stdout.

Siapa yang butuh regex untuk membelah case unta?

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

Contoh

octoseptuagintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
feersum
sumber
1
Benda ini bahkan tidak terlihat seperti C lagi ... Saya kagum.
Quentin
Mengapa spasi ( *U<95 ?) dan semua baris baru?
tommeding
@tommeding Ruang itu pengawasan. Baris baru membuat kode "dapat dibaca" dan tidak termasuk dalam hitungan.
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)))

Contoh:

(c "Septuagintillion") ;; 1.0E213

Kepala sekolahpanggilan
sumber
2

Haskell, 204 byte (+9 untuk String yang diformat)

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

Di GHCi:

*Main> x "decillion"
1000000000000000000000000000000000

Mengganti 10^(dengan "10^"++(show.menambahkan 9 byte lainnya:

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

Di GHCi:

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

Sunting: Saya harus memperbaiki "quinquagintillion"yang berisi "qua".

AplusKminus
sumber