Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

fun challenge

Name: Anonymous 2008-05-28 20:15

Write a program that takes an integer as input and writes the integer in English.

ie:

enter integer: 23
twenty-three.

Here's my code in common lisp:

(format t "~r" (read))

Name: Anonymous 2008-05-29 13:26

List-based

import Char
import Control.Arrow
import List

main = interact (unlines . map translate . lines)

translate ('-': num) = case translateAbs num of abs@"zero" -> abs
                                                abs        -> "minus " ++ abs
translate ('+': num) = translateAbs num
translate num        = translateAbs num

translateAbs num
   | length num > (3 * 22) = error "translate: Number too long"
   | otherwise =
        foldl1 ((++) . (++ ", ")) . checkZero . reverse . filter (not . null) . zipWith suffix suffixes
                                  . map translateTrio . splitInTrios $ map digitToInt num
   where suffix s  []  = []
         suffix [] htu = htu
         suffix s  htu = htu ++ " " ++ s

checkZero [] = ["zero"]
checkZero n  = n

splitInTrios =
   takeWhile (not . null) . loop . reverse
   where loop = uncurry (:) . (reverse *** loop) . splitAt 3

translateTrio [u]   = units !! u
translateTrio [t,u] =
   case (t, u) of (0, u) -> translateTrio [u]
                  (1, u) -> teens !! u
                  (t, 0) -> tens !! t
                  (t, u) -> tens !! t ++ "-" ++ translateTrio [u]

translateTrio [h,t,u] =
   case (h, translateTrio [t, u]) of (0, tu) -> tu
                                     (h, []) -> hundreds !! h
                                     (h, tu) -> hundreds !! h ++ " and " ++ tu

units = [[],    "one",    "two",    "three",    "four",     "five",    "six",     "seven",     "eight",    "nine"]
tens  = [[],    "ten",    "twenty", "thirty",   "forty",    "fifty",   "sixty",   "seventy",   "eighty",   "ninety"]
teens = ["ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]

hundreds = map (++ " hundred") units

suffixes = [[], "thousand"] ++ illions

illions = map (++ "illion") ([    "m",  "b",   "tr",  "quadr",    "quint", "sext", "sept",   "oct",  "non"]
       ++ map (++ "dec")     [[], "un", "duo", "tre", "quattuor", "quin",  "sex",  "septen", "octo", "novem"] ++ ["vingint"])

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List