Конвертировать X-Illion в стандартную форму

14

Получив строку, состоящую из префикса и затем «иллюзии», преобразуйте это число в стандартную форму.

Например:

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

Программа должна быть в состоянии обрабатывать ввод данных до Сантиллиона, что составляет 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 будет sexvigintillion. 10 ^ 70 будет 10 sexvigintillion.
Джеймс Уильямс
На самом деле, doevigintillion = 10 ^ 69, и sexvigintillion = 10 ^ 81.
Реми,
@ Реми, я думаю, ты используешь длинную шкалу (если это правильно)? Похоже, этот вопрос использует короткую шкалу.
Коул Джонсон
@Cole Johnson: В приведенном в списке списке имен говорится vigintillion = 10 ^ 63 и показано, что он добавляет 3 к власти, добавляет 6, добавляет секс 18 и т. Д.
Реми,

Ответы:

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

Спасибо Falko за то, что он запутал его до 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)
Remy
источник
2
+1 за злоупотребление отсутствием спецификации OP относительно того, следует ли печатать «10 ^ x» или достаточно просто вернуть числовое значение.
Инго Бюрк
1
Спасибо, хотя return'10^'+str(3*k)было бы всего 4 байта больше.
Реми
1
Поскольку это Python 2, вы можете использовать пробел для первого уровня и tab для второго. Вы также можете переместить оба 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"
XEM
источник
Вы можете удалить нули в строке и заменить split(0)с , match(/[A-Z][a-z]*/g)чтобы использовать регулярные выражения , чтобы соответствовать каждой строке.
NinjaBearMonkey
Он обрабатывает только префиксы «un, doe, tre и т. Д.» Для decillion. Он также должен обрабатывать такие случаи, как unvigintillion = 10 ^ 66 и novemnonagintillion = 10 ^ 300
Реми
Вы можете сократить это, используя функции ES6 =>.
soktinpk
спасибо за советы. @ Реми, ты уверен? ОП, похоже, этого не спрашивает
xem
Мне кажется очевидным, что все кратные 3 необходимы: «... это дает значения для каждого приращения 10 ^ 3 до 10 ^ 63, но затем дает их с приращениями 10 ^ 30, однако шаблон довольно прост» в ОП. Также ОП приводит пример «sexvigintillion» в комментарии.
feersum
9

С 235

Обрабатывает все 100 случаев. Программа использует стандартный ввод и стандартный вывод.

Кому нужны регулярные выражения для разбиения верблюжьих дел?

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
feersum
источник
1
Эта вещь больше не похожа на C ... Я поражен.
Квентин
Почему пробел ( *U<95 ?) и все новые строки?
Томсминг
@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

Headmastersquall
источник
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".

AplusKminus
источник