การแปลงจำนวนเต็มเป็นคำภาษาอังกฤษ


21

เป้าหมายของรหัสนี้คือการแปลงจำนวนเต็มเป็นคำภาษาอังกฤษ

โปรแกรมแจ้งให้ป้อนข้อมูล NaNถ้าใส่นี้ไม่ได้เป็นจำนวนเต็มพิมพ์ หากเป็นจำนวนเต็มให้แปลงเป็นคำภาษาอังกฤษและพิมพ์คำเหล่านี้ อินพุตขั้นต่ำ: 0 (ศูนย์) อินพุตสูงสุด: 9000 (เก้าพัน)
ดังนั้น5ผลตอบแทนfive(กรณีไม่สำคัญ) และ500ผลตอบแทนfive hundredหรือfive-hundred (ขีดกลางไม่สำคัญ)

กฎอื่น ๆ :

oneก่อนhundredหรือthousandเป็นตัวเลือก: one hundredถูกต้อง แต่hundredเกินไป (ถ้าใส่เป็น100ของหลักสูตร)

คำandในตัวอย่างเช่นone hundred and forty fiveตัวเลือกเช่นกัน

ช่องว่างสำคัญ ดังนั้นสำหรับ500, five-hundredหรือfive hundredถูกต้อง แต่fivehundredไม่ได้เป็น

โชคดี!


มีคำตอบอยู่ที่นี่ ungolfed rgagnon.com/javadetails/java-0426.html

นี้คำตอบเพื่อไม่สิ่งที่คล้ายกัน แต่ไม่ได้เป็นรหัสกอล์ฟ
ST3

คำตอบ:


7

Perl 281 ไบต์

print+0eq($_=<>)?Zero:"@{[((@0=($z,One,Two,Three,Four,Five,@2=(Six,Seven),
Eight,Nine,Ten,Eleven,Twelve,map$_.teen,Thir,Four,@1=(Fif,@2,Eigh,Nine)))
[$_/1e3],Thousand)x($_>999),($0[($_%=1e3)/100],Hundred)x($_>99),
($_%=100)>19?((Twen,Thir,For,@1)[$_/10-2].ty,$0[$_%10]):$0[$_]]}"||NaN

เพิ่มบรรทัดใหม่สำหรับการมีสติในแนวนอน ข้างต้นอาจถูกใช้แบบโต้ตอบหรือโดยการวางค่าผ่านทาง stdin

ทำงานอย่างถูกต้องสำหรับค่าจำนวนเต็มทั้งหมดในช่วง[0, 19999]ค่าที่อยู่นอกช่วงนี้แสดงพฤติกรรมที่ไม่ได้กำหนด ค่าที่ไม่ใช่จำนวนเต็มจะถูกปัดเศษเป็นศูนย์และจะมีการรายงานเฉพาะค่าที่ไม่ใช่ตัวเลขจริง ๆ เท่านั้นNaNจริง ๆ เท่านั้น

ตัวอย่างการใช้งาน:

for $n (14, 42, 762, 2000, 6012, 19791, 1e9, foobar, 17.2, -3) {
  print "$n: ", `echo $n | perl spoken-numbers.pl`, $/;
}

ตัวอย่างผลลัพธ์:

14: Fourteen
42: Forty Two
762: Seven Hundred Sixty Two
2000: Two Thousand 
6012: Six Thousand Twelve
19791: Nineteen Thousand Seven Hundred Ninety One
1000000000: Thousand 
foobar: NaN
17.2: Seventeen
-3: Nine Hundred Ninety Seven

"1000000000: พัน"? และไม่ควรพิมพ์ "NaN" 17.2?
DavidC

5
@DavidCarraher "... ค่าที่อยู่นอกช่วงนี้แสดงพฤติกรรมที่ไม่ได้กำหนดค่าที่ไม่ใช่จำนวนเต็มจะถูกปัดเศษเป็นศูนย์และเช่นนั้นเฉพาะค่าที่ไม่ใช่ตัวเลขจริง ๆ เท่านั้นที่จะรายงานNaN"
โม่

ฉันไม่ใช่ผู้เชี่ยวชาญ Perl ดังนั้นฉันถามคำถามนี้: โปรแกรมนี้ให้การป้อนข้อมูลหรือไม่
ProgramFOX

@ProgramFOX ฉันได้อัปเดตให้อ่านค่าจาก stdin (หากเรียกใช้แบบโต้ตอบจะแจ้งให้ผู้ใช้รับค่า) แทนที่จะเป็นฟังก์ชั่น
โม่

13

จาวาสคริปต์ (375)

อาจเป็นความพยายามที่น่ากลัว แต่ต่อไปนี่จะไป ...

alert(function N(s,z){return O="zero,one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir,,fif,,,eigh,,,,twen,,for".split(","),(z?O[s]||O[s-10]||O[s-20]:s<13?N(s,1):s<20?N(s,1)+"teen":s<100?N(a=20+(s/10|0),1)+"ty"+(s%10?" "+N(s%10):""):s<1e3?N(s/100|0)+" hundred"+(s%100?" "+N(s%100):""):s<1e5?N(s/1e3|0)+" thousand"+(s%1e3?" "+N(s%1e3):""):0)||NaN}(prompt()))

พริตตี้ที่พิมพ์ (เป็นฟังก์ชั่น):

function N(s,z) {
  return O = "zero,one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir,,fif,,,eigh,,,,twen,,for".split(","),
      (z? O[s] || O[s-10] || O[s-20]
       : s < 13?  N(s,1)
       : s < 20?  N(s,1) + "teen"
       : s < 100? N(a=20+(s/10|0),1) + "ty" + (s%10?" "+N(s%10):"")
       : s < 1e3?  N(s/100|0) +  " hundred" + (s%100?" "+N(s%100):"")
       : s < 1e5?  N(s/1e3|0) + " thousand" + (s%1e3?" "+N(s%1e3):"") : 0) || NaN
}

ตัวอย่างการแปลง (โปรดทราบว่ามันยังส่งออกNaNเมื่อนอกขอบเขตเช่นอินพุตไม่ถูกต้อง):

540: five hundred forty
4711: four thousand seven hundred eleven
7382: seven thousand three hundred eighty two
1992: one thousand nine hundred ninety two
hutenosa: NaN
1000000000: NaN
-3: NaN

+1มันค่อนข้างยากที่จะทำได้ดีกว่าในภาษาเช่นจาวาสคริปต์ (คุณสามารถลบพื้นที่ในN(s,z) {returnการบันทึก 1 ถ่าน)
เครื่องทำความเย็นคณิตศาสตร์

โอ้ฮ่าฮ่าต้องพลาดแน่ ฉันก็ดูเหมือนจะไม่ได้รับพวงของตัวอักษรในOสตริง ฉันจะแก้ไขว่า ..
หิ่งห้อย

11

Mathematica 60 57

f = ToString@#~WolframAlpha~{{"NumberName", 1}, "Plaintext"} &

การใช้งาน:

f[500]

ห้าร้อย

แก้ไข:

InputString[]~WolframAlpha~{{"NumberName", 1}, "Plaintext"}

3
นี่ไม่ได้ตอบคำถามจริงๆ ฉันบอกว่าผู้ใช้จะต้องป้อนตัวเลข (โดยใช้บรรทัดคำสั่งหรือกล่องข้อความแจ้งเป็นต้น) จากนั้นโปรแกรมของคุณควรเอาท์พุทคำ (บนบรรทัดคำสั่งหรือในกล่องข้อความเป็นต้น) รหัสของคุณเป็นเพียงฟังก์ชันในการแปลงและโปรแกรมของคุณจะไม่ขอให้ป้อนข้อมูล
ProgramFOX

@ProgramFOX มีข้อความระบุว่า "ผู้ใช้ป้อนข้อมูลบางอย่าง" ไม่ได้หมายความว่า 'โปรแกรมแจ้งให้ป้อนข้อมูล'
MrZander

@MrZander: เอ่อ 'โปรแกรมแจ้งให้ป้อนข้อมูล' เป็นสิ่งที่ฉันหมายถึง ฉันอัปเดตคำถามของฉัน แต่แน่นอนว่าจะไม่เป็นธรรมถ้าฉันไม่ตอบคำถามของ alephalpha ดังนั้นเขาจึงได้ +1 ของฉัน
ProgramFOX

8

เสียงกระเพื่อม72 56 ตัวอักษร

ฉันรู้ว่า 1) มันเก่าและ 2) มันขึ้นอยู่กับไลบรารีมาตรฐานในการทำงาน แต่ความจริงที่ว่าคุณสามารถใช้ระบบการพิมพ์ c-lisp เพื่อทำสิ่งนี้ได้สร้างความประทับใจให้ฉันเสมอ นอกจากนี้ในความเป็นจริงก็จะนำเข้าจากผู้ใช้แปลงและพิมพ์

(format t "~:[NaN~;~:*~r~]" (parse-integer (read-line) :junk-allowed t))

มีทั้งหมด 72 ตัวอักษร

  • :junk-allowed ทำให้ parse-integer ส่งคืนค่าศูนย์เมื่อล้มเหลวแทนที่จะยกข้อผิดพลาด
  • ~:[if-nil~;if-non-nill] เงื่อนไขเฉพาะในศูนย์จัดการ NaN ในกรณีที่จำเป็น
  • ~:* สำรองการตีความอาร์กิวเมนต์เพื่อใช้อินพุตอีกครั้ง
  • ~r พิมพ์ตัวเลขเป็นสตริงคำภาษาอังกฤษตามที่ร้องขอยกเว้นด้วยเครื่องหมายวรรคตอนที่ถูกต้องแบบเต็ม

ตัวอย่าง:

17823658
seventeen million, eight hundred and twenty-three thousand, six hundred and fifty-eight

192hqfwoelkqhwef9812ho1289hg18hoif3h1o98g3hgq
NaN

ข้อมูลเสียงกระเพื่อมส่วนใหญ่มาจาก การปฏิบัติ Common เสียงกระเพื่อม

แก้ไขเล่นกอล์ฟได้อย่างถูกต้องจนถึง 56 ตัวอักษร

(format t "~:[NaN~;~:*~r~]"(ignore-errors(floor(read))))

รุ่นนี้ทำงานค่อนข้างแตกต่าง แทนที่จะอ่านบรรทัดและแปลงมันจะเรียกผู้อ่านเสียงกระเพื่อมเพื่อตีความอินพุตเป็นเสียงกระเพื่อม s-expression พยายามใช้มันเป็นตัวเลขและหากมีข้อผิดพลาดใด ๆ ที่เกิดขึ้นจะไม่สนใจพวกมันสร้างศูนย์เพื่อจัดรูปแบบตามเงื่อนไขสตริง นี่อาจเป็นครั้งแรกที่ฉันเห็นว่าการผลิตรายการสั้น ๆ อย่างแท้จริง ... สนุก!

  • (read) เรียกใช้ lisp reader / parser เพื่ออ่านหนึ่งนิพจน์จากอินพุตมาตรฐานและแปลงเป็นวัตถุที่เหมาะสม
  • (floor) ความพยายามในการแปลงประเภทตัวเลขใด ๆ ให้เป็นจำนวนเต็มต่ำกว่าที่ใกล้ที่สุดและไม่ใช่ตัวเลขทำให้เกิดข้อผิดพลาด
  • (ignore-errors ...) ทำในสิ่งที่มันบอกบนดีบุกมันจับและละเว้นข้อผิดพลาดใด ๆ ในการแสดงออกที่ปิดล้อมกลับศูนย์เพื่อฟีดสาขา NaN ของสตริงรูปแบบ

แน่นอนว่าไม่มีปัญหาที่คำถามเก่า :) ฉันได้แก้ไขคำตอบของคุณเพื่อรวมชื่อภาษาและจำนวนตัวอักษรในส่วนหัว
ProgramFOX

ขอบคุณสำหรับการแก้ไขฉันยังไม่ได้ไวยากรณ์ Stack * สำหรับสิ่งเหล่านี้ลง กลับไปในและแก้ไขข้อผิดพลาดที่ฉันทำในคำอธิบายของเงื่อนไขในสตริงรูปแบบเช่นกัน
Tom Scogland

3

PHP, 327 310 308 ไบต์

<?$a=['',one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir,0,fif,0,0,eigh];echo($n=$argv[1])>999?$a[$n/1000].' thousand ':'',$n%1000>99?$a[$n/100%10].' hundred ':'',$n?($k=$n%100)<20?($a[$k]?:$a[$k%10]).[teen][$k<13]:[2=>twen,thir,'for',fif,six,seven,eigh,nine][$k/10].'ty '.$a[$k%10]:zero;

รับจำนวนเป็นพารามิเตอร์ใช้งานได้สำหรับ 0 <= n <= 12999

ทำให้พังถล่ม

// define names
$a=['',one,two,three,four,five,six,seven,eight,nine,
    ten,eleven,twelve,thir,0,fif,0,0,eigh];
// print ...
echo
    ($n=$argv[1])>999?$a[$n/1000].' thousand ':'',                  // thousands
    $n%1000>99?$a[$n/100%10].' hundred ':'',                        // hundreds
    $n?
        // if remains <20:
        ($k=$n%100)<20?
            ($a[$k]?:$a[$k%10]) // no value at index (0,14,16,17,19)? value from index%10
            .[teen][$k<13]      // append "teen" for $k>12
        // else:
        :[2=>twen,thir,'for',fif,six,seven,eigh,nine][$k/10].'ty '  // tens
        .$a[$k%10]                                                  // ones
    // "zero" for $n==0
    :zero
;

2

SAS, 70 ตัวอักษร

data;window w n;display w;if n=. then put 'NaN';else put n words.;run;

windowและdisplayงบเปิดคำสั่ง SAS พรอมต์ ป้อนข้อมูลสำหรับnไปที่บรรทัดที่ 1 ซึ่งจะใช้ประโยชน์จากรูปแบบ SAS words.ซึ่งจะพิมพ์ตัวเลขเป็นคำหรือชุดคำที่มี "และ", "" และ "-" ตามความเหมาะสม


2

PHP

777 ตัวอักษร

นี่เป็นความพยายามที่แย่มาก แต่คุณไม่สามารถกล่าวหาว่าฉันใช้ประโยชน์จากช่องโหว่ใด ๆ ได้รวมทั้งเป็นหมายเลขที่โชคดีมาก ขอบคุณ ProgramFOX สำหรับคำแนะนำ

<?php $i=9212;$b = array('zero','one','two','three','four','five','six','seven','eight','nine');$t='teen';$c = array('ten','eleven','tweleve','thir'.$t,$b[4].$t,'fif'.$t,$b[6].$t,$b[7].$t,$b[8].$t,$b[9].$t);$d = array('','','twenty','thirty','fourty','fifty','sixty','seventy','eighty','ninety');$e='hundred';$f='thousand';$j=str_split($i);if (strlen($i)===1){$a=$b[$i];}elseif (strlen($i)===3){$k=1;$a=$b[$j[0]].' '.$e.' '.x($j,$k);}elseif (strlen($i)===4){$k=2;$a=$b[$j[0]].' '.$f.' '.$b[$j[1]].' '.$e.' '.x($j,$k);}elseif (substr($i, -2, 1)==='1'){$a=$c[$j[1]];}else{$a=$d[$j[0]].' '.$b[$j[1]];}$a = str_replace('zero hundred','',$a);echo $a;function x($j,$k){global $i, $b, $c, $d;if (substr($i, -2, 1)==='1'){return $c[$j[$k+1]];}else{return $d[$j[$k]].' '.$b[$j[$k+1]];}}

มือยาว

<?php
// Input
$i=9212;
// 0-9
$b = array('zero','one','two','three','four','five','six','seven','eight','nine');
// 10-19 (Very tricky)
$t='teen';
$c = array('ten','eleven','tweleve','thir'.$t,$b[4].$t,'fif'.$t,$b[6].$t,$b[7].$t,$b[8].$t,$b[9].$t); 
// Left digit of 20-99
$d = array('','','twenty','thirty','fourty','fifty','sixty','seventy','eighty','ninety');
// Hundreds
$e='hundred';
// Thousands
$f='thousand';
// Split input
$j=str_split($i);
// 1 digit inputs
if (strlen($i)===1){$a=$b[$i];}
// 3 digit input
elseif (strlen($i)===3){$k=1;$a=$b[$j[0]].' '.$e.' '.x($j,$k);}
// 4 digit input
elseif (strlen($i)===4){$k=2;$a=$b[$j[0]].' '.$f.' '.$b[$j[1]].' '.$e.' '.x($j,$k);}
// 10-19
elseif (substr($i, -2, 1)==='1'){$a=$c[$j[1]];}
// 20-99
else{$a=$d[$j[0]].' '.$b[$j[1]];}
// Fix for thousand numbers
$a = str_replace('zero hundred','',$a);
// Result
echo $a;
// Abstracted function last 2 digits for 3 and 4 digit numbers
function x($j,$k){
    global $i, $b, $c, $d;
    // 10-19
    if (substr($i, -2, 1)==='1'){return $c[$j[$k+1]];}
    // 20-99
    else{return $d[$j[$k]].' '.$b[$j[$k+1]];}
}

1
array('zero','one','two')ฉันคิดว่าคุณสามารถร่นรหัสของคุณโดยการสร้างอาร์เรย์เช่นนี้
ProgramFOX

@ProgramFOX หรือแม้กระทั่ง['zero','one','two'](php 5.4+) และถ้าคุณไม่ทราบE_NOTICE, [zero,one,two]จะทำงานได้เป็นอย่างดี
โม่

ฉันควรอัปเดต แต่ 777 เป็นหมายเลขนำโชค
Goose

+1 สำหรับความพยายามของคุณ PHP มีความสำคัญน้อยมากในการตีกอล์ฟ
Primo

1

Python 2.x - 378

อนุพันธ์ของ Fireflys ตอบแม้ว่าจะเปลี่ยนPเป็นล้านหรือล้านล้าน ฯลฯ มันสามารถใช้ซ้ำในช่วงใด ๆ ของจำนวนบวก นอกจากนี้ยังรองรับค่าสูงสุด 999,999

O=",one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir,,fif,,,eigh,,,,twen,thir,for,fif,,,eigh,".split(",")
P=",thousand".split(',')
def N(s,p=0):
 h,s=divmod(s,1000);x=N(h,p+1)if h>0 else" "
 if s<20:x+=O[s]or O[s-10]+["","teen"][s>12]
 elif s<100:x+=(O[s/10+20]or O[s/10])+"ty"+N(s%10)
 else:x+=N(s/100)+"hundred"+N(s%100)
 return x+" "+P[p]
print N(input())

การทดสอบตัวอย่าง (อินพุตคือ<<<เอาต์พุตคือ>>>):

<<< 1234
>>> one thousand two hundred thirty four

<<< 999999
>>>  nine hundred ninety nine   thousand nine hundred ninety nine

ถึงแม้ว่าถ้าใครบางคนสามารถอธิบายปัญหา "บัฟเฟอร์อันเดอร์โฟลว์" ที่แปลกประหลาดนี้ได้ฉันก็จะบวม ...

<<< -1
>>>  nine hundred ninety nine

<<< -2
>>>  nine hundred ninety eight

print divmod(-2,1000) #-> (-1, 998)
primo

โอ้แน่นอน ฉันคิดว่ามันอาจจะมีคุณค่าหรืออะไรสักอย่าง แต่มี-1*1000และ "เหลือ" 998ของ

1

SmileBASIC, 365สามร้อยสี่สิบเจ็ดไบต์

DIM N$[22]D$="OneTwoThreeFourFiveSixSevenEightNineTenElevenTwelveThirFourFifSixSevenEighNineTwenFor
WHILE LEN(D$)INC I,D$[0]<"_
INC N$[I],SHIFT(D$)WEND
INPUT N
W=N MOD 100C%=N/100MOD 10M%=N/1E3T=W<20X=W/10>>0?(N$[M%]+" Thousand ")*!!M%+(N$[C%]+" Hundred ")*!!C%+(N$[X+10+(X==2)*8+(X==4)*7]+"ty "+N$[N MOD 10])*!T+N$[W*T]+"teen"*(T&&W>12)+"Zero"*!N

มีช่องว่างต่อท้ายหากตัวเลขหนึ่งหรือสองหลักสุดท้ายเป็น 0


0

MOO - 55 ตัวอักษร

player:tell($string_utils:english_number(read(player)))

หรือถ้าฉันไม่ต้องการพิมพ์ไปที่ "stdout" - 42 chars: $string_utils:english_number(read(player))

หมายเหตุ: รหัสนี้จะไม่พิมพ์พรอมต์ใด ๆ ไปยังเอาต์พุตมาตรฐานและพิมพ์zeroแทนNaNเมื่อไม่มีการป้อนค่าตัวเลข

เป็นโบนัสรหัสนี้สามารถจัดการกับจำนวนใด ๆ ภายในขอบเขตของภาษาหมู่ ( 2147483647- -2147483648)


0

ภาษา Wolfram 27 40 ไบต์

การใช้ฟังก์ชั่นพื้นเมืองIntegerName,

 Check[Input[]~IntegerName~"Words","NaN"]

ข้อความข้างต้นแจ้งให้ป้อนข้อมูลผู้ใช้ การใช้งานปัจจุบันส่งกลับ "NaN" หากผู้ใช้ป้อนสิ่งอื่นที่ไม่ใช่จำนวนเต็ม


ตัวอย่างบางส่วน (พร้อมอินพุตที่ตั้งไว้ล่วงหน้า) :

 Check[243~IntegerName~"Words","NaN"]

สองร้อยสี่สิบสาม


 Check[1234567890~IntegerName~"Words","NaN"]   

หนึ่งพันสองร้อยสามสิบสี่ล้านห้าแสนหกหมื่นเจ็ดพันแปดร้อยเก้าสิบ


 Check["abc"~IntegerName~"Words","NaN"]  

น่าน


0

Python 2 , 333 ไบต์

def f(n):S=str.split;D=S('z one two three four five six seven eight nine');K=' fif six seven eigh nine';k=n/1000;n,m=n/100%10,n%100;e,d=m/10,m%10;return' '.join([k and f(k),'thousand']*(k>0)+[D[n],'hundred']*(n>0)+([S('ten eleven twelve thir four'+K)[d]+'teen'*(d>2)]if 9<m<20else[S('twen thir for'+K)[e-2]+'ty']*(e>0)+[D[d]]*(d>0)))

ลองออนไลน์!

สิ่งนี้ดีสำหรับ 1 ถึง 999,999 โดยรวม


0

Pyth, 239 242 ไบต์

L:rjdb6"  +"dAm+cd;"nine"," one two three four five six seven eight""  twen thir for fif six seven eigh"|y_.ey+Wk.e?Y?thZjd,?hZ+@HhZ"ty"""@GeZ@+c"ten eleven twelve"d+R"teen"+c"thir four"d>H5eZ?hZ+@GhZ" hundred"""c.[03_b]1"thousand"c_jQT3"zero

อินพุตเป็นจำนวนเต็มในช่วง [0-999,999] ลองออนไลน์ได้ที่นี่ที่นี่รอคำอธิบาย

รุ่นก่อนหน้าการทำงานที่คล้ายกันมาก แต่ไม่รองรับ 0:

L:rjdb6"  +"dJc" one two three four five six seven eight nine"dKc"  twen thir for fif six seven eigh nine"dy_.ey+Wk.e?Y?thZjd,?hZ+@KhZ"ty"""@JeZ@+c"ten eleven twelve"d+R"teen"+c"thir four"d>K5eZ?hZ+@JhZ" hundred"""c.[03_b]1"thousand"c_jQT3

คำอธิบายของรุ่นก่อนหน้า:

Implicit: Q=eval(input()), d=" "

Step 1: output formatting helper function
L:rjdb6"  +"d   
L               Define a function, y(b):
   jdb          Join b on spaces
  r   6         Strip whitespace from beginning and end
 :              In the above, replace...
       "  +"    ... strings of more than one space...
            d   ... with a single space

Step 2: Define number lookup lists
Jc"..."dKc"..."d   
  "..."            Lookup string
 c     d           Split the above on spaces
J                  Store in J - this is list of unit names
        Kc"..."d   As above, but storing in K - this is list of tens names, without "ty"

Step 3: Bringing it all together
y_.ey+Wk.e?Y?thZjd,?hZ+@KhZ"ty"""@JeZ@+c"ten eleven twelve"d+R"teen"+c"thir four"d>K5eZ?hZ+@JhZ" hundred"""c.[03_b]1"thousand"c_jQT3   
                                                                                                                                jQT    Get digits of Q
                                                                                                                               _       Reverse
                                                                                                                              c    3   Split into groups of 3
  .e                                                                                                                                   Map the above, element as b, index as k, using:
                                                                                                                _b                       Reverse the digits in the group
                                                                                                            .[03                         Pad the above on the left with 0 to length 3
                                                                                                           c      ]1                     Chop at index 1 - [1,2,3] => [[1],[2,3]]
        .e                                                                                                                               Map the above, element as Z, index as Y, using:
          ?Y                                                                                                                               If second element in the group (i.e. tens and units):
            ?thZ                                                                                                                             If (tens - 1) is non-zero (i.e. 0 or >=2):
                   ?hZ                                                                                                                         If tens is non-zero:
                       @KhZ                                                                                                                      Lookup in tens names
                      +    "ty"                                                                                                                  Append "ty"
                                                                                                                                               Else:
                               ""                                                                                                                Empty string
                  ,                                                                                                                            Create two-element list of the above with...
                                 @JeZ                                                                                                          ... lookup units name
                jd                                                                                                                             Join the above on a space - this covers [0-9] and [20-99]
                                                                                                                                             Else:
                                                                     c"thir four"d                                                             ["thir", "four"]
                                                                    +             >K5                                                          Append last 5 element of tens names ("fif" onwards)
                                                            +R"teen"                                                                           Append "teen" to each string in the above
                                      +c"ten eleven twelve"d                                                                                   Prepend ["ten", "eleven", "twelve"]
                                     @                                               eZ                                                        Take string at index of units column - this covers [10-19]
                                                                                                                                           Else: (i.e. hundreds column)
                                                                                       ?hZ                                                   If hundreds column is non-zero:
                                                                                           @JhZ                                                Lookup units name
                                                                                          +    " hundred"                                      Append " hundred"
                                                                                                         ""                                  Else: empty string
                                                                                                                                         Result of map is two element list of [hundreds name, tens and units name]
      Wk                                                                                                                                 If k is nonzero (i.e. dealing with thousands group)...
     +                                                                                                              "thousand"           ... Append "thousand"
    y                                                                                                                                    Apply output formatting (join on spaces, strip, deduplicate spaces)
                                                                                                                                       Result of map is [units group string, thousands group string]
 _                                                                                                                                     Reverse group ordering to put thousands back in front
y                                                                                                                                      Apply output formatting again, implicit print
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.