Monday, July 29, 2013

GroupBy and SubMap

int groups = 7
//divide list up into groups by % (their remainder)
Map a = (1..50).groupBy({ it % groups }) as TreeMap
assert a.keySet() == (0..<groups) as Set
assert a.keySet() == [0, 1, 2, 3, 4, 5, 6] as Set

//pull out specific keys (plus vals) from a Map
assert a.subMap(1) == [1:[1, 8, 15, 22, 29, 36, 43, 50]]
assert a.subMap([1,2]) == [1:[1, 8, 15, 22, 29, 36, 43, 50], 2:[2, 9, 16, 23, 30, 37, 44]]
assert a.subMap([1,2,99]) == [1:[1, 8, 15, 22, 29, 36, 43, 50], 2:[2, 9, 16, 23, 30, 37, 44], 99:null]
assert a.subMap([1,2,99]).findAll({k,v->!!v}) == [1:[1, 8, 15, 22, 29, 36, 43, 50], 2:[2, 9, 16, 23, 30, 37, 44]]
assert a.subMap((1..3)) == [1:[1, 8, 15, 22, 29, 36, 43, 50], 2:[2, 9, 16, 23, 30, 37, 44], 3:[3, 10, 17, 24, 31, 38, 45]]

Intersect Lists and Maps

List a = [1,2,3]
List b = [2,3,4]
assert [2,3] == a.intersect(b)
assert [1,2,3,4] == (a + b).unique()
assert [1] == a - b
assert [4] == b - a


Map c = [a:1, b:2, c:44]
Map d = [b:2, c:3]
assert [b:2] == c.intersect(d)
assert [a:1, b:2, c:3] == c + d
assert [a:1, b:2, c:44] == d + c
assert [a:1, c:44] == c - d
assert [c:3] == d - c

Wednesday, July 24, 2013

Random String generator

//see: http://groovyconsole.appspot.com/edit/1032002

String generateToken(Integer size = 16){
    String availableChars = 'ABCDEFGHIJLMNOPQRSTUVXZYabcdefghijlmnopqrstuvxzy0123456789!@#$%*_'
    Random generator = new Random()
    String token = ""
    size.times {
        token += availableChars[generator.nextInt(availableChars.length() - 1)]
    }
    return token
}
 
generateToken()
generateToken(8)

Thursday, July 4, 2013

printf with Strings

//all formatting options: http://docs.oracle.com/javase/6/docs/api/java/util/Formatter.html#syntax

//test padding on both sides of "HI"//

(-8..8).each{ i ->
    if (i == 0) i = '' // avoid illegal printf syntax
    
    String f = "**%${i}s**"
    print ((f + ' --> ').padRight(15)) // just for debugging
    printf(f+'\n', "HI")
}


//Tic Tac Toe//

List field = [["","x","o"],["","x",""],["o","",""]]
field.eachWithIndex { line,index ->
    if(index > 0) {
        println "---+" * 2 + "---"
    }
    printf(" %-2s| %-2s| %-2s\n", line)
}