Mae向きなブログ

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

約束の海

山崎豊子の本に没頭したのは、2011年から2012年にかけて。かねてより本書には興味を持っていましたが、未完のままになっているとのことで読むことに躊躇いがあったのですが、読んでみて本当によかったと思います。

この物語を通して何を訴えたかったのか、また物語の内容もさることながら、80歳を超えてなお新しいことに挑戦し続けるその姿勢に感銘を受けました。

約束の海

約束の海

平成22年度秋季基本情報午後問12

平成22年度秋季 基本情報技術者試験(FE)の午後問題12(アセンブラ言語CASL)は、

  • ビット列の並びを逆転させるプログラム

に関する問題でした。

設問1

ポイントは、SRL命令を実行したとき、

  • OFにはレジスタから最後に送り出されたビットの値が設定される
  • ZFが1のときは、ラベルFIN2の処理を行う

ということでしょうか。

実行結果

作成したプログラムを「CASLシミュレータ(CASL II 対応)」で実行してみました。#0005番地に格納されている値(#B3D1)が実行後は#8BCDになっています。

  • 実行前

f:id:rahaema:20181118162020p:plain

  • 実行後

f:id:rahaema:20181118162125p:plain

設問2

LOOP1は、n語の並びを逆順にする処理(第1語と第n語の入れ替え、第2語と第n-1語の入れ替え、…)、LOOP2は各語それぞれについて設問1のREVRSを使ってビットの並びを逆転させていますね。

実行結果

#0007番地から「#B3D1,#8000,#0001」を設定して実行してみました。

  • 実行前

f:id:rahaema:20181118164853p:plain

  • 実行後

f:id:rahaema:20181118164940p:plain

設問3

プログラムの中に適切なコメントが記載されているので、GR1,GR2,GR3に具体的な値を設定して紙上でビット遊びをすることが大切なんだろうなと思います。ビット列が右に左に移動して、ANDしたりORするうちに望みのビット列が得られる様子は面白いですね。

解くためには,

  • 算術シフトと論理シフトの違い
  • 「XOR GR6,=#FFFF」はビット反転

ということを知っていればよいのではないでしょうか。

実行結果

#B3D1に対して、真ん中の8ビットが逆順になるように、pを4、qを8で実行してみました。

  • 実行前

f:id:rahaema:20181118170320p:plain

  • 実行後

f:id:rahaema:20181118170329p:plain

「低レイヤを知りたい人のためのCコンパイラ作成入門」を読んで(1)

コンパイラの仕組みについては学生時代に学んだ記憶はあるのですが、当時は難易度が高く思えて、今となっては字句解析して構文解析してという程度しか理解できていません。これまで何度も学び直しをしようと思ったもののハードルが高くて何度も跳ね返されてきました。

ひょんなことで、「低レイヤを知りたい人のためのCコンパイラ作成入門」を知ったのですが、読み始めるととても分かりやすくて、面白くて、また学んでみようかなと思えてきました。読みながら、実際に手を動かして作っているのですが、このオンラインブックは執筆中ということもあり、そのままでは動かない部分がありましたので、自分なりに動くように作成してみました。

以下は、「ステップ4:四則演算のできる言語の作成」までの内容です。おかしな記述などがあれば遠慮なくご指摘いただければと思います。

9cc.c

実行結果

$ make
cc     9cc.c   -o 9cc
$ make test
./test.sh
OK

先ごろ実施された「平成30年度秋季基本情報午後問8 - Mae向きなブログ」にも四則演算を行う問題が出題されていました。今回の方法と実行結果が同じになっています。当たり前といえば当たり前なのですが、うれしいですね。

$ ./9cc 2*(34-(5+67)/8) > tmp.s
$ gcc -o tmp tmp.s
$ ./tmp
$ echo $?
50

平成30年度秋季応用情報午後問3

平成30年度秋季 応用情報技術者試験(AP)の午後問題3は、ウェーブレット木に関する問題でした。

年齢だけは重ねているので、基本情報や応用情報技術者試試験で出題される、いろいろなアルゴリズムについて詳細は知らなくても、名前だけは聞いたことがあるものが今までは出題されていたのですが、ウェーブレット木というのは初耳のような気がします。

理解を深めるために問題を解いて、プログラムを作成してみました。

プログラム(h30a_ap_pm3.rb)

実行結果

問題文中で取り上げられている、文字列Pについて、

  • ウェーブレットの構築
  • 文字の出現回数を数える

を実行してみました。図1と同じようなウェーブレット木が構築でき、文字数も数えられているようです。

$ ruby h30a_ap_pm3.rb
#<struct Node
 key=342,
 left=#<struct Node key=24, left=nil, right=nil>,
 right=#<struct Node key=17, left=nil, right=nil>>
A : 3
C : 2
G : 3
T : 2

追記

以前のプログラムでは、文字の種類の個数が4ではないとき、不具合がありましたので以下のページを参考に修正しました。(2019/03/31)

下町ロケット ヤタガラス

あいかわらず池井戸潤氏の本は面白いですね。今回も楽しく読了できました。本の中では、準天頂衛星ヤタガラスという名で登場しますが、現実には準天頂衛星みちびきが、2018年11月1日にサービスを開始したばかりのようです。いろんな方面で有効活用してもらいたいですね。

下町ロケット ヤタガラス

下町ロケット ヤタガラス

平成30年度秋季基本情報午後問12

平成30年度秋季 基本情報技術者試験(FE)の午後問題12(アセンブラ言語CASL)は、

  • 1970年1月1日から、指定された日付までの日数を求める問題

でした。

プログラム(h30a_fe_pm12.casl)

  • 05行目:本日の日付(2018年10月28日)をセット
  • 13行目:(空欄a)GR4に10月までの経過日数が格納されているメモリアドレスをセットする
  • 14行目:9月までの合計日数をGR1に加算する(10月まで加算してはダメ)。
  • 22行目:(空欄b)すでに2018年(今年)分の日数は足しているので、処理している年(GR2)と等しくなったら22〜26行目の加算処理はしない
  • 36行目:GR0を0で初期化(0は平年、1はうるう年)
  • 39行目:(空欄c)38行目で3とAND演算をしている。結果が0の場合は4の倍数である。
  • 42行目:(空欄d)41行目の実行結果で、GR0に100で割り切れた場合は1が、割り切れなかった場合は0が格納されている。100で割り切れなかった場合は、うるう年なのでビット反転する操作が必要になる。
  • 49行目:DIVISIBLは繰り返し引き算を行って割り切れるかどうかを判定している。

実行結果

作成したプログラムを「CASLシミュレータ(CASL II 対応)」で実行してみました。1970年1月1日から本日(2018年10月28日)までの日数は、GR0の値から17832日のようです。

f:id:rahaema:20181028140414p:plain

あっているかRubyスクリプトと比較してみたところ、無事、同じ結果となりました。

$ ruby -rdate -e "puts (Date.today - Date.new(1970,1,1)).to_i"
17832

平成30年度秋季基本情報午後問9

平成30年度秋季 基本情報技術者試験(FE)の午後問題9は列車の運行をシミュレーションするプログラムでした。

h30a_fe_pm9.c

実行結果

「図1 鉄道模型の路線構成及び列車位置」から4回処理を進める様子を眺められるようにしてみました。

f:id:rahaema:20181027120348p:plain

$ gcc h30a_fe_pm9.c && ./a.out
----- 初期状態 -----
区間0 : 赤 : 列車4
区間1 : 赤 : 列車3
区間2 : 緑 :   -
区間3 : 赤 : 列車2
区間4 : 赤 : 列車1
区間5 : 緑 :   -
区間6 : 緑 :   -
区間7 : 緑 :   -
区間8 : 赤 : 列車0
----- 進行1回目 -----
区間0 : 赤 : 列車4
区間1 : 緑 :   -
区間2 : 赤 : 列車3
区間3 : 赤 : 列車2
区間4 : 緑 :   -
区間5 : 赤 : 列車1
区間6 : 緑 :   -
区間7 : 緑 :   -
区間8 : 緑 :   -
----- 進行2回目 -----
区間0 : 赤 : 列車4
区間1 : 緑 :   -
区間2 : 赤 : 列車3
区間3 : 緑 :   -
区間4 : 赤 : 列車2
区間5 : 緑 :   -
区間6 : 緑 :   -
区間7 : 緑 :   -
区間8 : 緑 :   -
----- 進行3回目 -----
区間0 : 赤 : 列車4
区間1 : 緑 :   -
区間2 : 緑 :   -
区間3 : 赤 : 列車3
区間4 : 緑 :   -
区間5 : 緑 :   -
区間6 : 赤 : 列車2
区間7 : 緑 :   -
区間8 : 緑 :   -
----- 進行4回目 -----
区間0 : 緑 :   -
区間1 : 緑 :   -
区間2 : 赤 : 列車4
区間3 : 緑 :   -
区間4 : 赤 : 列車3
区間5 : 緑 :   -
区間6 : 緑 :   -
区間7 : 緑 :   -
区間8 : 緑 :   -

感想

電車好きな方が作問されたんでしょうね。電車と言えば、以前読んだ『プログラミングの基礎 - Mae向きなブログ』に電車関連の題材を扱った問題があったと思います。いつか自分でも作ってみたいと思いながら、まだ取り組めずにいます。いつかと言っているうちは取り組めないんでしょうけど、いつか取り組んでみたいですね。