免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yestreenstars
打印 上一主题 下一主题

[文本处理] 练习题(阿拉伯数字转化为罗马数字) [复制链接]

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
31 [报告]
发表于 2015-06-15 13:45 |只看该作者
回复 30# Herowinter

写成多行脚本会好些~
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
32 [报告]
发表于 2015-06-15 15:26 |只看该作者
回复 27# jason680

不错的思路,但那些单字符的变量看得有点晕,单行命令用单字符变量还好~
   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
33 [报告]
发表于 2015-06-15 16:22 |只看该作者
本帖最后由 jason680 于 2015-06-15 16:30 编辑

回复 32# yestreenstars

$ awk '
BEGIN{
  # 0. prepare roman and value array
  # rom[1] = I, val[1] = 1
  # rom[2] = V, val[2] = 5
  # rom[3] = X, val[3] = 10
  # ...
  # rom[7] = X, val[7] = 1000
  max = split("IVXLCDM",rom,"");
  for(n=1; n <= max; n++){
    val[n] = 10**int(n/2) * (n%2?1:.5);
  }
}
{
  num = $0;
  # 1. check number ( 1 <= number <= 3999 )
  if(num < 1 || 3999 < num){
    print "out of range 1~3999: " num;
    next
  }
  rom_str = "";
  # 2. check number with 10 times only (1000, 100, 10, and 1)
  #    max=7, and V[7] = 1000, V[5]=100, ...
  for(n = max; n > 0; n -= 2){
    if(num >= val[n]){
      multi = int(num / val[n]);
      num %= val[n];
      # 3. for special number 4 and 9
      #   4xx = 100 and 500  = CD  (Note: multi=4, rom[5] and rom[5+1], n=5)
      #   9xx = 100 and 1000 = CM  (Note: multi=9, rom[5] and rom[5+2], n=5)
      #   rom[5] = C, val[5] = 100   , n =5
      #   rom[6] = D, val[6] = 500   , n+1=6
      #   rom[7] = M, val[7] = 1000 , n+2=7
      if(multi %5 == 4){
        rom_str = rom_str rom[n] rom[n+(multi>5?2:1)];
        continue;
      }
     #4. more than number 5
     #  6x = 50 and 1x = LX   (Note: multi=6 ==> rom[3+1] and multi=6-5=1)
     #  7x = 50 and 2x = LXX  (Note: Multi=7 ==> rom[3+1] and multi=7-5=2)
     #  rom[3] = X, val[3] = 10,  n=3
     #  rom[4] = L, val[4] = 50,  n+1=4
     if(multi >= 5){
       rom_str = rom_str rom[n+1];
       multi -= 5;
     }
     # for normal number
     for(c=1; c <= multi; c++)
       rom_str = rom_str rom[n]
    }
  }
  print rom_str
}' FILE
VI
LXXVI
CDXCIX
MMMDCCCLXXXVIII
IX
XX
out of range 1~3999: 4000
out of range 1~3999: 0
out of range 1~3999: -1

$ cat FILE
6
76
499
3888
9
20
4000
0
-1

   

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
34 [报告]
发表于 2015-06-15 19:59 |只看该作者
这是我的python2代码,比较幼稚有些地方很不严谨高手请蛋定
  1. #!/usr/bin/python2

  2. ROM = [['I', 'V'], ['X', 'L'], ['C', 'D'], ['M']]
  3. GEN = lambda a, b, c, d, e, f, r: a * ROM[b][c] + d * ROM[e][f] + r
  4. LAM = [[3, lambda m, i, r: (0, i, 0, m, i, 0, r)],
  5.        [5, lambda m, i, r: (1, i, 0, 5 - m, i, 1, r)],
  6.        [8, lambda m, i, r: (1, i, 1, m - 5, i, 0, r)],
  7.        [9, lambda m, i, r: (10 - m, i, 0, 1, i + 1, 0, r)]]

  8. def A2R(n, i=0, R=''):
  9.     if n is 0: return R
  10.     n, m = divmod(n, 10)
  11.     return A2R(n, i + 1, GEN(*next(l(m, i, R) for v, l in LAM if m <= v)))


  12. test = [6, 9, 10, 11, 76, 499, 3888]
  13. good = ['VI', 'IX', 'X', 'XI', 'LXXVI', 'CDXCIX', 'MMMDCCCLXXXVIII']

  14. for I, N in enumerate(test):
  15.     rom = A2R(N)
  16.     print N, '=', rom, ':', rom == good[I]

复制代码

论坛徽章:
1
水瓶座
日期:2014-03-04 17:56:43
35 [报告]
发表于 2015-06-15 21:30 |只看该作者
dfgsdg hsdfgh

论坛徽章:
2
巳蛇
日期:2013-12-31 14:13:002015年亚洲杯之沙特阿拉伯
日期:2015-03-26 13:30:50
36 [报告]
发表于 2015-06-17 11:20 |只看该作者
  1. #-*- coding:utf8 -*-

  2. def arab_to_roma(targ):
  3.     nums = [1000, 500, 100, 50, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
  4.     roma = {1000:'M', 500:'D', 100:'C', 50:'L', 10:'X',
  5.             9:'IX', 8:'VIII', 7:'VII', 6:'VI', 5:'V',
  6.             4:'IV',3:'III', 2:'II', 1:'I'}
  7.     answ = {}

  8.     for item in nums:
  9.         while targ >= item:
  10.             if not answ.has_key(item):
  11.                 answ[item] = 1
  12.             else:
  13.                 answ[item] += 1
  14.             targ -= item

  15.     return (''.join([roma[key]*answ[key] for key in sorted(answ, reverse=True)]))

  16. if __name__ == '__main__':
  17.     arab = [6, 76, 499, 3888]
  18.     for item in arab:
  19.         print arab_to_roma(item)
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
37 [报告]
发表于 2015-06-17 22:49 |只看该作者
回复 34# substr函数

这脚本有问题哈~5的时候有问题~
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
38 [报告]
发表于 2015-06-17 22:54 |只看该作者
回复 36# lichmama

你这脚本也有问题哦~不只是499时有问题,其他很多转化都有问题~
   

论坛徽章:
2
巳蛇
日期:2013-12-31 14:13:002015年亚洲杯之沙特阿拉伯
日期:2015-03-26 13:30:50
39 [报告]
发表于 2015-06-18 10:39 |只看该作者
回复 38# yestreenstars


    是的,没注意到还有其他规则。

论坛徽章:
11
射手座
日期:2015-08-11 16:10:26辰龙
日期:2015-08-11 16:11:11黑曼巴
日期:2016-04-26 16:58:40
40 [报告]
发表于 2015-06-18 10:55 |只看该作者
回复 16# ly5066113


    好猥琐的枚举法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP