Перетворіть x-ілюзію в стандартну форму


14

Дано рядок, що складається з префікса, а потім "ілюзії", перетворіть це число у стандартну форму.

Наприклад:

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

Програма повинна мати можливість обробляти вхід, що переходить до Centillion, що становить 10 ^ 303. Перелік імен та їх стандартних значень форми можна знайти тут - зауважте, що це дає значення для кожні 10 ^ 3 приросту до 10 ^ 63, але потім дає їх з кроком 10 ^ 30, однак шаблон досить простий.

Програмі потрібно обробити всі 100 випадків (навіть тих, які явно не вказані на веб-сайті) - ось кілька прикладів цього:

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

Вхід може бути наданий через STDIN, аргумент функції або жорстко закодований у вигляді рядка.

Це код-гольф, тому найкоротший код виграє!


Що було б 10 ^ 70?
Scimonster

3
10 ^ 70 не має представництва, тому що 3 не є коефіцієнтом 70, але 10 ^ 69 буде сексвігітілліоном. 10 ^ 70 було б 10 сексвігінтільйонів.
Джеймс Вільямс

Власне, doevigintillion = 10 ^ 69, а sexvigintillion = 10 ^ 81.
Ремі

@Remy Я б припустив, що ви використовуєте довгу шкалу (якщо це правильно)? Здається, що це питання використовує коротку шкалу.
Коул Джонсон

@Cole Johnson: У наведеному списку імен написано vigintillion = 10 ^ 63, і показано, що un- додає 3 до сили, doe - додає 6, sex - додає 18 і т.д.
Remy

Відповіді:


11

Python 2 ( 384 368 365 348 347 байт)

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Рядок з відступом однієї вкладки, а решта з одинарними пробілами.)

Тут c('million') == 10**6має бути окремий випадок, оскільки він 'novem'також закінчується 'm'.

Приклади:

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

Дякую Фалько, що обдумував його до 350 байт.


Для практики я спробував переписати це як однолінійний ламбдас. Це 404 398 390 384 380 379 байт:

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 за зловживання відсутністю специфікації OP щодо того, чи слід надрукувати "10 ^ x" чи достатньо лише повернення числового значення.
Інго Бюрк

1
Дякую, хоча return'10^'+str(3*k)було б лише на 4 байти більше.
Ремі

1
Оскільки це python 2, ви можете використовувати пробіл для першого рівня, а для другого - вкладку. Ви також можете переміщувати і те, aі bфункцію, як аргументи ключових слів.
FryAmTheEggman

2
1000**kкоротше, ніж 10**(3*k). Приріст kза допомогою 3*d[p]також однаково короткий.
xnor

2
Ви можете зберегти кілька символів, уникаючи раннього виходу, використовуючи if'm'==s:k=6;d=[]замість другої тривалої returnзаяви.
Фалько

9

JS (ES6), 292 270

Розуміє лише цифри, записані в даному списку. ОП не зрозуміло щодо інших.

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

Приклад:

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

Ви можете видалити нулі в рядку і замінити split(0)з , match(/[A-Z][a-z]*/g)щоб використовувати регулярні вирази , щоб відповідати кожному рядку.
NinjaBearMonkey

Це лише обробляє префікси "un, doe, tre і т. Д." На десятиліття. Він також повинен обробляти такі випадки, як unvigintillion = 10 ^ 66 та novemnonagintillion = 10 ^ 300
Remy

Ви можете скоротити це за допомогою функцій ES6 =>.
soktinpk

дякую за поради. @Remy Ви впевнені? ОП, схоже, не питає цього
xem

Мені здається зрозумілим, що потрібні всі кратні з 3: "... це дає значення для кожні 10 ^ 3 приросту до 10 ^ 63, але потім дає їх з кроком 10 ^ 30, проте шаблон досить простий" у ОП. Також в коментарі ОП наводить приклад "sexvigintillion".
feersum

9

С, 235

Обробляє всі 100 справ. Програма використовує stdin та stdout.

Кому потрібні реджекси для розщеплення верблюда?

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

Приклад

octoseptuagintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

1
Ця річ навіть не схожа на C ... Я вражений.
Квентін

Чому пробіл ( *U<95 ?) та всі нові рядки?
tomsmeding

@tomsmeding Простір було недоглядом. Нові рядки роблять код "читабельним" і не включаються до складу рахунку.
feersum

2

Clojure, 381 377 байт

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

Приклад:

(c "Septuagintillion") ;; 1.0E213


2

Haskell, 204 байти (+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:

*Main> x "decillion"
1000000000000000000000000000000000

Заміна 10^(на "10^"++(show.додає ще 9 байт:

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:

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

Редагувати: я повинен був виправити, "quinquagintillion"що містить "qua".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.