Another update from ingydotnet^djgoku

This commit is contained in:
Ingy döt Net 2015-11-18 06:14:39 +00:00
parent 91df62d461
commit 948b86eafa
7604 changed files with 108452 additions and 22726 deletions

View file

@ -0,0 +1,76 @@
::Number Names Task from Rosetta Code Wiki
::Batch File Implementation
@echo off
setlocal enabledelayedexpansion
if "%~1"=="iterate" goto num_name
::Define the words
set "small=One Two Three Four Five Six Seven Eight Nine Ten"
set "small=%small% Eleven Twelve Thirteen Fourteen Fifteen Sixteen Seventeen Eighteen Nineteen"
set "decade=Twenty Thirty Forty Fifty Sixty Seventy Eighty Ninety"
set "big=Thousand Million Billion"
::Seperating each word...
set cnt=0
for %%X in (%small%) do (set /a "cnt+=1"&set small!cnt!=%%X)
set cnt=0
for %%Y in (%decade%) do (set decade!cnt!=%%Y&set /a "cnt+=1")
set cnt=0
for %%Z in (%big%) do (set big!cnt!=%%Z&set /a "cnt+=1")
::The Main Thing
for %%. in (42,27,1090,230000,1001100,-40309,0,123456789) do (
set input=%%.
if %%. lss 0 (set /a input*=-1)
if !input! equ 0 (set TotalOut=Zero) else (
call :num_word %%.
)
echo "!TotalOut!"
)
exit /b
::/The Main Thing
::The Procedure
:num_word
set outP=
set unit=0
set num=!input!
:num_loop
set /a tmpLng1 = num %% 100
set /a tmpLng2 = tmpLng1 %% 10
set /a tmpNum1 = tmpLng1/10 - 2
if !tmpLng1! geq 1 if !tmpLng1! leq 19 (
set "outP=!small%tmpLng1%! !outP!"
)
if !tmpLng1! geq 20 if !tmpLng1! leq 99 (
if !tmpLng2! equ 0 (
set "outP=!decade%tmpNum1%! !outP!"
) else (
set "outP=!decade%tmpNum1%!-!small%tmpLng2%! !outP!"
)
)
set /a tmpLng1 = (num %% 1000)/100
if not !tmpLng1! equ 0 (
set "outP=!small%tmpLng1%! Hundred !outP!"
)
set /a num/=1000
if !num! lss 1 goto :break_loop
set /a tmpLng1 = num %% 1000
if not !tmpLng1! equ 0 (
set "outP=!big%unit%! !outP!"
)
set /a unit+=1
goto :num_loop
:break_loop
set "TotalOut=!outP!"
if %1 lss 0 set "TotalOut=Negative !outP!"
set TotalOut=%TotalOut:~0,-1%
goto :EOF

View file

@ -0,0 +1,77 @@
-module(nr2eng).
-import(lists, [foreach/2, seq/2, append/2]).
-import(string, [strip/3, str/2]).
-export([start/0]).
sym(1) -> "one";
sym(2) -> "two";
sym(3) -> "three";
sym(4) -> "four";
sym(5) -> "five";
sym(6) -> "six";
sym(7) -> "seven";
sym(8) -> "eight";
sym(9) -> "nine";
sym(10) -> "ten";
sym(11) -> "eleven";
sym(12) -> "twelve";
sym(13) -> "thirteen";
sym(20) -> "twenty";
sym(30) -> "thirty";
sym(40) -> "forty";
sym(50) -> "fifty";
sym(100) -> "hundred";
sym(1000) -> "thousand";
sym(1000*1000) -> "million";
sym(1000*1000*1000) -> "billion";
sym(_) -> "".
next(1000) -> 100;
next(100) -> 10;
next(10) -> 1;
next(X) -> X div 1000.
concat(PRE, "") ->
PRE;
concat(PRE, POST) ->
PRE++" "++POST.
concat("", _, POST) ->
POST;
concat(PRE, SYM, "") ->
PRE++" "++SYM;
concat(PRE, SYM, POST) ->
PRE++" "++SYM++" "++POST.
nr2eng(0, _) ->
"";
nr2eng(NR, 1) ->
sym(NR);
nr2eng(NR, 10) when NR =< 20 ->
case sym(NR) of
"" -> strip(sym(NR-10), right, $t) ++ "teen";
_ -> sym(NR)
end;
nr2eng(NR, 10) ->
concat(
case sym((NR div 10)*10) of
"" -> strip(sym(NR div 10), right, $t) ++ "ty";
_ -> sym((NR div 10)*10)
end,
nr2eng(NR rem 10, 1));
nr2eng(NR, B) ->
PRE = nr2eng(NR div B, next(B)),
POST = nr2eng(NR rem B, next(B)),
AND = str(POST, "and"),
COMMA = if
POST == "" -> "";
AND == 0 -> " and";
B >= 1000 -> ",";
true -> ""
end,
concat(PRE, sym(B)++COMMA, POST).
start() ->
lists:foreach(
fun (X) -> io:fwrite("~p ~p ~n", [X, nr2eng(X, 1000000000)])
end,
append(seq(1, 2000), [123123, 43234234])).

View file

@ -0,0 +1,78 @@
const stext = ["one", "two", "three", "four", "five",
"six", "seven", "eight", "nine"]
const teentext = ["eleven", "twelve", "thirteen", "fourteen",
"fifteen", "sixteen", "seventeen",
"eighteen", "nineteen"]
const tenstext = ["ten", "twenty", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety"]
const ordstext = ["million", "billion", "trillion",
"quadrillion", "quintillion", "sextillion",
"septillion", "octillion", "nonillion",
"decillion", "undecillion", "duodecillion",
"tredecillion", "quattuordecillion", "quindecillion",
"sexdecillion", "septendecillion", "octodecillion",
"novemdecillion", "vigintillion"]
function normalize_digits!{T<:Integer}(a::Array{T,1})
while 0 < length(a) && a[end] == 0
pop!(a)
end
return length(a)
end
function digits2text!{T<:Integer}(d::Array{T,1}, use_short_scale=true)
ndig = normalize_digits!(d)
0 < ndig || return ""
if ndig < 7
s = ""
if 3 < ndig
t = digits2text!(d[1:3])
s = digits2text!(d[4:end])*" thousand"
0 < length(t) || return s
if contains(t, "and")
return s*" "*t
else
return s*" and "*t
end
end
if ndig == 3
s *= stext[pop!(d)]*" hundred"
ndig = normalize_digits!(d)
0 < ndig || return s
s *= " and "
end
1 < ndig || return s*stext[pop!(d)]
j, i = d
j != 0 || return s*tenstext[i]
i != 1 || return s*teentext[j]
return s*tenstext[i]*"-"*stext[j]
end
s = digits2text!(d[1:6])
d = d[7:end]
dgrp = use_short_scale ? 3 : 6
ord = 0
while(dgrp < length(d))
ord += 1
t = digits2text!(d[1:dgrp])
d = d[(dgrp+1):end]
0 < length(t) || continue
t = t*" "*ordstext[ord]
if length(s) == 0
s = t
else
s = t*" "*s
end
end
ord += 1
t = digits2text!(d)*" "*ordstext[ord]
0 < length(s) || return t
return t*" "*s
end
function num2text{T<:Integer}(n::T, use_short_scale=true)
-1 < n || return "minus "*num2text(-n, use_short_scale)
0 < n || return "zero"
toobig = use_short_scale ? big(10)^66 : big(10)^126
n < toobig || return "too big to say"
return digits2text!(digits(n, 10), use_short_scale)
end

View file

@ -0,0 +1,53 @@
function wrap{T<:String,U<:Integer}(str::T, width::U=70, indent::U=4)
sdent = " "^(indent-1)
s = sdent
llen = indent
for t in split(str, " ")
s *= " "*t
llen += length(t) + 1
width < llen || continue
s *= "\n"*sdent
llen = indent
end
return rstrip(s)
end
println("Testing num2text")
println()
println("Some easy ones to start with")
println()
tests = [-1:21, 100, 101, 10000, 10001, 1000000, 1010101]
for i in tests
println(@sprintf("%8d is %s", i, num2text(i)))
end
println()
println("Some larger numbers")
println()
println("The largest signed literal integer (short-scale)")
i = typemax(1)
println(" ", i, " is")
println(wrap(num2text(i)))
println()
println("The largest signed literal integer (long-scale)")
println(" ", i, " is")
println(wrap(num2text(i, false)))
println()
println("The largest unsigned integer (short-scale)")
i = typemax(Uint128)
println(" ", i, " is")
println(wrap(num2text(i)))
println()
println("50! (short-scale)")
i = factorial(big(50))
println(" ", i, " is")
println(wrap(num2text(i)))
println()
println("51! (short-scale)")
i = factorial(big(51))
println(" ", i, " is")
println(wrap(num2text(i)))
println()
println("51! (long-scale)")
println(" ", i, " is")
println(wrap(num2text(i, false)))

View file

@ -13,7 +13,7 @@ sub int-name ($num) {
if $num eq '0' { return @I[0] }
my $m = 0;
return join ', ', reverse gather for $num.flip.comb(/\d ** 1..3/) {
my ($i,$x,$c) = .comb;
my ($i,$x,$c) = .comb».Int;
if $i or $x or $c {
take join ' ', gather {
if $c { take @C[$c] }

View file

@ -0,0 +1,26 @@
import scala.collection.immutable.TreeMap
val NUMBERS = TreeMap(
1 -> "one", 2 -> "two", 3 -> "three", 4 -> "four", 5 -> "five", 6 -> "six", 7 -> "seven", 8 -> "eight", 9 -> "nine",
10 -> "ten", 11 -> "eleven", 12 -> "twelve", 13 -> "thirteen", 14 -> "fourteen", 15 -> "fifteen", 16 -> "sixteen",
17 -> "seventeen", 18 -> "eighteen", 19 -> "nineteen", 20 -> "twenty", 30 -> "thirty", 40 -> "forty",
50 -> "fifty", 60 -> "sixty", 70 -> "seventy", 80 -> "eighty", 90 -> "ninety"
)
val HUNDREDS = TreeMap(
100l -> "hundred", 1000l -> "thousand", 1000000l -> "million", 1000000000l -> "billion", 1000000000000l -> "trillion"
)
def numberToString(number: Long) : String = {
if (HUNDREDS.to(number).nonEmpty) {
val (h, hundreds) = HUNDREDS.to(number).last
val remainder = number % h
numberToString(number / h) + hundreds + {if (remainder > 0) {if (remainder < 100) " and " else ", "} + numberToString(remainder) else " "}
} else if (NUMBERS.to(number.toInt).nonEmpty) {
val (n, word) = NUMBERS.to(number.toInt).last
val remainder = number - n
word + {if (remainder > 0 && remainder < 10) "-" else " "} + numberToString(remainder)
} else {
""
}
}