免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2813 | 回复: 9
打印 上一主题 下一主题

计算一个图形中的三角形数目 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-24 09:51 |只看该作者 |倒序浏览
微信朋友圈的一个游戏,数三角形的数目。自己用Python了一个小程序来处理了一下。
代码段:
      triangle_counter.py
  1. #!/usr/bin/python

  2. """
  3. ---------------------------------------------------------------------------------------------------
  4. 2015.07.23  Grey
  5. ***************************************************************************************************
  6. Counter all the triangles in a picture
  7. ---------------------------------------------------------------------------------------------------
  8. """

  9. import itertools,string

  10. def CounterTriangle():
  11.     print "All the triangles we can find in the picture are as follows:"
  12.     triangle_number    = 0
  13.     sides_match_list   = ['abh','acgi','adfj','aek','bcde','efgh','hijk']
  14.     dot_list           = []
  15.     i = 0
  16.     while i < 26:
  17.         dot_list.append(string.lowercase[i])
  18.         if string.lowercase[i] == 'k':
  19.             break
  20.         else:
  21.             i += 1
  22.     for each_combination in itertools.combinations(dot_list,3):
  23.         triangle_flag = True
  24.         for each_dot_combination in itertools.combinations(each_combination,2):
  25.             for each_side in sides_match_list:
  26.                 if each_dot_combination[0] in each_side and each_dot_combination[1] in each_side:
  27.                     triangle_flag = True
  28.                     break
  29.                 else:
  30.                     triangle_flag = False
  31.             else:
  32.                 triangle_flag = False
  33.                 break
  34.         line_flag = False
  35.         for each_side in sides_match_list:
  36.             if each_combination[0] in each_side and each_combination[1] in each_side and each_combination[2] in each_side:
  37.                 line_flag = True
  38.         if triangle_flag == True and line_flag == False:
  39.             triangle_number += 1
  40.             print "%d : %s" % (triangle_number,each_combination)
  41.     print "The number of triangles in the picture is : %d" % triangle_number

  42. CounterTriangle()
  43.         
复制代码

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
2 [报告]
发表于 2015-07-24 11:00 |只看该作者
学习了, 没想到还可以这样折腾.

论坛徽章:
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
3 [报告]
发表于 2015-07-24 11:15 |只看该作者
回复 2# haooooaaa


想请教大神,能否说说思路, 或者原理; 非常感谢!

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
4 [报告]
发表于 2015-07-24 13:25 |只看该作者
本帖最后由 haooooaaa 于 2015-07-24 13:56 编辑

回复 3# substr函数


    也尝试折腾了一下.
  1. #!/usr/bin/env python
  2. import itertools

  3. a = ['abh','acgi','adfj','aek','bcde','efgh','hijk']
  4. a = [ set(i) for i in a ]

  5. def CounterTri():
  6.     k = []
  7.     for x in itertools.combinations(a, 3):
  8.         o, p, q = x[0] & x[1], x[1] & x[2], x[2] & x[0]
  9.         if bool(o) and bool(p) and bool(q) and o != p != q:
  10.             k.append(list(o | p | q))
  11.             
  12.     print "Triangle Counter is %s" % len(k)
  13.    
  14.     for i in k:
  15.         print i
  16.    
  17. CounterTri()
复制代码
  1. $ python ttt.py
  2. Triangle Counter is 24
  3. ['a', 'c', 'b']
  4. ['a', 'h', 'g']
  5. ['a', 'i', 'h']
  6. ['a', 'b', 'd']
  7. ['a', 'h', 'f']
  8. ['a', 'h', 'j']
  9. ['a', 'b', 'e']
  10. ['a', 'h', 'e']
  11. ['a', 'h', 'k']
  12. ['h', 'b', 'e']
  13. ['a', 'c', 'd']
  14. ['a', 'g', 'f']
  15. ['a', 'i', 'j']
  16. ['a', 'c', 'e']
  17. ['a', 'e', 'g']
  18. ['a', 'i', 'k']
  19. ['c', 'e', 'g']
  20. ['i', 'h', 'g']
  21. ['a', 'e', 'd']
  22. ['a', 'e', 'f']
  23. ['a', 'k', 'j']
  24. ['e', 'd', 'f']
  25. ['h', 'j', 'f']
  26. ['h', 'k', 'e']
复制代码

论坛徽章:
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
5 [报告]
发表于 2015-07-24 13:28 |只看该作者
本帖最后由 substr函数 于 2015-07-24 13:29 编辑

回复 4# haooooaaa


我是小白〜大神,能否说说思路, 或者原理

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
6 [报告]
发表于 2015-07-24 13:58 |只看该作者
回复 5# substr函数


['abh','acgi','adfj','aek','bcde','efgh','hijk']

相就的点的元素集体如上.

而任意两线的交点只有一个. ==> 这个可以用 交集去得到.

然后三角形为三个点.

用 itertools的组合方法 得到 任意3个点元素集的 组合.

再两两取交集. 得到 三个点.

评分

参与人数 1信誉积分 +10 收起 理由
substr函数 + 10 赞一个!

查看全部评分

论坛徽章:
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
7 [报告]
发表于 2015-07-25 13:05 |只看该作者
回复 6# haooooaaa


感谢大神!
!懂了

论坛徽章:
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
8 [报告]
发表于 2015-07-25 13:10 |只看该作者
     也尝试一下
  1. ('a', 'c', 'b')
  2. ('a', 'h', 'g')
  3. ('a', 'i', 'h')
  4. ('a', 'b', 'd')
  5. ('a', 'h', 'f')
  6. ('a', 'h', 'j')
  7. ('a', 'b', 'e')
  8. ('a', 'h', 'e')
  9. ('a', 'h', 'k')
  10. ('h', 'b', 'e')
  11. ('a', 'c', 'd')
  12. ('a', 'g', 'f')
  13. ('a', 'i', 'j')
  14. ('a', 'c', 'e')
  15. ('a', 'e', 'g')
  16. ('a', 'i', 'k')
  17. ('c', 'e', 'g')
  18. ('i', 'h', 'g')
  19. ('a', 'e', 'd')
  20. ('a', 'e', 'f')
  21. ('a', 'k', 'j')
  22. ('e', 'd', 'f')
  23. ('h', 'j', 'f')
  24. ('h', 'k', 'e')

  25. TOTAL TRIANGELS IS 24
复制代码
  1. #!/usr/bin/python2

  2. from itertools import combinations as COMBINA

  3. TRIANGLE = ['abh', 'acgi', 'adfj', 'aek', 'bcde', 'efgh', 'hijk']
  4. TRIANGLE = [set(i) for i in TRIANGLE]


  5. def COUNT(TRIANGLE):
  6.     COUNT = 0
  7.     for A, B, C in COMBINA(TRIANGLE, 3):
  8.         POINTS = set(A & B | B & C | C & A)
  9.         if len(POINTS) == 3: print tuple(POINTS); COUNT += 1
  10.     print "\nTOTAL TRIANGELS IS %d" % COUNT


  11. COUNT(TRIANGLE)
复制代码

论坛徽章:
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
9 [报告]
发表于 2015-07-25 13:52 |只看该作者
回复 1# greatleaf


这个微信朋友圈的代码太差劲了。

It sucks 烂透了;

论坛徽章:
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
10 [报告]
发表于 2015-07-25 13:55 |只看该作者
LZ?不知道微信朋友圈 学python是自学还是参加培训?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP