http://qiita.com/Nabetani/items/4c60f10b73812e86441c
http://nabetani.sakura.ne.jp/hena/ord6lintersection/
L字型の領域をふたつ作り、重なった部分の数を算出するという問題。
一見めんどくさそうですが、実はL字じゃなくて長方形*2とみなせば余計なこと考えなくていいので楽。
30分くらいで終わりました。
埋める部分の求め方がとっても力業なかんじがしますが、先日諦めたビット演算を今回はうまく使えたので満足です。
なお30分にはコメントとかは含んでいません。
ガガッと書いて30分で動いた、完成!としてから整形してJavadocとか書いてます。
それにしてもいくら読んでもこれが理解できぬ。
「オフラインリアルタイムどう書く」の一覧
http://nabetani.sakura.ne.jp/hena/ord6lintersection/
L字型の領域をふたつ作り、重なった部分の数を算出するという問題。
一見めんどくさそうですが、実はL字じゃなくて長方形*2とみなせば余計なこと考えなくていいので楽。
<?php class INTERSECTION{ /** * 面積を返す * @param String 「23-94-28,89-06-51」みたいな文字列 * @return String 「11」みたいな文字列 */ public function get($input){ // 10*10のマップ $map = str_repeat('0', 100); // 入力値を分割 $input = explode(',', $input); $data1 = explode('-', $input[0]); $data2 = explode('-', $input[1]); // マップ埋め $map = $this->bury($map, $data1[0], $data1[1], 1); $map = $this->bury($map, $data1[0], $data1[2], 1); $map = $this->bury($map, $data2[0], $data2[1], 2); $map = $this->bury($map, $data2[0], $data2[2], 2); // 重複したところをカウント return (string)substr_count($map, '3'); } /** * 長方形内部をビット和で埋める * @param String マップ * @param String 頂点の座標 * @param String 対角線上の頂点の座標 * @param int 埋める値 * @return String マップをビット和で埋めたもの */ public function bury($map, $angle1, $angle2, $val){ for($x = min( $angle1[0], $angle2[0] );$x <= max( $angle1[0], $angle2[0] ); $x++){ for($y = min( $angle1[1], $angle2[1] );$y <= max( $angle1[1], $angle2[1] ); $y++){ $map[(int)$x.$y] = $map[(int)$x.$y] | $val; } } return $map; } } // テスト $test = [ ['23-94-28,89-06-51', '11'], /* 省略 */ ]; $intersection = new INTERSECTION(); foreach($test as $key=>$data){ $answer = $intersection->get($data[0]); if($answer !== $data[1]){ print('えらー'); } }
30分くらいで終わりました。
埋める部分の求め方がとっても力業なかんじがしますが、先日諦めたビット演算を今回はうまく使えたので満足です。
なお30分にはコメントとかは含んでいません。
ガガッと書いて30分で動いた、完成!としてから整形してJavadocとか書いてます。
それにしてもいくら読んでもこれが理解できぬ。
「オフラインリアルタイムどう書く」の一覧
PR