3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

2時間で100個のいちごを食べる最適ペースをPythonで解析

Last updated at Posted at 2025-12-24

大食いの極意

いちごを大量に食べるために必要なのは次の三つである

  1. 食べる動作をどれだけ均等化できるか
  2. 胃のキャパシティをどこで使い切るか
  3. 後半のペース低下をどう最小化するか

大食いは根性ではなく、負荷管理とペース配分の最適化で決まる

特に重要なのは
「前半で急ぎすぎると後半に必ず失速する」
という点である

人間は時間の経過とともに動作の効率が落ちる
そのため、大食いのコツは一定リズムを保つことで疲労を可視化し、
ペースを均等化することに尽きる

これを数値モデルとして作れるのが Python の強みである

スクリーンショット 2025-12-24 23.13.59.png

現実的な前提条件

一個あたりの動作

摘む 2秒
持ち上げる 1秒
食べる 3秒
次の株へ移動 2秒
合計 8秒

胃容量

1.5kg
いちご1個15g
上限 100個

疲労モデル

時間経過で最大10パーセント遅くなる


完成版 GUI コード

import tkinter as tk
import time
import threading

class StrawberrySimulator:
    def __init__(self, root):
        self.root = root
        self.root.title("いちご狩り 2時間シミュレーション + 手動カウント")

        frame_left = tk.Frame(root)
        frame_left.pack(side="left", padx=20, pady=10)

        tk.Label(frame_left, text="自動シミュレーション", font=("Helvetica", 16)).pack()

        self.total_time = 7200
        self.remaining_time = self.total_time
        self.eat_count = 0
        self.base_time_per_strawberry = 8
        self.max_capacity = 100

        self.label_time = tk.Label(frame_left, text="残り時間: 7200 秒", font=("Helvetica", 14))
        self.label_time.pack(pady=5)

        self.label_count = tk.Label(frame_left, text="食べた数: 0 個", font=("Helvetica", 14))
        self.label_count.pack(pady=5)

        self.canvas = tk.Canvas(frame_left, width=350, height=300, bg="white")
        self.canvas.pack(pady=10)

        self.strawberries = []
        self.draw_strawberries()

        self.button_start = tk.Button(frame_left, text="シミュレーション開始", command=self.start_simulation)
        self.button_start.pack(pady=10)

        frame_right = tk.Frame(root)
        frame_right.pack(side="right", padx=20, pady=10)

        tk.Label(frame_right, text="自分で食べた数(手動)", font=("Helvetica", 16)).pack()

        self.manual_count = 0

        self.label_manual = tk.Label(frame_right, text="あなたが食べた数: 0 個", font=("Helvetica", 14))
        self.label_manual.pack(pady=10)

        self.button_plus = tk.Button(frame_right, text="+ 1 個食べた", font=("Helvetica", 14), command=self.add_manual)
        self.button_plus.pack(pady=5)

        self.button_reset = tk.Button(frame_right, text="リセット", command=self.reset_manual)
        self.button_reset.pack(pady=5)

    def draw_strawberries(self):
        self.canvas.delete("all")
        self.strawberries.clear()

        x, y = 20, 20
        for i in range(self.max_capacity):
            s = self.canvas.create_oval(x, y, x + 20, y + 20, fill="red")
            self.strawberries.append(s)

            x += 30
            if x > 320:
                x = 20
                y += 30

    def start_simulation(self):
        thread = threading.Thread(target=self.simulate)
        thread.daemon = True
        thread.start()

    def simulate(self):
        start_time = time.time()

        while self.remaining_time > 0 and self.eat_count < self.max_capacity:
            elapsed = time.time() - start_time
            fatigue_rate = 1 + (elapsed / self.total_time) * 0.1
            time_per_one = self.base_time_per_strawberry * fatigue_rate

            time.sleep(time_per_one)
            self.eat_count += 1

            if self.strawberries:
                s = self.strawberries.pop()
                self.canvas.delete(s)

            self.remaining_time = self.total_time - int(elapsed)
            self.update_gui()

        self.end_simulation()

    def update_gui(self):
        self.label_time.config(text=f"残り時間: {self.remaining_time}")
        self.label_count.config(text=f"食べた数: {self.eat_count}")

    def end_simulation(self):
        self.label_time.config(text="終了")
        self.label_count.config(text=f"最終結果: {self.eat_count} 個 食べました")

    def add_manual(self):
        self.manual_count += 1
        self.label_manual.config(text=f"あなたが食べた数: {self.manual_count}")

    def reset_manual(self):
        self.manual_count = 0
        self.label_manual.config(text=f"あなたが食べた数: 0 個")


root = tk.Tk()
app = StrawberrySimulator(root)
root.mainloop()

どう動くか

シミュレーションでは、時間とともに食べるスピードがわずかに落ち、
100個に到達するか、2時間が終了すると止まる。

右側の手動カウンターと比較することで
自分の実際のペースとAIのペースを比較できる。

大食いの極意である「ペースの均等化」を可視化できるのがポイント。

まとめ

大食いは勘と勢いではなく、ペース配分がすべてである
Pythonを使えば、そのペース管理や限界値を数値として再現できる

単なる遊びのテーマでありながら
GUI、スレッド、シミュレーション、可視化といった要素を総合的に学べる構成になっている

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?