鱼C论坛

 找回密码
 立即注册
查看: 6009|回复: 55

[技术交流] Python:每日一题 27(答题领鱼币)

[复制链接]
发表于 2017-4-13 19:14:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
九宫格即把1~9的数字填到3行3列的表格中,使每行每列和对角线的数字之和都相等,例如:

215406s5nhq29vyz5ssvum.png

请编程做出所有的排列可能。


感谢@冬雪雪冬 提供的题目,大家有好题目也要贡献出来,有鱼币奖励

游客,如果您要查看本帖隐藏内容请回复




欢迎小伙伴们,一起答题!
如果你有能力,欢迎加入我们!
已经上车老司机:@冬雪雪冬 @lumber2388779 @ooxx7788 @gopythoner
点我走上人生巅峰
帅的人都上车了,而丑的人还在犹豫

评分

参与人数 1贡献 +2 收起 理由
朝闻夕死 + 2 热爱鱼C^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-4-13 19:56:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 20:01:25 | 显示全部楼层
Number 1 :

[[2 7 6]
[9 5 1]
[4 3 8]]

--------------------
Number 2 :

[[2 9 4]
[7 5 3]
[6 1 8]]

--------------------
Number 3 :

[[4 3 8]
[9 5 1]
[2 7 6]]

--------------------
Number 4 :

[[4 9 2]
[3 5 7]
[8 1 6]]

--------------------
Number 5 :

[[6 1 8]
[7 5 3]
[2 9 4]]

--------------------
Number 6 :

[[6 7 2]
[1 5 9]
[8 3 4]]

--------------------
Number 7 :

[[8 1 6]
[3 5 7]
[4 9 2]]

--------------------
Number 8 :

[[8 3 4]
[1 5 9]
[6 7 2]]

--------------------

  1. #!/usr/bin/env python2
  2. # -*- coding: utf-8 -*-
  3. """
  4. Created on Thu Apr 13 19:40:58 2017

  5. @author: jerry_xu
  6. """
  7. import numpy
  8. from itertools import permutations as pt
  9. comb = pt(range(1,10), 9)

  10. def check(lst):
  11.     return True if sum(lst[0:3]) == sum(lst[3:6]) == sum(lst[6:9]) == sum(lst[0:9:3]) == sum(lst[1:9:3]) == sum(lst[2:9:3]) == sum(lst[0:9:4]) == sum(lst[2:7:2]) else False

  12. i = 0
  13. for each in comb:
  14.     if check(each):
  15.         c = numpy.array(each)
  16.         c = c.reshape((3, 3))
  17.         i += 1
  18.         print 'Number %d :' % i
  19.         print ''
  20.         print c
  21.         print ''
  22.         print '-' * 20
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 20:41:58 | 显示全部楼层
本帖最后由 ooxx7788 于 2017-4-13 20:43 编辑
  1. for a in range(1, 10):
  2.     for b in range(1, 10):
  3.         if b in [a]:
  4.             continue
  5.         for c in range(1, 10):
  6.             if c in [a, b]:
  7.                 continue
  8.             for d in range(1, 10):
  9.                 if d in [a, b, c]:
  10.                     continue
  11.                 for e in range(1, 10):
  12.                     if e in [a, b, c, d]:
  13.                         continue
  14.                     for f in range(1, 10):
  15.                         if f in [a, b, c, d, e]:
  16.                             continue
  17.                         for g in range(1, 10):
  18.                             if g in [a, b, c, d, e, f]:
  19.                                 continue
  20.                             for h in range(1, 10):
  21.                                 if h in [a, b, c, d, e, f, g]:
  22.                                     continue
  23.                                 for i in range(1, 10):
  24.                                     if i in [a, b, c, d, e, f, g, h]:
  25.                                         continue
  26.                                     elif a + b + c == d + e + f == g + h + i == a + d + g == b + e + h == c + f + i == a + e + i == c + e + g:
  27.                                         print('-'*5)
  28.                                         print(a, b, c)
  29.                                         print(d, e, f)
  30.                                         print(g, h, i)
  31. print('-'*5)
复制代码


我就弄点简单粗暴的吧!
输出
  1. -----
  2. 2 7 6
  3. 9 5 1
  4. 4 3 8
  5. -----
  6. 2 9 4
  7. 7 5 3
  8. 6 1 8
  9. -----
  10. 4 3 8
  11. 9 5 1
  12. 2 7 6
  13. -----
  14. 4 9 2
  15. 3 5 7
  16. 8 1 6
  17. -----
  18. 6 1 8
  19. 7 5 3
  20. 2 9 4
  21. -----
  22. 6 7 2
  23. 1 5 9
  24. 8 3 4
  25. -----
  26. 8 1 6
  27. 3 5 7
  28. 4 9 2
  29. -----
  30. 8 3 4
  31. 1 5 9
  32. 6 7 2
  33. -----
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 21:58:01 | 显示全部楼层
  1. import itertools as t
  2. a = t.permutations(range(1,10),9)
  3. for i in a:
  4.     i = list(i)
  5.     if i[0]+i[4]+i[8]==15 and i[2]+i[4]+i[6]==15 and i[0]+i[1]+i[2]==15 and i[0]+i[3]+i[6]==15:
  6.         if i[1]+i[4]+i[7]==15 and i[3]+i[4]+i[5]==15:
  7.             print i
复制代码



  1. [2, 7, 6, 9, 5, 1, 4, 3, 8]
  2. [2, 9, 4, 7, 5, 3, 6, 1, 8]
  3. [4, 3, 8, 9, 5, 1, 2, 7, 6]
  4. [4, 9, 2, 3, 5, 7, 8, 1, 6]
  5. [6, 1, 8, 7, 5, 3, 2, 9, 4]
  6. [6, 7, 2, 1, 5, 9, 8, 3, 4]
  7. [8, 1, 6, 3, 5, 7, 4, 9, 2]
  8. [8, 3, 4, 1, 5, 9, 6, 7, 2]
复制代码

只能想到这种简单的

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-13 21:58:18 | 显示全部楼层
@冬雪雪冬 还不来!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-14 09:25:41 | 显示全部楼层
ooxx7788 发表于 2017-4-13 20:41
我就弄点简单粗暴的吧!
输出

厉害了,大叔
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-14 09:46:28 | 显示全部楼层
说一下我的思路,使用穷举法,但做些优化。
1. [1][1]位置肯定是5。
2. 每行列对角线之后是15
所以将1~9除了5以外排列出4个,将其填到[0][0],[0][1],[0][2],[1][0]位置,将10减去这个数排在相对的位置,如[0][0]填1,则[2][2]填9,当然这4个数要去除相互直接的和为10的。
再判断[0][0],[0][1][0][2]之和为15且[0][0],[1][0],[2][0]之和为15就可得到答案了。
这里为了方便没有采用二维列表,只用以为列表代替了。
  1. import itertools
  2. count = 1
  3. for i in itertools.permutations((1, 2, 3, 4, 6 , 7, 8, 9), 4):
  4.     list1 = [0] * 9
  5.     list1[4] = 5
  6.     if len(set([10 - n for n in i]) & set(i)) == 0:
  7.         for j in range(4):
  8.             list1[j] = i[j]
  9.         for j in range(4):
  10.             list1[8 - j] = 10 - i[j]
  11.         if list1[0] + list1[1] + list1[2] == 15 and list1[0] + list1[3] + list1[6] == 15:
  12.             print('No.%d'%count)
  13.             for m in range(3):
  14.                 print(list1[m * 3: (m + 1) * 3])
  15.             print()
  16.             count += 1
复制代码
  1. No.1
  2. [2, 7, 6]
  3. [9, 5, 1]
  4. [4, 3, 8]

  5. No.2
  6. [2, 9, 4]
  7. [7, 5, 3]
  8. [6, 1, 8]

  9. No.3
  10. [4, 3, 8]
  11. [9, 5, 1]
  12. [2, 7, 6]

  13. No.4
  14. [4, 9, 2]
  15. [3, 5, 7]
  16. [8, 1, 6]

  17. No.5
  18. [6, 1, 8]
  19. [7, 5, 3]
  20. [2, 9, 4]

  21. No.6
  22. [6, 7, 2]
  23. [1, 5, 9]
  24. [8, 3, 4]

  25. No.7
  26. [8, 1, 6]
  27. [3, 5, 7]
  28. [4, 9, 2]

  29. No.8
  30. [8, 3, 4]
  31. [1, 5, 9]
  32. [6, 7, 2]
复制代码

点评

我很赞同!: 5.0
我很赞同!: 5
厉害!  发表于 2017-4-14 17:39
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-14 11:36:01 | 显示全部楼层
学习学习。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-14 22:47:23 | 显示全部楼层
本帖最后由 dori233 于 2017-4-15 14:58 编辑

  1. # -*- coding: utf-8 -*-

  2. def sum15():
  3.     """先把相加等于15的组合找出来,1~9数字不能重复出现"""
  4.     mun_list = []
  5.     for i in range(1, 10):
  6.         for x in range(1, 10):
  7.             for z in range(1, 10):
  8.                 if (i+x+z == 15) and (len({i, x, z}) == 3):
  9.                     mun_list.append([i, x, z])
  10.     return mun_list


  11. def ruled_out(mun_list):
  12.     """组合数字变成横竖斜对角都相加等于15的九宫格,组合的可能性,添加到列表中"""
  13.     ruled_list = []
  14.     for m1 in mun_list:
  15.         for m2 in mun_list:
  16.             for m3 in mun_list:
  17.                 if len(set(m1) | set(m2) | set(m3)) == 9:
  18.                     u1 = m1[0]+m2[0]+m3[0]
  19.                     u2 = m1[1]+m2[1]+m3[1]
  20.                     u3 = m1[2]+m2[2]+m3[2]
  21.                     i1 = m1[0]+m2[1]+m3[2]
  22.                     i2 = m1[2]+m2[1]+m3[0]
  23.                     if len({u1, u2, u3, i1, i2}) == 1:
  24.                         # 生成了一个带格式的字符串,方便日后打印
  25.                         ruled_list.append('\n\n%s\n%s\n%s\n\n======' % (m1, m2, m3))
  26.     return ruled_list


  27. # 开始工作
  28. result_list = ruled_out(sum15())
  29. file = open('九宫格结果.txt', 'w')
  30. file.write('一共有%d种组合' % len(result_list))
  31. file.writelines(result_list)
  32. file.close()
复制代码


输出结果: 九宫格结果.txt:↓
  1. 一共有8种组合

  2. [2, 7, 6]
  3. [9, 5, 1]
  4. [4, 3, 8]

  5. ======

  6. [2, 9, 4]
  7. [7, 5, 3]
  8. [6, 1, 8]

  9. ======

  10. [4, 3, 8]
  11. [9, 5, 1]
  12. [2, 7, 6]

  13. ======

  14. [4, 9, 2]
  15. [3, 5, 7]
  16. [8, 1, 6]

  17. ======

  18. [6, 1, 8]
  19. [7, 5, 3]
  20. [2, 9, 4]

  21. ======

  22. [6, 7, 2]
  23. [1, 5, 9]
  24. [8, 3, 4]

  25. ======

  26. [8, 1, 6]
  27. [3, 5, 7]
  28. [4, 9, 2]

  29. ======

  30. [8, 3, 4]
  31. [1, 5, 9]
  32. [6, 7, 2]

  33. ======
复制代码


昨晚那个程序太不效率了,小改了一下,依然是用set的思路去解决.

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 那也加分!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-16 18:04:03 | 显示全部楼层
看题。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-16 20:56:46 | 显示全部楼层
其实我是看jerry用了itertools了,才选择用个暴力的方法。
用itertools生成全排列的情况下,不考虑排版的情况下,几乎可以写出一行解决的代码。

  1. from itertools import permutations as pt

  2. for each in pt(range(1, 10), 9):
  3.     a, b, c, d, e, f, g, h, i = each
  4.     if a + b + c == d + e + f == g + h + i == a + d + g == b + e + h == c + f + i == a + e + i == c + e + g:
  5.         print('-' * 7, '\n', a, b, c, '\n', d, e, f, '\n', g, h, i)
  6. print('-' * 7)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-4-17 11:39:18 | 显示全部楼层
这个大家基本用的都是一样的方法,我业不会其他方法 就不来骗鱼币了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-11 16:05:33 | 显示全部楼层
好难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-11 17:52:22 | 显示全部楼层
本帖最后由 solomonxian 于 2017-6-11 17:53 编辑

9! 种排列吗, 符合的就8种
  1. # 只有把 5 放中间一种类型解法,并且和等于15,不过还是暴力破解看看吧

  2. def check(a):
  3.     """传入九宫格(列表),判定是否破解"""
  4.     #print("a=", a)
  5.     if a[0]+a[1]+a[2] == a[3]+a[4]+a[5] == a[6]+a[7]+a[8]\
  6.     == a[0]+a[3]+a[6] == a[1]+a[4]+a[7] == a[2]+a[5]+a[8]\
  7.     == a[0]+a[4]+a[8] == a[2]+a[4]+a[6]:
  8.         print(a)

  9. def permute(a_list):
  10.     """闭包处理, 保存了使用方法 for 循环和两个环境变量"""
  11.    
  12.     outer = []  # 记录每个九宫格排列结果
  13.     counted = {"sudo": 0}  # 计数器
  14.     def extract(n,i):
  15.         """递归处理, 从列表 n 中抽一个出来,剩余的元素再排列"""
  16.         outer.append(i)
  17.         if len(n) == 1:
  18.             counted['sudo'] += 1
  19.             check(outer)
  20.         else:
  21.             m = n[:]   # 复制品用于安全迭代
  22.             m.remove(i)
  23.             for j in m:
  24.                 extract(m, j)
  25.         # 删去本次循环增加的 i ,保持9个元素
  26.         outer.remove(i)
  27.                
  28.     for num in a_list:
  29.         extract(a_list, num)
  30.     print(counted)
  31.    
  32. a1 = [1,2,3,4,5,6,7,8,9]
  33. permute(a1)
复制代码

  1. [2, 7, 6, 9, 5, 1, 4, 3, 8]
  2. [2, 9, 4, 7, 5, 3, 6, 1, 8]
  3. [4, 3, 8, 9, 5, 1, 2, 7, 6]
  4. [4, 9, 2, 3, 5, 7, 8, 1, 6]
  5. [6, 1, 8, 7, 5, 3, 2, 9, 4]
  6. [6, 7, 2, 1, 5, 9, 8, 3, 4]
  7. [8, 1, 6, 3, 5, 7, 4, 9, 2]
  8. [8, 3, 4, 1, 5, 9, 6, 7, 2]
  9. {'sudo': 362880}
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-16 16:53:50 | 显示全部楼层
感谢楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-21 21:15:47 | 显示全部楼层
q
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-21 22:07:40 | 显示全部楼层

  1. from itertools import permutations as qpl
  2. #import time

  3. #t=time.time()
  4. comb=qpl(range(1,10),9)

  5. all=[]
  6. for i in comb:
  7.     p=True
  8.     for j in range(3):#判断横竖
  9.         if i[j]+i[j+3]+i[j+6]!=15 or i[j*3]+i[j*3+1]+i[j*3+2]!=15:
  10.             p=False
  11.             break
  12.     if p:
  13.         if i[0]+i[4]+i[8]==15 and i[2]+i[4]+i[6]==15:#判断对角线
  14.             all.append(i)
  15. #print(time.time()-t)
  16. x=''#格式化输出
  17. for i in all:
  18.     for j in range(3):
  19.         x+=str(i[j*3])+str(i[j*3+1])+str(i[j*3+2])+'\n'
  20.     x+='\n'
  21. print(x)

复制代码

实际上是同一个
276
951
438

294
753
618

438
951
276

492
357
816

618
753
294

672
159
834

816
357
492

834
159
672
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-21 22:12:42 | 显示全部楼层
我觉得可以出一个题目:
给出20个(或者更多)的3*3的矩阵,判断哪些属于同一个类型,比比谁的代码效率快
比如本题的8个答案,可以通过水平翻转、垂直翻转、或者对角线翻转互相转换, 全部属于同一个类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-21 22:22:12 | 显示全部楼层
小锟 发表于 2017-4-13 21:58
只能想到这种简单的

简单的最高效!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 20:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表