どこぞの会社の入社試験をPHPで2011

去年 http://d.hatena.ne.jp/hirai428/20100408
今回の問題 http://okajima.air-nifty.com/b/2011/01/2011-ffac.html


110分かけてスパゲティ書きました!!
途中10分ぐらいウンコしてて10分ぐらい課長と話してたので実質90分かな。
ウンコ中はこれのこと考えてませんでした。

タイム意識して頭のなかでまとめずにガリガリ書いてたのがいかんかったようで、途中で混乱したうえにバグ出た。
コメントが詳細に書いてあるあたりがそのあたりですね。
正直まだバグ潜んでそうだけど全消しできたし120分が近いしでこれでひとまず提出することにします。
あとの10分でやることとしたらコメント整備かしらね。

ちなみにPHPは我流なので「ここおかしいよ!」とかすごいありそうです(去年も同じこと言った)
PHP触るの1年以上ぶりで構文とか全然覚えてなかったね。
2010年の僕の回答を参考にしました。

そんなわけでウンコスパゲティソース。
白い皿に漏られた(意図的な誤字)スパゲティミートソースを携帯カメラで撮ってセピア加工するとウンコまみれの便器みたいになるよ。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS" />
</head>
<body>
<?php
//ぷよぷよの問題 15:30〜

class Puyo2{

	const KAIGYO = "\r\n";
	const BLANK = " ";
	const MIN_ERASE = 4;


	public static function execute($field2dArr){
	
		print("<table border=\"1\"><tbody>");
		print("<tr><td style=\"font-family:MS ゴシック;\"><pre>");
		print("開始!\n");
		Puyo2::printField2dArr($field2dArr);
		print("</pre></td></tr>");
		
		$count = 0;
		
		for(;;){
			$sameField = Puyo2::getSameField($field2dArr);
			$erased = Puyo2::erasePuyo($field2dArr, $sameField);
			if($erased === false){
				break;
			}
			print("<tr><td><pre>");
			print(++$count."れんさ!\n");
			Puyo2::printField2dArr($erased);
			print("</pre></td></tr>");
			
			$field2dArr = $erased;
		}
		print("</tbody></table>");
	}
	
	public static function erasePuyo($field2dArr, $sameField){
		$height = count($field2dArr);
		if($height == 0){
			return false;
		}
		$width = count($field2dArr[0]);
		if($width == 0){
			return false;
		}
		
		$erasing = $field2dArr;
		
		//消す
		$isErased = false;
		for($i = 0; $i < $height; $i++){
			for($j = 0; $j < $width; $j++){
				if(count($sameField[$i][$j]) + 1 >= Puyo2::MIN_ERASE){
					$erasing[$i][$j] = Puyo2::BLANK;
					$isErased = true;
				}
			}
		}
		if(!$isErased){
			return false;
		}
		
		//落とす
		for($j = 0; $j < $width; $j++){
			$vertical = array();
			for($i = 0; $i < $height; $i++){
				if($erasing[$i][$j] !== Puyo2::BLANK){
					array_push($vertical, $erasing[$i][$j]);
				}
			}
			
			
			for($i = $height - 1; $i >= 0; $i--){
				$puyo = array_pop($vertical);
				if($puyo == null){
					$erasing[$i][$j] = Puyo2::BLANK;
				}else{
					$erasing[$i][$j] = $puyo;
				}
			}
		}
		
		return $erasing;
	}

	public static function getSameField($field2dArr){
		
		//左上からチェックし、左と上をチェック
		$height = count($field2dArr);
		if($height == 0){
			return false;
		}
		$width = count($field2dArr[0]);
		if($width == 0){
			return false;
		}
		
		
		$sameField = array();
		for($i = 0; $i < $height; $i++){
			$sameRow = array();
			for($j = 0; $j < $width; $j++){
				$sameRow[$j] = array();
			}
			$sameField[$i] = $sameRow;
		}

		for($i = 0; $i < $height; $i++){
			for($j = 0; $j < $width; $j++){
				if($field2dArr[$i][$j] === Puyo2::BLANK){
					continue;
				}
				
				//最初の列でない場合、現在地と左を比較
				if($j != 0){
					if($field2dArr[$i][$j] === $field2dArr[$i][$j - 1]){
						//左の持っている情報を現在地に持たせる
						$sameField[$i][$j] = $sameField[$i][$j - 1];
						//左自身の情報を現在地に持たせる
						array_push($sameField[$i][$j], new Point($i, $j - 1));
					
						foreach($sameField[$i][$j - 1] as $same){
							//左の持っている情報に現在地の情報を持たせる
							array_push($sameField[$same->row][$same->column], new Point($i, $j));
						}
						//左に現在地の情報を持たせる
						array_push($sameField[$i][$j - 1], new Point($i, $j));
					}
				}
				
				//最初の行でない場合、現在地と上を比較
				if($i != 0){
					if($field2dArr[$i][$j] === $field2dArr[$i - 1][$j]){
						$sameAboveAndLeft = false;
						//最初の列でない場合、上を左と比較
						if($j != 0){
							foreach($sameField[$i - 1][$j] as $above){
								if($above->row == $i && $above->column == ($j - 1)){
									$sameAboveAndLeft = true;
								}
							}
						}
					
						//上と左が同じ塊であると判別されていない場合のみ以下処理
						if(!$sameAboveAndLeft){
							
							$tempSelf = $sameField[$i][$j];
							$tempAbove = $sameField[$i - 1][$j];
							
							//上が情報を持っている場合
							if(!empty($tempAbove)){
								//上の持っている情報を現在地に持たせる
								$sameField[$i][$j] = array_merge($sameField[$i][$j], $tempAbove);
								//上の持っている情報を現在地の持っている情報に持たせる
								foreach($tempSelf as $same){
									$sameField[$same->row][$same->column] = array_merge($sameField[$same->row][$same->column], $tempAbove);
								}
							}
							//上自身の情報を現在地に持たせる
							array_push($sameField[$i][$j], new Point($i - 1, $j));
							//上自身の情報を現在地の持っている情報に持たせる
							foreach($tempSelf as $same){
								array_push($sameField[$same->row][$same->column], new Point($i - 1, $j));
							}
							
							//現在地が情報を持っている場合
							if(!empty($tempSelf)){
								//現在地の持っている情報を上に持たせる
								$sameField[$i - 1][$j] = array_merge($sameField[$i - 1][$j], $tempSelf);
								//現在地の持っている情報を上の持っている情報に持たせる
								foreach($tempAbove as $same){
									$sameField[$same->row][$same->column] = array_merge($sameField[$same->row][$same->column], $tempSelf);
								}
							}
							
							//現在地自身の情報を上に持たせる
							array_push($sameField[$i - 1][$j], new Point($i, $j));
							//現在地自身の情報を上の持っている情報に持たせる
							foreach($tempAbove as $same){
								array_push($sameField[$same->row][$same->column], new Point($i, $j));
							}
						}
					}
				}
			}
		}
		
		return $sameField;
	}
	
	public static function printField2dArr($field2dArr){
		foreach($field2dArr as $row){
			print implode("", $row);
			print Puyo2::KAIGYO;
		}
	}
	
	public static function readField($fieldStr){
		$exploded = explode(Puyo2::KAIGYO, $fieldStr);
		$ret = array();
		$i = 0;
		$maxLen = 0;

		foreach($exploded as $str){
			$len = strlen($str);
			$maxLen = max($maxLen, $len);
		}
		
		foreach($exploded as $str){
			$arr = array();
		
			for($j = 0; $j < $maxLen; $j++){
				if(isset($str[$j])){
					$arr[$j] = $str[$j];
				}else{
					$arr[$j] = Puyo2::BLANK;
				}
				
			}
			$ret[$i++] = $arr;
		}
		return $ret;
	}
}

class Point{
	var $row;
	var $column;
	
	public function __construct($row, $column){
		$this->row = $row;
		$this->column = $column;
	}
}

$input = file_get_contents("input.txt");
Puyo2::execute(Puyo2::readField($input));

?>
</body>
</html>

1年で何も成長してないどころか経年劣化してる気すらする。
まだ27歳なんだけどね。


あっここに置いてある108連鎖も動いたよ やったね
http://d.hatena.ne.jp/heisseswasser/20110223/1298429883