Language detail: Groovy
Coverage: 56.43%
|
number of '+' ratings |
contribution for coverage |
Unsolved challenges
- タブ区切りデータの処理 (Nested Flatten)
- LL Golf Hole 9 - トラックバックを打つ (Nested Flatten)
- 2^i * 3^j * 5^k なる整数 (Nested Flatten)
- tailの実装 (Nested Flatten)
- lessの実装 (Nested Flatten)
codes
起動オプションの解析
(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 はずしてワンライナーにしただけかも。
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)
|
議席数をドント方式で
(Nested
Flatten)
next >>
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 }
}
|





shimakuma
#7755()
[
Groovy
]
Rating0/0=0.00
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]Rating0/0=0.00-0+
[ reply ]