Oban数字

2010年10月1日

我们需要一个将数字转换为单词的函数。Scheme没有提供,所以我们自己编写:

(定义(数字->单词n)
(letrec((ones)(“一”“二”“三”“四”“五”“六”
“七”“八”“九”“十”“十一”“十二”
“十三”“十四”“十五”“十六”
“十七”“十八”“十九”)
(十’(“二十”“三十”“四十”“五十”
“六十”“七十”“八十”“九十”)
(集团(“千”“百万”“十亿”“万亿”)
“四万亿”“五亿”“六亿”
“septillion”“octillion”“nonillion”“debillion”
“十一亿”“十亿”“万亿”
“quattourdecillion”“五十亿”“性十亿”
“septendecillion”“octodecillion”“novmdecillin”
“vigintillion”)
(nnn->单词(λ(n));三位数
(秒(<=100 n)
(字符串附加
(列出个位数(商n 100))
“百”
(如果(正?(模n 100))“”)
(nnn->字(模n 100))
((<=20n)
(字符串附加
(十位数列表(商n 10))
(如果(零?(模n 10))“”
(字符串附加“-”(列出个数(模n 10))))
(其他))
(cond((negative?n)(字符串附加“negatible”(数字->单词(-n)))
((<=#e1e66 n)(错误'num->单词“超出范围”))
((零?n)“零”)
((小于n 1000)(nnn->单词n))
(else(let循环((n n)(组-组))
(let(上(商n 1000))
(组(模n 1000))
(字符串附加
(if(zero?prev)“”
(前循环(cdr组))
(如果(零?组)“”
(字符串附加
(如果(正面?前面)“”)
(nnn->单词组)
(如果(字符串=?“”(汽车组))“”
(字符串附加“”(汽车组))))

有了它,就很容易了。有454个数字在0到1000之间。不可能有其他的oban数字,因为任何较大的数字在拼写中都包含单词“千”或后缀“illion”(斯隆的A008521号):

(每个人)
(λ(n)(显示n)(换行))
(n列表(n范围1000)(不是(字符串索引#\o(数字->单词n))))

我们使用列表推导式字符串索引来自标准前奏曲。您可以在运行程序http://programmingpraxis.codepad.org/pN3VLfJP.

页码:1 2

6对“奥巴马数字”的回应

  1. […]实践–奥本数字Remco Niemeijer在今天的编程实践练习中,我们的任务是打印所有奥本数字的列表([…]

  2. 雷姆科·尼梅耶

    My Haskell解决方案(请参阅http://bonsaicode.wordpress.com/2010/10/01/programming-praxis-oban-numbers网站/对于带有注释的版本):

    欧本::[国际]obans=过滤器(notElem'o'.spell)[1..999]其中拼写n|n<20=个!!n个|n<100=十!!div n 10++拼写(mod n 10)|真=拼写(div n 100)++“百”++拼写(mod n 100)ones=“”:words“一二三四五六七八\\九点一十一点一十三点十四\\十五十六十七十八十九”tens=“”:“”:words“二十、三十、四十五、六十\\七十八九十“tens=“”:“”:words“二十、三十、四十五、六十\\七十八九十“主::IO()main=mapM_打印obans
  3. 雷姆科·尼梅耶

    哎哟。意外复制了十位数的定义。以下是正确的版本:

    欧班斯::[国际]obans=过滤器(notElem'o'.spell)[1..999]其中拼写n|n<20=个!!n个|n<100=十!!div n 10++拼写(mod n 10)|真=拼写(div n 100)++“百”++拼写(mod n 100)ones=“”:words“一二三四五六七八\\九点一十一点一十三点十四\\十五、十六、十七、十八、十九“tens=“”:“”:words“二十、三十、四十五、六十\\七十八九十“主::IO()main=mapM_打印obans
  4. 山姆

    -我们真的不需要把它们拼出来,是吗?

    obanNumbers=过滤器(mkOban.show)[1..]

    mkOban::String->Bool
    mkOban[]=正确
    mkOban['1',_]=真
    mkOban('1':_)=错误
    mkOban('2':_)=错误
    mkOban('4':_)=错误
    mkOban(x:xs)=mkOpan xs

  5. 伊恩

    山姆,我认为你的版本不会打印11或12,这是一个数字。我不确定,因为我不读哈斯克尔的书。

    这是我的Python版本。结果与雷姆科的版本非常相似。

    定义int2str(数量):
    to_20=[“,‘一’,‘二’,‘三’,‘四’,‘五’,‘六’,‘七’,‘八’,
    “九”、“十”、“十一”、“十二”、“十三”、“十四”,
    “十五”、“十六”、“十七”、“十八”、“十九”]
    tens=[“,”,“二十”,“三十”,“四十”,“五十”,“六十”,“七十”,
    “八十”、“九十”]

    如果num<20:
    返回到20[num]
    如果num<100:
    return tens[num//10]+“”+to_20[num%10]
    其他:
    返回到_20[num//100]+“一百”+int2str(num%100)

    定义oban():
    如果int2str(i).find('o')==-1],则返回[i代表范围(1000)内的i

    打印oban()

  6. 康(Khanh)

    类似地,F中的mine#

    让rec为Oban(n:int)=让数字=[“”;“一”;“二”;“三”;“四”;“五”;“六”;“七”;“八”;“九”;“十”;“十一”;“十二”;“第十四”;“十四”;“十五”;“十六”;“十七”;“十八”;“十九”]让十位数=[“”;“”;”二十“;”三十“;”四十“;”五十“;”六十“;”七十“;”八十“;”九十“]如果n<20,则not(数字。[n].包含(“o”))elif n<100则not(tens.[n/10].包含(“o”)&&(isOban(n%10))elif n<1000则not(数字。[n/100]。包含(“o”)&&(isOban(n%100))否则为false设l=List.filter为Oban[1..1000]|>List.length

留下评论