IchigoJamでけいさんバトル
某SNSで、こんな投稿を見つけた。
富岳に勝てば富岳1日使い放題 pic.twitter.com/BCjk7odEvs
— t--s(てぃーす) (@tomooo_108) April 26, 2025
1時間に44京回以上計算できるスーパーコンピュータ「富岳」と、10秒間に行えるたしざんの回数で競う企画のようである。
しかし、普通の人間がズルやハプニングなしで「富岳」に勝つのは普通に考えて5000兆%不可能だろう。
そこで、まずは身近なコンピュータと対戦し、練習してみるのがいいかもしれない。
というわけで、IchigoJam でそれっぽいプログラムを実装してみた。
※IchigoJamはjig.jpの登録商標です。
今回のプログラムの仕様
起動すると、まずプレイヤーが10秒間の足し算に挑戦するパートが始まる。
3カウントのあと、ゲームが始まり、答えが1~10の整数になる足し算が表示される。
プレイヤーは、答えが1~9のときはそれぞれの値に対応するキーを、10のときは0のキーを押して答える。
正解なら次の問題に進み、不正解なら問題は変わらない。
10秒後、プレイヤーが答えるパートが終了する。
Enter キーを押すと、コンピュータが10秒間の足し算に挑戦するパートに移る。
さらに10秒後、コンピュータが答えるパートが終了する。
Enter キーを押すと、また最初 (プレイヤーが挑戦するパート) からできる。
プログラム
10 ' ケイサン バトル
20 CLS:?"VER()=";VER();:LOCATE6,4:?"アト ビョウ";:LOCATE15,14:?"+ = ?";:M=0:Y=8:I=110
30 LOCATE11-4*M,Y:IFM?"コンピュータ";:ELSE?"アナタ";
40 S=0:T=0:LOCATE14,Y:?DEC$(S,9);
50 FORJ=1TO3:LOCATE15,16:?4-J;:WAIT60:NEXT:LOCATE15,16:?" ";:P=-1:CLT
60 C=RND(10)+1:A=RND(C+1):B=C-A:LOCATE12,14:?DEC$(A,2);:LOCATE17,14:?DEC$(B,2);
70 L=10-TICK()/60:IFL<>PLOCATE9,4:?DEC$(L,2);:P=L:IFL<=0GOTO140
80 GOSUBI:IFK<>CGOTO70
90 S=S+1:IFS>9999S=S-10000:T=T+1:LOCATE14,Y:?DEC$(T,5);
100 LOCATE19,Y:?DEC$(S+10000*(T>0),4);:GOTO60
110 K=INKEY():IF48<=KANDK<58K=K-48+10*(K=48)ELSEK=-1
120 RETURN
130 K=A+B:RETURN
140 LOCATE12,14:?" ";:LOCATE17,14:?" ";:IFMGOTO190
150 LOCATE3,18:?"オツカレサマ デシタ!";:LOCATE3,19:?"ツギ ハ コンピュータ ガ チョウセン シマス";
160 LOCATE3,20:?"Enter キー ヲ オシテ クダサイ":M=1:Y=10:I=130
170 K=INKEY():IFK<>10ANDK<>13WAIT1:GOTO170
180 FORJ=18TO20:LOCATE3,J:?DEC$(0,26);:LOCATE28,J:?" ";:NEXT:GOTO30
190 LOCATE3,18:?"オワリ!";:LOCATE3,20:?"Enter キー デ リトライ"
200 K=INKEY():IFK<>10ANDK<>13WAIT1:GOTO200
210 GOTO20※ DEC$ を用いているため、IchigoJam BASIC 1.0.0 では動きません
このプログラムは、CC BY 4.0 でライセンスする。
OneFiveCrowd で実行する (高速、非公式) (推奨)
IchigoJam web で実行する (公式、低速)
実行結果例
MeganeJam (1.2.3)
コンピュータの記録は 247 回であった。
IchigoJam S (1.3.1)
コンピュータの記録は 370 回であった。
IcigoJam Q (1.4.3)
コンピュータの記録は 371 回であった。
IcigoJam R (1.5b rv)
コンピュータの記録は 2112 回であった。
IchigoJam P (1.6.0)
コンピュータの記録は 6365 回であった。
解説
ポイント
プレイヤーの挑戦とコンピュータの挑戦でプログラムを共通にし、スコアを表示する位置と入力を受け取るサブルーチンのみ変数を用いて切り替えることで、不公平さを減らすことを試みた。
とはいえ、人間のプレイヤーは画面から数字を読み取り、答えをキーで入力しなければいけないのに対し、コンピュータは内部の変数から直接数字を読み取ることができ、答えも内部の変数に直接書き込める、という不公平さはある。
各変数の役割
A:足される数 (問題)
B:足す数 (問題)
C:問題の答え
S:正解した問題数の十進数で下位4桁
T:正解した問題数の上位
M:モード (プレイヤーが答えるか、コンピュータが答えるか)
Y:スコアを表示する縦位置
I:入力を受け取るサブルーチンの行番号
J:ループ変数
L:残り秒数
P:今画面に表示している残り秒数
K:入力されたキーまたは答え
プログラムの各部分の役割
10~20行目:全体の初期化
10行目:FILES 対応のタイトル
20行目:画面の初期化・動きの無い部分の描画・プレイヤーの挑戦用の設定
30~100行目:挑戦の処理
30~50行目:挑戦開始時の描画・スコアおよび時間の初期化
60行目:問題の生成と描画
70行目:残り時間の描画と終了判定
80行目:入力を受け取るサブルーチンの呼び出しと正解判定
90~100行目:スコアの更新と描画
110~130行目:入力を受け取るサブルーチン
110~120行目:プレイヤーの入力を受け取るサブルーチン
130行目:コンピュータが計算を行うサブルーチン
140~210行目:挑戦終了時の処理
140行目:問題の消去・挑戦者の種類による分岐
150~160行目:プレイヤーの挑戦終了時のメッセージ表示・コンピュータの挑戦用の設定
170行目:Enterキーが押されるのを待機
180行目:メッセージの消去・挑戦に進む
190行目:コンピュータの挑戦終了時のメッセージ表示
200行目:Enterキーが押されるのを待機
210行目:最初に戻る (リトライ)
おわりに
IchigoJamは本当に1秒間に5000万回計算できるのか!? 高専生向けマシン語入門スライド
では、IchigoJam BASIC (バージョン不明) の計算速度を「足し算1000回 1.8秒」(10秒に換算すると5,556回)「VIDEO0で表示を消してもせいぜい1秒に1000回」(10秒に換算すると10,000回) としている。
今回のプログラムでは、足し算をする時間だけでなく、問題の生成やスコアの更新などの処理も含めて10秒での挑戦となっているので、足し算だけを行ったときに比べて回数は少なくなると考えられる。
ちなみに、同ページでは「富岳」の計算速度を1秒間に100京回としている。
これは、本記事の冒頭で紹介した投稿の「1秒間に44京回以上」という主張と矛盾しない。


コメント