吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 959|回复: 17
收起左侧

[求助] 我该如何设计健身计划的python程序?

  [复制链接]
吾更爱你 发表于 2023-2-22 14:50
  

       
  • 设计个python查询程序 输入起始日期和项目 未来30天训练计划
       
  • 输入的项目是胸 背 腿其中的一个
       
  • 每天情况有五种:胸  背 腿 有氧 休息
       
  • 其中胸  背 腿是力量训练 力量训练完第二天是有氧 但是连续运动3天后要休息一天
       
  • 比如2023年1月1日 训练项目是胸 那么接下来的每一天的训练项目是:
       
  • 2023-01-01 胸        2023-01-02 有氧        
      2023-01-03 背        
      2023-01-04 休息        
      2023-01-05 有氧        
      2023-01-06 腿        
      2023-01-07 有氧        
      2023-01-08 休息        
      2023-01-09 胸        
      2023-01-10 有氧        
      2023-01-11 背        
      2023-01-12 休息        
      2023-01-13 有氧        
      2023-01-14 腿
      

代码如下
[Python] 纯文本查看 复制代码
from datetime import datetime, timedelta

# 定义每个项目的运动顺序
project_order = {
    "胸": ["胸", "有氧", "背", "休息", "有氧", "腿", "有氧", "休息"],
    "背": ["背", "有氧", "腿", "休息", "有氧", "胸", "有氧", "休息"],
    "腿": ["腿", "有氧", "胸", "休息", "有氧", "背", "有氧", "休息"]
}

def get_training_plan(start_date, project):
    """
    根据起始日期和项目生成未来30天的训练计划
    """
    plan = []
    order = project_order[project]
    current_date = datetime.strptime(start_date, "%Y-%m-%d")

    for i in range(30):
        # 根据项目的运动顺序获取当前日期应该进行的训练项目
        training_project = order[i % 8]
        # 如果当前是休息日,则跳过当天的训练
        if training_project == "休息":
            plan.append(current_date.strftime("%Y-%m-%d") + " " + training_project)
            current_date += timedelta(days=1)
            continue
        # 添加当前日期的训练计划
        plan.append(current_date.strftime("%Y-%m-%d") + " " + training_project)
        # 如果当前是有氧日,则将前一天的训练项目标记为已完成
        if training_project == "有氧":
            previous_day = plan[-1][:10]
        # 更新日期
        current_date += timedelta(days=1)
    return plan

# 测试程序
start_date = "2023-01-01"
project = "胸"
plan = get_training_plan(start_date, project)
for p in plan:
    print(p)


但实际上光指定一天的训练项目没有用 比如指定2023-2-20是腿  那么就有三种情况
第一种情况:如果腿的前两天是背和有氧 那么再下一天就是休息 顺序是:背    有氧  腿 休息 有氧 胸
第二种情况:如果腿的前一天是休息 那么下一天就是有氧 顺序如下:有氧  休息 腿 有氧 胸    休息
第三种情况:如果腿的前两天是休息 有氧 那么下一天就是有氧 顺序是:休息 有氧  腿 有氧 休息 胸  
看起来要指定前两天和起始日的项目 我该如何设计我的查询程序呢 ?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lineulb 发表于 2023-2-22 15:18
帮你用chatgpt滚了一圈
[Python] 纯文本查看 复制代码
from datetime import datetime, timedelta

def generate_training_plan(start_date, project):
    # 建立一个训练项目列表
    project_list = ['胸', '背', '腿']
    # 建立一个训练类型列表
    type_list = ['胸', '背', '腿', '有氧', '休息']
    # 计算起始日期之后30天的日期
    end_date = start_date + timedelta(days=30)
    # 初始化当前训练类型和训练天数
    current_type = project
    days_since_last_rest = 0
    # 生成训练计划
    training_plan = []
    while start_date <= end_date:
        training_plan.append((start_date, current_type))
        # 每个训练项目完成后,切换到下一个训练项目
        current_type_index = type_list.index(current_type)
        next_type_index = (current_type_index + 1) % len(project_list)
        next_type = project_list[next_type_index]
        # 检查是否需要进行有氧训练或休息
        days_since_last_rest += 1
        if current_type in project_list and days_since_last_rest == 3:
            current_type = '休息'
            days_since_last_rest = 0
        elif current_type == '休息':
            current_type = '有氧'
        else:
            current_type = next_type
        # 增加一天
        start_date += timedelta(days=1)
    return training_plan


[Python] 纯文本查看 复制代码
start_date = datetime(2023, 1, 1)
project = '胸'
training_plan = generate_training_plan(start_date, project)
for training_day in training_plan:
    print(training_day[0].strftime('%Y-%m-%d'), training_day[1])


[Python] 纯文本查看 复制代码
from datetime import datetime, timedelta

# 定义每个训练周期的类型
TRAINING_TYPES = ["胸", "背", "腿", "有氧", "休息"]

def generate_training_plan(start_date, start_training_type, day_before_yesterday_type, yesterday_type):
    # 将起始日期和前两天的项目转换为datetime对象
    start_date = datetime.strptime(start_date, "%Y-%m-%d")
    day_before_yesterday_type_index = TRAINING_TYPES.index(day_before_yesterday_type)
    yesterday_type_index = TRAINING_TYPES.index(yesterday_type)

    # 定义一个列表,用于存储每天的训练类型
    training_plan = []

    # 根据起始日的类型确定第一天的训练类型
    if start_training_type == "有氧" or start_training_type == "休息":
        training_type_index = TRAINING_TYPES.index(start_training_type)
    else:
        training_type_index = (yesterday_type_index + 1) % 3

    # 生成未来30天的训练计划
    for i in range(30):
        # 将当天的训练类型加入训练计划中
        training_plan.append((start_date + timedelta(days=i)).strftime("%Y-%m-%d") + " " + TRAINING_TYPES[training_type_index])

        # 根据当天的训练类型确定下一天的训练类型
        if TRAINING_TYPES[training_type_index] == "胸" or TRAINING_TYPES[training_type_index] == "背" or TRAINING_TYPES[training_type_index] == "腿":
            if i % 3 == 2:
                training_type_index = (training_type_index + 2) % 5
            else:
                training_type_index = (training_type_index + 1) % 5
        else:
            training_type_index = (training_type_index + 1) % 5

    return training_plan
恋天 发表于 2023-2-22 15:31
lineulb 发表于 2023-2-22 15:18
帮你用chatgpt滚了一圈
[mw_shl_code=python,true]from datetime import datetime, timedelta

哈哈哈,太秀了
侃遍天下无二人 发表于 2023-2-22 16:41
建议直接下个app帮你定制计划,还可以跟着动画练
 楼主| 吾更爱你 发表于 2023-2-22 16:48
侃遍天下无二人 发表于 2023-2-22 16:41
建议直接下个app帮你定制计划,还可以跟着动画练

哈哈 其实是设计个例子学习下编程
 楼主| 吾更爱你 发表于 2023-2-22 16:50
lineulb 发表于 2023-2-22 15:18
帮你用chatgpt滚了一圈
[mw_shl_code=python,true]from datetime import datetime, timedelta

chatgpt还没有那么智能 运行下就知道是错的

2023-01-01 胸
2023-01-02 背
2023-01-03 腿
2023-01-04 休息
2023-01-05 有氧
2023-01-06 背
2023-01-07 休息  

1月7号间隔两天就休息了 错的

而且只输入一天是无法得出结果的
 楼主| 吾更爱你 发表于 2023-2-22 16:51
恋天 发表于 2023-2-22 15:31
哈哈哈,太秀了

chatgpt解决不了的
lineulb 发表于 2023-2-23 09:36
吾更爱你 发表于 2023-2-22 16:50
chatgpt还没有那么智能 运行下就知道是错的

2023-01-01 胸

chatgpt确实不够优秀,我有些时候让它生成的代码,它根本没考虑过比如python3版本,引入包之类的
,单总体而言已经很不错了,我觉得它生成的代码你看懂它为什么这么写,抱着学习的态度去看它。另外就是对于python来说,我感觉自学它入门的话很多功能虽然能实现,但是不够规范,看它代码能让你的代码更为规范。
terran312 发表于 2023-3-13 00:09
先提两点意见:
1、表达能力确实不行,我看的不是很明白;
2、用好标点可以让表达更容易。
我的疑问:查询程序为什么要纠结逻辑,查询难道不是只在乎数据本身吗?
我的理解:如果是想设计个程序来给你制定计划,你可以设置个计数器,如果遇到运动日就+1,如果遇到休息日就清零,通过计数器来达到“练三休一”的目的。(其实我并不是很确定,你想要解决的是不是这个问题。。。)
 楼主| 吾更爱你 发表于 2023-3-13 08:01
terran312 发表于 2023-3-13 00:09
先提两点意见:
1、表达能力确实不行,我看的不是很明白;
2、用好标点可以让表达更容易。

一共就几十个字 空格代表了标点 为了方便理解我举了大量例子 表达能力和理解能力是相对的概念

因为这个问题本身就是很强的逻辑 不是连三休息这么简单的问题 每一天练什么不光取决于起始项目 还取决于前两天的项目  
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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