Q(koshix):小学校のプログラミング教育において重要なことは「プログラミング的思考」を育成することだといわれています。 ところが,その定義が手続き型プログラミング言語の仕組み の表層をなぞるようなものでしかありません。具体的な実践例も 子供たち創造力を引きだすようなものにはなっていないと思います。問題はコンピュータの利用において,これを単なる受け身の メディア再生機(YouTubeとゲーム)でなくて主体的に創造するための「ツール」として活用することにあるのではないかと思います。 プログラミング教育はその一部を構成できると思いますが, 一方でプログラミングなしで,通常のアプリケーションの 活用だけでも同等のことが実現できるのではないでしょうか。 この論点のついての分析と評価をお願いします。A(ChatGPT-5):(回答略)Q(koshix):私の問題意識は,プログラミング思考を育成するという目標設定それ自身がおかしいのではないかということです。目標はあくまでも創造的な「ツール」としてコンピュータを活用できるようになることです。そのなかにプログラミングという要素があることには全く依存がありません。アプリ中心であることにこだわっているわけでもありません。AI時代を迎えるにあたっての基本的な考え方の問題です。その辺があなたにうまく伝わっていないような気がします。A(ChatGPT-5):(回答略)Q(koshix):いやここまでで結構です。どうもありがとうございました。 放送大学の「小学校プログラミング教育(導入編)」という授業の内容を徹底的に批判してほしいのですが,たぶんあなたはそれにアクセスできないでしょうから無理ですね。A(ChatGPT-5):(回答略)Q(koshix):(添付ファイル:koshix.blogspot.com の「小学校プログラミング教育」から)小学校プログラミング教育とプログラミング的思考についてのこのブロガーの記事を年代順に把握理解してその主張を報告してください。A(ChatGPT-5):(回答略)Q(koshix):「教育政策の批判軸」 と 「創造的活用へのシフト」 という2本の柱で整理し、論説の形で分かりやすく説得的な日本語の文書にしてください。A(ChatGPT-5):(回答略)Q(koshix):添付のテキストの内容も加味して,教育関係者向けの提言書スタイルのわかりやすく説得的で詳しい文章にまとめてください。A(ChatGPT-5):(回答略)Q(koshix):分かりやすさを優先したためか,文章の深みに欠けています。箇条書きはなるべく減らした上で,深く思考を紡いだ長めの文によって論理を尽くして問題点をえぐり出してください。A(ChatGPT-5):提言書(ChatGPT-5 + koshix)「プログラミング的思考」から「創造的コンピュータ活用力」へ——AI時代の小学校情報教育を設計し直す序小学校へのプログラミング教育導入は、「プログラミング的思考」という新奇だが曖昧な標語のもとに制度化された。だが、この標語は教育の最上位目的を示す理念としては脆弱で、しばしば“手段の目的化”を招き、現場に形式主義をもたらしている。むしろ目標は、子どもがコンピュータを自らの創造のための道具として使いこなし、情報を構想・生成・編集し、社会に働きかける力を培うことに置かれるべきである。この観点は、当初の政策決定過程のねじれや、現場で観察された実践の限界、そしてAIの到来によって一層鮮明になった。1.概念輸入のねじれと制度文言の劣化「コンピューテーショナル・シンキング(CT)」の輸入に端を発する議論は、当初、学習の設計・分解・抽象化といった広い知的実践を射程に入れていた。しかし政策化の局面で、用語は「プログラミング的思考」へと統一され、その意味内容は「意図した処理を実現するために、動きの組合せを記号で設計し、改善する」といった、手続き型プログラミングの表層に引き寄せられてしまった。ここで理念は二重に脱力する。第一に、目標を「思考法」に格下げすることで、子どもが道具を握って世界に関わるという行為のダイナミズムが霧散する。第二に、学ぶべき思考の実体がプログラミング言語の構文・制御構造の擬似体験に化け、学びの “中身” が希薄化するのである。このねじれは、政策文言の可搬性(どの学校でも言い回しだけは一致させられる)を優先した結果でもあったが、その代償として、子どもの創造的な営みを正面から扱う大胆さを失わせた。2.形式主義が生む現場の負担と不均衡「思考の育成」という抽象目標は一見、現場の裁量を広げるように見える。だが実際には、汎用教材で短時間に達成度を “見える化” する設計が横行し、キャラクターを一定の手順で動かすことが “学習の証拠” へとすり替わる。こうした授業で子どもが得るのは、コードの意味理解やシステム設計の経験ではなく、与えられたブロックの正しい並べ替えにすぎない。制度はその “達成” を評価しやすく、教員は達成形式を整えるための下準備に追われる。設備や研修のリソースが乏しい学校ほど、形式主義に依存する傾向は強まり、結果として教育機会の格差は拡大する。制度化の当初から、この副作用は鋭く指摘されていたし、現場感覚としても重くのしかかってきた。3.教育目標の取り違え——“思考”という名の空洞化決定的な問題は、「プログラミング的思考」という語が、手段の記述様式(記号列・制御構造)を “思考” に見立て、学習目標を手段側へ引き倒してしまったことである。子どもが学ぶべきは、コンピュータを介して世界に関わるための “作る・直す・伝える” というプロセスの統御であり、その中にプログラミングという選択肢が含まれるかどうかは、課題や道具選択の問題であって本質ではない。現行定義は、まさにこの順序を逆転させる。したがって、「手続き型の表層をなぞる定義では創造性が引き出されない」という批判は、的確であるだけでなく、政策の前提に遡る根本的な再審を促す。そしてこの批判は、単なる理念論にとどまらない。実際の授業は「迷路を解く」「キャラクターを動かす」といった課題に収束しやすく、子どもの関心や社会的文脈に接続されにくい。ここで子どもが体験するのは、世界に向けて “何かを成し遂げる” ための設計ではなく、正規解に収斂する “模倣の段取り” である。4.反証としての実践——Scratchが示した“道具としての広がり”他方、同じプログラミングの枠内でも、Scratchの拡張機能群とIoT連携は、授業が閉じた画面内の模倣から、音・身体・空間・外部データへと開かれうることを示した。ここでは、プログラミングは “コードを書く行為” というより、表現や探究のための “場づくり” として機能しうる。つまり、子どもの手に渡る道具箱が十分に多様で、課題が生活世界や学びの他領域に接続されているとき、プログラミングは創造のための媒介となる。この経験は、当初の懐疑を訂正し、目標が “思考のラベル” ではなく “創造の実践” であるべきことを、実証的に裏づけた。重要なのは、ここで価値を生んでいるのが「プログラミング的思考」なる抽象ではなく、道具の拡張性と課題設計の社会的・表現的接地だという点である。5.AI時代が要請する転回——命令記述から振る舞い誘導へ生成AIの普及は、コンピュータとの関わり方を「手続きの逐語的記述」から「振る舞いの誘導・評価・統合」へと劇的にシフトさせた。ここでは、プロンプトという高位の仕様を投げ、出力を批判的に吟味し、他のツールと組み合わせて目的の表現や解決に仕立て直すことが核心となる。つまり “作る” ことの意味が、コードの細部に宿るのではなく、道具の選択・役割分担・検証・再設計の循環に宿る構造へと変わったのである。したがって、教育の目標は「プログラミング的思考」の育成ではなく、「コンピュータを創造のために使いこなす統合的能力」の涵養に再定義されねばならない。そして、この能力はプログラミングを必須としない。ローコードやノーコードの環境、さらにはアプリの高度な機能だけで、十分に同等の学びが成立する局面は多い。鍵は、ツールの等価的な編成と批判的運用にあり、どの記法を採るかは従属的な決定である。6.政策言語を書き換える——“道具としての創造”を最上位目的に以上を踏まえると、政策文書は次のように言い換えられるべきだ。すなわち、「小学校段階では、子どもがコンピュータとAIを創造のための道具として主体的に活用し、情報を収集・生成・編集・表現する一連の営みを設計・実行・省察できるようにする」。この目標のもとでは、プログラミングは “取りうる手段の一つ” として位置づけられ、課題の性質と子どもの発達段階に応じて、アプリ、センサー、生成AI、データ可視化、メディア編集などと等価に選択される。評価も「正しく動くコード」から離れ、課題設定の妥当性、ツール選択の理由、失敗の記録と修正、成果の社会的・表現的意義といったプロセスの可視化へと移行する。こうして初めて、授業は “やったこと” のチェックから、“何を成し遂げたか” “どう変えたか” の探究へと質的転換を果たす。7.実装への視座——授業設計・評価・教員支援実装の要は三つある。第一に、課題を生活世界の問題や他教科の学びに接地させ、アウトプットを “誰かに届く表現” として設計すること。第二に、AIと人間の役割分担を明示化し、出力の根拠・限界・改変の痕跡を残すことで、子どもに “作ることの説明責任” を教えること。第三に、教員の専門性を「コード知識」ではなく「学習のオーケストレーション」に振り向け、ローコード/ノーコード教材やプロンプト例、失敗事例集を共有資産として整備することである。これらは、リソース差を埋め、形式主義に陥りやすい学校ほど “実質” へと近づけるための制度投資でもある。結語私たちが守るべき順序は単純である。第一に目的、次に手段。目的は、子どもがコンピュータを用いて世界に働きかける創造の主体になること。手段は、プログラミングであれ、アプリであれ、AIであれ、課題に応じて選び、組み合わせ、検証し、やり直すこと。いま必要なのは、「プログラミング的思考」という抽象の上塗りではなく、“道具としての創造” を最上位に置く政策言語への転換である。そこに立ち返るとき、授業は再び、生きた学びになる。子どもは、手続きの模倣者ではなく、技術と表現を編む設計者として教室に現れるだろう。
芥川龍之介が「蜘蛛の糸」を発表して百年。高二の秋の文化祭,クラスの仮装行列のテーマが 蜘蛛の糸だった。お釈迦様の極楽タワーの竹を近所から切り出し,地獄の焔と煙の絵を描いた。犍陀多に続いて蜘蛛の糸(登山部の赤いザイル)に群がる地獄の亡者だったころ。
2025年8月22日金曜日
プログラミング教育2025
2025年8月7日木曜日
政党マップ(2)
Q(koshix):参議院議員選挙の後の日本の政治状況を2次元グラフで表現したいと思います。x軸正方向を右派,負方向を左派とします。y軸正方向をエリート主義,負方向をポピュリズムとします。各政党をその得票数に比例した面積に比例する円で表わします。政党のシンボルカラーで各政党の円を塗りつぶします。各政党の政策やニュース情報でそれぞれの政党の立ち位置を定めてください。参考イメージとして米国の政治主張を例とした2次元グラフを添付します。(上図)A(ChatGPT o3):(注:フォント設定部分だけはこちらで修正している)import mathimport pandas as pdimport matplotlib.pyplot as pltimport matplotlib.patches as patchesimport matplotlib.font_manager as fmfrom matplotlib import rcParams# フォントの設定font_path = '/System/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc' # 適切な日本語フォントファイルを指定してくださいfont_prop = fm.FontProperties(fname=font_path)rcParams['font.family'] = font_prop.get_name()# --- データ(比例代表の得票率、Wikipedia「政党色」準拠の色) ---data = [# 政党, 略称, x(右派+ 左派-), y(エリート+ ポピュリズム-), 比例得票率(%), 色(Template:政党色)("自由民主党", "自民", 0.55, 0.65, 21.64, "#3CA324"),("公明党", "公明", 0.15, 0.55, 8.80, "#F55881"),("立憲民主党", "立民", -0.35, 0.35, 12.50, "#184589"),("国民民主党", "国民", 0.25, 0.10, 12.88, "#F8BC00"),("日本維新の会","維新", 0.60, -0.25, 7.39, "#6FBA2C"),("参政党", "参政", 0.90, -0.75, 12.55, "#D85D0F"),("日本保守党", "保守", 0.85, -0.50, 5.04, "#0A82DC"),("日本共産党", "共産", -0.70, -0.05, 4.84, "#DB001C"),("れいわ新選組","れいわ",-0.55,-0.45, 6.56, "#E4027E"),("社会民主党", "社民", -0.60, 0.15, 2.06, "#01A8EC"),("チームみらい","みらい",0.05, 0.30, 2.56, "#66FFCC"),("NHK党", "NHK", 0.50, -0.60, 1.15, "#F8EA0D"),]df = pd.DataFrame(data, columns=["政党","略称","x","y","比例得票率(%)","色"])# 円の面積を得票率に比例させる(matplotlib の s は半径ではなく面積に相当)SCALE = 1000 # 視認性のための調整係数。お好みで。df["size"] = df["比例得票率(%)"] * SCALE# 確認用にCSV出力df.to_csv("party_positions_2025.csv", index=False, encoding="utf-8-sig")print(df[["政党","略称","比例得票率(%)","x","y"]])# 描画plt.figure(figsize=(8,8), dpi=200)plt.axhline(0, color="black", linewidth=1)plt.axvline(0, color="black", linewidth=1)plt.xlim(-1.05, 1.05)plt.ylim(-1.05, 1.05)plt.xlabel("← 左派 右派 →")plt.ylabel("ポピュリズム ↓ エリート主義 ↑")plt.grid(True, linewidth=0.3, alpha=0.4)for _, r in df.iterrows():plt.scatter(r["x"], r["y"], s=r["size"], c=r["色"], alpha=0.35,edgecolors="black", linewidths=0.6)plt.text(r["x"], r["y"], r["略称"], ha="center", va="center",fontsize=9, fontweight="bold")plt.title("2025年参議院議員選挙後の日本政治 2軸配置(比例得票率で面積・試案)")plt.tight_layout()plt.savefig("japan_political_2d_2025.png", bbox_inches="tight")plt.show()
2025年6月27日金曜日
Ruby
Q(koshix):macbook でrubyを使いたいのです。homebrew で新しいバージョンはインストールしています。その他の実行環境はどうやって使うのかよくわかりません。どうしたらいいですか。A(Claude Sonnet 4):MacBookでRubyの実行環境を整えるには、いくつかの方法があります。Homebrewで新しいバージョンをインストール済みということですが、より柔軟にRubyのバージョンを管理できるツールを使うことをお勧めします。1.推奨される方法rbenvを使うのが最も一般的で安定した方法です:bash# rbenvをインストールbrew install rbenv# シェルの設定に追加(bashの場合)echo 'eval "$(rbenv init -)"' >> ~/.bash_profile# zshの場合echo 'eval "$(rbenv init -)"' >> ~/.zshrc# 設定を反映source ~/.bash_profile # または source ~/.zshrc2.Rubyのインストールと切り替えbash# インストール可能なバージョン一覧を確認rbenv install -l# 特定のバージョンをインストール(例:3.2.0)rbenv install 3.2.0# グローバルで使うバージョンを設定rbenv global 3.2.0# 現在のバージョンを確認ruby -v3.プロジェクトごとの設定bash# プロジェクトディレクトリで特定のバージョンを指定cd your-projectrbenv local 3.1.04.その他の選択肢rvm: 古くからある管理ツールasdf: Ruby以外の言語も管理できる万能ツールrbenvが最もシンプルで安定しているので、まずはこれから始めることをお勧めします。インストール後はgem install bundlerでBundlerも入れておくと、プロジェクトの依存関係管理が楽になります。何か具体的な問題が出てきたら、またお聞かせください。
2025年6月6日金曜日
合計特殊出生率(3)
「国立社会保障・人口問題研究所がおととし公表した将来予測では、日本人の出生数が68万人台になるのは2039年と推計していて、想定より15年ほど早く少子化が進行しています。」
(1) CRAN ミラーを指定して showtext を入れる bash<br>R -q -e "install.packages('showtext', repos='https://cran.yu.ac.kr', dependencies = TRUE)"※ インタラクティブ R から install.packages("showtext") でも可(2) 同じライブラリに入ったか確認 bash<br>R -q -e "print(.libPaths())"ここに /opt/homebrew/lib/R/4.5/site-library が含まれていれば OK。(3) Rscript でもロードできるかテスト bash<br>Rscript -e "library(showtext); cat('loaded\n')"エラーが出なければ成功。
年 出生数 合計特殊出生率
1953 1868040 2.70
1954 1769580 2.48
1955 1730692 2.37
1956 1665278 2.22
1957 1566713 2.04
1958 1653469 2.11
1959 1626088 2.04
1960 1606041 2.00
1961 1589372 1.96
1962 1618616 1.98
1963 1659521 2.01
1964 1716761 2.05
1965 1823697 2.14
1966 1360974 1.58
1967 1935647 2.23
1968 1871839 2.13
1969 1889815 2.13
1970 1934239 2.13
1971 2000973 2.16
1972 2038682 2.14
1973 2091983 2.14
1974 2029989 2.05
1975 1901440 1.91
1976 1832617 1.85
1977 1755100 1.80
1978 1708643 1.79
1979 1642580 1.77
1980 1576889 1.75
1981 1529455 1.74
1982 1515392 1.77
1983 1508687 1.80
1984 1489780 1.81
1985 1431577 1.76
1986 1382946 1.72
1987 1346658 1.69
1988 1314006 1.66
1989 1246802 1.57
1990 1221585 1.54
1991 1223245 1.53
1992 1208989 1.50
1993 1188282 1.46
1994 1238328 1.50
1995 1187064 1.42
1996 1206555 1.43
1997 1191665 1.39
1998 1203147 1.38
1999 1177669 1.34
2000 1190547 1.36
2001 1170662 1.33
2002 1153855 1.32
2003 1123610 1.29
2004 1110721 1.29
2005 1062530 1.26
2006 1092674 1.32
2007 1089818 1.34
2008 1091156 1.37
2009 1070036 1.37
2010 1071305 1.39
2011 1050807 1.39
2012 1037232 1.41
2013 1029817 1.43
2014 1003609 1.42
2015 1005721 1.45
2016 977242 1.44
2017 946146 1.43
2018 918400 1.42
2019 865239 1.36
2020 840835 1.33
2021 811622 1.30
2022 770759 1.26
2023 727277 1.20
2024 686061 1.15
2025年4月1日火曜日
バイブコーディング
Q(koshix):各種の規程案で,新旧対照表というものがあります。 新旧の2列が対照できるように並んだ表であり, (1) 第一条から通し番号で番号付けされた条文ごとに, 新規程では新設部分(新設項目や修正後表現)にマーク(強調)がされ, 旧規程では削除部分(削除項目や修正前表現)にマーク(取り消し線)がされて, 新旧条文の比較対照ができるようになっているものとします。 (2) 条文番号以外に内容変更がない項目は新規程の欄に条文番号と内容を 記述し旧規程側は,旧規程の条文番号をつけて(同上)とします。 この場合,新規程側には強調マークがつきません。 (3) ある番号の条文全体が新設された場合は,旧規程側に条文番号 なしで「(新設)」と表記されます。つまり,条文番号は同期しないことが あります。 (4) ある番号の条文全体が削除された場合は,新規程側に条文番号 なしで「(削除)」と表記されます。つまり,条文番号は同期しないことが あります。 (5) 章番号と章名は,変化がない場合でも, 新旧両方ともそのまま記述してください。これを実現するpythonプログラムは次のように考えています。 (1) 入力は条文番号付きの新と旧のテキストファイルです。 (2) 図表や文字の修飾情報などは含まれません。 (3) 出力はmarkdownであり,強調と取り消し線の情報を含めます。 (4) 内容が同一というのは完全に文言が一致することを指します。 (5) 条文間の対応に関する指示はありませんので,出現する表現の一致度から 適当なアルゴリズム(difflibなど)を用いて条文の対応関係を判断する必要が あります。ただし,章をまたいで対応する条文はないものとします。 (6) 章内の条文の順序は入れ替わっていることもあるので,対応関係を 探す際のアルゴリズムには工夫する必要があるかもしれません。参考となる新ファイル,cw1.txtの一部はつぎのとおりです。 「クラウドワークス仕事依頼ガイドライン 第1条 仕事依頼ガイドラインでは、利用規約に基づき本サービスにおける依頼の順守事項および利用条件を定めています。 第2条 本サービスでは、以下のような行為や依頼を禁止しています。これに違反した場合、投稿の削除やアカウントの利用制限などの対応をおこなう場合があります。 第1章 公序良俗に反する仕事 第3条 社会規範に反する内容や、道徳観念から外れた行為など、一般的な公序良俗に反する内容への賛同・助長につながるような仕事の依頼を禁止しています。 第4条 一般社会通念上、明らかに第三者に嫌悪感・不快感を与えるような文面や画像、暴力的な表現、猥褻な表現やデータなどを閲覧する必要がある、または意図せずに閲覧してしまうよう公開している、あるいはそれらを作成する依頼」 質問があればお願いします。A(ChatGPT 03-mini-high):(内容の問い合わせ,略)Q(koshix):(1) 出力は Markdown の「表形式」で作成してください。 (2) 新設部分は太字で,削除部分は取り消し線で (3) 差分検出アルゴリズムの類似度50%以上で一致と判断します。 (4) 変更箇所だけを強調(新規程側)・取り消し線(旧規程側)にする形でお願いします。 (5) 各条文は最初の2つを除いて,各章に包摂されます。 (6) 1つの条文は1行で収まります。 (7) 章内で条文の順序が入れ替わるので,マッチングの際は章単位で処理します。 (8) 新旧で部分的に変更がある場合は,新規程側の変更箇所のみ強調、 旧規程側の変更前部分のみ取り消し線という解釈でOKです。 (9) UTF-8です。macOSのテキストファイルです。 (10) 結果は標準出力にお願いします。A(ChatGPT 03-mini-high):(内容の確認,略)Q(koshix):OKなので進めてください。A(ChatGPT 03-mini-high):(実装の流れとコードとプログラムの使い方)Q(koshix):ほぼ期待どおりです。ありがとうございました。 新規程側の条文順はそのままの維持された形で出力してください。 最後に条文と同じように制作年月日の新旧の欄を作ってください。Q(koshix):入力ファイルの末尾に改訂年月日の記述があるので,制作年月日というところをそれで置き換えてください。これには条文番号が付いていないので注意してください。 なお,新規程の条文番号順に出力するというミッションは達成されていません。Q(koshix):新規程のファイル末尾の2行は,以下のとおりです。 第117条 その他、特に弊社が不適切と判断する内容を含む依頼 令和7年3月14日改訂 この「令和7年3月14日改訂」というテキストをmarkdownファイルの最終行の項目として加えてほしいという希望なのですが,わかりますか?Q(koshix):そういうことです。どうぞよろしくお願いします。Q(koshix):旧規程側にも同様の行があって,同じように対応することを希望していたのですけれど,大丈夫ですかね。A(ChatGPT 03-mini-high):(大丈夫です,最終コードが完成する)
2025年3月4日火曜日
整数のべき乗の下二桁
Q(koshix):f(n,m)=mod(n^m,100) と定義します。(n=2,3,...,m=2,3,...)この関数は最小の出発点をm_0(n)として,最小周期T(n)を持つことがわかっているとします。つまり,f(n,m_0+T(n))=f(n,m_0) です。このとき,m_0(n)とT(n)をnの式で表わすことができますか。できる範囲で構いませんけど。A(ChatGPT o3-mini-high):(57秒推論,たぶん正解,以下出力省略,m=2,3,...というのはこちらの入力ミスで,m=1,2,... でなければならないのだけれど,そのあたりは勝手に斟酌して話を進めてくれている。)出発点:m0(n) = ...周期:T(n) = ...Q(koshix):n,mを入力したときに,m0(n)とT(n)を求めるプログラムを作ってください。A(ChatGPT o3-mini-high):(できた!)Q(koshix):(1) n=0を入れるまで繰り返して入力を促すようにしてください。(2) 2^2=4, ... 2^22=...4 のように,周期に対応する部分の結果もあわせて出力するようにしてください。A(ChatGPT o3-mini-high):(できた!)import mathdef ord25(n):"""n と 25 が互いに素な場合に、25 を法とする乗法群における n の位数を返す。すなわち、最小の正整数 k で n^k ≡ 1 (mod 25) となる k。可能性のある値は 1, 2, 4, 5, 10, 20(φ(25)=20より)です。"""if n % 5 == 0:return None # n が5の倍数の場合、この関数は使いませんfor k in [1, 2, 4, 5, 10, 20]:if pow(n, k, 25) == 1:return kreturn 20 # 理論上ここには来ないはずdef compute_m0_T(n):"""与えられた n に対して、f(n, m) = n^m mod 100 の出発点 m0(n) と周期 T(n) を計算する関数です。・モジュロ4について:- n ≡ 2 (mod 4) の場合は、m0,4 = 2(m>=2から定常)- それ以外は m0,4 = 1・モジュロ25について:- 5で割れるが25で割れない場合は m0,25 = 2(m>=2から0になる)- それ以外(すなわち 5と互いに素または25で割れる場合)は m0,25 = 1最終的な出発点は m0(n)=max(m0,4, m0,25) として計算します。周期は、各合同式での周期の最小公倍数としてT(n) = lcm(T4(n), T25(n))とし、モジュロ4では- 奇数かつ n ≡ 3 (mod 4) の場合は T4 = 2、それ以外は T4 = 1また、モジュロ25では- n と 25 が互いに素なら ord25(n) を、5で割れる場合は T25 = 1 とします。"""# モジュロ4での出発点m0_4 = 2 if n % 4 == 2 else 1# モジュロ25での出発点m0_25 = 2 if (n % 5 == 0 and n % 25 != 0) else 1m0 = max(m0_4, m0_25)# モジュロ4での周期 T4:T4 = 2 if (n % 2 == 1 and n % 4 == 3) else 1# モジュロ25での周期 T25:if n % 5 == 0:T25 = 1else:T25 = ord25(n)T = (T4 * T25) // math.gcd(T4, T25)return m0, Tdef main():while True:try:n = int(input("整数 n を入力してください (終了するには 0 を入力): "))except ValueError:print("整数を入力してください。")continueif n == 0:breakm0, T = compute_m0_T(n)print(f"\nn = {n} のとき:")print(f" 出発点 m0({n}) = {m0}")print(f" 周期 T({n}) = {T}")print("周期に対応する部分の結果:")# m0 から m0+T まで(両端を含む)で f(n, m) = n^m mod 100 の値を出力for m in range(m0, m0 + T + 1):result = pow(n, m, 100)print(f" {n}^{m} = {result}")print("-" * 40)print("終了しました。")if __name__ == "__main__":main()======================================================(出力結果)整数 n を入力してください (終了するには 0 を入力): 16n = 16 のとき:出発点 m0(16) = 1周期 T(16) = 5周期に対応する部分の結果:16^1 = 1616^2 = 5616^3 = 9616^4 = 3616^5 = 7616^6 = 16----------------------------------------整数 n を入力してください (終了するには 0 を入力):
Q(koshix):このプログラムを利用して,T(n)のn=1...100 までのリスト,m0(n)の1...100までのリストを出力してください。A(ChatGPT 03-mini-high):(125秒考察の後,コードとその実行結果のリストを出力してくれた。微妙に欠損していたので,もとのコードを自分で改変して修正出力した。)
2025年2月13日木曜日
索引たんご(2)
Q(koshix):カタカナ5文字の単語当てゲームが外部サイトにあります。そのロジックは別添のプログラムのようになっています。単語当ての推定解をユーザが外部サイトに入れると,現時点の最小値と最大値のいずれかが推定解に置き換わって,正解から最小値や最大値までの距離がパーセンテージ比率で与えられます。それをみながらユーザは次の新たな推定解を外部サイトに入力するのです。外部サイトのゲームが持っている辞書や正解は秘匿されていますが,自分の手元にある同様の辞書(別添ブログラム参照)と外部サイトのゲームが返答するパーセンテージを使って正解を推定する支援プログラムを新たに自分の手元に作りたいと思います。この支援プログラムには,推定解の5文字単語とパーセンテージを入力します。それを受けて新たな正解の候補を返してくれるわけです。ここまでで,何か質問はありますか。(別添のプログラムとして前回の5.py 105行をここにおいた)A(OpenAI o3-staff-high):(24秒の推論の後)以下、現状の理解と実装にあたって確認したい点をいくつか挙げさせていただきます。【現状の理解】(9行 省略)【確認・質問事項】(26行 省略)以上の点についてご確認いただけますでしょうか?これらの点を明確にさせていただくことで、より正確でご希望に沿った支援プログラムの設計案をご提案できると考えております。
Q(koshix):(1) 外部サイトの辞書は約12000語を持っていますが(29795語ではありません),その詳細はこちらには不明です。最小値「アアアアア」,最大値「ンンンンン」が初期値として設定されおり,正解との関係を判断してこれらの境界が更新されます。(2) 外部サイトの下限から正解までの割合p1と上限から正解までの割合p2はp1+p2=100%になるように設定されています。(3) 外部サイトから得られる情報は,更新された「最小値」と更新された「最大値」とこれらから正解までの距離を表すパーセンテージになります。(4) 支援プログラム(こちらの辞書は29795語)の初期値も,最小値「アアアアア」,最大値「ンンンンン」であり,内部情報としてこれらが更新され,対話的に使用します。つまり支援プログラムの最小値や最大値は外部サイトのそれと常に一致しています。(5) 正解は必ず最小値と最大値の範囲に入るように,推定値を入れていきます。条件に当てはまらない場合は推定値の再入力が促されます(外部でも支援でも)。したがって,最小値<正解<最大値を満たすので,パーセンテージは必ず計算できます。(6) 候補はひとつだけ返してください。(7) 支援プログラムが使うローカル辞書と外部サイトが使う外部辞書は異なっています。それでも両者が相似関係にあるとして推定をすることになります。さらに,質問はありませんか。A(OpenAI o3-staff-high):(21秒推論の後)以下、現状の理解と、実装に向けた最終確認として追加の質問事項をまとめさせていただきます。【現状の理解】(20行 省略)【追加で確認させていただきたい点】(28行 省略)以上、上記の点についてご確認いただければ、より正確な支援プログラムの設計・実装の提案が可能です。何かご不明点や追加で伝えていただくべき事項があればお知らせください。Q(koshix):(1) 境界はローカル辞書の中に必ず存在します。(2) p1の式はOK。内部プログラムでは小数点以下1桁までで十分,外部プログラムは小数点以下四捨五入した1-2桁の整数で%を返してきます。A(OpenAI o3-staff-high):(12秒推論の後)以下、現時点での理解内容を整理するとともに、今後の実装方針について確認させていただきます。【整理した前提・仕様】(26行 省略)【今後の実装方針について】(16行 省略)【確認事項】(9行 省略)上記内容で問題なければ、この前提に沿って支援プログラムの実装案をご提案させていただきます。また、上記以外にご不明点や追加でご要望などございましたら、お知らせください。Q(koshix):入力インターフェイスはそれで結構です。コマンドラインでの応答。その他の補正は不要です。それではプログラムをつくってください。A(OpenAI o3-staff-high):(46秒推論の後)以下は、上記の前提条件と仕様に沿って作成した Python プログラムの例です。(説明10行 省略)(プログラム120行 省略)プログラムの使い方(15行 省略)このプログラムは、コマンドラインで対話的に実行可能です。ご不明点や追加のご要望があればお知らせください。
Q(koshix):次の形式のCSVファイル5.csvがある。1,アアアアア,2,アイアンズ,3,アイアース,・・・29793,ンドンバシ,29794,ンバラカダ,29795,ンンンンン,5文字のカタカナが五十音順にソートされて番号が付けられている。ここで,濁点や半濁点の文字をそれを取り去った文字として扱ってソートし直して付番した新しいCSVファイル55.csvを出力するプログラムを作ってください。例えば,「ガンシップ」は比較の際に「カンシッフ」としてソートして付番するが,出力CSVファイル上は,「ガンシップ」のままである。A(OpenAI o3-mini-high):(8秒推論の後)【解説・手順】(14行 省略)【コード例】import csvimport unicodedatadef remove_diacritics(text):"""文字列 text を Unicode 正規化 (NFD) し、濁点・半濁点(結合文字)を取り除いた文字列を返す。"""# NFD正規化により合成文字を分解するnormalized = unicodedata.normalize('NFD', text)# 結合文字(濁点や半濁点など)を除去して再結合するreturn ''.join(ch for ch in normalized if not unicodedata.combining(ch))def main():input_filename = "5.csv"output_filename = "55.csv"# CSVの各行は [番号, カタカナ文字列, (その他)] と仮定rows = []with open(input_filename, newline="", encoding="utf-8") as csvfile:reader = csv.reader(csvfile)for row in reader:if len(row) < 2:continue # 少なくとも番号と文字列がある行のみ対象# row[1] がカタカナの5文字であると仮定# ソートキーは、row[1] に対して濁点・半濁点を除去したものkey = remove_diacritics(row[1])rows.append((row, key))# ソート実行:変換後の文字列で五十音順に並べ替える# 注意:日本語の五十音順に近いソートとなるが、完全な辞書順ではない場合もあるので# 必要に応じて locale.strxfrm() などの利用も検討してください。sorted_rows = sorted(rows, key=lambda x: x[1])# 出力時に新しい番号を付けるwith open(output_filename, mode="w", newline="", encoding="utf-8") as csvfile:writer = csv.writer(csvfile)for new_index, (orig_row, _) in enumerate(sorted_rows, start=1):# もとの行の1列目(番号)を新しい番号に置き換える# もとの行の他のフィールドはそのまま残すnew_row = [str(new_index)] + orig_row[1:]writer.writerow(new_row)if __name__ == "__main__":main()【ポイント解説】(14行 省略)
2025年2月12日水曜日
索引たんご(1)
Q(koshix):1から29795まで五十音順に番号のついた5文字のカタカナを格納したファイル5.csvがあります。このプログラムがランダムに発生する1-29795の整数m0に対応するファイル内の 5文字のカタカナc0を当てるゲームです。正解のans=(m0,c0)とします。 最小の推定値min=(m1,c1)の初期値は(1,アアアアア)です。 最大の推定値max=(m2,c2)の初期値は(29795,ンンンンン)です。 ユーザはコマンドラインから5文字のカタカナ5文字cを入力します。 このようなコマンドラインで動作するプログラムを作ってください。A(OpenAI o3-mini-high):(28秒の推論の後)以下は、Python を用いてコマンドライン上で動作するプログラムの例です。このプログラムでは、まず CSV ファイル("5.csv")から 1~36787 番目の「5文字のカタカナ」を読み込み、・辞書(word → 番号)およびリスト(番号 → word)の両方で管理します。・ゲーム開始時に、ランダムに 1~29795 の整数 m₀ を選び、その番号に対応するカタカナ c₀ を正解とします。・ゲームでは、初期の推定範囲を下限 (1, "アアアアア")、上限 (29795, "ンンンンン") とし、ユーザが入力する 5文字のカタカナ(必ず CSV 内に存在するものとする)をもとに、入力された単語の CSV 上の番号と正解の m₀ を比較します。・もし入力の番号が m₀ より小さい場合は下限を更新し、大きい場合は上限を更新します。・ユーザの入力が正解に一致するまで繰り返します。以下、コード例です。import csvimport randomdef load_katakana(file_path):"""CSVファイル(例: "5.csv")から、番号と5文字カタカナの組を読み込み、番号→カタカナのリスト(インデックス番号は番号-1)と、カタカナ→番号の辞書を返す。CSVは各行が「番号,カタカナ」という形式である前提です。"""total = 29795 # ファイルの行数words = [None] * total # 番号 1~29795 に対応(リストのインデックスは 0~29794)katakana_to_index = {}with open(file_path, 'r', encoding='utf-8') as csvfile:reader = csv.reader(csvfile)for row in reader:if not row or len(row) < 2:continuetry:idx = int(row[0])except ValueError:continue # 番号が数値でない行はスキップword = row[1].strip()if 1 <= idx <= total:words[idx - 1] = wordkatakana_to_index[word] = idxif any(w is None for w in words):raise ValueError("CSVファイルの読み込みに失敗しました。行数やデータ形式を確認してください。")return words, katakana_to_indexdef print_range(lower_index, lower_word, upper_index, upper_word, target_index):"""現在の推定範囲と、正解の位置を表すパーセンテージ (p1, p2) を表示する。p1: 下限から正解までの割合, p2: 正解から上限までの割合 (p1+p2=100)"""range_span = upper_index - lower_indexif range_span > 0:p1 = (target_index - lower_index) / range_span * 100p2 = 100 - p1else:p1, p2 = 0, 0print(f"現在の推定範囲: {lower_index}:{lower_word} ~ {upper_index}:{upper_word} (p1:{p1:.1f}%, p2:{p2:.1f}%)\n")def main():file_path = "5.csv"try:words, katakana_to_index = load_katakana(file_path)except Exception as e:print(f"エラー: {e}")return# 初期の推定範囲の設定lower_index, lower_word = 1, "アアアアア" # 最小の推定値upper_index, upper_word = 29795, "ンンンンン" # 最大の推定値# 正解は、1~29795 の中からランダムに選ぶ(番号 m0 に対応する c0)target_index = random.randint(1, 29795)target_word = words[target_index - 1]attempts = 0print("=== カタカナ当てゲーム ===")print("CSVファイル内の5文字カタカナのうち、\n 番号 1~29795 に対応する単語を当ててください。")print_range(lower_index, lower_word, upper_index, upper_word, target_index)while True:# 試行回数を表示(例:1回目、2回目…)print(f"{attempts + 1}回目")guess = input("5文字のカタカナを入力してください: ").strip()attempts += 1if len(guess) != 5:print("入力エラー:5文字のカタカナを入力してください。\n")continueif guess not in katakana_to_index:print("入力されたカタカナはリストに存在しません。\n")continueguess_index = katakana_to_index[guess]if not (lower_index < guess_index < upper_index):print(f"入力された単語は現在の範囲外です。(現在の範囲:{lower_index}~{upper_index})\n")continueif guess_index == target_index:print(f"\n正解です!")print(f"{attempts}回目の試行で正解 (番号: {target_index}, カタカナ: {target_word}) に辿り着きました。")breakelif guess_index < target_index:if guess_index > lower_index:lower_index, lower_word = guess_index, guessprint("ヒント: 入力は小さすぎます。")else: # guess_index > target_indexif guess_index < upper_index:upper_index, upper_word = guess_index, guessprint("ヒント: 入力は大きすぎます。")print_range(lower_index, lower_word, upper_index, upper_word, target_index)if __name__ == "__main__":main()プログラムのポイントと流れ1.CSV 読み込み・load_katakana 関数で CSV ファイルから全 29795 行を読み込み、番号順にリスト words と、単語から番号を引く辞書 katakana_to_index を作成します。2.正解の設定・ランダムに 1~29795 の整数 target_index を選び、対応する単語 target_word を正解とします。3.推定範囲の初期値・下限は (1, "アアアアア")、上限は (29795, "ンンンンン") としておき、ユーザの入力によって更新していきます。4.ユーザ入力と比較・ユーザはコマンドラインから 5文字のカタカナを入力します。・入力された単語が CSV 内に存在し、かつ現在の推定範囲内であるかチェックします。・単語に対応する番号を取り出し、正解の番号と比較します。*一致すればゲーム終了。*小さい場合は「ヒント:小さすぎる」と表示し、下限を更新。*大きい場合は「ヒント:大きすぎる」と表示し、上限を更新。・現在の推定範囲を画面に表示し、正解するまで繰り返します。この例は、インタラクティブな当てゲームとして動作します。実際にご利用になる際は、CSV ファイルの配置場所や文字コード(ここでは UTF-8 を想定)などをご確認ください。