忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2025/07/27 04:10 |
今週の実績 2013/07/21
2013/07/18の実績

地球防衛軍4

スーパーレスキュー 15
協力プレイ時に、他プレイヤーを50人救助した

2013/07/17の実績

地球防衛軍4

ビー・ハンター 15
飛行型巨大生物を4000体倒す

2013/07/15の実績

地球防衛軍4

デス・ハンター 15
デスクイーンを24体倒す
PR


2013/07/21 21:31 | Comments(0) | 実績
PHP5.3.7 「第8回オフラインリアルタイムどう書くの問題」をPHPで解く
http://qiita.com/Nabetani/items/709d61dff282cff7a890
http://nabetani.sakura.ne.jp/hena/ord8biboma/

ボンバーマンで爆風が到達する場所を図示せよというお題。

解ける人はたぶんビット演算とかでずばしゃー!と解くのでしょうけど、私はそのあたりがよくわからないんですよね。
なので懇切丁寧に、2次元表になおすという人間に優しい解き方をしてみようと思います。
<?php

	class BOMBERMAN{
	
		/**
		* 爆風の範囲を返す
		* @param  String 「802b1200/01400c20」みたいな文字列
		* @return String 「53c40cfc」みたいな文字列
		*/
		public function get($input){
			
			// 入力値を2次元表に分解
			$array = explode('/', $input);
			$wall = str_split(substr(str_pad(base_convert($array[0], 16, 2), 32, '0', STR_PAD_LEFT), 0, -2), 6);
			$bomb = str_split(substr(str_pad(base_convert($array[1], 16, 2), 32, '0', STR_PAD_LEFT), 0, -2), 6);
			
			// 爆風の位置
			$blast = $bomb;
			
			// 爆弾の行でくるくる
			foreach($bomb as $key=>$val){
				// 爆弾の列でくるくる
				for($i=0; $i<strlen($val); $i++){
					// 爆弾があれば爆発
					if($val[$i] === '1'){
						$this->explosion($blast, $wall, $key, $i);
					}
				}
			}
			
			// 16進数に戻す
			return str_pad(base_convert(implode('', $blast) . '00', 2, 16), 8, '0', STR_PAD_LEFT);
		}
		
		/**
		* ば く は つ するーーー!
		* @param &array 爆風が通った場所が1になる
		* @param array 壁
		* @param int 列
		* @param int 行
		*/
		private function explosion(&$blast, $wall, $column, $row){
			// 行を1埋め
			$key1 = $key2 = $row;
			// 爆弾より右が壁にぶつかるまで1で埋める。以下同じ
			while(@$wall[$column][$key1] === '0'){
				$blast[$column][$key1++] = '1';
			}
			while(@$wall[$column][$key2] === '0'){
				$blast[$column][$key2--] = '1';
			}
			// 列を1埋め
			$key1 = $key2 = $column;
			while(@$wall[$key1][$row] === '0'){
				$blast[$key1++][$row] = '1';
			}
			while(@$wall[$key2][$row] === '0'){
				$blast[$key2--][$row] = '1';
			}
		}
		
	}
	
	// テスト
	$test = [
		['802b1200/01400c20', '53c40cfc'],
		/* 省略 */
	];

	$bomberman = new BOMBERMAN();
	foreach($test as $key=>$data){
		$answer = $bomberman->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
爆弾と壁と爆風の表も別々にする必要がなく、値を1,2,4とかにすれば1枚で済むのですが、面倒なのでわかりやすくするために別にしています。
実際計算中の値は以下のようになっており、
$wall = array(5) {
  [0]=>
  string(6) "100000"
  [1]=>
  string(6) "000010"
  [2]=>
  string(6) "101100"
  [3]=>
  string(6) "010010"
  [4]=>
  string(6) "000000"
}
$bomb = array(5) {
  [0]=>
  string(6) "000000"
  [1]=>
  string(6) "010100"
  [2]=>
  string(6) "000000"
  [3]=>
  string(6) "001100"
  [4]=>
  string(6) "001000"
}
$blast = array(5) {
  [0]=>
  string(6) "010100"
  [1]=>
  string(6) "111100"
  [2]=>
  string(6) "010000"
  [3]=>
  string(6) "001100"
  [4]=>
  string(6) "111111"
}
実に人間に優しい形で確認することができます。
かかった時間は3時間くらい。
ビット演算はわかんないとか言いつつ実際やってみようと延々挑戦したあげく挫折したとかいう歴史があったりなかったり。

なおgmp_scan1()とかの使いどころを探してみたがちょっと無理だった。


「オフラインリアルタイムどう書く」の一覧


2013/07/19 23:59 | Comments(0) | PHP
PHP5.3.7 「第9回オフラインリアルタイムどう書くの参考問題」をPHPで解く
http://qiita.com/Nabetani/items/7c46e8409c456e8fabd1
http://nabetani.sakura.ne.jp/hena/ord9nummake/

与えられたカードから4桁の順列を作る問題です。
解く方法は、カードから順列を作成する方法と、全数探査のふたつにおおまかにわけられるでしょう。
Rubyだとpermutationなどという反則メソッドがありますが、何故かPHPにはありません。
全数探査で解いてみます。
<?php
	class NUMMAKE{
		
		/**
		* 4桁の数を作って指定番目の値を返す
		* @param String 「13:01167」みたいな文字列
		* @return String 1109 (01167で作れる数のうち13番目)、無しの場合は「-」
		*/
		public function get($input){
			$nowCount = 0;
			
			// 入力を分解
			list($count, $tmp) = explode(':', $input);
			$tmp = str_replace('9', '6', $tmp);
			$nums = array_fill(0, 9, 0);
			for($i=0; $i<strlen($tmp); $i++){
				$nums[$tmp[$i]]++;
			}
			
			foreach(range('1000', '9999') as $int){
				$numbers = $nums;
				$str = str_replace('9', '6', $int);
				
				// 適合しなければ次に進む
				for($i=0; $i<strlen($str); $i++){
					if($numbers[$str[$i]]-- <= 0){
						continue 2;
					}
				}
				
				if(++$nowCount >= $count){
					// 規定番目がみつかった
					return (string)$int;
				}
			}
			
			// 見つからなかった
			return '-';
		}
	}
	
	// テスト
	$test = [
		['13:01167', '1109'],
		/* 省略 */
	];

	$num = new NUMMAKE();
	foreach($test as $key=>$data){
		$answer = $num->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}

今回は全数が9000個しかなかったので手っ取り早くforeachで回してます。
これが今度は6桁7桁の順列を作る、とかになったらカードから順列を作成する方法を取らないといけなくなるでしょう。

かかった時間は2時間程度。
最初カードから順列で作ろうとしてめんどくさいことになり、全数探査で作り直したら30分で終わったとかいう。


「オフラインリアルタイムどう書く」の一覧


2013/07/15 20:55 | Comments(0) | PHP
買ったものリスト 2013/07/14
今週はピクミンにデッドアイランドも発売されたというのに、地球防衛に忙しすぎてとても手が回りません。
どうしてそんなまとめて発売するんだ。
そういやデッドアイランドの日記は途中打ち切りみたいになってますが、実際は全28回既に書き終わってます。


きんいろモザイク1 原 悠衣
きんいろモザイク2
☆☆☆

1巻読んでお、いいかな、と思ったけど2巻を読んであ、もういいや、となった。


さえずり少女、しんしん鎌倉 matoba
☆☆☆☆☆

金髪少女が日本にホームステイ、というどこかすぐ上で聞いたような設定。
でも百合要素は全く無い、爽やか目で少しだけ切ない話となっています。
話が終わってしまったため一巻であっさり完結となってしまいました。
もっと見ていたいですが、でも続いてしまうとどうでもいい4コマに成り下がってしまうだろうからこれでいいのかもしれません。
作者買いに追加かな。


エスパー魔美4 藤子・F・不二雄
エスパー魔美5
☆☆☆☆

所有を明言してしまいました。
これで捕まっちゃうかな。
たしか小学生だったかのころにこれとハーイあっこですを見ていた記憶が。


2013/07/14 21:16 | Comments(0) | 買ったもの
今週の実績 2013/07/14
2013/07/08の実績

地球防衛軍4

レスキュー 15
レスキュー
協力プレイ時に、他プレイヤーを5人救助した


2013/07/14 20:15 | Comments(0) | 実績
PHP5.3.7 「第12回オフラインリアルタイムどう書くの問題」をPHPで解く
http://qiita.com/Nabetani/items/f3cca410428f90333e28
http://nabetani.sakura.ne.jp/hena/ord12rotdice/

さいころを転がして出た目を記録します。
単純に考えれば配列に全ての面を入れておけばいいだけなので、その方針にしたがって実装します。
世の中にはすごいことを考える人もいますが、私ががんばってこういうコードを書いたとして、後から見直したら絶対意味がわからない自信がある。

<?php
	class DICE{
	
		/**
		* さいころをコロコロして歩いた目を返す
		* @param String 「NNESWWS」みたいな文字列
		* @return String 「15635624」みたいな文字列
		*/
		public function get($input){
			// 初期値 順に上下東西南北
			$dice = [1, 6, 4, 3, 5, 2];
			$ret = (string)$dice[0];
			
			// 進む方向
			$next = [
				 'N' => [5,4,2,3,0,1]
				,'S' => [4,5,2,3,1,0]
				,'W' => [3,2,0,1,5,6]
				,'E' => [2,3,1,0,5,6]
			];
			
			// 順番に進むだけ
			for($i=0; $i<strlen($input); $i++){
				$dice = array_combine($next[$input[$i]], $dice);
				ksort($dice);
				$ret .= $dice[0];
			}
			
			// 終了
			return $ret;
		}
	}
	
	// テスト
	$test = [
		['NNESWWS', '15635624'],
		/* 省略 */
	];

	$dice = new DICE();
	foreach($test as $key=>$data){
		$answer = $dice->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
20分くらいですぐに終わりました。
まあ、実は昔同じことをやったことがあるので、そのときの知識を流用しただけです。
やったことがなければもう少しかかってたかと思われます。

$nextは、さいころが転がったときに、どの面がどの方向に移動するかを表す表です。
北(N)に転がったとしたら、そのときに上を向いていた面(方向0)は北(方向5)に向き直る、という形です。

ksortが微妙だな。
こいつは参照渡しなので$dice = ksort(array_combine($next[$input[$i]], $dice))とか書けないんですよね。


「オフラインリアルタイムどう書く」の一覧


2013/07/12 23:51 | Comments(0) | PHP
PHP5.3.7 「第9回オフラインリアルタイムどう書くの問題」をPHPで解く
http://qiita.com/Nabetani/items/84255ac417ef25069a3b
http://nabetani.sakura.ne.jp/hena/ord9busfare/

順番からいうと「第10回オフラインリアルタイムどう書くの参考問題」ですが、どうも泥臭い方法しか考えつかないのでとりあえず保留します。
今回は年齢区分によるバス代の算出です。
大人一人で幼児二人無料といった割引を考慮して算出する必要があります。
<?php
	class BUS{
		/**
		* バス代を算出
		* @param String 「210:Cn,In,Iw,Ap,Iw」みたいな文字列
		* @param int バス代
		*/
		public function get($input){
			// 入力値を分解
			list($adlultPrice, $persons) = explode(':', $input);
			
			// 料金を算出
			$prices = ['Ap'=>0, 'Cp'=>0, 'Ip'=>0];
			$prices['An'] = (int)$adlultPrice;
			$prices['Cn'] = $prices['In'] = $prices['Aw'] = (int)ceil($adlultPrice/20)*10;
			$prices['Cw'] = $prices['Iw'] = (int)ceil($prices['Cn']/20)*10;
			
			// 客をACI,nwの順にソート
			$persons = explode(',', $persons);
			usort($persons, function($a, $b){
				if(($tmp = strcmp($a[0], $b[0])) === 0){
					return strcmp($a[1], $b[1]);
				}
				return $tmp;
			});
			
			// 順番に処理
			$sumPrice = 0;
			$adultCount = 0;
			foreach($persons as $person){
				// 大人割引
				if($person[0] === 'A'){
					$adultCount+=2;
				}elseif($person[0] === 'I' && $person[1] !== 'p' && $adultCount>0){
					$adultCount--;
					continue;
				}
				// 合計金額
				$sumPrice += $prices[$person];
			}
			
			// 終了
			return $sumPrice;
		}
	}
	
	// テスト
	$test = [
		['210:Cn,In,Iw,Ap,Iw', '170'],
		/* 省略 */
	];

	$bus = new BUS();
	foreach($test as $key=>$data){
		$answer = $bus->get($data[0]);
		if($answer !== (int)$data[1]){
			print('えらー');
		}
	}

なんつーか、特筆することが極めて無い中身になった。
なおソートするところで'p'を無視していますが、こいつは0円なので何処に出てこようが気にする必要はありません。
一見幼児割引のところでチェックする必要がある気がしますが、実は単に弾くだけで問題無いです。

かかった時間は一時間くらい。
最初$personsをさらに年齢区分と料金区分の配列にして処理してたけど、意味がないなと削ったので多少無駄な時間があります。


「オフラインリアルタイムどう書く」の一覧


2013/07/08 22:14 | Comments(0) | PHP
買ったものリスト 2013/7/07
地球防衛軍4、プレイ時間が4日で40時間になりました。


ご注文はうさぎですか?1 Koi
ご注文はうさぎですか?2
☆☆☆

基本的にキャラが可愛いだけの話。
しかしまあ次も買ってもいいかなと思う程度にはできてます。
世界観は基本的に現代日本で特殊な設定とかはありません(未成年が労働してるのはお約束なのでパス)が、何故か一カ所だけ超設定があります。
今のところ必要性が全く無くて存在する意味がわかりません。
そのうちきちんと決着付けてくれるんだろうな。

ところで条河麻耶だけ元ネタがわからん。


ひよっこシスターの安息1 山田 古都子
ひよっこシスターの安息2
☆☆☆

たいしたネタも盛り上がる部分も、そしてキャラの掘り下げもほとんど無い、淡々と進む日常4コマ。
うさぎに輪をかけてキャラだけの話で、しかも基本的に主人公だけがメインです。
なんというかどうでもいいような内容なんですが、そのゆるいところが何故か少し気に入りました。
が、他にもキャラがいたのに掘り下げる前に打ち切られてしまいました。残念。


地球防衛軍4
☆☆☆☆☆

青い地球を守るため~♪
EDFの出動だ~♪
煌めけ勝利の稲光~♪
宇宙人共撃滅だ!

初回クリアまでのプレイ時間は26時間、武器取得数は174。
つまり、全然まだまだ先は長いってことです。
色々とここはちょっと……と感じるところもありますが、そんな細かいところなどどうでもよくなるくらいに地球防衛軍でした。
みんなも一緒にEDF!EDF!


2013/07/07 23:30 | Comments(0) | 買ったもの
今週の実績 2013/07/07

2013/07/06の実績

地球防衛軍4

マスターダイバー 15
ウイングダイバーの体力が550に到達

2013/07/05の実績

地球防衛軍4

武器入手10% 15
武器の入手率が10%

2013/07/04の実績

地球防衛軍4

高度200メートル 10
高度200メートルに到達した

Gears of War: Judgment

オールド スクール マラソン 10
BloodDrive で 10 マッチ プレイした

2013/07/03の実績

Gears of War: Judgment

隠れても無駄 10
Ward で「空中ハンター」リボンを獲得した

2013/07/01の実績

Gears of War: Judgment

拾いもの 15
Lost City で FFA モードをプレイし、 1 ゲーム内で拾った全武器でキルを達成した

怒涛の進撃 30
いずれかの DLC マップで、8 分以内にジェネレーターを破壊した



2013/07/07 22:30 | Comments(0) | 実績
PHP5.3.7 「第10回オフラインリアルタイムどう書くの問題」をPHPで解く
http://qiita.com/Nabetani/items/55641767510c2f9f235f
http://nabetani.sakura.ne.jp/hena/ord10haniwa/

第10回はハニカム歩きです。
ていうかこれ、第12回の道なりの亀と同じだよな。
ただし進行方向が6方向と、二次元配列で解くには少々面倒になっています。
ということで手っ取り早く進行先を全部持たせることにします。

 'BCDEFG','B' => 'HICAGS','C' => 'IJKDAB','D' => 'CKLMEA','E' => 'ADMNOF','F' => 'GAEOPQ',
			'G' => 'SBAFQR','H' => 'TUIBSk','I' => 'UVJCBH','J' => 'VWXKCI','K' => 'JXYLDC','L' => 'KYZaMD',
			'M' => 'DLabNE','N' => 'EMbcdO','O' => 'FENdeP','P' => 'QFOefg','Q' => 'RGFPgh','R' => 'jSGQhi',
			'S' => 'kHBGRj','T' => '!!UHk!','U' => '!!VIHT','V' => '!!WJIU','W' => '!!!XJV','X' => 'W!!YKJ',
			'Y' => 'X!!ZLK','Z' => 'Y!!!aL','a' => 'LZ!!bM','b' => 'Ma!!cN','c' => 'Nb!!!d','d' => 'ONc!!e',
			'e' => 'POd!!f','f' => 'gPe!!!','g' => 'hQPf!!','h' => 'iRQg!!','i' => '!jRh!!','j' => '!kSRi!','k' => '!THSj!'
		];
		
		/**
		* はにかむ構造を解いて返す
		* @param String 「135004」みたいな文字列
		* @param String 「ACDABHS」みたいな文字列
		*/
		public function get($route){
			$ret = $now = 'A';
			foreach(str_split($route) as $val){
				$next = $this->next[$now][$val];
				$ret.= $next;
				// !の場合は先に進まない
				if($next !== '!'){
					$now = $next;
				}
			}
			return $ret;
		}
	}
	
	// テスト
	$test = [
		[ '135004', 'ACDABHS' ],
		/* 省略 */
	];

	$honeycomb = new HONEYCOMB();
	foreach($test as $key=>$data){
		$answer = $honeycomb->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}

今回はえらい簡単でした。
20分くらいで終わった。
もしかしたら第12回もこの方法でやった方が簡単だったかもしれぬ。

「オフラインリアルタイムどう書く」の一覧


2013/07/05 22:15 | Comments(0) | PHP

<<前のページ | HOME | 次のページ>>
忍者ブログ[PR]