有意思的Python题目实现
(声明:本教程仅供本人学习使用,如有人使用该技术触犯法律与本人无关)
(如果有错误,还希望指出。共同进步)
#!/usr/bin/python
# -*- coding:utf-8 -*-
"""
- 1 -
某公司有4个项目组,项目组A,B,C,D, 项目组A现有10人,项目组B现有7人,项目C组有5人,项目组D有4人。
为了实现跨项目组协作,公司决定每月从人数最多的项目组中抽调3人出来,到其他剩下3组中,每组1人,这称之为一次调整优化
经过十年的调整后,各项目组各有几人
"""
def department_adjustment(jl_time: int) -> dict:
"""
:param jl_time: months
:return: result
"""
partment_dict = {
'a': 10,
'b': 7,
'c': 5,
'd': 4
}
for i in range(jl_time):
new_dict = sorted(partment_dict.items(), key=lambda item: item[1], reverse=True)
partment_dict = {k: v + 1 for k, v in partment_dict.items()}
max_dpm = new_dict[0][0]
partment_dict[max_dpm] -= 4
return partment_dict
# 验证代码的正确性只需关注总人数的变化
"""
- 2 -
验证邀请码有效性,字符串长度16,由小写字母和数字组成
1)从序列号最后一位数字开始,逆向将奇数位相加
2)从序列号最后一位数字开始,逆向将偶数位数字,先乘2(如果乘积为两位数,则先减去9),再求和
3)将奇数位总和加上偶数位总和,结果可以被10整除
4)小写字母对应数值,按字母顺序,1-9循环
"""
def test_code(code_string: str) -> str:
"""
:param code_string: 邀请码
:return: result
"""
if len(code_string) != 16 and not code_string.islower():
return 'error'
code_dict = {
'a': 1,
'b': 2,
'c': 3,
'd': 4,
'e': 5,
'f': 6,
'g': 7,
'h': 8,
'i': 9,
'j': 1,
'k': 2,
'l': 3,
'm': 4,
'n': 5,
'o': 6,
'p': 7,
'q': 8,
'r': 9,
's': 1,
't': 2,
'u': 3,
'v': 4,
'w': 5,
'x': 6,
'y': 7,
'z': 8
}
j_num = 0
o_num = 0
for index, value in enumerate(code_string[::-1]):
if not value.isdigit():
value = code_dict[value]
if index % 2 == 0:
# print('奇数:{}'.format(value))
j_num += int(value)
else:
# print('偶数:{}'.format(value))
value = int(value) * 2
if int(value) > 9:
value = int(value) - 9
o_num += int(value)
# print(j_num)
# print(o_num)
if (j_num + o_num) % 10 == 0:
return 'ok'
else:
return 'error'
"""
- 3 -
小明的抽屉中有n个游戏币,总面值m,游戏币的设置有1分,2分,5分,10分的,而在小明所拥有的游戏币中有些面值的游戏币可能没有,
求一共有多少种可能的游戏币组合方式
输入: 输入两个数n(游戏币的个数),m(总面值)
输出: 请输出可能的组合方式数
"""
# 对语言的理解不够透彻,所以使用了暴力求解法
def game_coin(n: int, m: int) -> int:
"""
:param n: 游戏币的个数
:param m: 总面值
:return: 组合方式数
"""
count_num = 0
if n * 10 < m:
return count_num
for i in range(m // 10 + 1):
for j in range((m - 10 * i) // 5 + 1):
for k in range((m - 10 * i - 5 * i) // 2 + 1):
if (n - i - j - k) + 2 * k + 5 * j + 10 * i == m and (n - i - j - k) >= 0:
count_num += 1
# print([n - i - j - k, k, j, i])
return count_num
"""
- 4 -
有数学家发现一些两位数很有意思,比如,
34 * 86 = 43 * 68
也就是说,如果把他们的十位数和个位数交换,二者乘积不变。
编程求出满足该性质的两位数组合(暴力解法非最优法)。
"""
# 找了数和数的规律,编写的代码,但感觉怪怪的,有点面向结果的味道,这个题有点投机取巧了。希望大神帮帮忙。
def interest_num():
"""
:return: 组合数
"""
result_num = []
for i in range(10, 33):
if i % 5 != 0 and i % 11 != 0:
if i > 25:
jugde_list = ['{}{}'.format(i, i * 2), '{}{}'.format(i, i * 3), '{}{}'.format(i * 2, i * 3)]
else:
jugde_list = ['{}{}'.format(i, i * 2), '{}{}'.format(i, i * 3), '{}{}'.format(i, i * 4),
'{}{}'.format(i * 2, i * 3), '{}{}'.format(i * 2, i * 4), '{}{}'.format(i * 3, i * 4), ]
for j in jugde_list:
a = j[0]
b = j[1]
c = j[2]
d = j[3]
if int(a + b) * int(d + c) == int(b + a) * int(c + d) and j not in result_num:
result_num.append(int(a + b) * int(d + c))
# print(result_num)
return len(set(result_num))