แปลง x-illion เป็นรูปแบบมาตรฐาน


14

รับสตริงซึ่งประกอบด้วยคำนำหน้าและจากนั้น "illion" แปลงตัวเลขนี้เป็นรูปแบบมาตรฐาน

ตัวอย่างเช่น:

"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 sexvigintillion
James Williams

ที่จริงแล้ว doevigintillion = 10 ^ 69 และ sexvigintillion = 10 ^ 81
Remy

@ ศัตรูฉันจะเดาว่าคุณใช้สเกลยาว (ถ้าใช่) ดูเหมือนว่าคำถามนี้ใช้ขนาดสั้น
โคลจอห์นสัน

@ โคลจอห์นสัน: คำถามที่ให้ไว้ในรายการของชื่อพูด vigintillion = 10 ^ 63 และแสดงให้เห็นว่า un- เพิ่ม 3 พลัง, doe - เพิ่ม 6, เพศ - เพิ่ม 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

ขอบคุณ Falko ที่ทำให้มันยุ่งเหยิงมากถึง 350 ไบต์


สำหรับการปฏิบัติงานฉันพยายามเขียนมันใหม่เป็นแบบซับเดี่ยวโดยใช้ lambdas มันคือ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" ควรจะพิมพ์หรือไม่ว่าเพียงแค่กลับค่าตัวเลขจะเพียงพอ
Ingo Bürk

1
ขอบคุณแม้ว่าreturn'10^'+str(3*k)จะมากกว่า 4 ไบต์เท่านั้น
Remy

1
เนื่องจากนี่คือ python 2 คุณสามารถใช้การเว้นวรรคเยื้องสำหรับระดับแรกและแท็บสำหรับวินาที นอกจากนี้คุณยังสามารถย้ายทั้งสองaและbเข้าสู่ฟังก์ชั่นเป็นอาร์กิวเมนต์คำหลัก
FryAmTheEggman

2
1000**k10**(3*k)จะสั้นกว่า การเพิ่มkโดย3*d[p]ยังสั้นพอ ๆ กัน
xnor

2
คุณสามารถบันทึกตัวละครได้สองสามตัวโดยหลีกเลี่ยงการออกก่อนกำหนดโดยใช้คำสั่งที่if'm'==s:k=6;d=[]มีความยาวตัวที่สอง return
Falko

9

JS (ES6), 292 270

เข้าใจเฉพาะตัวเลขที่เขียนในรายการที่กำหนด OP ไม่ชัดเจนเกี่ยวกับผู้อื่น

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)เพื่อใช้ regexes เพื่อจับคู่แต่ละสตริง
NinjaBearMonkey

สิ่งนี้จะจัดการเฉพาะส่วนนำหน้า "un, doe, tre, etc" เป็นสิบล้าน มันควรจัดการกับกรณีเช่น unvigintillion = 10 ^ 66 และ novemnonagintillion = 10 ^ 300
Remy

=>คุณสามารถลดระยะนี้โดยใช้ฟังก์ชั่น ES6
soktinpk

ขอบคุณสำหรับเคล็ดลับ @ ศัตรูคุณแน่ใจหรือไม่ OP ดูเหมือนจะไม่ถาม
xem

เห็นได้ชัดว่าฉันต้องการทวีคูณของ 3 ทั้งหมด: "... นี่ให้ค่าสำหรับการเพิ่มขึ้นทุกๆ 10 ^ 3 ถึง 10 ^ 63 แต่จากนั้นให้เพิ่มทีละ 10 ^ 30 แต่รูปแบบนั้นค่อนข้างตรงไปตรงมา" ใน OP OP ยังยกตัวอย่างของ "sexvigintillion" ในความคิดเห็น
feersum

9

C, 235

รับได้ทั้งหมด 100 ราย โปรแกรมใช้ stdin และ stdout

ใครต้องการ regexes สำหรับการแยกตัวอูฐ?

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"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.