RosettaCodeData/Task/Middle-three-digits/ATS/middle-three-digits.ats
2023-07-01 13:44:08 -04:00

120 lines
1.6 KiB
Text

(* ****** ****** *)
//
#include
"share/atspre_staload.hats"
#include
"share/HATS/atspre_staload_libats_ML.hats"
//
(* ****** ****** *)
//
extern
fun
int2digits(x: int): list0(int)
//
(* ****** ****** *)
implement
int2digits(x) =
loop(x, list0_nil) where
{
//
fun
loop
(
x: int, res: list0(int)
) : list0(int) =
if x > 0 then loop(x/10, list0_cons(x%10, res)) else res
//
} (* end of [int2digits] *)
(* ****** ****** *)
extern
fun
Middle_three_digits(x: int): void
(* ****** ****** *)
implement
Middle_three_digits
(x0) = let
//
val x1 =
(
if x0 >= 0 then x0 else ~x0
) : int
//
fun
skip
(
ds: list0(int), k: int
) : list0(int) =
if k > 0 then skip(ds.tail(), k-1) else ds
//
val ds =
int2digits(x1)
//
val n0 = length(ds)
//
in
//
if
(n0 <= 2)
then
(
println! ("Middle-three-digits(", x0, "): Too small!")
)
else
(
if
(n0 % 2 = 0)
then
(
println!
(
"Middle-three-digits(", x0, "): Even number of digits!"
)
)
else let
val ds =
skip(ds, (n0-3)/2)
val-list0_cons(d1, ds) = ds
val-list0_cons(d2, ds) = ds
val-list0_cons(d3, ds) = ds
in
println! ("Middle-three-digits(", x0, "): ", d1, d2, d3)
end // end of [else]
)
//
end // end of [Middle_three_digits]
(* ****** ****** *)
implement
main0() =
{
//
val
thePassing =
g0ofg1
(
$list{int}
(
123
, 12345
, 1234567
, 987654321
, 10001, ~10001
, ~123, ~100, 100, ~12345
)
)
val
theFailing =
g0ofg1($list{int}(1, 2, ~1, ~10, 2002, ~2002, 0))
//
val () = thePassing.foreach()(lam x => Middle_three_digits(x))
val () = theFailing.foreach()(lam x => Middle_three_digits(x))
//
} (* end of [main0] *)
(* ****** ****** *)