Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

数学ガールの秘密ノート/ビットとバイナリー(2)

数学ガールの秘密ノート/ビットとバイナリー』の「第4章 フリップ・トリップ」で紹介されているフリップ・トリップ4を作ってみました。まだ完成とは言えませんが、早めに公開して少しずつ改善していきたいと思います。

f:id:rahaema:20190801182400p:plain

数学ガールの秘密ノート/ビットとバイナリー(1)

数学ガールの秘密ノート/ビットとバイナリー』の「第2章 変幻ピクセル」で紹介されている内容を実際に作って動かしてみました。読んでいるだけで楽しい本書ですが、実際に動かしてみるとさらに楽しくなりますね。

出来るだけ本文に沿った形で作ってみたかったのですが、FILETERだけが少し違っています。while文がない形になってしまいました。

bits_and_binary.rb

copy.rb

スキャナで読んで、フィルタを通さずにプリンタで出力するだけです。

require_relative 'bits_and_binary'

if __FILE__ == $0
  scanner = SCAN.new("F.txt")
  printer = PRINT.new(scanner)
  printer.execute
end

F.txt

0000000000000000
0000000000000000
0011111111111100
0011111111111100
0011111111111100
0011100000000000
0011100000000000
0011111111111100
0011111111111100
0011111111111100
0011100000000000
0011100000000000
0011100000000000
0011100000000000
0000000000000000
0000000000000000

実行

上記のbits_and_binary.rb,copy.rbF.txtを同じディレクトリに置いて実行すると以下のように出力されます。1は#、0は.で出力しています。

$ ruby copy.rb
................
................
..############..
..############..
..############..
..###...........
..###...........
..############..
..############..
..############..
..###...........
..###...........
..###...........
..###...........
................
................

complement_xor.rb

ビット反転です。FILTERクラスを継承したCOMPLEMENT_XORクラスを定義し、readメソッドの中でフィルタ処理を書いていきます。

require_relative 'bits_and_binary'

class COMPLEMENT_XOR < FILTER
  def read
    super ^ 0xffff
  end
end

if __FILE__ == $0
  scanner = SCAN.new("F.txt")
  filter  = COMPLEMENT_XOR.new(scanner)
  printer = PRINT.new(filter)
  printer.execute
end

実行

$ ruby complement_xor.rb
################
################
##............##
##............##
##............##
##...###########
##...###########
##............##
##............##
##............##
##...###########
##...###########
##...###########
##...###########
################
################

reverse_trick.rb

左右の反転です。

require_relative 'bits_and_binary'

class REVERSE_TRICK < FILTER
  def read
    m1 = 0b0101010101010101
    m2 = 0b0011001100110011
    m4 = 0b0000111100001111
    m8 = 0b0000000011111111
    x = super
    x = ((x & m1) << 1) | ((x >> 1) & m1)
    x = ((x & m2) << 2) | ((x >> 2) & m2)
    x = ((x & m4) << 4) | ((x >> 4) & m4)
    x = ((x & m8) << 8) | ((x >> 8) & m8)
    x
  end
end

if __FILE__ == $0
  scanner = SCAN.new("F.txt")
  filter  = REVERSE_TRICK.new(scanner)
  printer = PRINT.new(filter)
  printer.execute
end

実行

$ ruby reverse_trick.rb
................
................
..############..
..############..
..############..
...........###..
...........###..
..############..
..############..
..############..
...........###..
...........###..
...........###..
...........###..
................
................

hemming.rb

縁取りです。

require_relative 'bits_and_binary'

class RIGHT < FILTER
  def read
    super >> 1
  end
end

class LEFT < FILTER
  def read
    super << 1
  end
end

class UP < FILTER
  def initialize source
    super
    @counter = 0
  end
  def read
    @counter += 1
    super if @counter == 1
    @counter >= 16 ? 0 : super
 end
end

class DOWN < FILTER
  def initialize source
    super
    @counter = 0
  end
  def read
    @counter += 1
    @counter == 1 ? 0 : super
  end
end

class AND < FILTER
  def read
    a, b = super
    a & b
  end
end

class COMPLEMENT < FILTER
  def read
    0xffff - super
  end
end

if __FILE__ == $0
  scanner0 = SCAN.new("F.txt")
  scanner1 = SCAN.new("F.txt")
  scanner2 = SCAN.new("F.txt")
  scanner3 = SCAN.new("F.txt")
  scanner4 = SCAN.new("F.txt")
  right    = RIGHT.new(scanner1)
  left     = LEFT.new(scanner2)
  up       = UP.new(scanner3)
  down     = DOWN.new(scanner4)
  and1     = AND.new(right, left)
  and2     = AND.new(up, down)
  and3     = AND.new(and1, and2)
  comp     = COMPLEMENT.new(and3)
  and4     = AND.new(scanner0, comp)
  printer  = PRINT.new(and4)
  printer.execute
end

実行

数種類の部品がお互いに連携しあって、出力される様は非常に面白いですね。

$ ruby hemming.rb
................
................
..############..
..#..........#..
..#..#########..
..#.#...........
..#.#...........
..#..#########..
..#..........#..
..#..#########..
..#.#...........
..#.#...........
..#.#...........
..###...........
................
................

学びを結果に変えるアウトプット大全

アウトプットが大切であるというのは、以前、どこかで耳にしたことがあって、だからブログに

  • 本を読んだら、少しでも感想を書いておこう
  • プログラムを書いたら載せておこう

と思って今まで続けています。読後の感想を書くのは難しく、中々うまく書けないのですが、これからも続けていきたいですね。

本書はアウトプットの効果について述べられた本ですが、印象に残ったフレーズなどを記録しておきます。たまに以下の箇条書きを見て、こんなことだったなと復習して長期記憶として残していきたいですね。

  • 柔らかく伝えるクッション話法
  • どう話すか
  • ちょくちょく話す
  • 何を学びたいか
  • 断りの技術
  • 緊張を味方につける
  • 落書きは決して悪いものではない
  • 脳の棚卸し
  • デフォルトモード・ネットワーク
  • 目標の書き方

学びを結果に変えるアウトプット大全

学びを結果に変えるアウトプット大全

ノーサイド・ゲーム

今年に入って、新たに本を読むと言うよりも、今まで読んだ本を読み返すと言う読書スタイルになってきているのですが、池井戸潤作品は話が別。ドラマが始まったのをきっかけに読んでみました。相変わらず、スカッとする面白さですね。日々のストレスを忘れさせてくれるだけではなく、正義とは何かとか考えさせられます。2019年といえば、ラグビーW杯*1が開催される年。この小説、ドラマを通してラグビー人気も盛り上がるといいですね。

ノーサイド・ゲーム

ノーサイド・ゲーム

タートルグラフィックス

平成16年度秋期基本情報午後問10で出題されたタートルグラフィックスは、マーカー(亀)の方向を上下左右の4方向しか指定できない簡易的なものでした。

左右の回転コマンドを追加すると、もう少し面白くなるのではと思い、rコマンド(右回転)とlコマンド(左回転)を追加してみました。

turtle_graphics.c

実行結果

  • 25前進(f25)
  • 144度右方向に回転する(r144)

これを5回繰り返すコマンド{5f25r144}を実行してみました*1

$ gcc turtle_graphics.c && ./a.out > picture.tex
$ ptex2pdf -u -l picture.tex && open picture.pdf

f:id:rahaema:20190622155429p:plain

関連

*1:実行するには、LaTeX2e環境が必要です。

思い邪なし 京セラ創業者 稲盛和夫

当然、隣県ご出身の稲盛和夫さんのお名前は知っていはいましたが、京セラを創業した方、JALの再建を果たされた方ということくらいの知識しかありませんでした。

本書を読んで、稲盛和夫さんの人となりに触れ、今まで、なんで書かれた本なりを読んでこなかったんだろうとの思いを強くしました。まさに「思い邪なく」一生懸命に人生を生きておられる方。少しでも見習いたいと思わせてくれた良書でした。

人が働くとはどういうことかが真剣に問われている本でもあり、就職活動中の学生の方などには特にお薦めしたい本だと思います。

平成16年度春期ソフトウェア開発午後問5

平成16年度春期 ソフトウェア開発技術者試験(SW)の午後問題5は、

  • Base64の変換プログラム

に関する問題でした。

f:id:rahaema:20190610204949p:plain

プログラム例(h16h_sw_pm5.c)*1

実行結果

設問1(1)、(2)を実際に実行してみました。

  • 出力結果1行目が、4バイトのデータ(10,20,30,40)をエンコードした結果の文字列です。
  • 次の10,20,30,40(改行含む)が上記の文字列をデコードしたものです。
  • 次の130,24は"ghg="をデコードした結果です。
 gcc h16h_sw_pm5.c && ./a.out
ChQeKA==
10
20
30
40

130
24

関連

*1:エンコード出力時に、76文字ごとに改行すること、最後の行は76文字未満でも改行するという条件は未実装です。