芒種
予想通り前回記事投稿から何もありませんでした。
「PMがPTA広報の部長になった訳だが」は取材(?)の為休載して埋め草記事でお茶を濁します。
今のところ紹介出来る持ちネタが4つあります。
- 16進の文字'0'~'f'を数値に変換する
- C++でJavaのsynchronized()を再現したい症候群
- if~elseのネストを解決するJavaクラス
- 生産性を上げる3種の神器 正規表現、RDBMS、スクリプト言語
アセンブラ/C/C++/Javaと辿ってきたのがモロバレですね。最近流行の言語は履修してません。
16進の文字'0'~'f'を数値に変換する
自分のアイデアでは無いので先に出典を紹介します。記憶が怪しいのですが「 ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか 」で読んだ気がします。
問題
16進数を表す文字('0'~'9', 'a'~'f')の文字コードが与えられた時、対応する16進数値(0~f)に変換する。
C/C++言語風の表現をすると以下のコードの内部実装を考えよ、上記以外の文字はバリデーションチェックで弾かれ入力されない為エラーチェックは不要、純粋な処理だけ考えなさい。
スマート(?)な実装ほど良しとします。尚、想定するスマートな実装は1行です。
というものです。
int f(char c) {
// ここを考える。charからintへの型変換とか詳細は無視してOK
}
社内の同僚に問題を出してみた所、if文で文字判定して返値を求めるとか、
;で区切った後エディタ上で改行しなければ見た目は1行とか、
int f(char c) {
return atoi(c);
}
等の回答が得られました。
atoi()の内部実装を問う設問なのでその回答は豪快過ぎます。笑
スマートな解
剰余演算(%)を使います。
int f(char c) {
return c % ('a' - 10) % '0';
}
これを見た時は目から鱗でした。
特定の条件を満たす時、自然数列上の任意個の、任意の区間を、自然数列にマッピング出来るという事です。
ちなみにこの問題における特定の条件とは
「出力値最大な'f'の返値 16 は、 入力値最小の'0'(=48)より小さい」
「'a'-10 (=97 -10 =87) は'9'(=57)より大きい」です。
'A'と大文字にしてしまうと'A'-10(=65 -10 = 55)は'9'(=57)より小さくなるので成立しなくなります。
次回予告
最近中学生の息子が買ったNintendo Switchの「はじめてゲームプログラミング」に親の私の方がドハマりして時間溶かしてます。
広報部運営が何もないと時間が取れてゲーム作成が捗るのですが、この記事本来の目的であるPTAのプロマネに関するネタが発生する事も期待しつつ、次回更新は少暑の頃を予定しています。