「第2回 オフラインリアルタイムどう書く」参考問題: へなちょこ解答(Groovy)

Groovyでも書いてみました。

しかし、のん気に解いていたら、自分より洗練された解答で先を越されて、地団駄踏んでいるトコロ。うそーん…

/**
 * 問題: http://qiita.com/items/9d80de41903775296ca6
 */
class SpinImage {

	def execute(str){
		def fs = str.split(":")
		def imgLength = Integer.valueOf(fs[0])
		def hexList = fs[1].toList()

		def binList = []
		for(hex in hexList){
			def bins = Integer.toBinaryString(Integer.valueOf(hex, 16))
			for(int i = bins.size(); i < 4; i++){
				bins = '0' + bins
			}
			binList.add(bins.toList())
		}
		binList = binList.flatten()
		def origLength = binList.size()
		if(imgLength * imgLength < binList.size()){
			binList = binList.subList(0, imgLength * imgLength)
		}

		// 回転
		def resultbin = []
		for(int i = 0; i < imgLength; i++){
			for(int k = imgLength - 1; -1 < k; k--){
				resultbin.add(binList[imgLength * k + i])
			}
		}

		for(int i = resultbin.size(); i < origLength; i++){
			resultbin.add(0)
		}
		for(int i = 0; i + 3 < resultbin.size(); i++){
			def oneHex = ''
			resultbin[i..i + 3].each { oneHex += it }
			resultbin[i..i + 3] = [
				Integer.toHexString(Integer.valueOf(oneHex, 2))
			]
		}

		def result = imgLength + ':'
		resultbin[0..resultbin.size() - 1].each { result += it }
		return result
	}


	public static void main(String[] args) {
		SpinImage spin = new SpinImage()
		println spin.execute("2:1")
	}
}

「リスト内の各要素が4桁に満たないとき、4桁になるまで先頭に0パディングする」という処理をGroovyクロージャで書きたかったのだけど、よくわからず、お手上げ。

ふもさんのチートシートとにらめっこしながら書きました。

あと、初めてSpockを使いました。