寄り道16(ラズパイ4)

今日の目標

四択クイズゲームの初期案を考える

今日の結果

四択クイズゲームの初期案を考える
→達成

今回のソースコード

※今回はもらったサンプルを動かす形で終わった。

import streamlit as st
from PIL import Image
import random

st.title("モンスターが現れた。クイズを出した。「日本の都道府県で2025年現在、2番目に小さいのはどこ?」")
img = Image.open("monster.png")
st.image(img)

cand=["香川","大阪","新潟","愛媛","広島"]

for i in range(0,4):
    st.write(cand[random.randint(0, 4)])

次回の目標

選択肢の表示と問題の回答後の処理を作る。

余談:特になし

寄り道15(ラズパイ4)

メモ

パリティビット
リポジトリ,Git(実際に見たほうが早い)
ディストリビューション(Redhat系,Debian系)

次回予定

 全問ランダムで解く(今までしていなかった)
 問題を作る。

余談:はじめは全問からランダム

 同じ問題を繰り返し解くよりも効率よく勉強できます。歴史の縄文時代だけ詳しくなる人が多いのは毎回順番に解こうとするから。
 意識することは苦手問題の傾向。自分の場合は計算問題とマネジメント系が苦手。
 慣れたら分野別に練習すると定着しやすい。

寄り道14(ラズパイ4)

今日の目標

基本情報技術者試験の範囲から問題を作る。

今日の結果

基本情報技術者試験の範囲から問題を作る。
→1問追加

メモ

 作りたい問題
→答えが7になる逆ポーランド表記法の式はどれでしょう?
 問題の答えが用意できても間違えた選択肢を用意するのが大変。他者に用意する場合は被演算子をすべて偶数にした式を答えにすると間違えてくれそう。
 自分の学習用なので今回はこの形式にしなかった。
調べたほうがいい言葉 →First-In-First-Out 例:コンビニのパン

今回のソースコード

※ChatGPTで作られたコードです。

import tkinter as tk
from tkinter import messagebox
import pandas as pd

# Load quiz data
quiz_data = pd.read_csv('./quiz.tsv', sep='\t')

# Quiz logic
class QuizApp:
    def __init__(self, root, quiz_data):
        self.root = root
        self.quiz_data = quiz_data
        self.current_question = 0
        self.score = 0

        self.question_label = tk.Label(root, text="", font=("Arial", 16), wraplength=400)
        self.question_label.pack(pady=20)

        self.buttons = []
        for i in range(4):
            button = tk.Button(root, text="", font=("Arial", 14), command=lambda i=i: self.check_answer(i + 1))
            button.pack(fill="x", pady=5)
            self.buttons.append(button)

        self.result_label = tk.Label(root, text="", font=("Arial", 14), fg="green")
        self.result_label.pack(pady=10)

        self.next_button = tk.Button(root, text="次の問題に進む", font=("Arial", 14), command=self.next_question, state=tk.DISABLED)
        self.next_button.pack(pady=10)

        self.load_question()

    def load_question(self):
        if self.current_question < len(self.quiz_data):
            row = self.quiz_data.iloc[self.current_question]
            self.question_label.config(text=row['q'])
            self.result_label.config(text="")
            self.next_button.config(state=tk.DISABLED)

            for i in range(4):
                self.buttons[i].config(text=row[f'cond{i + 1}'], state=tk.NORMAL)
        else:
            messagebox.showinfo("終了", f"クイズが終了しました! 正解数: {self.score}/{len(self.quiz_data)}")
            self.root.quit()

    def check_answer(self, selected):
        correct_answer = self.quiz_data.iloc[self.current_question]['answer']
        if selected == correct_answer:
            self.result_label.config(text="正解!")
            self.score += 1
        else:
            self.result_label.config(text="不正解...")

        for button in self.buttons:
            button.config(state=tk.DISABLED)
        self.next_button.config(state=tk.NORMAL)

    def next_question(self):
        self.current_question += 1
        self.load_question()

# Create GUI application
root = tk.Tk()
root.title("4択クイズ")
app = QuizApp(root, quiz_data)
root.mainloop()

quiz.tsv

id   q   cond1   cond2   cond3   cond4   answer
1   日本の首都はどこ? 東京  大阪  北海道   名古屋   1
2   香川県の県庁所在地はどこ? 東京  大阪  高松  丸亀  3
3   逆ポーランド表記法「123*+」の計算結果は?   5   6   7   8   3

次回の目標

問題の追加

余談:特になし

寄り道13(ラズパイ4)

今日の目標

Google Driveを触れるようにする

今日の結果

Google Driveを触れるようにする
→未達成

Google Driveを触れるようにする

 資料が英語なのでフリーズしていました。Firefoxの日本語の翻訳機能がデフォルトで存在しないみたいです。
 落ち着いて拡張機能を利用すると解決できる問題でした。
 rcloneのインストールと、参考になったサイトをブックマークしたらタイムアップになっていました。

次回の目標

フィボナッチ数列について考える
Google Driveを触れるようにする

余談:素数判定について

 素数判定に使っていた判別方法の名称が判明しました。試し割り法と呼ばれていたみたいです。

寄り道12(ラズパイ4)

今日の目標

前回の課題の処理時間を短縮する

今日の結果

前回の課題の処理時間を短縮する
→達成

前回の課題の処理時間を短縮する

 前回はp,q,rの重複を許していたみたいで、for文に工夫がないことから30分かかっていました。
 今回は約6分におさまりました。
 一番処理時間の短縮につながるfor文のイテラブル(この場合はrange関数)の引数を、元から重複無しで無駄を減らせるように調整しました。今回もjudging_num関数は過去の遺物となりました。

今回のソースコード

import time

s = time.time()
# def isascnum(s):
#     return True if s.isdecimal() and s.isascii() else False

#結果
# 'NoneType' object has no attribute 'isdecimal'
def num_sequence(num_term):#関数good_triangleの数列を作る term:項
    l=[]
    n=4
    while len(l)!=num_term:
        m=good_triangle(n)
        if m!=None:
            l.append(m)
            print(f"{len(l)}th:{max(l)}")
        n+=1
    return max(l)
    # n=0
    # l=[]
    # l.append(good_triangle(20))
    # while n!=num_term:
        
    #     n+=1




def good_triangle(a):
    for p in range(3,a):
        # flg=0
        for q in range(2,p):
            # if flg:
            #     break
            for r in range(1,q):
                if is_good(p,q,r,a):
                    return a
                #     flg=1
                #     if flg:
                #         break
                        # if judging_num(p,q,r):
                        #     return a
                            #print(p,q,r,a)

# def judging_num(p,q,r):#pとqとrを一通りに絞る
#     return True if p>q and q>r else False

def is_good(p,q,r,a):
    if (p**2+q**2+r**2+a**2)**2==3*(p**4+q**4+r**4+a**4):
        return True
    else:
        return False

# b=is_good(7,5,3,8)
# print(b)
# print(good_triangle(200))
print(num_sequence(100))
# # def num_seq(n):
# good_triangle(8)
#pow(pow(p,2)+pow(q,2)+pow(r,2)+pow(a,2),2)=3*(pow(p,4)+pow(q,4)pow(r,4)pow(a,4))
e = time.time()

print(f"処理時間={e-s:.2f}sec")

次回の目標

フィボナッチ数列について考える
Google Driveを触れるようにする

余談:

寄り道11(ラズパイ4)

今日の目標

前回の課題の処理時間を短縮する

今日の結果

前回の課題の処理時間を短縮する
→未達成(調べるだけで終わってしまった)

前回の課題の処理時間を短縮する

 今回は調べるだけで終わりました。ChatGPTのコードの結果を見たところ、圧倒的な処理が終了するまでの時間差がありました。
 おそらく、アルゴリズムの違いが主要原因だと思います。for文のネストを解除することも視野に入れるかもしれません。

今回のソースコード

# def isascnum(s):
#     return True if s.isdecimal() and s.isascii() else False

#結果
# 'NoneType' object has no attribute 'isdecimal'
def num_sequence(num_term):#関数good_triangleの数列を作る term:項
    l=[]
    n=4
    while len(l)!=num_term:
        m=good_triangle(n)
        if m!=None:
            l.append(m)
        n+=1
    return max(l)
    # n=0
    # l=[]
    # l.append(good_triangle(20))
    # while n!=num_term:
        
    #     n+=1




def good_triangle(a):
    for p in range(1,a):
        # flg=0
        for q in range(1,a):
            # if flg:
            #     break
            for r in range(1,a):
                if is_good(p,q,r,a):
                    return a
                #     flg=1
                #     if flg:
                #         break
                        # if judging_num(p,q,r):
                        #     return a
                            #print(p,q,r,a)

def judging_num(p,q,r):#pとqとrを一通りに絞る
    return True if p>q and q>r else False

def is_good(p,q,r,a):
    if (p**2+q**2+r**2+a**2)**2==3*(p**4+q**4+r**4+a**4):
        return True
    else:
        return False

# b=is_good(7,5,3,8)
# print(b)
# print(good_triangle(200))
print(num_sequence(100))
# # def num_seq(n):
# good_triangle(8)
#pow(pow(p,2)+pow(q,2)+pow(r,2)+pow(a,2),2)=3*(pow(p,4)+pow(q,4)pow(r,4)pow(a,4))

次回の目標

前回の課題の処理時間を短縮する

余談:プレゼンのパワーポイントのアニメーションについて

 アニメーションは使っている側が面白いと思うだけで、実際に見ている側が面白いと思うか否かは別物だと言われて納得しました。
 見る側に配慮した資料を作ることの方が大切なことです。面白さは二の次です。

寄り道10(ラズパイ4)

今日の目標

問題を解く(良い三角形)

今日の結果

問題を解く(良い三角形)
→達成

問題を解く(良い三角形)

多重ループにて

 多重ループをbreak文で抜ける際、pythonではフラグを準備する必要があります。PHPみたいに、break 2 で多重ループから抜ける(処理の中断)ができないということです。
 今回はreturnで強制的に関数が終了するため、必要なくなりました。

num_sequence関数にて

 このnum_sequence関数で、引数1をとった時、Noneが返ってきました。
 リストlの中にNoneが返ってくる現象を解決するためにまたif文を使うことになりました。
 pythonはswitch文等を切り捨ててif文ですべてを解決させるものなので、if文にはとてもお世話になります。

トラップ

今回は入力待機が存在しないのと、時間の関係で没にしました。
計算時間19:51〜20:21(遅くても)

今回のソースコード

# def isascnum(s):
#     return True if s.isdecimal() and s.isascii() else False

#結果
# 'NoneType' object has no attribute 'isdecimal'
def num_sequence(num_term):#関数good_triangleの数列を作る term:項
    l=[]
    n=4
    while len(l)!=num_term:
        m=good_triangle(n)
        if m!=None:
            l.append(m)
        n+=1
    return max(l)
    # n=0
    # l=[]
    # l.append(good_triangle(20))
    # while n!=num_term:
        
    #     n+=1




def good_triangle(a):
    for p in range(1,a):
        # flg=0
        for q in range(1,a):
            # if flg:
            #     break
            for r in range(1,a):
                if is_good(p,q,r,a):
                    return a
                #     flg=1
                #     if flg:
                #         break
                        # if judging_num(p,q,r):
                        #     return a
                            #print(p,q,r,a)

def judging_num(p,q,r):#pとqとrを一通りに絞る
    return True if p>q and q>r else False

def is_good(p,q,r,a):
    if (p**2+q**2+r**2+a**2)**2==3*(p**4+q**4+r**4+a**4):
        return True
    else:
        return False

# b=is_good(7,5,3,8)
# print(b)
# print(good_triangle(200))
print(num_sequence(100))
# # def num_seq(n):
# good_triangle(8)
#pow(pow(p,2)+pow(q,2)+pow(r,2)+pow(a,2),2)=3*(pow(p,4)+pow(q,4)pow(r,4)pow(a,4))

次回の目標

Google Drive上のフォルダのショートカットを作る
Git Hubを触る

余談: 時間がないのでパスしました