吾更爱你 发表于 2023-2-22 14:50

我该如何设计健身计划的python程序?


    [*]设计个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 腿

代码如下
from datetime import datetime, timedelta

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

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

    for i in range(30):
      # 根据项目的运动顺序获取当前日期应该进行的训练项目
      training_project = order
      # 如果当前是休息日,则跳过当天的训练
      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滚了一圈
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
      # 检查是否需要进行有氧训练或休息
      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


start_date = datetime(2023, 1, 1)
project = '胸'
training_plan = generate_training_plan(start_date, project)
for training_day in training_plan:
    print(training_day.strftime('%Y-%m-%d'), training_day)


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)

      # 根据当天的训练类型确定下一天的训练类型
      if TRAINING_TYPES == "胸" or TRAINING_TYPES == "背" or TRAINING_TYPES == "腿":
            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滚了一圈
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滚了一圈
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、用好标点可以让表达更容易。


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

因为这个问题本身就是很强的逻辑 不是连三休息这么简单的问题 每一天练什么不光取决于起始项目 还取决于前两天的项目
页: [1] 2
查看完整版本: 我该如何设计健身计划的python程序?