ナベアツ算2号

ナベアツ算の下書き。 - uokumuraの日記」からはだいぶ様変わりしましたが、とりあえず

200.まで {
    3.の倍数.と(3.のつく数字).のとき(アホに)
    5.の倍数.のとき(ナルシストに)
    8.の倍数.のとき(人を捜してる感じに)
}.なります()

ができるようになったので、doukaku.orgに上げました。mixinを使うと「get2バイト文字」をプロパティとして認識してくれるようです。…怪しげな挙動を。

で、どう書く.orgにあげたやつだと上のコードが最後に書かれててインパクトがいまいちなので、さらに手を入れました。

Integer.metaClass.mixin(IntegerExpand)
ArrayList.metaClass.mixin(ArrayListExpand)

200.まで {
    3.の倍数.と(3.のつく数字).のとき(アホに)
    5.の倍数.のとき(ナルシストに)
    8.の倍数.のとき(人を捜してる感じに)
}.なります()


class IntegerExpand {
    static range
    
    def getの倍数() {
        return range.findAll{it % (this as Integer) == 0}
    }
    
    def getのつく数字() {
        range.findAll{"$it" =~ "${this as Integer}"}
    }
    
    public String stringValue() { this as String} 
   
    def まで(cls) {
        range = (1..(this as Integer) as ArrayList)
        [
            アホに: {"${delegate.old}っ"},
            ナルシストに: {"${delegate.old}…oh!"},
            人を捜してる感じに: {"${delegate.old}〜〜?"}
        ].with(cls)
        return range
    }
}

class ArrayListExpand {
    def と = {list->new ArrayList(new TreeSet(delegate + list))}
    def のとき = {cls->
        delegate.each{
            def old = it.stringValue()
            it.metaClass.getOld = {old}
            it.metaClass.stringValue = cls
        }
    }
    def なります = {->
        delegate.each {println it.stringValue()}
    }
}

staticフィールドを使ってるのもちょっと…なんでもう少し手を加えたいところですが、こんなのにあんまり凝っててもしゃーないですね^^;
しかし手を入れれば入れるほど仕事コードと逆にトリッキーになって、Golfと逆に長くなってくのがちょっと面白いなぁ。