1)カードの合計が21を超えないような引きに調整する
2)カードの合計に閾値を設けて1~3の範囲でゆらぐような乱数を選択させることでAIのように見せる
2018.12.15
Javaプログラミングコンテスト最優秀賞者のプログラムを見てみよう、第2弾です。
ネットワーク関連の問題の要点部は「文字列 str にIPv4アドレスがサブネットマスクのサフィックス付きで与えられたときに、ネットワークアドレスとブロードキャストアドレスを表示する」のが目標です。
前回の時点で、IPアドレスの上位から8ビットずつをint型のa、b、c、dに代入し、サブネットマスク(サフィックス値)をzに代入しました。
ここから、ネットワークアドレスを求めていきます。
int ip = (a << 24) + (b << 16) + (c << 8) + d;
ipに、IPアドレスを数値として入れました。
"<<"はシフト演算。
c << 8は、cを左に8ビットシフトした値になります。左に1ビットシフトすると2倍になるので、8ビットシフトすると256倍になります。
このあたり、知っていればどうってことはないのですが、一度は覚えていてもいざ使おうとなるとできるかどうか・・・。
ついつい、c * Math.pow(2, 8) とか b * Math.pow(2, 16)とやってしまいそうな気がします。
ipに32ビットの整数値を格納しましたが、int型は32ビットなので大丈夫です。
ここも、余裕を持ってlong型にしようとか考えそうになりますが、値として持てればいい、つまり正負の符号などを考えなくていいのでint型がぴったりですね。
同様にしてサブネットマスクを求めてint型にし、ipと論理積(&)をとればネットワークアドレスが求まります!
といきたいところですが、最優秀者のコードは違いました。
char[] ipc = Integer.toBinaryString(ip).toCharArray();
ipを一旦、2進数文字列に変換し、char型の配列に格納します。
さらに
for (int i = 31; i >= z; i--) ipc[i] = '0';
としました。
考えてみれば、ipを2進表記したときに下位zビットを0にセットするだけでいいですね。
当たり前のことですが、ネットワークアドレスを求めるときにサブネットマスクと論理積をとる、というふうに覚えているとこうした簡単なことに気づきづらいものです。
ついついまともにやってしまいそう・・・。
こうしてあっさり求めたネットワークアドレスを数値に戻します。
a = b = c = d = 0;
for (int i = 0; i < 8; i++) {
a += (ipc[i] - '0') << (7 - i);
b += (ipc[i + 8] - '0') << (7 - i);
c += (ipc[i + 16] - '0') << (7 - i);
d += (ipc[i + 24] - '0') << (7 - i);
}
プログラムは、それを作った人の思考経路が透けて見えるので面白いです。
たとえばaにはipアドレスの上位8ビットを入れたいのですが、各ビットはchar型の配列に'0'か'1'として入っているので、これを一旦数値に変換します。
このとき、char型は内部的に整数値になっているので、ipc[i] - '0'のように引き算ができます。'0'の次が'1'になっているので、これにより'0'は0に、'1'は1になります。
さらに最上位ビットであれば128倍、つまり左に7ビットシフトします。2番目のビットであれば、左に6ビットシフトし、…となるので、for文で繰り返し処理します。
そしてこれらを足し合わせるためにa += (右辺)としています。これはa = a + (右辺)と同じで、aに(右辺)を加えていくという意味になります。
これで数値に変換されますが、この部分は他にもいろいろなやり方がありそうです。
あとは表示するだけ。
System.out.println(a + "." + b + "." + c + "." + d);
見事でした。
もう一つのブロードキャストアドレスも、同じようにできそうですね。
詳しくは次回!
カードをクリックしてめくります。
BlackJackというカードゲーム。
1)カードの合計が21を超えないような引きに調整する
2)カードの合計に閾値を設けて1~3の範囲でゆらぐような乱数を選択させることでAIのように見せる
2018.12.07
プロジェクト開発演習のこれまでの記事はこちらから
いよいよ演習も実装工程、つまり実際にプログラミング作業を行う段階に入ってきました。
今回の演習は株式会社コア様と連携して演習を行っており、同社のIoT関連製品である「GR-LYCHEE」(ジーアールライチ)を使用して開発を行っています。
なぜライチという名前なのか、企業の人に聞くのを忘れていました!
GR-LYCHEEはこんな感じの機器です。
いろいろな装置を付けられます。
実は右のほうに小さなカメラが接続されています。
GR-LYCHEE自体は名刺サイズでとても小さいのですが、写真だと分かりにくいでしょうか。
さて、今回は2つのプロジェクトに分かれて作業をしているので、今日は1つのチームの取り組みを紹介します。
チームSSGは、最終的にはラジコンのようなことをしたいようです。
「小さい」ということを生かして狭いところにも入って、ライトをつけて写真を撮ったりするような機能を考えています。
うまくいけば災害現場などで活躍できるようなものを・・・ということですが果たして?
いきなりそこまでの機能を実現させるのは大変なので、ひとまずカメラ機能を試します。
また、ラジコンを動かす代わりに、前進や後退のボタンが押されたときにLEDを光らせたり点滅させたりすることで、少しずつ動作確認しています。
プログラム言語は、CやC#を使っています。
GR-LYCHEEを動かすときはC言語を使用しますが、クラウド上で開発できるMbedというサービスを利用しています。
便利ですよね。
今日はスレッド処理が実現できたし、なかなか順調のようですね!
次回はもう一方のプロジェクトを紹介します。
© 2017 学校法人コア学園 秋田コア ビジネスカレッジ All Rights Reserved.
当サイトの内容、テキスト、画像等の無断転載・無断使用を固く禁じます。