【时事篇-03】20240113棋盘麦粒的问题 (黑白棋盘填入不同色彩文字,2的次方、sum法)

发布时间:2024年01月13日

作品展示:

背景需求

棋盘麦粒的每个棋盘格子里有多少麦粒呢?64格一共需要多少麦粒

用Python写一个答案吧

'''
项目:棋盘麦粒The grain problem  2的次方 sum()
作者:阿夏
时间:2024年1月13日19:03'''

'''在印度有一个古老的传说:舍罕王打算奖赏国际象棋的发明人——宰相:西萨·班·达依尔。
国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里,赏给我1粒麦子,
在第2个小格里给2粒,第3小格给4粒,以后每一小格都比前一小格加一倍。
请您把这样摆满棋盘上所有的64格的麦粒,都赏给您的仆人吧!
”国王觉得这要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,
国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。 
那么,宰相要求得到的麦粒到底有多少呢?总数为:
1 + 2 + 4+ 8 + ……… + 2的63次方 = 2的64次方-1 = 18446744073709551615(粒)
人们估计,全世界需要500年生产这么多麦子!'''


print('第1步:计算棋盘麦粒总数和每格子数量')
P=[]
a=0
for i in range(0,64):    
    a=2**i    # 第1个格子是1粒子==2的0次方=1 ……# 第64个格子是1粒子==2的63次方=9223372036854775808
    P.append(a)    # 把第一个字的1粒计入列表
print(len(P),'个棋盘格的麦粒总数',sum(P))
# 64 个棋盘格的麦粒总数 18446744073709551615
print('每个棋盘格的麦粒数',P)
# 每个棋盘格的麦粒数 [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968, 72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]

# 8个8个一组
b=[]
for pl in range(int(len(P)/8)):
    b.append(P[pl*8:pl*8+8])
for c in range(len(b)):
    print('棋盘第',c+1,'行:',b[c])

# 棋盘第 1 行: [1, 2, 4, 8, 16, 32, 64, 128]
# 棋盘第 2 行: [256, 512, 1024, 2048, 4096, 8192, 16384, 32768]
# 棋盘第 3 行: [65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608]
# 棋盘第 4 行: [16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648]
# 棋盘第 5 行: [4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888]
# 棋盘第 6 行: [1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328]
# 棋盘第 7 行: [281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968]
# 棋盘第 8 行: [720575940379279

答案一:64 个棋盘格的麦粒总数 18446744073709551615(京兆亿)

答案二:计算每个格子填写的数量

棋盘第 1 行: [1, 2, 4, 8, 16, 32, 64, 128]
棋盘第 2 行: [256, 512, 1024, 2048, 4096, 8192, 16384, 32768]
棋盘第 3 行: [65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608]
棋盘第 4 行: [16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648]
棋盘第 5 行: [4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888]
棋盘第 6 行: [1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328]
棋盘第 7 行: [281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968]
棋盘第 8 行: [72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]

我想在8*8国际象棋棋盘格里填满64个数字

制作一个word模板

1.0版本---白背景黑字

'''
项目:1.0 白底 黑字 棋盘麦粒The grain problem  2的次方 sum()
作者:阿夏
时间:2024年1月13日19:03'''

'''在印度有一个古老的传说:舍罕王打算奖赏国际象棋的发明人——宰相:西萨·班·达依尔。
国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里,赏给我1粒麦子,
在第2个小格里给2粒,第3小格给4粒,以后每一小格都比前一小格加一倍。
请您把这样摆满棋盘上所有的64格的麦粒,都赏给您的仆人吧!
”国王觉得这要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,
国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。 
那么,宰相要求得到的麦粒到底有多少呢?总数为:
1 + 2 + 4+ 8 + ……… + 2的63次方 = 2的64次方-1 = 18446744073709551615(粒)
人们估计,全世界需要500年生产这么多麦子!'''


import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,time

import docx
from docx import Document
from docx.shared import Pt 
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn


from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor

print('第1步:计算棋盘麦粒总数和每格子数量')
P=[]
a=0
for i in range(0,64):    
    a=2**i    # 第1个格子是1粒子==2的0次方=1 ……# 第64个格子是1粒子==2的63次方=9223372036854775808
    P.append(a)    # 把第一个字的1粒计入列表
print(len(P),'个棋盘格的麦粒总数',sum(P))
# 64 个棋盘格的麦粒总数 18446744073709551615
print('每个棋盘格的麦粒数',P)
# 每个棋盘格的麦粒数 [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968, 72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]

# 8个8个一组
b=[]
for pl in range(int(len(P)/8)):
    b.append(P[pl*8:pl*8+8])
for c in range(len(b)):
    print('棋盘第',c+1,'行:',b[c])

# 棋盘第 1 行: [1, 2, 4, 8, 16, 32, 64, 128]
# 棋盘第 2 行: [256, 512, 1024, 2048, 4096, 8192, 16384, 32768]
# 棋盘第 3 行: [65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608]
# 棋盘第 4 行: [16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648]
# 棋盘第 5 行: [4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888]
# 棋盘第 6 行: [1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328]
# 棋盘第 7 行: [281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968]
# 棋盘第 8 行: [72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]

# 最前面加上总数,作为标题插入0000单元格
P.insert(0,sum(P))
print(P)



print('第2步:制作单元格坐标')
bg=[]
title='0000'
bg.append(title)
for x in range(1,9):
    for y in range(0,8):
        bg.append('{}{}'.format('%02d'%x,'%02d'%y))
print(bg)
# ['0000', '0100', '0101', '0102', '0103', '0104', '0105', '0106', '0107', '0200', '0201', '0202', '0203', '0204', '0205', '0206', '0207', '0300', '0301', '0302', '0303', '0304', '0305', '0306', '0307', '0400', '0401', '0402', '0403', '0404', '0405', '0406', '0407', '0500', '0501', '0502', '0503', '0504', '0505', '0506', '0507', '0600', '0601', '0602', '0603', '0604', '0605', '0606', '0607', '0700', '0701', '0702', '0703', '0704', '0705', '0706', '0707', '0800', '0801', '0802', '0803', '0804', '0805', '0806', '0807']
    

print('第3步:写入Word棋盘')

doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\棋盘麦粒\棋盘麦粒.docx')  

#       # 房间模板(第一个表格)要写入的门牌号列表 
table = doc.tables[0]          # 表0,表2 写标题用的
# 标题写入3、5单元格  
for t in range(0,len(bg)):             # 0-5是最下面一行,用来写卡片数字
    pp=int(bg[t][0:2])     # 
    qq=int(bg[t][2:4])
    k=str(P[t])              # 提取list图案列表里面每个图形  t=索引数字
    print(pp,qq,k)

    # 图案符号的字体、大小参数
    run=table.cell(pp,qq).paragraphs[0].add_run(k)    # 在单元格0,0(第1行第1列)输入第0个图图案
    run.font.name = '黑体'#输入时默认华文彩云字体
    # run.font.size = Pt(46)  #输入字体大小默认30号 换行(一页一份大卡片
    run.font.size = Pt(22) #是否加粗
    # run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255
    run.font.color.rgb = RGBColor(0,0,0) #数字小,颜色深0-255
    run.bold=True
    # paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距

    r = run._element
    r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
    table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中   
#    
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\棋盘麦粒\棋盘麦粒(填写版).docx')#保存为XX学号的电话号码word     
time.sleep(2)

问题:

1、字号太大,撑大了方形格子,但是缩小字号容易看不清楚,还是保持黑体22,加粗

2、国际象棋棋盘是黑白格子,做一个黑白底的模板,但是那样就要有黑和白两种字体

2.0代码——黑白棋盘格及数字填充

word 单元格用黑色填充

'''
项目:2.0 黑白棋盘 棋盘麦粒The grain problem  2的次方 sum()
重点:填充黑白背景,黑棋盘用白文字,白棋盘用黑文字
作者:阿夏
时间:2024年1月13日19:03'''

'''在印度有一个古老的传说:舍罕王打算奖赏国际象棋的发明人——宰相:西萨·班·达依尔。
国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里,赏给我1粒麦子,
在第2个小格里给2粒,第3小格给4粒,以后每一小格都比前一小格加一倍。
请您把这样摆满棋盘上所有的64格的麦粒,都赏给您的仆人吧!
”国王觉得这要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,
国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。 
那么,宰相要求得到的麦粒到底有多少呢?总数为:
1 + 2 + 4+ 8 + ……… + 2的63次方 = 2的64次方-1 = 18446744073709551615(粒)
人们估计,全世界需要500年生产这么多麦子!'''


import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,time

import docx
from docx import Document
from docx.shared import Pt 
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn


from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor



print('第1步:制作单元格坐标,分别提取')

# 所有单元格坐标
bg=[]
# title='0000'
# bg.append(title)
for x in range(1,9):
    for y in range(0,8):
        bg.append('{}{}'.format('%02d'%x,'%02d'%y))
print(len(bg))
# ['0000', '0100', '0101', '0102', '0103', '0104', '0105', '0106', '0107', '0200', '0201', '0202', '0203', '0204', '0205', '0206', '0207', '0300', '0301', '0302', '0303', '0304', '0305', '0306', '0307', '0400', '0401', '0402', '0403', '0404', '0405', '0406', '0407', '0500', '0501', '0502', '0503', '0504', '0505', '0506', '0507', '0600', '0601', '0602', '0603', '0604', '0605', '0606', '0607', '0700', '0701', '0702', '0703', '0704', '0705', '0706', '0707', '0800', '0801', '0802', '0803', '0804', '0805', '0806', '0807']

# 为了黑白格子,把所有黑格子坐标写出类,记录索引数字
bg_black=[]
bg_white=[]
BG=[]
# 提取黑色的第一部分 1,3,5,7行的
for a1 in range(1,9,2):
    for b1 in range(0,8,2):
        bg_black.append('{}{}'.format('%02d'%a1,'%02d'%b1))
for a2 in range(2,9,2):
    for b2 in range(1,8,2):
        bg_black.append('{}{}'.format('%02d'%a2,'%02d'%b2))
print(bg_black)
BG.append(bg_black)

# 提取白色的第一部分 
for a4 in range(1,9,2):
    for b4 in range(1,8,2):
        bg_white.append('{}{}'.format('%02d'%a4,'%02d'%b4))
for a3 in range(2,9,2):
    for b3 in range(0,8,2):
        bg_white.append('{}{}'.format('%02d'%a3,'%02d'%b3))
print(bg_white)
# 加上标题
title='0000'
bg_white.insert(0,title)

BG.append(bg_white)



print('第1步:计算棋盘麦粒总数和每格子数量')
P=[]
Q=[]
a=0
for i in range(0,64):    
    a=2**i    # 第1个格子是1粒子==2的0次方=1 ……# 第64个格子是1粒子==2的63次方=9223372036854775808
    P.append(str(a))    # [''.''.'']
    print(P )
    Q.append(a)    # 算总数用
print(len(P),'个棋盘格的麦粒总数',sum(Q))
# # 64 个棋盘格的麦粒总数 18446744073709551615
# print('每个棋盘格的麦粒数',str(P))
# # 每个棋盘格的麦粒数 [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968, 72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]

# 8个8个一组
# b=[]
# for pl in range(int(len(P)/8)):
#     b.append(P[pl*8:pl*8+8])
# for c in range(len(b)):
#     print('棋盘第',c+1,'行:',b[c])

# 棋盘第 1 行: [1, 2, 4, 8, 16, 32, 64, 128]
# 棋盘第 2 行: [256, 512, 1024, 2048, 4096, 8192, 16384, 32768]
# 棋盘第 3 行: [65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608]
# 棋盘第 4 行: [16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648]
# 棋盘第 5 行: [4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888]
# 棋盘第 6 行: [1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328]
# 棋盘第 7 行: [281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968]
# 棋盘第 8 行: [72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]

# # # 最前面加上总数,作为标题插入0000单元格
# # # P.insert(0,sum(P))
# # print(P)
# # print(len(P))
# # # 65

# # 为了黑白格子,把所有黑格子的数字写出类,通过单元格索引判断记录索引数字

# 提取黑格子中的需要填写的数字,写成白数字  白数字与黑格子匹配
PP=[]
p_white=[]
for g1 in range(len(bg_black)):  
    for h1 in range(len(bg)):     
        if bg_black[g1]==bg[h1]:
            p_white.append(P[h1])
        else:
            pass
print(p_white)
#需要变成白色字体的数字 ['1', '4', '16', '64', '512', '2048', '8192', '32768', '65536', '262144', '1048576', '4194304', '33554432', '134217728', '536870912', '2147483648', '4294967296', '17179869184', '68719476736', '274877906944', '2199023255552', '8796093022208', '35184372088832', '140737488355328', '281474976710656', '1125899906842624', '4503599627370496', '18014398509481984', '144115188075855872', '576460752303423488', '2305843009213693952', '9223372036854775808']
print(len(p_white)) # 32
PP.append(p_white)

# 提取白格子中的需要填写的数字,写成黑数字  黑数字与白格子匹配
p_black=[]
for g2 in range(len(bg_white)):  
    for h2 in range(len(bg)):
   
        if bg_white[g2]==bg[h2]:
            p_black.append(P[h2])
        else:
            pass
print(p_black)
# 黑色字体最前面加上 总数,作为标题
p_black.insert(0,sum(Q))
#需要变成白色字体的数字['2', '8', '32', '128', '256', '1024', '4096', '16384', '131072', '524288', '2097152', '8388608', '16777216', '67108864', '268435456', '1073741824', '8589934592', '34359738368', '137438953472', '549755813888', '1099511627776', '4398046511104', '17592186044416', '70368744177664', '562949953421312', '2251799813685248', '9007199254740992', '36028797018963968', '72057594037927936', '288230376151711744', '1152921504606846976', '4611686018427387904']
print(len(p_black)) # 32
PP.append(p_black)


print(PP)
print(BG)


print('第3步:写入Word棋盘')
# RGB 颜色,0,0,0=黑色,255,255,255=白色
one=[255,0]
two=[255,0]
three=[255,0]
doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\棋盘麦粒\棋盘麦粒.docx')  

#       # 房间模板(第一个表格)要写入的门牌号列表 

for w in range(len(BG)):
    table = doc.tables[0]          # 表0,表2 写标题用的
 
    for t in range(0,len(BG[w])):             # 0-5是最下面一行,用来写卡片数字
        pp=int(BG[w][t][0:2])     # 
        qq=int(BG[w][t][2:4])
        k=str(PP[w][t])              # 提取list图案列表里面每个图形  t=索引数字
        print(pp,qq,k)

        # 图案符号的字体、大小参数
        run=table.cell(pp,qq).paragraphs[0].add_run(k)    # 在单元格0,0(第1行第1列)输入第0个图图案
        run.font.name = '黑体'#输入时默认华文彩云字体
        # run.font.size = Pt(46)  #输入字体大小默认30号 换行(一页一份大卡片
        run.font.size = Pt(22) #是否加粗
        # run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255
        run.font.color.rgb = RGBColor(one[w],two[w],three[w]) #数字小,颜色深0-255
        run.bold=True
        # paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距

        r = run._element
        r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
        table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中   
#    
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\棋盘麦粒\棋盘麦粒(填写版).docx')#保存为XX学号的电话号码word     
time.sleep(2)

感想:

制作黑白格子的数字,花了很大的精力,提取各种单元格的坐标,确定单元格所属数字的颜色,做了6个小时,反复测算。

不同单元格的数字填色实在太麻烦了!

文章来源:https://blog.csdn.net/reasonsummer/article/details/135568988
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。