「第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") } }
- 上のコードとテストコード https://gist.github.com/3182191
「リスト内の各要素が4桁に満たないとき、4桁になるまで先頭に0パディングする」という処理をGroovyクロージャで書きたかったのだけど、よくわからず、お手上げ。
ふもさんのチートシートとにらめっこしながら書きました。
あと、初めてSpockを使いました。