有意思的Python题目实现

有意思的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))

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值