Language detail: Groovy

Coverage: 56.43%
number of '+' ratings
contribution for coverage

Unsolved challenges

codes

Feed

Used modules

next >>

数値リストの圧縮 (Nested Flatten)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def dkk208(List l){
  l.size < 3 ? l : l[2..-1].inject(l[0, 1]){ r, n ->
    def a = r[-1], b = r[-2]
    if(a instanceof Number && b instanceof Number && n == a * 2 - b)
      r[-2..-1] = [[b, n, n - a]]
    else if(a instanceof List && n == a[1] + a[2])
      a[1] = n
    else
      r << n
    r
  }.each{ it instanceof List && it[2] == 1 && it.pop() }
}
assert dkk208([1, 3, 4, 5, 6, 12, 13, 15, 20, 25, 26, 27]) ==
  [1, [3, 6], 12, 13, [15, 25, 5], 26, 27]
起動オプションの解析 (Nested Flatten)

CliBuilderを使って書いてみました。longOptは期待通りに動きませんが...

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
cli = new CliBuilder(usage:'cmdopt -o [-q] [-d{0|1|2}] 文字列 [文字列 ...]')
cli.o(longOpt:'output', required:true, 'set output') 
cli.q(longOpt:'quote', 'set quote') 
cli.d(longOpt:'debug', args:1, argName:'level', 'set debug level') 

opt = cli.parse(args)
if (!opt) System.exit 1
params = opt.arguments()
if (params.size() < 1) die 'parameter must be specified'
level = opt.d ? opt.d.toInteger() : 0
if (!(level in 0..2)) die 'debug level must be in 0-2'

println '[オプション情報]'
println "o(output): ${opt.o ? 'ON' : 'OFF'}"
println "q(quote): ${opt.q ? 'ON' : 'OFF'}"
println "d(debug): $level"
println '\n[パラメータ情報]'
println "指定数: ${params.size()}"
i = 1
params.each { println "${i++}: $it" }

def die(msg) {
  cli.writer.println "error: $msg"
  cli.usage()
  System.exit 1
}
LL Golf Hole 3 - 13日の金曜日を数え上げる (Nested Flatten)
同じ方針で 67B。使いませんでしたが,"${l.size}" は "$l.size" でOKです。
1
2
a=(new Date()..new Date(114,0,0)).grep{it=~/i\D+13/}
print a+a.size
echoクライアント (Nested Flatten)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
try {
  host = args[0] 
  port = args[1].toInteger()
} catch (e) {
  println "usage: groovy ${this.class.name} host port"
  System.exit 1
}

new Socket(host, port).withStreams { is, os ->
  dis = new DataInputStream(is)
  buf = new byte[1024]
  while ((len = System.in.read(buf)) >= 0) {
    os.write(buf, 0, len)
    dis.readFully(buf, 0, len)
    System.out.write(buf, 0, len)
  }
}
文字列型日時ののN秒後時間取得 (Nested Flatten)

初めて投稿します。よろしくお願いします。new Date(String s)を使えばもっと短く書けると思うけど、deprecatedだから反則ですよね...

1
2
3
4
5
6
7
8
9
format = new java.text.SimpleDateFormat('yyyyMMddHHmmss')

def dateEx(delta, date = null) {
  d = (date) ? format.parse(date) : new Date()
  format.format(new Date(d.time + delta * 1000))
}

println dateEx(40, "20080827235925")
println dateEx(100)
LL Golf Hole 3 - 13日の金曜日を数え上げる (Nested Flatten)

あ、個数もか… 削って85B。出力は汚いです。

1
l=((new Date()..new Date(113,11,31)).findAll{it.date*it.day==65});print"${l.size}$l"

73B。もう終わったけど…

1
(new Date()..new Date(113,11,31)).any{if(it.date*it.day==65)println it}
文字変換表に基く文字列の変換 (Nested Flatten)

さっきのは基本でした。今度は拡張版で。 まだ削りようはいくらでもあるけど、とりあえずcurryが使いたかったので。

1
2
tr={e,f,t,w->w.collect{e(f).contains(it)?e(t)[e(f).indexOf(it)]:it}.join()}.curry({it[0]..it[2]})
println(tr("a-z","A-Z","typewriter"))

メソッド定義を書いて、それを呼び出す形で書くもの?なら…

trをインライン化すればワンライナー。

1
2
3
tr={f,t,w->w.collect{f.contains(it)?t[f.indexOf(it)]:it}.join()}

println(tr("qwertyuiop","QWERTYUIOP","typewriter"))
LL Golf Hole 8 - 横向きのピラミッドを作る (Nested Flatten)
52B。
1
[1..<(n=0.decode(args[0])),n..1]*.any{println'*'*it}
コマンドライン引数から取れば短くできますね。
1
b=args[0].toInteger()*2;b.times {println"*"*(it<b/2?it:b-it)}

ちょっと毛色を変えてクロージャ定義で。 nを受け取ってピラミッドを返すクロージャです。

1
{n->n>1?"*¥n${call(n-1).replaceAll('¥n','*¥n')}*¥n":"*¥n"}

お題のRubyのGroovy移植です。

1
2
def b = System.in.newReader().readLine().toInteger()*2
b.times { println "*"*(it<b/2 ?it:b-it) }
LL Golf Hole 7 - バイト数を読みやすくする (Nested Flatten)

お題のRubyの移植版です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def b = System.in.newReader().readLine().toFloat()

if (b < 10**3)
   { println b }
else if (b < 10**6)
   { printf ("%.1fk" , (b/10**3))}
else if (b < 10**9)
   { printf ("%2.1fM" , (b/10**6))}
else if (b < 10**12)
   { printf ("%2.1fG" , (b/10**9))}
else
   { printf ("%2.1fT" , (b/10**12))}
LL Golf Hole 6 - 10進数を2進数に基数変換する (Nested Flatten)
オリジナリティー低いです。
genzonさんの def はずしてワンライナーにしただけかも。
1
print Integer.toBinaryString(System.in.newReader().readLine().toInteger())

shimakumaさんに比べると、ちょっと長いですね・・

1
2
def input = System.in.newReader().readLine()
println Integer.toBinaryString(input.toInteger())
LL Golf Hole 5 - 最上位の桁を数え上げる (Nested Flatten)

正規表現版、Rubyの回答を参考にしました。

1
(0..300).each{ans->if(ans.toString()==~'[0-9]0*') println ans}
LL Golf Hole 6 - 10進数を2進数に基数変換する (Nested Flatten)
stdin -> stdout
1
print 0L.toString("$System.in".toLong(),2)
LL Golf Hole 5 - 最上位の桁を数え上げる (Nested Flatten)

ゴルフらしく。

1
(0..300).grep(~/.0*/).any 0.&println
議席数をドント方式で (Nested Flatten)

wikipediaの数式を元に作成しました。 変数v、sもそのままです。

http://ja.wikipedia.org/wiki/%E3%83%89%E3%83%B3%E3%83%88%E5%BC%8F

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
println dont([ 123, 4, 56, 78 ], 100)

def dont( vlist, countOfSheet ){
    def groups = vlist.collect{ [ v:it, s:0 ] }

    countOfSheet.times{
        def map = groups.max{ it.v/(it.s + 1) }
        map.s++
    }
    
    groups.collect{ it.s }
}
next >>

Index

Feed

Other

Link

Pathtraq

loading...