カラーコードのパターンを一行rubyでproduct

場合の数・確率

html_color

カラーバーを表示するHTMLを作成してみました。

準備するもの
  • Linux PC(確認環境はDebian 8.3 Jessie)
  • 端末ウィンドウ(ターミナルソフト)
  • Coreutilsパッケージ
  • Ruby(確認環境はv2.1.5)
~$ seq 1 777777 16000000 |
> perl -ne 'printf"<hr size=20 color=#%06x>",$_' > /tmp/a.html

HTMLのhrタグを使うとバーが作成できます。バーのサイズを20にしてカラーコードをseqコマンドでジェネレートすることで、上記のようなカラーバー一覧となるわけです。
カラーコードは0x000000〜0xFFFFFFで指定、10進数にすると0〜16777215ということで、seqの最大値は大雑把に16000000を指定しています。 777777という数字は適当です。ラッキーになるように。

各BYTEの16進と色の割り当ては以下のとおりです。
color_code
00は色なし、FFに近いほど色が濃くなります。

さて、冒頭のカラーバーではseqのスキップ数指定によって適当にカラーコードを生成しましたが、次はパターンを決めて3原色の重複組み合わせを求めてカラーコードを生成してみます。
rubyのproductメソッドを使います。productの引数に重複組み合わせを求めたいリストを指定します。複数のリストを指定できます。

その前に、rubyのirb(インタラクティブシェル)で実験してみます。血液型A,B,Oの掛けあわせです。

~$ irb
irb(main):001:0> abo=['A','B','O']
=> ["A", "B", "O"]
irb(main):002:0> abo.product(abo)
=> [["A", "A"], ["A", "B"], ["A", "O"], ["B", "A"], ["B", "B"], ["B", "O"], ["O", "A"], ["O", "B"], ["O", "O"]]
irb(main):003:0> 

全部で9パターンでした。
A型は、”A”, “A”と、”A”, “O”と、”O”, “A”
AB型は、”A”, “B” と、”B”, “A”
B型は、”B”, “B”と、”B”, “O”と、”O”, “B”
“O”,”O”だけがO型ですので、O型って貴重な気がしますね。(O型贔屓)

上記irbの実験でproductの使い方のコツを掴みましたので、カラーコードのパターンを生成してみましょう。原色は3種類ですので、以下のように、iroリストを3個掛けます。

iro=[パターン1,パターン2,パターン3]
iro.product(iro,iro)

~$ ruby -e 'iro=[64,160,240];iro.product(iro,iro).collect {|pat| puts "#%02X%02X%02X\n" % pat}'
#404040
#4040A0
#4040F0
#40A040
#40A0A0
#40A0F0
#40F040
#40F0A0
#40F0F0
#A04040
#A040A0
#A040F0
#A0A040
#A0A0A0
#A0A0F0
#A0F040
#A0F0A0
#A0F0F0
#F04040
#F040A0
#F040F0
#F0A040
#F0A0A0
#F0A0F0
#F0F040
#F0F0A0
#F0F0F0
~$

合ってそうです。最後にHTMLを作成するコマンドに手直しします。

~$ ruby -e 'iro=[64,160,240];iro.product(iro,iro).collect {|pat| puts "#%02X%02X%02X" % pat + "<hr size=10 color=#%02X%02X%02X>" % pat }' > /tmp/a.html 

以下が生成されたHTMLの表示です。
html_color_2

コメント

タイトルとURLをコピーしました