忍者ブログ
[PR]
×

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



2017/03/27 21:42 |
PHP5.5.0 「第2回オフラインリアルタイムどう書くの参考問題」をPHPで解く
http://qiita.com/Nabetani/items/9d80de41903775296ca6

画像を回転させる問題です。
絶対に誰も真似しない方法で回答。
<?php

	class ROTATE{
		
		/**
		* 画像を回転させる
		* @param  String 「3:5b8」みたいな文字列
		* @return String 「3:de0」みたいな文字列
		*/
		public function get($input){
			// 入力を2進数に
			list($size, $hex) = explode(':', $input);
			$bit = '';
			$tmp = str_split($hex, 4);
			foreach($tmp as $key=>$val){
				$bit .= sprintf('%0'.(strlen($val)*4).'s', base_convert($val, 16, 2));
			}
			
			// 指定サイズの黒画像を作成
			$image = imagecreatetruecolor($size, $size);
			$dot = imagecolorallocate($image, 0, 0, 1);
			
			// 1のビットに点を打つ
			for($y=0; $y<$size; $y++){
				for($x=0; $x<$size; $x++){
					if($bit[$x+$y*$size]){
						imagesetpixel($image, $x, $y, $dot);
					}
				}
			}
			
			// 画像を回転
			$image = imagerotate($image, 270, 0);
			
			// 色を取得
			$rot = '';
			for($y=0; $y<$size; $y++){
				for($x=0; $x<$size; $x++){
					$rot .= imagecolorat($image, $x, $y);
				}
			}
			imagedestroy($image);
			
			// 16進数にして戻す
			$rot = str_pad($rot, (strlen($bit)), '0', STR_PAD_RIGHT);
			$ret = '';
			$tmp = str_split($rot, 16);
			foreach($tmp as $key=>$val){
				$ret .= sprintf('%0'.(strlen($val)/4).'s', base_convert($val, 2, 16));
			}
			return $size . ':' . $ret;
		}
	}
	
	// テスト
	$test = [
		['3:5b8', '3:de0'],
		['1:8', '1:8'],
		['2:8', '2:4'],
		['2:4', '2:1'],
		['2:1', '2:2'],
		['3:5d0', '3:5d0'],
		['4:1234', '4:0865'],
		['5:22a2a20', '5:22a2a20'],
		['5:1234567', '5:25b0540'],
		['6:123456789', '6:09cc196a6'],
		['7:123456789abcd', '7:f1a206734b258'],
		['7:fffffffffffff', '7:ffffffffffff8'],
		['7:fdfbf7efdfbf0', '7:ffffffffffc00'],
		['8:123456789abcdef1', '8:f0ccaaff78665580'],
		['9:112233445566778899aab', '9:b23da9011d22daf005d40'],
	];

	$rotate = new ROTATE();
	foreach($test as $key=>$data){
		$answer = $rotate->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
実際に画像を作って回転させました。
もちろん、このような回りくどいことをする必要性は皆無です。
単にやってみたかっただけという。

なおbase_convert()のあたりがややこしいのは、16桁以上の16進数をbase_convert()に突っ込むと正しくない値が返ってきてしまうせいです。
そのせいで最後の2サンプルだけ正しく動かなかったという。


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

PR


2013/09/23 22:47 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP5.5.0 「第1回オフラインリアルタイムどう書くの問題」をPHPで解く | HOME | 買ったものリスト 2013/09/22>>
忍者ブログ[PR]