C++ の動作確認をしてみた(8)

C++の練習を兼ねて, AtCoder Beginner Contest 077 の 問題C(Snuke Festival)を解いてみた.

■感想.
① N が 最大 10の5乗 と指示があったので, for文 の 3重ループは, TLE になると推測し, 二分探索などを模索した.
② lower_bound, upper_bound という便利な関数が用意されていることが, ネット上の情報で判明したので, 計算量削減に使えないか, 検討してみた.
③ 最初, A を 基準に試行錯誤してみたが, 条件を満たす組み合わせの数え上げが上手くいかず, 次に, B を 基準に試行錯誤してみたところ, 条件を満たす組み合わせの数え上げが上手くいった.
④ 本家の解答を見たところ, おおよそ解答方針が一致していたので, 時間かかってしまったものの, とりあえず粘ってみた甲斐があったと思われる.


本家のサイトARC084/ABC077 解説をご覧下さい。


■C++版プログラム


■参照サイト
AtCoder Beginner Contest 077
lower_bound、upper_boundの基本的な使い方

C++ の動作確認をしてみた(7)

C++の練習を兼ねて, AtCoder Beginner Contest 106 の 問題D(AtCoder Express 2)を解いてみた.

■感想.
① 時間内では, C011_scrambled ~ C016_scrambled で, TLEとなったので, ロジック見直しが必要となった.
※下記ソース: ABC_106_D_1.cpp
② 解答を確認して, 計算量の削減方法について, 大変参考になった.
※下記ソース: ABC_106_D_2.cpp


本家のサイトAtCoder Beginner Contest 106 解説をご覧下さい。


■C++版プログラム


■参照サイト
AtCoder Beginner Contest 106

C++ の動作確認をしてみた(6)

C++の練習を兼ねて, AtCoder Beginner Contest 079 の 問題C(Train Ticket)を解いてみた.

■感想.
① 解答を後で見たところ, if – else if で押し切っているので, なるほどと感心させられた.
② +++, ++-, … , --- の8通り調べる方針は, 一致していたので, 着眼点が大きくブレてはいなかったと思われる.
③ char型 -> int型 の変換方法について, 勉強になったと思われる.


本家のサイトABC 079 解説をご覧下さい。


■C++版プログラム

■参照サイト
AtCoder Beginner Contest 079
char型をint型に変換する方法と注意【数値化 キャスト 文字列変換】

C++ の動作確認をしてみた(5)

C++の練習を兼ねて, AtCoder Beginner Contest 105 の 問題D(Candy Distribution)を解いてみた.

■感想.
① C++ 連想配列クラス(std::map) の 使い方を練習出来て良かったと思う.
② 連想配列クラスから, 値を取り出してくる場合, イテレータを使うのが良いらしい.
③ 余りゼロのケースは, 初めから, カウントアップしておく点に注意が必要.
④ 最大, 48[ms] かかっているテストケースがあったので, 改善の余地が, たくさんありそう.


本家のサイトABC 105 解説をご覧下さい。


■C++版プログラム

■参照サイト
AtCoder Beginner Contest 105
C++ 連想配列クラス std::map 入門

OpenAI Gym を使ってみた(1)

Window10上だと, 敷居が高く感じたので, macOS(High Sierra 10.13.4)上で確認してみた.


■動作環境構築(例)
下記, 参照サイトを参考に, 以下のようなコマンドを実行した.


■動作確認

-> ‘CartPole-v0’ の 動作確認しようとしたところ, CartPole が, 即座に画面外に消えてしまったので,
‘MountainCar-v0’ で 再度, 動作確認した経緯がある.

■参照サイト
OpenAI Gymで強化学習
OpenAI Gym 入門

C++ の動作確認をしてみた(4)

C++の練習を兼ねて, AtCoder Beginner Contest 105 の 問題C(C – Base -2 Number)を解いてみた.


① 制限時間内に, 解答できず終了.
② 公開されている解答を見たものの, 理解不能.
③ 結局, 試行錯誤して, ロジックを積み上げたところ, どうやらテストケースは, 全通過した模様(汗).
④ おそらく, もっと簡単なロジックがあると想定されるので, 後日, 他の方の解答を拝見しようと思う.



本家のサイトABC 105 解説をご覧下さい。


■C++版プログラム

■参照サイト
AtCoder Beginner Contest 105

C++ の動作確認をしてみた(3)

C++の練習を兼ねて, AtCoder Beginner Contest 090 の 問題C(Flip,Flip, and Flip……)を解いてみた.


最初, if文で, 1行×1列の場合, 2行×M列の場合, N行×2列の場合, … などと試行錯誤していたが, 絶対値を使ってみると,
全ての条件が, 一つの式で表せることが確認できたので, 見た目が, だいぶスリムになったと思う.
かなり感動したので, 投稿することになってしまった(汗).



本家のサイトABC 090/ARC 091 解説をご覧下さい。


■C++版プログラム

■参照サイト
AtCoder Beginner Contest 090

C++ の動作確認をしてみた(2)

C言語で書かれたプログラムを, C++に書き換えてみた.


題材として、AtCoder Beginner Contest 089 の 問題D(Practical Skill Test)を使ってみることにした。

但し、解答方針に関する理解は、まだまだ、出来てないように思うので(汗)、
C言語 -> C++ に翻訳してみることまでは、出来そうだったので、翻訳してみた。

なお、C言語で書かれたプログラムの詳細については、
本家のサイトABC 089 解説をご覧下さい。


■C++版プログラム

■参照サイト
AtCoder Beginner Contest 089

C++ の動作確認をしてみた(1)

1. 環境は、macOS High Sierra (version: 10.13.4) 上で行った。

2. プログラム記載~実行は、Visual Studio Code で行った。

今回確認した内容は、ロベールのC++教室 の(第1部)第69章 リンケージである。
以下の “動作確認(改善前)” で、対応できなかったのでメモした。

■動作確認(改善前)
Visual Studio Code 上で、動作確認する上で、以下のルールで行ってきた。
1. 標準入力(cin)が有る場合 … ターミナルを使った動作確認
$ g++ -o abc xxx.cpp
$ ./abc

2. 標準入力(cin)が無い場合 … 下記、3種類のキーを同時押しする動作確認
[command]key + [shift]key + [,]key

■対象プログラム

■動作確認(改善前)による実行結果
前述のプログラムを実行した結果、いずれの場合でも、以下のようなエラーが出力された。

〜(略)〜
clang: error: linker command failed with exit code 1 (use -v to see invocation)
〜(略)〜

■動作確認(改善版)
分割コンパイルが必要とのネット上の情報があったので、以下の形で、ターミナル上で対応した。
$ g++ -c 1-69_1.cpp -o 1-69_1.o
$ g++ -c 1-69_2.cpp -o 1-69_2.o
$ g++ -g -o abc 1-69_1.o 1-69_2.o
$ ./abc

■動作確認(改善後)による実行結果
前述のプログラムを実行した結果、以下のように、想定した動作を確認することができた。

■参照サイト
複数の.cppを分割コンパイル

コンパイラ(gccコマンド)の使い方

ターミナルに毎回表示される長ったらしい表示を短くする

平成30年春期 エンベデッドシステムスペシャリスト試験(ES)午後Ⅱ(問2) を 解いてみた。

引き続き、ハードウェアの知識を補いたいので、試しに解いてみました。

※1. 受験した訳でないです。
※2. 解答を記載ましたが、正解とは限りません。

■■■ 問1 ■■■

■設問1.
(1)
(a) 商品の口数 … 3
販売した口数 … 3
・図6(P.22) に、”出荷ラベル3枚の印刷指示” と記載されているので、販売した口数は、3 と推定。
・図6(P.22) の 注記で、”購入メッセージに付加された口数の値は、99であった。” との記述から、表2(P.17) の 購入 で、全口購入キーが押されたことを示す、に該当すると判断した。よって、商品の口数は、販売した口数と同じ 3 だったと推定。

(b) 競り休止
・表2(P.17) から、台端末 → 制御装置 で、”競り開始”、”競り休止”、”競り終了” の ステータスが有り得る。
したがって、以下の3パターンが考えられる。
① 競り開始 → 競り開始 → 競り開始 (※そもそも、考えづらい)
② 競り開始 → 競り休止 → 競り開始 (※表2(P.17) の 競り開始 の “確定キー” の記述、競り休止 の “休止キー” の記述に符合)
② 競り開始 → 競り終了 → 競り開始 (※”競り終了” 後は、”競り結果” が来るはずなので、”競り開始” とならないと判断)
上記から、② の パターン を答案として採用してみた。

(c) スクリーン表示指示で、運用状態の表示領域に休止中、販売可能な口数の表示領域に0口の表示を指示する。(49字)
・(1) (a) で、売れ残り口数が、0口となっていることを考慮する形で、答案作成してみた。

(2) 競り価格を下げずに競りを再開する場合。(19字)
・表2(P.17) の 競り開始 で、”テンキーで入力された値がなければ、付加される値は 0 である。”
・[制御装置における処理の概要] の (3) ④(P.18) に、”~競り価格から競り開始メッセージに付加された値を引いた価格を新たな競り価格~”
上記、2点との記載があるので、これをもとに答案作成してみた。

(3) 29[ms]
・商品の静止画 … 図3(P.16) より、商品の静止画を表示する領域は、600×500ピクセルと分かるので、600 × 500 × 3 = 900000[byte] = 900[kilobyte]
・テキストデータ … 問題文より、4[kilobyte]
・LAN1 の 実効通信速度 … 1[gigabit/s] × 25% × (1 / 8)[byte/bit] = (1 / 32)[gigabyte/s] = (1000 / 32)[kilobyte/s]
・以上から、(900 + 4)[kilobyte] ÷ (1000 / 32)[kilobyte/s] = 28.928[ms] → 小数第1位を四捨五入して、29[ms]

■設問2.
(1)
(a) スクリーンと台端末に表示する休止中及び新たな販売可能な口数に関する情報(35字)
・表3(P.20) の 情報表示タスクを参考に、答案作成してみた。

(b) 競り開始要求を受けてから情報表示タスクに情報表示要求を通知するまでの間(35字)
・表3(P.20) の 競り制御タスク の ② と、図6(P.22) の 通信シーケンス を参考に、答案作成してみた。

(2)
(a) 購入を希望する口数、買参人番号
・表2(P.17) 購入メッセージ で、”台番号キーで入力した台番号と ~ 買参人番号が付加される。” との記述があること
・図5(P.19) 購入履歴情報を構成するレコードのフィールド を見ると、買参人番号、購入口数 が含まれること
→ 上記、2点の記載から、これをもとに答案作成してみた。

(b) 買参人端末の表示部に、取引の成立又は不成立についての結果の表示を指示(34字)
・他の買参人が、取引成立となった場合もイメージして、答案作成してみた。(汗)

(3)
(a) 購入履歴情報を構成するレコードの買参人番号が、記憶した買参人番号と一致するすべてのレコードを記憶(48字)
・図5(P.19) 購入履歴情報を構成するレコードのフィールド を見ると、買参人番号 が含まれること
・表3(P.20) の 買参人タスク に、”該当する買参人の購入履歴を買参人端末表示メッセージで~” との記述(※購入履歴情報のレコードについて絞り込み機能があると推測される)があること
→ 上記、2点の記載から、これをもとに答案作成してみた。

(b) 前回追加したレコードのリンクの値を新たなレコードのリンクに設定し、前回追加したレコードのリンクに新たなレコードのレコード番号を設定(65字)
・図5(P.19) 購入履歴情報を構成するレコードのフィールド で、レコード番号、買参人番号、リンク に絞って考えてみた。
・以下の [変更後] の 挙動 を イメージして、答案作成してみたが、異常にムズイ。(汗)

[変更前]
00003 BUYER_03 -1
(※前回レコード番号: 00003 に更新)

00003 BUYER_03 -1
00007 BUYER_03 00003
(※前回レコード番号: 00007 に更新)

00003 BUYER_03 -1
00007 BUYER_03 00003
00011 BUYER_03 00007
(※前回レコード番号: 00011 に更新)

00003 BUYER_03 -1
00007 BUYER_03 00003
00011 BUYER_03 00007
00025 BUYER_03 00011
(※前回レコード番号: 00025 に更新)

以下、続く

[変更後]
00003 BUYER_03 -1
(※前回レコード番号: 00003 に更新)

00003 BUYER_03 00007 ← update
00007 BUYER_03 00003 ← update
(※前回レコード番号: 00007 に更新)

00003 BUYER_03 00007
00007 BUYER_03 00011 ← update
00011 BUYER_03 00003 ← update
(※前回レコード番号: 00011 に更新)

00003 BUYER_03 00007
00007 BUYER_03 00011
00011 BUYER_03 00025 ← update
00025 BUYER_03 00003 ← update
(※前回レコード番号: 00025 に更新)

以下、続く

・但し、問題文は、レコードの書き込みについてだけ言及されているものの、おそらく、そもそも購入履歴の表示方法も、変わってくると推測される。以下の具体例のように、1行目に表示するレコードの表示方法が異なってくると推測される。
・購入履歴 の 表示例
[変更前]
00003 BUYER_03 -1
00007 BUYER_03 00003
00011 BUYER_03 00007
00025 BUYER_03 00011
(※前回レコード番号: 00025 に更新)

上記の購入履歴データを、表示させる場合、
① 前回レコード番号: 00025 をもとに、レコード番号 00025 を 1行目に表示
② レコード番号 00025 の リンク 00011 から、レコード番号 00011 を 2行目に表示
③ レコード番号 00011 の リンク 00007 から、レコード番号 00007 を 3行目に表示
④ レコード番号 00007 の リンク 00003 から、レコード番号 00003 を 4行目に表示

[変更後]
00003 BUYER_03 00007
00007 BUYER_03 00011
00011 BUYER_03 00025
00025 BUYER_03 00003
(※前回レコード番号: 00025 に更新)

上記の購入履歴データを、表示させる場合、
① 前回レコード番号: 00025 をもとに、レコード番号 00025 の リンク 00003 から、レコード番号 00003 を 1行目に表示
② レコード番号 00003 の リンク 00007 から、レコード番号 00007 を 2行目に表示
③ レコード番号 00007 の リンク 00011 から、レコード番号 00011 を 3行目に表示
④ レコード番号 00011 の リンク 00025 から、レコード番号 00025 を 4行目に表示

■設問3.
(1)
e. 商品追加完了の通知
f. 商品移動指示
g. 商品追加許可
・表4(P.25) の 競り制御タスク から、文言から抜粋等によって、答案作成してみた。

(2)
h. 指定された商品情報を競り待ちテーブルの末尾に追加(24字)
・表4(P.25) の “商品移動要求を受けると、指定された商品情報を競り待ちテーブルの末尾に追加する。” から抜粋して、答案作成してみた。

(3)
i. 商品追加要求
j. 商品移動指示
k. 商品移動完了
l. 商品追加完了
m. 商品追加指示の処理③で追加した商品情報が、商品移動指示の処理①で消える(35字)
・競り待ちテーブルの更新タイミングについて、商品移動指示は、”処理①”、商品追加指示は、”処理③” となっているため、これを念頭に、答案作成してみたが、異常にムズイ。(汗)

参照サイト
■平成30年度春期(1)試験 問題冊子・解答例・採点講評・配点割合(PDF)
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_1/2018h30h_es_pm2_qs.pdf