見出し画像

RGB色コードかるた(仮称)できるかなっ

どうもどうも、久方ぶりにプログラミング絡みの記事です。
そして最初に言っときますが、現時点での結論は「分かりません」です。
俗に言う「ヤマなしオチなしイミなし」って感じの文章です。
や、でもイミだけはあると信じたいかな。

きっかけは先日七峰らいがさんに私の記事を話題にしていただいたこと。

七峰さんのこの記事を要約すると、

コンピューターで表示できる色って、R(赤)、G(緑)、B(青)それぞれ0~255の色諧調があるんだけど、すべての色の組み合わせを一度もダブらせることなくランダムで出力させたい

ってこと(で良いですかね?)。んですべての色パターンを出し尽くしたらプログラム終了(七峰さんのとこだと、カントの言葉「Es ist gut」(これでよし)って表示させてEndなのだそうです)。

七峰さんはこれを応用してRPGにおけるキャラクター番号の振り分けに用いたいようなのですが、とりあえずここでは問題を単純化して「RGB色コードかるた」(仮称)と名付け、要件定義したいと思います。

RGB色コードかるた(仮称)
<使用言語>
SmileBASIC
<要件定義>

① R(0~255)、G(0~255)、B(0~255)をそれぞれランダムにて生成し、任意の色コードを定義する。
② ①で生成された色コードで何かしら出力する(適当な文字列で良い)。
③ すべての色コードを使用するまで①と②を繰り返す。
④ すべての色コードを使用したらプログラムを終了する。
[条件]
一度使用した色コードは再度使用しないこと。(かるたの原則)

この[条件]すなわち「一度使用した色コードは再度使用しない」ってのがクセ者なんですね。というのも、いわゆる乱数を生成する関数(SmileBASICでは「RND関数」と言います)は、それを以前にも使用したかどうかなんて関知してませんので。ランダムに出すからランダム関数なんだよーんってな感じです。

私は以前、かるたの札を読み上げるプログラムをSmileBASIC(Pi-STARTER)で自作したのですが、このときは札が100枚だったのでそれぞれの札にあたる変数を100個作り、その変数の中身が「0」なら「読まれてない」/「1」なら「すでに読まれてる」ということにして、すべての札の変数が「1」になったらプログラムを終了するようにしたのです。

じゃあ同じ手を今回のRGB色コードかるたにも使ったらええやん、と最初は私も思いました。んで、今回のケースで札にあたるものはいくつあるの?というと…。

R(赤)256 ×  G(緑)256 × B(青)256 = 16,777,216 個

画像1

ぎゃーーーーーーー!!!!!
久々のマンガ台詞シリーズ、今回はまさかのカイジかよっ!!
(いや驚くとこそこじゃないだろ)

そんなにたくさんの変数用意できるの?ホントにっ!?

私がやったときはDIM文(配列変数)というのを使い、変数にナンバリングを持たせてCARD[1]~CARD[100]としたのですが、この手法だと9,999,999個(7桁)までしかできないんだって。

いや、つーか仮にそんだけの数の変数を定義できたとしてですよ?

それ色コード出力するたびに、その変数に値入れていく作業を16,581,375個プログラムで書くとか正気じゃないですよ。しかも色コードの数だけ変数があるわけだから、そこの部分はサブルーチンや繰り返し処理で圧縮することができません。

七峰さんも現時点では「乱数がダブってしまうのを止められず」と書かれているので、これについてはあきらめた模様。私もこれどうにかできるのではと思っていろいろ考えてみたのですが、結果どうもなりませんでした。

そんなこんなで、いやはやなんともGAME OVERでございます。

でもこれ、SmileBASIC以外の言語だったらどうにかなるのかな?
いや、そもそも「発生した乱数をすべて記録させとく」って方法論に無茶があって、もっとスマートな解決方法があったりしますか?

ということで、識者の知恵をお借りしたく、こうしてnoteにあげさせていただきました次第です。「これこれこうしたら出来るよん」という方がおられたらコメントいただければ幸いです。もしくは「んなもん出来るわけあるかボケ!!」というコメントでもOKポッキーでございます。

まぁでも、たまにはこういうことに頭使ってみるのも悪くないやね。
七峰らいが様、この度はいろいろとありがとうございました。
記事内容、こんなんで良いか一応確認してもらえたら幸いです。


<2021.5/9 追記>

上記リンクは七峰らいが様の本件の続編の記事にあたります。
当方のnoteその他(Pi STARTERフォーラムやtwitter)からの識者皆様によるアドバイスを参考に、状況を前進させた模様です。

当方のプログラミングレベルではすぐ理解が追い付かない内容もありますが、やはり何人か寄ると文殊の知恵ですね!
いろいろご助言いただいた皆様、心より感謝いたします。

この記事が気に入ったらサポートをしてみませんか?