September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
|
|
@ -4,4 +4,8 @@ Show how to spell out a number in English.
|
|||
You can use a preexisting implementation or roll your own, but you should support inputs up to at least one million (or the maximum value of your language's default bounded integer type, if that's less).
|
||||
|
||||
Support for inputs other than positive integers (like zero, negative integers, and floating-point numbers) is optional.
|
||||
|
||||
|
||||
;Related task:
|
||||
* [[Spelling of ordinal numbers]].
|
||||
<br><br>
|
||||
|
|
|
|||
183
Task/Number-names/360-Assembly/number-names.360
Normal file
183
Task/Number-names/360-Assembly/number-names.360
Normal file
|
|
@ -0,0 +1,183 @@
|
|||
* Number names 20/02/2017
|
||||
NUMNAME CSECT
|
||||
USING NUMNAME,R13
|
||||
B 72(R15)
|
||||
DC 17F'0'
|
||||
STM R14,R12,12(R13)
|
||||
ST R13,4(R15)
|
||||
ST R15,8(R13)
|
||||
LR R13,R15 end of prolog
|
||||
LA R6,1 i=1
|
||||
DO WHILE=(C,R6,LE,=A(NG)) do i=1 to hbound(g)
|
||||
LR R1,R6 i
|
||||
SLA R1,2
|
||||
L R2,G-4(R1) g(i)
|
||||
ST R2,N n=g(i)
|
||||
L R4,N
|
||||
IF LTR,R4,Z,R4 THEN if n=0 then
|
||||
MVC R,=CL256'zero' r='zero'
|
||||
ELSE , else
|
||||
MVC R,=CL256' ' r=''
|
||||
MVC D,=F'10' d=10
|
||||
MVC C,=F'100' c=100
|
||||
MVC K,=F'1000' k=1000
|
||||
L R2,N n
|
||||
LPR R2,R2 abs(n)
|
||||
ST R2,A a=abs(n)
|
||||
SR R7,R7 j=0
|
||||
DO WHILE=(C,R7,LE,D) do j=0 to d
|
||||
L R4,A a
|
||||
SRDA R4,32
|
||||
D R4,C /c
|
||||
M R4,C *a
|
||||
L R8,A a
|
||||
SR R8,R5 h=a-c*a/c
|
||||
IF C,R8,GT,=F'0',AND,C,R8,LT,D THEN if h>0 & h<d then
|
||||
LR R1,R8 h
|
||||
MH R1,=H'10'
|
||||
LA R4,S(R1) @s(h+1)
|
||||
MVC PG(10),0(R4) s(h+1)
|
||||
MVC PG+10(246),R !!r
|
||||
MVC R,PG r=s(h+1)!!' '!!r
|
||||
ENDIF , endif
|
||||
IF C,R8,GT,=F'9',AND,C,R8,LT,=F'20' THEN if h>9 & h<20 then
|
||||
LR R1,R8 h
|
||||
S R1,D -d
|
||||
MH R1,=H'10'
|
||||
LA R4,T(R1) @t(h-d+1)
|
||||
MVC PG(10),0(R4) t(h-d+1)
|
||||
MVC PG+10(246),R !!r
|
||||
MVC R,PG r=t(h-d+1)!!' '!!r
|
||||
ENDIF , endif
|
||||
IF C,R8,GT,=F'19',AND,C,R8,LT,C THEN if h>19 & h<c then
|
||||
LR R4,R8 h
|
||||
SRDA R4,32
|
||||
D R4,D /d
|
||||
M R4,D *d
|
||||
LR R1,R8 h
|
||||
SR R1,R5 h-d*(h/d)
|
||||
ST R1,X x=h-d*(h/d)
|
||||
L R4,X x
|
||||
IF LTR,R4,NZ,R4 THEN if x^=0 then
|
||||
MVI Y,C'-' y='-'
|
||||
ELSE , else
|
||||
MVI Y,C' ' y=' '
|
||||
ENDIF , endif
|
||||
LR R4,R8 h
|
||||
SRDA R4,32
|
||||
D R4,D /d
|
||||
MH R5,=H'10'
|
||||
LA R4,U(R5) @u(h/d+1)
|
||||
MVC PG(10),0(R4) u(h/d+1)
|
||||
MVC PG+10(1),Y y
|
||||
L R1,X x
|
||||
MH R1,=H'10'
|
||||
LA R4,S(R1) @s(x+1)
|
||||
MVC PG+11(10),0(R4) s(x+1)
|
||||
MVC PG+21(235),R !!r
|
||||
MVC R,PG r=u(h/d+1)!!y!!s(x+1)!!r
|
||||
ENDIF , endif
|
||||
L R4,A a
|
||||
SRDA R4,32
|
||||
D R4,K a/k
|
||||
M R4,K *k
|
||||
L R8,A a
|
||||
SR R8,R5 h=a-k*(a/k)
|
||||
LR R4,R8 h
|
||||
SRDA R4,32
|
||||
D R4,C /c
|
||||
LR R8,R5 h=h/c
|
||||
IF LTR,R8,NZ,R8 THEN if h^=0 then
|
||||
LR R1,R8 h
|
||||
MH R1,=H'10'
|
||||
LA R4,S(R1) @s(h+1)
|
||||
MVC PG(10),0(R4) s(h+1)
|
||||
MVC PG+10(10),=CL10' hundred '
|
||||
MVC PG+20(236),R !!r
|
||||
MVC R,PG r=s(h+1)!!' hundred '!!r
|
||||
ENDIF , endif
|
||||
L R4,A a
|
||||
SRDA R4,32
|
||||
D R4,K /k
|
||||
ST R5,A a=a/k
|
||||
L R4,A
|
||||
IF LTR,R4,P,R4 THEN if a>0 then
|
||||
L R4,A a
|
||||
SRDA R4,32
|
||||
D R4,K /k
|
||||
M R4,K *k
|
||||
L R8,A a
|
||||
SR R8,R5 h=a-k*(a/k)
|
||||
IF LTR,R8,NZ,R8 THEN if h^=0 then
|
||||
LR R1,R7 j
|
||||
MH R1,=H'10'
|
||||
LA R4,V(R1) @v(j+1)
|
||||
MVC PG(10),0(R4) v(j+1)
|
||||
MVC PG+10(246),R !!r
|
||||
MVC R,PG r=v(j+1)!!' '!!r
|
||||
ENDIF , endif
|
||||
ENDIF , endif
|
||||
LA R3,1 l=0
|
||||
LA R9,256 jr=256
|
||||
LA R10,R ir=0
|
||||
LA R11,R-1 irr=-1
|
||||
LOOP CLI 0(R10),C' ' if r[ii]=' ' .....+
|
||||
BNE OPT |
|
||||
CLI 1(R10),C' ' if r[ii+1]=' ' |
|
||||
BE ITER |
|
||||
CLI 1(R10),C'-' if r[ii+1]='-' |
|
||||
BE ITER |
|
||||
OPT LA R11,1(R11) irr=irr+1 |
|
||||
MVC 0(1,R11),0(R10) rr=rr!!ci |
|
||||
LA R3,1(R3) l=l+1 |
|
||||
ITER LA R10,1(R10) ir=ir+1 |
|
||||
BCT R9,LOOP ...................+
|
||||
LA R1,R-1 @r
|
||||
AR R1,R3 +lr
|
||||
MVC 0(80,R1),=CL80' ' clean the end
|
||||
L R4,A a
|
||||
IF LTR,R4,NP,R4 THEN if a<=0 then
|
||||
B LEAVEJ leave
|
||||
ENDIF , endif a<=0
|
||||
LA R7,1(R7) j++
|
||||
ENDDO , enddo j
|
||||
LEAVEJ L R4,N n
|
||||
IF LTR,R4,M,R4 THEN if n<0 then
|
||||
MVC PG(6),=C'minus ' 'minus '
|
||||
MVC PG+6(250),R !!r
|
||||
MVC R,PG r='minus '!!r
|
||||
ENDIF , endif n<0
|
||||
ENDIF , endif n=0
|
||||
MVC PG,=CL132' ' clear buffer
|
||||
L R1,N n
|
||||
XDECO R1,PG edit n
|
||||
MVC PG+13(256),R r
|
||||
XPRNT PG,132 print buffer
|
||||
LA R6,1(R6) i++
|
||||
ENDDO , enddo i
|
||||
L R13,4(0,R13) epilog
|
||||
LM R14,R12,12(R13)
|
||||
XR R15,R15
|
||||
BR R14 exit
|
||||
S DC CL10' ',CL10'one',CL10'two',CL10'three',CL10'four'
|
||||
DC CL10'five',CL10'six',CL10'seven',CL10'eight',CL10'nine'
|
||||
T DC CL50'ten eleven twelve thirteen fourteen'
|
||||
DC CL50'fifteen sixteen seventeen eighteen nineteen'
|
||||
U DC CL50' twenty thirty forty'
|
||||
DC CL50'fifty sixty seventy eighty ninety'
|
||||
V DC CL50'thousand million billion trillion'
|
||||
G DC F'0',F'2',F'19',F'20',F'21',F'99',F'100',F'101',F'-123'
|
||||
DC F'9123',F'467889',F'1234567',F'2147483647'
|
||||
NG EQU (*-G)/4
|
||||
N DS F
|
||||
D DS F
|
||||
C DS F
|
||||
K DS F
|
||||
A DS F
|
||||
X DS F
|
||||
Y DS CL1
|
||||
R DS CL256
|
||||
XDEC DS CL12
|
||||
PG DS CL256
|
||||
YREGS
|
||||
END NUMNAME
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
spell_integer = (n) ->
|
||||
tens = [null, null, "twenty", "thirty", "forty",
|
||||
"fifty", "sixty", "seventy", "eighty", "ninety"]
|
||||
|
||||
small = ["zero", "one", "two", "three", "four", "five",
|
||||
"six", "seven", "eight", "nine", "ten", "eleven",
|
||||
"twelve", "thirteen", "fourteen", "fifteen",
|
||||
"sixteen", "seventeen", "eighteen", "nineteen"]
|
||||
|
||||
bl = [null, null, "m", "b", "tr", "quadr",
|
||||
"quint", "sext", "sept", "oct", "non", "dec"]
|
||||
|
||||
divmod = (n, d) ->
|
||||
[Math.floor(n / d), n % d]
|
||||
|
||||
nonzero = (c, n) ->
|
||||
if n == 0
|
||||
""
|
||||
else
|
||||
c + spell_integer n
|
||||
|
||||
big = (e, n) ->
|
||||
if e == 0
|
||||
spell_integer n
|
||||
else if e == 1
|
||||
spell_integer(n) + " thousand"
|
||||
else
|
||||
spell_integer(n) + " " + bl[e] + "illion"
|
||||
|
||||
base1000_rev = (n) ->
|
||||
# generates the value of the digits of n in base 1000
|
||||
# (i.e. 3-digit chunks), in reverse.
|
||||
chunks = []
|
||||
while n != 0
|
||||
[n, r] = divmod n, 1000
|
||||
chunks.push r
|
||||
chunks
|
||||
|
||||
if n < 0
|
||||
throw Error "spell_integer: negative input"
|
||||
else if n < 20
|
||||
small[n]
|
||||
else if n < 100
|
||||
[a, b] = divmod n, 10
|
||||
tens[a] + nonzero("-", b)
|
||||
else if n < 1000
|
||||
[a, b] = divmod n, 100
|
||||
small[a] + " hundred" + nonzero(" ", b)
|
||||
else
|
||||
chunks = (big(exp, x) for x, exp in base1000_rev(n) when x)
|
||||
chunks.reverse().join ', '
|
||||
|
||||
# example
|
||||
console.log spell_integer 1278
|
||||
console.log spell_integer 1752
|
||||
console.log spell_integer 2010
|
||||
console.log spell_integer 4000123007913
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
> coffee spell_number.coffee
|
||||
one thousand, two hundred seventy-eight
|
||||
one thousand, seven hundred fifty-two
|
||||
two thousand, ten
|
||||
four trillion, one hundred twenty-three million, seven thousand, nine hundred thirteen
|
||||
48
Task/Number-names/Elixir/number-names.elixir
Normal file
48
Task/Number-names/Elixir/number-names.elixir
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
defmodule RC do
|
||||
@small ~w(zero one two three four five six seven eight nine ten
|
||||
eleven twelve thirteen fourteen fifteen sixteen seventeen
|
||||
eighteen nineteen)
|
||||
@tens ~w(wrong wrong twenty thirty forty fifty sixty seventy eighty ninety)
|
||||
@big [nil, "thousand"] ++
|
||||
(~w( m b tr quadr quint sext sept oct non dec) |> Enum.map(&"#{&1}illion"))
|
||||
|
||||
def wordify(number) when number<0, do: "negative #{wordify(-number)}"
|
||||
def wordify(number) when number<20, do: Enum.at(@small,number)
|
||||
def wordify(number) when number<100 do
|
||||
rm = rem(number,10)
|
||||
Enum.at(@tens,div(number,10)) <> (if rm==0, do: "", else: "-#{wordify(rm)}")
|
||||
end
|
||||
def wordify(number) when number<1000 do
|
||||
rm = rem(number,100)
|
||||
"#{Enum.at(@small,div(number,100))} hundred" <> (if rm==0, do: "", else: " and #{wordify(rm)}")
|
||||
end
|
||||
def wordify(number) do
|
||||
# separate into 3-digit chunks
|
||||
chunks = chunk(number, [])
|
||||
if length(chunks) > length(@big), do: raise(ArgumentError, "Integer value too large.")
|
||||
Enum.map(chunks, &wordify(&1))
|
||||
|> Enum.zip(@big)
|
||||
|> Enum.filter_map(fn {a,_} -> a != "zero" end, fn {a,b} -> "#{a} #{b}" end)
|
||||
|> Enum.reverse
|
||||
|> Enum.join(", ")
|
||||
end
|
||||
|
||||
defp chunk(0, res), do: Enum.reverse(res)
|
||||
defp chunk(number, res) do
|
||||
chunk(div(number,1000), [rem(number,1000) | res])
|
||||
end
|
||||
end
|
||||
|
||||
data = [-1123, 0, 1, 20, 123, 200, 220, 1245, 2000, 2200, 2220, 467889,
|
||||
23_000_467, 23_234_467, 2_235_654_234, 12_123_234_543_543_456,
|
||||
987_654_321_098_765_432_109_876_543_210_987_654,
|
||||
123890812938219038290489327894327894723897432]
|
||||
|
||||
Enum.each(data, fn n ->
|
||||
IO.write "#{n}: "
|
||||
try do
|
||||
IO.inspect RC.wordify(n)
|
||||
rescue
|
||||
e in ArgumentError -> IO.puts Exception.message(e)
|
||||
end
|
||||
end)
|
||||
103
Task/Number-names/Kotlin/number-names.kotlin
Normal file
103
Task/Number-names/Kotlin/number-names.kotlin
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
// version 1.1.2
|
||||
|
||||
val names = mapOf(
|
||||
1 to "one",
|
||||
2 to "two",
|
||||
3 to "three",
|
||||
4 to "four",
|
||||
5 to "five",
|
||||
6 to "six",
|
||||
7 to "seven",
|
||||
8 to "eight",
|
||||
9 to "nine",
|
||||
10 to "ten",
|
||||
11 to "eleven",
|
||||
12 to "twelve",
|
||||
13 to "thirteen",
|
||||
14 to "fourteen",
|
||||
15 to "fifteen",
|
||||
16 to "sixteen",
|
||||
17 to "seventeen",
|
||||
18 to "eighteen",
|
||||
19 to "nineteen",
|
||||
20 to "twenty",
|
||||
30 to "thirty",
|
||||
40 to "forty",
|
||||
50 to "fifty",
|
||||
60 to "sixty",
|
||||
70 to "seventy",
|
||||
80 to "eighty",
|
||||
90 to "ninety"
|
||||
)
|
||||
val bigNames = mapOf(
|
||||
1_000L to "thousand",
|
||||
1_000_000L to "million",
|
||||
1_000_000_000L to "billion",
|
||||
1_000_000_000_000L to "trillion",
|
||||
1_000_000_000_000_000L to "quadrillion",
|
||||
1_000_000_000_000_000_000L to "quintillion"
|
||||
)
|
||||
|
||||
fun numToText(n: Long, uk: Boolean = false): String {
|
||||
if (n == 0L) return "zero"
|
||||
val neg = n < 0L
|
||||
val maxNeg = n == Long.MIN_VALUE
|
||||
var nn = if (maxNeg) -(n + 1) else if (neg) -n else n
|
||||
val digits3 = IntArray(7)
|
||||
for (i in 0..6) { // split number into groups of 3 digits from the right
|
||||
digits3[i] = (nn % 1000).toInt()
|
||||
nn /= 1000
|
||||
}
|
||||
|
||||
fun threeDigitsToText(number: Int) : String {
|
||||
val sb = StringBuilder()
|
||||
if (number == 0) return ""
|
||||
val hundreds = number / 100
|
||||
val remainder = number % 100
|
||||
if (hundreds > 0) {
|
||||
sb.append(names[hundreds], " hundred")
|
||||
if (remainder > 0) sb.append(if (uk) " and " else " ")
|
||||
}
|
||||
if (remainder > 0) {
|
||||
val tens = remainder / 10
|
||||
val units = remainder % 10
|
||||
if (tens > 1) {
|
||||
sb.append(names[tens * 10])
|
||||
if (units > 0) sb.append("-", names[units])
|
||||
}
|
||||
else sb.append(names[remainder])
|
||||
}
|
||||
return sb.toString()
|
||||
}
|
||||
|
||||
val strings = Array<String>(7) { threeDigitsToText(digits3[it]) }
|
||||
var text = strings[0]
|
||||
var andNeeded = uk && digits3[0] in 1..99
|
||||
var big = 1000L
|
||||
for (i in 1..6) {
|
||||
if (digits3[i] > 0) {
|
||||
var text2 = strings[i] + " " + bigNames[big]
|
||||
if (text.length > 0) {
|
||||
text2 += if (andNeeded) " and " else ", "
|
||||
andNeeded = false
|
||||
}
|
||||
else andNeeded = uk && digits3[i] in 1..99
|
||||
text = text2 + text
|
||||
}
|
||||
big *= 1000
|
||||
}
|
||||
if (maxNeg) text = text.dropLast(5) + "eight"
|
||||
return (if (neg) "minus " else "") + text
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val la = longArrayOf(
|
||||
0, 1, 7, 10, 18, 22, 67, 99, 100, 105, 999, -1056, 1000005000,
|
||||
2074000000, 1234000000745003L, Long.MIN_VALUE
|
||||
)
|
||||
println("Using US representation:")
|
||||
for (i in la) println("${"%20d".format(i)} = ${numToText(i)}")
|
||||
println()
|
||||
println("Using UK representation:")
|
||||
for (i in la) println("${"%20d".format(i)} = ${numToText(i, true)}")
|
||||
}
|
||||
9
Task/Number-names/Perl-6/number-names-2.pl6
Normal file
9
Task/Number-names/Perl-6/number-names-2.pl6
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
use Lingua::EN::Numbers::Cardinal;
|
||||
|
||||
put join "\n", .&cardinal, .&cardinal(:improper) with -7/4;
|
||||
|
||||
printf "%-7s : %19s : %s\n", $_, cardinal($_), cardinal($_, :denominator(16)) for 1/16, 2/16 ... 1;
|
||||
|
||||
put join "\n", .&cardinal, .&cardinal-year, .&ordinal, .&ordinal-digit with 1999;
|
||||
|
||||
.&cardinal.put for 6.022e23, 42000, π;
|
||||
|
|
@ -1,3 +1,6 @@
|
|||
--
|
||||
-- demo/rosetta/Number_names.exw
|
||||
--
|
||||
constant twenties = {"zero","one","two","three","four","five","six","seven","eight","nine","ten",
|
||||
"eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"}
|
||||
|
||||
|
|
@ -67,7 +70,7 @@ integer n
|
|||
return res
|
||||
end function
|
||||
|
||||
function spell(atom N)
|
||||
global function spell(atom N)
|
||||
string res = ""
|
||||
if N<0 then
|
||||
res = "minus "
|
||||
|
|
@ -77,11 +80,14 @@ string res = ""
|
|||
return res
|
||||
end function
|
||||
|
||||
global
|
||||
constant Samples = {99, 300, 310, 417,1_501, 12_609, 200000000000100, 999999999999999,
|
||||
-123456787654321,102003000400005,1020030004,102003,102,1,0,-1,-99,
|
||||
-1501,1234,12.34,10000001.2,1E-3,-2.7182818}
|
||||
-1501,1234,12.34,10000001.2,1E-3,-2.7182818,
|
||||
201021002001,-20102100200,2010210020,-201021002,20102100,-2010210,
|
||||
201021,-20102,2010,-201,20,-2}
|
||||
|
||||
function smartp(atom N)
|
||||
global function smartp(atom N)
|
||||
string res
|
||||
if N=floor(N) then return sprintf("%d",N) end if
|
||||
res = sprintf("%18.8f",N)
|
||||
|
|
@ -91,14 +97,32 @@ string res
|
|||
return res
|
||||
end function
|
||||
|
||||
procedure main()
|
||||
atom si
|
||||
for i=1 to length(Samples) do
|
||||
si = Samples[i]
|
||||
printf(1,"%18s %s\n",{smartp(si),spell(si)})
|
||||
end for
|
||||
for i=1 to length(Samples) do
|
||||
si = Samples[i]
|
||||
printf(1,"%18s %s\n",{smartp(si),spell(si)})
|
||||
end for
|
||||
end procedure
|
||||
|
||||
si = 201021002001
|
||||
while si!=0 do
|
||||
printf(1,"%18s %s\n",{smartp(si),spell(si)})
|
||||
si = trunc(si/-10)
|
||||
end while
|
||||
-- from Executable_library#Phix --
|
||||
function isMainOrInclude()
|
||||
-- returns 1 if called from the main file, 0 if from an include
|
||||
integer res
|
||||
#ilASM{
|
||||
[32]
|
||||
mov eax,[ebp+20] -- prev_ebp
|
||||
mov eax,[eax+8] -- rtn
|
||||
mov [res],eax
|
||||
[64]
|
||||
mov rax,[rbp+40] -- prev_ebp
|
||||
mov rax,[rax+16] -- rtn
|
||||
mov [res],rax
|
||||
[]
|
||||
}
|
||||
return res=21 -- (21=T_maintls)
|
||||
end function
|
||||
|
||||
if isMainOrInclude() then
|
||||
main()
|
||||
end if
|
||||
|
|
|
|||
49
Task/Number-names/PureBasic/number-names-3.purebasic
Normal file
49
Task/Number-names/PureBasic/number-names-3.purebasic
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
def int_to_english(n):
|
||||
if n < 0: return "minus " + int_to_english(-n)
|
||||
if n < 10:
|
||||
return ["zero", "one", "two", "three", "four", "five",
|
||||
"six", "seven", "eight", "nine"][n]
|
||||
if n < 20:
|
||||
return ["ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
|
||||
"sixteen", "seventeen", "eighteen", "nineteen"][n-10]
|
||||
if n < 100:
|
||||
tens = ["twenty", "thirty", "forty", "fifty", "sixty",
|
||||
"seventy", "eighty", "ninety"][(n // 10 - 2)%10]
|
||||
if n % 10 != 0:
|
||||
return tens + "-" + int_to_english(n % 10)
|
||||
else:
|
||||
return tens
|
||||
if n < 1000:
|
||||
if n % 100 == 0:
|
||||
return int_to_english(n // 100) + " hundred"
|
||||
else:
|
||||
return int_to_english(n // 100) + " hundred and " +\
|
||||
int_to_english(n % 100)
|
||||
# http://www.isthe.com/chongo/tech/math/number/tenpower.html
|
||||
powers = [("thousand", 3), ("million", 6),
|
||||
("billion", 9), ("trillion", 12), ("quadrillion", 15),
|
||||
("quintillion", 18), ("sextillion", 21), ("septillion", 24),
|
||||
("octillion", 27), ("nonillion", 30), ("decillion", 33),
|
||||
("undecillion", 36), ("duodecillion", 39), ("tredecillion", 42),
|
||||
("quattuordecillion", 45), ("quindecillion", 48),
|
||||
("sexdecillion", 51), ("eptendecillion", 54),
|
||||
("octadecillion", 57), ("novemdecillion", 61),
|
||||
("vigintillion", 64)]
|
||||
ns = str(n)
|
||||
idx = len(powers) - 1
|
||||
while True:
|
||||
d = powers[idx][1]
|
||||
if len(ns) > d:
|
||||
first = int_to_english(int(ns[:-d]))
|
||||
second = int_to_english(int(ns[-d:]))
|
||||
if second == "zero":
|
||||
return first + " " + powers[idx][0]
|
||||
else:
|
||||
return first + " " + powers[idx][0] + " " + second
|
||||
idx = idx - 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(int_to_english(42))
|
||||
print(int_to_english(3 ** 7))
|
||||
print(int_to_english(2 ** 100))
|
||||
print(int_to_english(10 ** (2*64)))
|
||||
22
Task/Number-names/Zkl/number-names-1.zkl
Normal file
22
Task/Number-names/Zkl/number-names-1.zkl
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
var
|
||||
ns =[1..20].chain([30..90,10]).walk(),
|
||||
names=T("one","two","three","four","five","six","seven","eight","nine",
|
||||
"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen",
|
||||
"seventeen","eighteen","nineteen","twenty",
|
||||
"thirty","forty","fifty","sixty","seventy","eighty","ninety"),
|
||||
hs =T( 100, 1000, 1000000, 1000000000,1000000000000),
|
||||
hnames=T("hundred","thousand","million","billion", "trillion");
|
||||
|
||||
fcn numberToString(n){ // n>0
|
||||
fcn(n){
|
||||
if(100<=n<0d100_000_0000_000){
|
||||
idx,h,name,r := hs.filter1n('>(n))-1, hs[idx], hnames[idx], n%h;
|
||||
String(self.fcn(n/h),name,
|
||||
if(r==0) "" else if(0<r<100) " and " else ", ",
|
||||
self.fcn(r));
|
||||
}else if(0<n<=90){
|
||||
idx,t,name,r := ns.filter1n('>(n))-1, ns[idx], names[idx], n-t;
|
||||
String(name, if(0<r<10) "-" else " ", self.fcn(r));
|
||||
}else ""
|
||||
}(n).strip() // sometimes there is a trailing space
|
||||
}
|
||||
3
Task/Number-names/Zkl/number-names-2.zkl
Normal file
3
Task/Number-names/Zkl/number-names-2.zkl
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
foreach n in (T(85001,155019,4547000,6766027,55555555555)){
|
||||
println("%,d is %s".fmt(n,numberToString(n)));
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue