X-Illion'u Standart Forma Dönüştür


14

Bir önek ve sonra "illion" dan oluşan bir dize verildiğinde, bu sayıyı standart forma dönüştürün.

Örneğin:

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

Programın 10 ^ 303 olan Centillion'a kadar olan girdileri işleyebilmesi gerekir. Bir ad listesi ve standart form değerleri burada bulunabilir - bunun 10 ^ 63'e kadar her 10 ^ 3 artış için değerler verdiğini, ancak daha sonra bunları 10 ^ 30 artışlarla verdiğini unutmayın, ancak desen oldukça basittir.

Program 100 vakayı da ele almalıdır (sağlanan web sitesi tarafından açıkça verilmemiş olanlar bile) - işte bunun bazı örnekleri:

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

Giriş, STDIN, işlev argümanı veya dize olarak sabit olarak kodlanabilir.

Bu kod golf, bu yüzden en kısa kod kazanır!


10 ^ 70 ne olurdu?
Scimonster

3
10 ^ 70 bir temsile sahip değildir, çünkü 3 70 faktörü değildir - ancak 10 ^ 69 sexvigintillion olacaktır. 10 ^ 70, 10 cinsiyetvigintilyon olur.
James Williams

Aslında, doevigintillion = 10 ^ 69 ve sexvigintillion = 10 ^ 81.
Remy

@Rem uzun ölçek kullandığınızı tahmin ediyorum (eğer doğru ise)? Bu soru kısa ölçeği kullanıyor gibi görünüyor.
Cole Johnson

@Cole Johnson: Sorunun sağlanan ad listesi vigintillion = 10 ^ 63 diyor ve güce 3 eklediğini, doe- 6 ekledi, seks ekliyor 18 vb. Gösteriyor
Remy

Yanıtlar:


11

Python 2 ( 384 368 365 348 347 bayt)

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Çizgi tek bir sekmeyle, geri kalanı ise tek boşlukla girintilidir.)

Burada c('million') == 10**6da özel bir durum olmalı çünkü 'novem'bitiyor 'm'.

Örnekler:

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

Falko'ya 350 bayta kadar gizlediği için teşekkürler.


Pratik yapmak için lambdaları kullanarak bunu tek astar olarak yeniden yazmayı denedim. Bu var 404 398 390 384 380 379 bayt:

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
OP'nin "10 ^ x" nin yazdırılması gerekip gerekmediği veya yalnızca sayısal değerin döndürülmesinin yeterli olup olmadığı konusundaki spesifikasyon eksikliğini kötüye kullanmak için +1 .
Ingo Bürk

1
Teşekkürler, ancak return'10^'+str(3*k)sadece 4 bayt daha fazla olurdu.
Remy

1
Bu python 2 olduğundan, birinci seviye için bir boşluk girintisi ve ikinci seviye için sekme kullanabilirsiniz. Anahtar kelime argümanları olarak her ikisini de ave bişlevin içine taşıyabilirsiniz .
FryAmTheEggman

2
1000**kdaha kısadır 10**(3*k). Artırım yapılması kile 3*d[p]de eşit derecede kısa olur.
xnor

2
if'm'==s:k=6;d=[]İkinci bir uzun returnifade yerine erken çıkıştan kaçınarak birkaç karakter kaydedebilirsiniz .
Falko

9

JS (ES6), 292 270

Yalnızca verilen listede yazılı sayıları anlar. OP diğerleri hakkında net değil.

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

Misal:

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

Dizedeki sıfırları kaldırabilir ve her dizeyle eşleştirmek için normal ifadeleri kullanmak üzere split(0)bununla değiştirebilirsiniz match(/[A-Z][a-z]*/g).
NinjaBearMonkey

Bu, yalnızca "un, doe, tre, vb." Öneklerini ondalık için işler. Ayrıca unvigintillion = 10 ^ 66 ve novemnonagintillion = 10 ^ 300
Remy

ES6 işlevlerini kullanarak bunu kısaltabilirsiniz =>.
soktinpk

ipuçları için teşekkürler. @ Emin misiniz? OP bunu sormuyor gibi görünüyor
xem

Bana 3'ün tüm katlarının gerekli olduğu anlaşılıyor: "... bu, 10 ^ 63'e kadar her 10 ^ 3 artış için değerler verir, ancak daha sonra bunları 10 ^ 30 artışlarla verir, ancak desen oldukça basittir" OP. Ayrıca OP bir yorumda "sexvigintillion" örneğini vermektedir.
feersum

9

C, 235

Tüm 100 kasayı idare eder. Program stdin ve stdout kullanır.

Deve-kasası yarılması için kimin regexes'e ihtiyacı var?

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

Misal

octoseptuagintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

1
Bu şey artık C gibi bile görünmüyor ... Şaşırdım.
Quentin

Neden boşluk ( *U<95 ?) ve tüm yeni satırlar?
tomsmeding

@tomsmeding Alan bir gözetimdi. Yeni satırlar kodu "okunabilir" yapar ve sayıma dahil edilmez.
feersum

2

Clojure, 381 377 bayt

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

Misal:

(c "Septuagintillion") ;; 1.0E213


2

Haskell, 204 bayt (biçimlendirilmiş Dize için +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'de:

*Main> x "decillion"
1000000000000000000000000000000000

Değiştirme 10^(ile "10^"++(show.başka 9 bayt ekler:

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'de:

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

Düzenleme:"quinquagintillion" Hangi içeren düzeltmek zorunda kaldı "qua".

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.