http://qiita.com/Nabetani/items/c206fbc645c255cb7de6
http://nabetani.sakura.ne.jp/hena/ord11arithseq/
前回の続き。
今回は複数の等差数列から、最も長い列になるものを取得します。
最初は/(1.{0,})\1{3,}1/とかそんなかんじでガガッと一発取得してやろう、とか考えていたのですが、後方参照でサブパターンをマッチさせる方法がわからず挫折。
結局一重ではありますがループになってしまいました。
残念。
得意な人ならきっとできると思うので教えてください。
かかった時間は2時間くらい。
そのうち1.5時間は正規表現を作っては消していたところ。
つうかbase_convert()便利だな。
「オフラインリアルタイムどう書く」の一覧
http://nabetani.sakura.ne.jp/hena/ord11arithseq/
前回の続き。
今回は複数の等差数列から、最も長い列になるものを取得します。
= strlen($input)){ break; } } return $count; } } // テスト $test = [ [ '12345abcz', '5' ], /* 省略 */ ]; $sequence = new SEQUENCE(); foreach($test as $key=>$data){ $answer = $sequence->get($data[0]); if($answer !== (int)$data[1]){ print('えらー'); } }順番にくるくるやっていけばいいだけなのですが、何故か正規表現に思い至ってしまったのでやってみた。
最初は/(1.{0,})\1{3,}1/とかそんなかんじでガガッと一発取得してやろう、とか考えていたのですが、後方参照でサブパターンをマッチさせる方法がわからず挫折。
結局一重ではありますがループになってしまいました。
残念。
得意な人ならきっとできると思うので教えてください。
かかった時間は2時間くらい。
そのうち1.5時間は正規表現を作っては消していたところ。
つうかbase_convert()便利だな。
「オフラインリアルタイムどう書く」の一覧
さあ今週はいよいよ遂に、散々待った、待ち続けた地球防衛軍4の発売です。
もちろん有給取ってきました。
EDFは解雇を怖れない!
ナースエンジェルりりかSOS1 池野 恋
ナースエンジェルりりかSOS2
ナースエンジェルりりかSOS3
ナースエンジェルりりかSOS4
☆☆☆☆
ハンドルネームの由来にまで使っているというのに何気に今まで読んだことがなかったとかいう。
ストーリーだけを抜き出すと相当暗いというか、先輩能力者が死んで非能力者まで戦闘に駆り出されたり、家族や友人が被害にあったりなどほとんど負け戦並の悲惨な状況なのですが、登場人物に色々とシリアスさが欠けるため、しょっちゅうギャグ展開になったりします。
さらに最終的にはあの伝説のラストシーンが……ってその打ち切りっぽい無理矢理なまとめは何なんだ。
彼とかは正直不要だったのではなかろうかと思うのですが、そうなると書き下ろしが困難になるな。
ところで私が本作を知るきっかけとなったのが、かつて乃諏樽慈亜って人が公開していた「恋をするたびに傷つきやすく」のMIDIです。
たまたまその曲を聴いてこれいいな、なんだろうと辿っていきました。
しかし、当時はりぼんを購読していたはずなのだけど本作を読んだ記憶が全く無いという不思議。
あとMIDIもPCの引っ越しを何度も重ねるうちに散逸してしまいました。
今からでも再入手できないかな。
リアルだと15年前の著作とか金さえあれば入手はそう難しくないけど、ネットだとそもそも存在すら残ってないことがあって残念です。
バード 雀界天使VS天才魔術師3 山根 和俊
☆☆☆
だから!無駄な!エロシーンは!要らないんだよ!!
せっかくストーリーは面白いのに台無しだ。
自動卓でもできるイカサマがめまぐるしく次々と現れてくる様は圧巻。
よくもまあこんなに色々考えつくものだ。
で、誰か実戦で使える人って存在するのですかね。
もちろん有給取ってきました。
EDFは解雇を怖れない!
ナースエンジェルりりかSOS1 池野 恋
ナースエンジェルりりかSOS2
ナースエンジェルりりかSOS3
ナースエンジェルりりかSOS4
☆☆☆☆
ハンドルネームの由来にまで使っているというのに何気に今まで読んだことがなかったとかいう。
ストーリーだけを抜き出すと相当暗いというか、先輩能力者が死んで非能力者まで戦闘に駆り出されたり、家族や友人が被害にあったりなどほとんど負け戦並の悲惨な状況なのですが、登場人物に色々とシリアスさが欠けるため、しょっちゅうギャグ展開になったりします。
さらに最終的にはあの伝説のラストシーンが……ってその打ち切りっぽい無理矢理なまとめは何なんだ。
彼とかは正直不要だったのではなかろうかと思うのですが、そうなると書き下ろしが困難になるな。
ところで私が本作を知るきっかけとなったのが、かつて乃諏樽慈亜って人が公開していた「恋をするたびに傷つきやすく」のMIDIです。
たまたまその曲を聴いてこれいいな、なんだろうと辿っていきました。
しかし、当時はりぼんを購読していたはずなのだけど本作を読んだ記憶が全く無いという不思議。
あとMIDIもPCの引っ越しを何度も重ねるうちに散逸してしまいました。
今からでも再入手できないかな。
リアルだと15年前の著作とか金さえあれば入手はそう難しくないけど、ネットだとそもそも存在すら残ってないことがあって残念です。
バード 雀界天使VS天才魔術師3 山根 和俊
☆☆☆
だから!無駄な!エロシーンは!要らないんだよ!!
せっかくストーリーは面白いのに台無しだ。
自動卓でもできるイカサマがめまぐるしく次々と現れてくる様は圧巻。
よくもまあこんなに色々考えつくものだ。
で、誰か実戦で使える人って存在するのですかね。
2013/06/30の実績
Gears of War: Judgment
フラッグ ランナー 25
Streets、Rig、Gondola、Library、Lost City、Museum、Checkout でフラッグを運んでポイントを獲得した
ゴラスナヤのために! 20
BREAKTHROUGH でパドックとしてフラッグを 5 本運んだ
2013/06/28の実績
Gears of War: Judgment
ボスのごとく 15
Boneyard で、FREE FOR ALL で 1 位を 5 回達成した
ロング ボム 10
Boneyard で「鬼ごっこ」リボンを獲得した
2013/06/24の実績
Gyromancer
30の勲章を持つ者 20
勲章を30種類手に入れた。
2013/06/23の実績
Gears of War: Judgment
落下したフラッグ 20
フラッグ キャリアを 20 回倒した
Gears of War: Judgment
フラッグ ランナー 25
Streets、Rig、Gondola、Library、Lost City、Museum、Checkout でフラッグを運んでポイントを獲得した
ゴラスナヤのために! 20
BREAKTHROUGH でパドックとしてフラッグを 5 本運んだ
2013/06/28の実績
Gears of War: Judgment
ボスのごとく 15
Boneyard で、FREE FOR ALL で 1 位を 5 回達成した
ロング ボム 10
Boneyard で「鬼ごっこ」リボンを獲得した
2013/06/24の実績
Gyromancer
30の勲章を持つ者 20
勲章を30種類手に入れた。
2013/06/23の実績
Gears of War: Judgment
落下したフラッグ 20
フラッグ キャリアを 20 回倒した
スクラップの提供するリアル脱出ゲーム「ある牢獄からの脱出」に参加してきました。
内容は簡単に言うとリアル脱出ゲーム。
昔Flashなどでよくあった脱出ゲーム、あれをリアルでやってしまおうという、そのまんまなナイス企画です。
我々10名は何らかの罪を犯し、脱出不可能と称される「アジト刑務所」に収監されてしまいました。
そして一時間後には処刑されてしまいます。
それまでに、ヒントをかき集めて牢獄を脱出しましょう。
牢屋はどう見ても10人は生活できない広さだとか、処刑の一時間前まで一体何やっていたんだとか、そういう細かいのはパスです。
部屋の至る所にあるヒントをかき集め、仲間と相談し、少しずつ脱獄への糸口を見つけていかなければなりません。
この手のイベントに参加したのは初めてだったので、最初は少し戸惑いました。
ヒントを集めるためにどの程度までの行動が許されるのかがよくわからなかったのですよね。
しかし最終的には部屋中の家具という家具をひっくり返し、分解できるものは分解し、警察の家捜しもかくやという勢いで怪しい情報を集めます。
集めただけで終わりではなく、それら複数の情報を突き合わせて、脱獄するための行動を起こさなければなりません。
おっと、ここから先の具体的な内容についてはもちろん秘密です。
これは簡単だなというものから、そんなん金田一くらいしかわかんねーよという超難解なものまで、数多くの謎が待ち受けています。
1時間という時間が非常に短く感じられる、実に濃密な時間でした。
ちなみにこれまでの脱出成功者数は1156組中24組という非常に狭き門ということで、当然ながら我々も処刑されてしまいました。無念。
なお、ゲーム終了後は脱出のヒントについて懇切丁寧にネタバレしてくれるので、同じゲームの二度目のプレイはありません。
他にも色々な脱出ゲームが企画されているので、少しでも興味を持った方はプレイしてみませんか?
問題は数人~10人程度という仲間を集めるのが難しいところでしょうか。
1枚だけ購入しての初対面でもプレイ可能みたいですが、さすがに敷居がマッハで高いですからね。
内容は簡単に言うとリアル脱出ゲーム。
昔Flashなどでよくあった脱出ゲーム、あれをリアルでやってしまおうという、そのまんまなナイス企画です。
我々10名は何らかの罪を犯し、脱出不可能と称される「アジト刑務所」に収監されてしまいました。
そして一時間後には処刑されてしまいます。
それまでに、ヒントをかき集めて牢獄を脱出しましょう。
牢屋はどう見ても10人は生活できない広さだとか、処刑の一時間前まで一体何やっていたんだとか、そういう細かいのはパスです。
部屋の至る所にあるヒントをかき集め、仲間と相談し、少しずつ脱獄への糸口を見つけていかなければなりません。
この手のイベントに参加したのは初めてだったので、最初は少し戸惑いました。
ヒントを集めるためにどの程度までの行動が許されるのかがよくわからなかったのですよね。
しかし最終的には部屋中の家具という家具をひっくり返し、分解できるものは分解し、警察の家捜しもかくやという勢いで怪しい情報を集めます。
集めただけで終わりではなく、それら複数の情報を突き合わせて、脱獄するための行動を起こさなければなりません。
おっと、ここから先の具体的な内容についてはもちろん秘密です。
これは簡単だなというものから、そんなん金田一くらいしかわかんねーよという超難解なものまで、数多くの謎が待ち受けています。
1時間という時間が非常に短く感じられる、実に濃密な時間でした。
ちなみにこれまでの脱出成功者数は1156組中24組という非常に狭き門ということで、当然ながら我々も処刑されてしまいました。無念。
なお、ゲーム終了後は脱出のヒントについて懇切丁寧にネタバレしてくれるので、同じゲームの二度目のプレイはありません。
他にも色々な脱出ゲームが企画されているので、少しでも興味を持った方はプレイしてみませんか?
問題は数人~10人程度という仲間を集めるのが難しいところでしょうか。
1枚だけ購入しての初対面でもプレイ可能みたいですが、さすがに敷居がマッハで高いですからね。
http://qiita.com/Nabetani/items/93cde1a6b7561426a3ac
http://nabetani.sakura.ne.jp/hena/ord11bitamida/
前回はいきなり第12回を解いてたので、だんだん後ろに戻ってみたいと思います。
今回は第11回。
お題はビットあみだくじ。
そのかわりといってはなんですが、5段以上、10行以上のあみだにも簡単に対応できます。
「オフラインリアルタイムどう書く」の一覧
http://nabetani.sakura.ne.jp/hena/ord11bitamida/
前回はいきなり第12回を解いてたので、だんだん後ろに戻ってみたいと思います。
今回は第11回。
お題はビットあみだくじ。
extractHex($hexData); foreach($bitArray as $key=>$bits){ // 1段進む $nowAmida = $this->getNext($nowAmida, $bits); } // 終了 return implode('', $nowAmida); } /** * 1段進む * 1があれば、次の0を探してそこと入れ替えればよい * @param array 現在の配列 * @param String '01010101'みたいな * @param array 一歩進んだ後の配列 */ private function getNext($nowAmida, $bits){ $bits .= '0'; // 最後の0 $left = -1; // 左端の1の場所 for($loop=0; $loop<strlen($bits); $loop++){="" 1だった="" if($bits[$loop]="=='1'){" 左端が無ければ左端としてセット="" if($left="" <="" 0){="" $left="$loop;" }="" continue;="" 0だった="" 左端がセットされていれば、その位置と入れ替える=""> -1){ list($nowAmida[$loop], $nowAmida[$left]) = [ $nowAmida[$left], $nowAmida[$loop] ]; $left = -1; } } return $nowAmida; } /** * 16進数を2進数に展開 * @param String 「d6-7b-e1-9e」みたいな文字列 * @return array ['00000000', '11111111' ] */ private function extractHex($hexData){ $bin = explode('-', $hexData); array_walk($bin, function(&$n) { $n = str_pad(base_convert($n, 16, 2), 8, '0', STR_PAD_LEFT); }); return $bin; } } // 以下はテスト $test = [ ['d6-7b-e1-9e', '740631825' ], ['83-4c-20-10', '123805476' ], ['fb-f7-7e-df', '274056813' ], ['55-33-0f-ff', '123456780' ], ['00-00-00-00', '012345678' ], ['00-00-00-55', '021436587' ], ['40-10-04-01', '021436587' ], ['00-00-aa-00', '103254768' ], ['80-20-08-02', '103254768' ], ['ff-7e-3c-18', '876543210' ], ['aa-55-aa-55', '351708264' ], ['55-aa-aa-55', '012345678' ], ['db-24-db-e7', '812543670' ], ['00-01-00-40', '021345687' ], ['00-00-80-00', '102345678' ], ['01-40-00-00', '021345687' ], ['00-00-00-02', '012345768' ], ['00-00-02-00', '012345768' ], ['00-14-00-00', '012436578' ], ['00-00-01-40', '021345687' ], ['00-80-01-00', '102345687' ], ['c8-00-00-81', '120354687' ], ['05-48-08-14', '021435687' ], ['24-05-00-f0', '413205687' ], ['40-08-14-01', '021536487' ], ['18-c8-80-80', '210534678' ], ['1c-88-52-00', '120564738' ], ['ec-dc-67-62', '213468705' ], ['0a-b6-60-e9', '035162784' ], ['52-d6-c6-c2', '120345678' ], ['47-e7-b0-36', '231047658' ], ['0f-85-91-aa', '108263754' ], ['76-b6-ed-f3', '601435782' ], ['f5-5e-f7-3d', '025847163' ], ['dd-e7-fb-f9', '610247538' ], ['8f-f4-af-fd', '583246017' ], ['bf-fb-cb-f7', '105382674' ], ['e5-fd-ff-ff', '512046378' ], ['ef-df-ef-fe', '713205648' ], ['bf-7f-fd-d7', '826437105' ], ['36-ff-df-de', '814527603' ], ['6f-dd-ff-ff', '230685147' ] ]; $amida = new AMIDA(); foreach($test as $key=>$data){ $answer = $amida->get($data[0]); if($answer !== $data[1]){ print('えらー'); } }ビット演算が苦手なので、地味に左から見ていくだけという単純かつ地道なアルゴリズムになっています。
そのかわりといってはなんですが、5段以上、10行以上のあみだにも簡単に対応できます。
「オフラインリアルタイムどう書く」の一覧
http://qiita.com/Nabetani/items/1de39df381dfeee305ab
http://nabetani.sakura.ne.jp/hena/ord12aloroturtle/
道なりの亀、という問題を見つけました。
我らがPHPで解いてる人が誰もいなかったのでやってみました。
かかった時間はたぶん1時間くらいです。
きちんと計っとけばよかった。
「オフラインリアルタイムどう書く」の一覧
http://nabetani.sakura.ne.jp/hena/ord12aloroturtle/
道なりの亀、という問題を見つけました。
我らがPHPで解いてる人が誰もいなかったのでやってみました。
かかった時間はたぶん1時間くらいです。
きちんと計っとけばよかった。
<?php class KAME{ // マップ private $mapArray = [ 'ABCDEFGHIJK', 'LMNOPQRSTUV', 'WXYZabcdefg' ,'hij?????765', 'klm?????432', 'nop?????10z' ,'qrs?????yxw', 'tuv?????vut']; // 一歩進む先 private $directionTo = [[1, 0], [0, 1], [-1, 0], [0, -1]]; // 現在地 private $nowX = 0; private $nowY = 0; // 向いてる方向 private $direction = 0; // →0↓1←2↑3 /** * 辿ったルートを取得 * @param String 辿る道順 * @param String 辿ったルート */ public function get($route){ $this->reset(); $ret = 'A'; foreach(str_split($route) as $now){ if($now === 'R'){ $this->turnRight(); continue; }elseif($now === 'L'){ $this->turnLeft(); continue; }else{ $ret .= $this->getRoute(hexdec($now)); if(substr($ret, -1) === '?'){return $ret;} continue; } } return $ret; } /** * 辿ったルートを取得 * @param int 何歩進むか * @param String 辿ったルートを表す文字列 */ private function getRoute($steps){ $ret = ''; // 歩数分繰り返し for($i=0; $i<$steps; $i++){ // 一歩進む $this->nowX += $this->directionTo[$this->direction][0]; $this->nowY += $this->directionTo[$this->direction][1]; // 進んだ先の値を取得 if(!isset($this->mapArray[$this->nowY][$this->nowX])){ return $ret . '?'; } $kame = $this->mapArray[$this->nowY][$this->nowX]; // 進んだ先が場外であれば終了 if($kame==='?'){ return $ret . '?'; } // 前回進んだ先が'tuv'であれば現在地と方向を変換 $this->routeChange($kame); // ルートを積む $ret .= $kame; } return $ret; } /** * 現在地が'tuv'の何れかである場合、現在地と方向を変更する必要がある * @param 現在地 */ private function routeChange($kame){ // tuv以外なら何もしない if(strpos('tuv', $kame) === false){ return; } // それ以外なら位置を変更、方向は反転 $this->nowX = (10 - $this->nowX); $this->turnRight(); $this->turnRight(); } /** * 右を向く */ private function turnRight(){ if(++$this->direction >= 4){$this->direction = 0;} } /** * 左を向く */ private function turnLeft(){ if(--$this->direction <= -1){$this->direction = 3;} } /** * リセット */ private function reset(){ $this->nowX = 0; $this->nowY = 0; $this->direction = 0; } } // 以下はテスト $test = []; $test[] = [ "2RcL3LL22", "ABCNYjmpsvy147edcbcdef" ]; $test[] = [ "L3R4L5RR5R3L5", "A?" ]; $test[] = [ "2ReLLe", "ABCNYjmpsvy147eTITe741yvspmjYNC" ]; $test[] = [ "1ReRRe", "ABMXilorux036fUJUf630xuroliXMB" ]; $test[] = [ "ReRRe", "ALWhknqtwz25gVKVg52zwtqnkhWLA" ]; $test[] = [ "f", "ABCDEFGHIJK?" ]; $test[] = [ "Rf", "ALWhknqtwz25gVK?" ]; $test[] = [ "1Rf", "ABMXilorux036fUJ?" ]; $test[] = [ "2Rf", "ABCNYjmpsvy147eTI?" ]; $test[] = [ "aR1RaL1LaR1R2L1L2", "ABCDEFGHIJKVUTSRQPONMLWXYZabcdefg567432" ]; $test[] = [ "2R1R2L1L2R1R2L1L2R1R2L1L2R1R2L1L2", "ABCNMLWXYjihklmponqrsvutwxy" ]; $test[] = [ "2R4R2L4L2R4R2L4L2R4R2L4L2", "ABCNYjmlknqtwxy147efgVK?" ]; $test[] = [ "R1L2R4R2L4L2R4R2L4L2R4R2L4L2", "ALMNYjmponqtwz0147eTUVK?" ]; $test[] = [ "R2L2R4R2L4L2R4R2L4L2R4R2L4L2", "ALWXYjmpsrqtwz2347eTIJK?" ]; $test[] = [ "R3L2R4R2L4L2R4R2L4L2R4R2L4L2", "ALWhijmpsvutwz2567eTI?" ]; $test[] = [ "R5L2L5L1LaR1L4L5", "ALWhknopmjYNCBMXilorux0325gVKJIHGF" ]; $test[] = [ "1R2L4L2R4R2L4L2R4", "ABMXYZabQFGHIJUfg?" ]; $test[] = [ "2R2L4L2R4R2L4L2R4", "ABCNYZabcRGHIJKVg?" ]; $test[] = [ "3R2L4L2R4R2L4L2R4", "ABCDOZabcdSHIJK?" ]; $test[] = [ "4R2L4L2R4R2L4L2R4", "ABCDEPabcdeTIJK?" ]; $test[] = [ "5R2L4L2R4R2L4L2R4", "ABCDEFQbcdefUJK?" ]; $test[] = [ "LLL1RRR1LLL1RRR2R1", "ALMXYZ?" ]; $test[] = [ "R3RRR3", "ALWhij?" ]; $test[] = [ "1LLL4RRR1LR1RL1", "ABMXilm?" ]; $test[] = [ "R2L1R2L1R3R4", "ALWXilmpsvut?" ]; $test[] = [ "7R4f47LLLc6R9L", "ABCDEFGHSd?" ]; $test[] = [ "5RR868L8448LL4R6", "ABCDEFEDCBA?" ]; $test[] = [ "42Rd1RLLa7L5", "ABCDEFGRc?" ]; $test[] = [ "RRLL6RLR1L5d12LaLRRL529L", "ABCDEFGRSTUV?" ]; $test[] = [ "RLR7L6LL1LRRRcRL52R", "ALWhknqtuv?" ]; $test[] = [ "1RLR8RLR1R437L99636R", "ABMXiloruxwtqnkhWLA?" ]; $test[] = [ "LLL2L3La9Le5LRR", "ALWXYZOD?" ]; $test[] = [ "R1LcRR491", "ALMNOPQRSTUV?" ]; $test[] = [ "R8L1R1R512L8RLLReRf", "ALWhknqtwx0z?" ]; $test[] = [ "1RcL8f1L29a5", "ABMXilorux036fedcbaZYXW?" ]; $test[] = [ "R822LeL46LL39LL", "ALWhknqtwz25gfedcbaZYXW?" ]; $test[] = [ "9R3L5LRRLb5R3L7cLLLR4L", "ABCDEFGHIJUf65?" ]; $test[] = [ "7LLRRR2R3R69Lf76eR2L", "ABCDEFGHSdcbaPE?" ]; $test[] = [ "8RRRLL3Le", "ABCDEFGHITe765?" ]; $test[] = [ "8R5RLL6LbL4LL5bL", "ABCDEFGHITe7410z?" ]; $test[] = [ "6LR2R1LR5LRLRL484L63", "ABCDEFGHITe741yxw?" ]; $kame = new KAME(); foreach($test as $key=>$data){ $route = $kame->get($data[0]); if($route !== $data[1]){ print('えらー'); } }
「オフラインリアルタイムどう書く」の一覧
http://blog.generace.co.jp/2013/06/21/894
なんか前提の時点でおかしい。
> 1.ループ処理を比較
> 2.インクリメントの前置と後置を比較
速度ではなく目的によって使い分けるべき。
あとIteratorは?
> 3.if else と 三項演算子を比較
> 4.if else と switch を比較
if($a){/* */}elseif($b){/* */}という比較は三項演算子やswitchでは(普通に使う限り)できない。
> 5.== と === の比較
理由がない限り===を使うべき。
> 6.empty と count の比較
count(false)→1
PDOStatement::fetch()は結果セットが無いとFALSEを返すので誤診断する。
まあfetchAll()使えばいいっちゃいいんですが。
というかむしろここでこそ5番目の==を使ってif($list)にした方がいいと思われる。
> 7.isset と array_key_exists の比較
isset($list[0], $list[1])という使い方はarray_key_existsではできない。
> まとめ
ここまでの中身とまとめ全然関係ねえ!
そういや前回のコードもフルボッコにされてるのにそのままですね。
Web系なのにこういうフットワークの鈍いところはちょっと。
なんか前提の時点でおかしい。
> 1.ループ処理を比較
> 2.インクリメントの前置と後置を比較
速度ではなく目的によって使い分けるべき。
あとIteratorは?
> 3.if else と 三項演算子を比較
> 4.if else と switch を比較
if($a){/* */}elseif($b){/* */}という比較は三項演算子やswitchでは(普通に使う限り)できない。
> 5.== と === の比較
理由がない限り===を使うべき。
> 6.empty と count の比較
count(false)→1
PDOStatement::fetch()は結果セットが無いとFALSEを返すので誤診断する。
まあfetchAll()使えばいいっちゃいいんですが。
というかむしろここでこそ5番目の==を使ってif($list)にした方がいいと思われる。
> 7.isset と array_key_exists の比較
isset($list[0], $list[1])という使い方はarray_key_existsではできない。
> まとめ
ここまでの中身とまとめ全然関係ねえ!
そういや前回のコードもフルボッコにされてるのにそのままですね。
Web系なのにこういうフットワークの鈍いところはちょっと。
前回の続き。
interfaceのinstanceofで引数判定、なんてよくやることですが、instanceof演算子はtraitには反応しません。
http://tanakahisateru.hatenablog.jp/entry/20110704/1309781929
> そりゃまあ当然で、PHP5.4のトレイトは、使用者側でアドホックにメソッド名の置き換えすらできてしまうので、「必ず特定のメソッドに応答することを保証する」インターフェースとしては使えないです。
実は元のメソッド名でも反応します。
asは単にエイリアスを作るだけなので、元のメソッド自体は残っているのです。
参考リンク先にも普通に
> Test class will now have "hello" and "helloA" methods
って書かれています。
従ってトレイトを「必ず特定のメソッドに応答することを保証する」インターフェースとして使用することは可能……と思いきや実はできません。
B::hoge as private;ってするとCall to private methodになっちゃうんですよね。
なんてこった。
ということで先方のサイトはこう読み直すのがよいでしょう。
> そりゃまあ当然で、PHP5.4のトレイトは、使用者側でアドホックに可視性の変更すらできてしまうので、「必ず特定のメソッドに応答することを保証する」インターフェースとしては使えないです。
まあ、せっかくなのでtraitをインターフェースとして使ってみます。
特にトレイト名を文字列で与えているあたりが微妙だ。
トレイト名はクラス名のようには扱うことができず、use節以外で使用するとUse of undefined constantのNoticeになってしまうようです。
こんな面倒なことをせず素直にmethod_exists($d, 'hoge')でいいや、と思ったのは秘密。
PHPにはこういう横紙破りな関数が揃ってるのが良くも悪くもナイスですね。
interfaceのinstanceofで引数判定、なんてよくやることですが、instanceof演算子はtraitには反応しません。
<?php // 基底クラス class A{} // trait trait B{ public function hoge(){ print('B::hoge/'.__CLASS__.'/'.__METHOD__); } } trait C{ public function hoge(){ print('C::hoge/'.__CLASS__.'/'.__METHOD__); } } // Aを継承したクラス class D extends A{ // トレイトB,Cを使用 use B, C{ // B::hogeを優先 B::hoge insteadof C; // B::hogeをfoo()に改名 B::hoge as foo; // C::hogeをbar()に改名 C::hoge as bar; } } $d = new D(); $d->foo(); // B:hoge/D/B::hoge $d->bar(); // C:hoge/D/C::hoge $d->hoge(); // B:hoge/D/B::hoge 元のメソッド名でも反応する $d instanceof A; // true $d instanceof C; // false
http://tanakahisateru.hatenablog.jp/entry/20110704/1309781929
> そりゃまあ当然で、PHP5.4のトレイトは、使用者側でアドホックにメソッド名の置き換えすらできてしまうので、「必ず特定のメソッドに応答することを保証する」インターフェースとしては使えないです。
実は元のメソッド名でも反応します。
asは単にエイリアスを作るだけなので、元のメソッド自体は残っているのです。
参考リンク先にも普通に
> Test class will now have "hello" and "helloA" methods
って書かれています。
従ってトレイトを「必ず特定のメソッドに応答することを保証する」インターフェースとして使用することは可能……と思いきや実はできません。
B::hoge as private;ってするとCall to private methodになっちゃうんですよね。
なんてこった。
ということで先方のサイトはこう読み直すのがよいでしょう。
> そりゃまあ当然で、PHP5.4のトレイトは、使用者側でアドホックに可視性の変更すらできてしまうので、「必ず特定のメソッドに応答することを保証する」インターフェースとしては使えないです。
まあ、せっかくなのでtraitをインターフェースとして使ってみます。
<?php /** * @param Object インスタンス * @param String トレイト名 * @return boolean instanceof */ function trait_instanceof($trait, $className){ $class = new ReflectionClass($trait); $traits = $class->getTraitNames(); return in_array($className, $traits, true); } $is = trait_instanceof($d, 'B');微妙だ。
特にトレイト名を文字列で与えているあたりが微妙だ。
トレイト名はクラス名のようには扱うことができず、use節以外で使用するとUse of undefined constantのNoticeになってしまうようです。
こんな面倒なことをせず素直にmethod_exists($d, 'hoge')でいいや、と思ったのは秘密。
PHPにはこういう横紙破りな関数が揃ってるのが良くも悪くもナイスですね。
放課後アトリエといろ1 華々 つぼみ
放課後アトリエといろ2
放課後アトリエといろ3
放課後アトリエといろ4
☆☆☆☆☆
まあ正直、よくある微百合萌え4コマなのですが、凛が可愛くて可愛くて。
というか一人に属性が多すぎて、どうも作者も贔屓にしてるような気がしてます。
最初の1巻はどうなんだろうなあと思ったのですが、キャラの立ち位置がはっきりしてくる2巻以降どんどん面白くなってきます。
数話かけての大きめな話もあったりしていいかんじです。
で、4巻まで読んで続きが楽しみだなあとブログを見に行ってみたら打ち切りとかどういうこった!ファック!
頼むからどこか引き取ってください。
あと4巻のカバーを剥がしては駄目だぞ。
4巻まで読んだ時点で☆☆☆☆くらいで、その後凛のあまりの可愛さに読み返したら1巻から新たな発見があったりしてどんどん評価が上昇してます。
なんといっても最初から立ち位置がほとんどぶれていないのが凄い。
大抵こういうのって話の展開に連れて性格や性根が変わっていくものですが、本作はキャラの登場前から変わっていません。
藤乃の速筆と部長の超設定くらい?
連載開始時は現役女子高生だったらしいですが、その頃からこんなに設定固めてあるとかすごい。
侵略! イカ娘14 安部 真弘
☆☆☆
何にも特筆すべきことがない。
特に盛り上がりもへったくれもない。
でも買っちゃう。
なんだろうこの気持ち。