Mae向きなブログ

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

目盛りの消えた定規

「目盛りの消えた定規(Sparse ruler)」という面白い問題があるんですね。

例えば、6cmの定規の場合、1cmと4cmの所に目盛りがありさせすれば、1cmから6cmまでを計測することができるというものです。詳しくは参考サイトで説明されているのですが、自分の理解を深めるためにRubyで作ってみました。

sparse_ruler.rb

実行結果

以下が実行結果です。6cmの定規の場合、1cmと4cmの所に、10cmの定規の場合、1cm,2cm,3cm,6cmの所に目盛りがあればいいようです。

$ ruby sparse_ruler.rb
6
1,4
$ ruby sparse_ruler.rb
10
1,2,3,6
$ ruby sparse_ruler.rb
15
1,2,3,4,10

参考サイト

漫画 君たちはどう生きるか

話題になっていたので読んでみた本です。漫画版なので読みやすく、まさにどう生きるかということについて考えるきっかけになる本で、小中学生には是非読んでもらいたいなと思いました。せっかくなので、原著も読んでみようと思います。

漫画 君たちはどう生きるか

漫画 君たちはどう生きるか

わたしを離さないで

日の名残り』を読み終えた後、すぐに購入していたのですが、重苦しい雰囲気が続き中々読み進めることはできませんでした。作品としては、『日の名残り』の方が好みですが、ちょうど、『サピエンス全史』を読み終えたばかりだったので、科学革命以降の急速な技術の進歩と幸福について考えさせられる作品だったと思います。

わたしを離さないで (ハヤカワepi文庫)

わたしを離さないで (ハヤカワepi文庫)

サピエンス全史

あまりの評判の高さから読んでみたくなって手に取った本です。

上下巻、合わせると600ページ程ありますが、11/6から読み始めて本日読了しました。

250万年前現生人類と非常によく似た動物が初めて姿を現してから、現代・未来までの物語。読み終えた瞬間から、もう一度もっとじっくりと読んでみたいと思っています。

通常、あとがきは本を読んでから最後に読むものだと思いますが、今から読まれる方は、訳者の柴田裕之さんが書かれたあとがきを読んでから読んでみるという手もあるのではとも思います。

AIが人間を殺す日

インパクトが強い書名ですが、車、医療、兵器に人工知能が組み込まれようとしている今の現状を以下の観点

  • Human out of the Loop(制御の環から人間を外す)
  • Human in the Loop(制御の環に人間を入れる)

から丁寧に解説してあって、今後の人工知能の在り方について個々人が考える良いきっかけになる良書ではないかと思います。

色々感じることはあったのですが、一番考えさせられたのは、

「軍事予算を受けた研究には断じて参加してはいけない」とする頑なな姿勢に終始する

ことがいいのかということでしょうか。DARPAが主催した様々なプロジェクトが、画期的な民生技術の開発を促してきたことを考えれば、日本の大学や企業などの研究機関も柔軟に考えていかないといけないのではと強く思います。

平成29年度春季応用情報午後問3

平成29年度春期 応用情報技術者試験(AP)の午後問題3は幅優先探索深さ優先探索、枝刈りに関する問題でした。

h29h_ap_pm3.rb

実行結果

$ ruby h29h_ap_pm3.rb
#<struct Status total=99, selectedNumbers=[10, 34, 55], nextIndex=4>
#<struct Status total=99, selectedNumbers=[55, 34, 10], nextIndex=0>

平成29年度春季基本情報午後問12

平成29年度春季 基本情報技術者試験(FE)の午後問題12(アセンブラ,CASL)は、64ビット符号なし整数の加算(副プログラムADD64)と副プログラムADD64を使用して、32ビット符号なし整数の乗算を行う副プログラムMUL32に関する問題でした。

設問1

空欄a

桁上がりのための処理を選択することになります。

空欄b

最下位の16ビット同士、第3位16ビット同士、第2位16ビット同士、最上位16ビット同士と加算処理が進んでいきますが、17行目の実行結果、ゼロフラグが1になれば、18行目でEXITにジャンプすることを考えると、最上位16ビットまで処理が進んだかを判定する処理を選ぶことになります。

設問2

行番号7の命令が2回目に実行されるときは、行番号11で(GR1)+3番地と(GR2)+3番地の加算をした結果#A684+#B759=#15DDDとなり、14行目でGR5が1となり、16行目でGR0が1になった状態で、7行目の処理が実行されることになります。#1+#2E0Cの結果を選択することになります。

設問3

2進数の掛け算では、以下のようになり、(A)の左シフトと加算で計算することができます。プログラム2の中で出てくるTEMPは、(A)をシフトした数を格納する役割を持っています。

    1011 (A)
   x1010 (B)
  ------
   10110 TEMP
 1011000 TEMP
 -------
 1101110

MUL32の中心的な処理は以下の所だと思います。TESTBITでは、かける数(GR0)の一番右側のビットが0の場合は、EXITLOOPへ、1の場合は、TEMPとGR3(乗算結果)を加算します。EXITLOOPでは、32ビット分の処理が終わっていればEXITへ、そうでなければTEMPを左に1ビットシフトする処理(ここでは2倍する処理で実現)が行われることになります。

TESTBIT  AND  GR0,=#0001
         JZE  EXITLOOP
         LD   GR1,GR3
         LAD  GR2,TEMP
         CALL ADD64
EXITLOOP CPL  GR5,=31
         JZE  EXIT
         ADDL GR5,=1
         LAD  GR1,TEMP
         空欄f
         CALL ADD64 
         LD   GR2,GR4    ; GR4に退避した値をGR2に復帰
         JUMP LOOP
EXIT     RPOP
         RET