プログラミングを上達させたい

情報学専攻の大学院→放送局でCMの営業など@大阪→舞台俳優&IT営業@東京

CodinGameのClash of Code、楽しすぎる侍

久々にCodinGameのClash of Codeをやったんですけど、やっぱり楽しいですね・・・
特にShortest Mode(いわゆるコードゴルフ)が楽しいです。
今回もいいコードをたくさん見たので、自分の備忘録も兼ねてそれらをまとめます。

2次のベクトルの和を2で割ったものを出力

例えば、[5, 2]と[3,10]が与えられたなら、和が[8,12]なので、2で割った[4,6]を出力、という問題です。出力する2つの数が整数になることは保証されています。

僕のコード(142文字)

a=readline().split(' ');
b=readline().split(' ');
console.log((parseInt(a[0])+(parseInt(b[0])))/2 +" "+((parseInt(a[1]))+(parseInt(b[1])))/2);

普通に書いただけです。

1位の人のコード(100文字)

g=()=>readline().split(' ').map(e=>+e);h=Math.floor;[r,c]=g();[e,f]=g();print(h((r+e)/2),h((c+f)/2))

関数の略し方がかっこいい・・・

与えられた整数が桁順にその桁の数を見て行ったときに「前の桁より増える」と「前の桁より減る」の両方があるかどうか?

例えば、「12341」などがtrueです。

僕のコード→ショートコーディングにこだわろうとしすぎて、正解が出せず

2位の人のコード(73文字)※javascript

a=readline()
x=[...a].sort()
print(!(a==x.join``||a==x.reverse().join``))

1位の人のコード(47文字)※ruby

n=gets.chars
r=n.reverse
p n.sort!=n&&r.sort!=r

なんと美しい・・・

数字nとn個の文字列(全て文字数が異なる)が与えられ、文字数が短い順に出力

2位の人のコード(103文字)※python

wo=[]
for i in range(int(input())):wo.append(input())
wo.sort(key=lambda s:len(s))
for w in wo:print(w)

lambda関数使うのかっこいい。

1位の人のコード(55文字)※ruby

puts gets.to_i.times.collect{gets}.sort_by{|x|x.length}

指示を全く無駄なくコード化した、って感じですね、すごい。

整数nとmが与えられ、n#/m#を計算(#は素数階乗の記号)

整数Aの素数階乗 A#というのは、A以下の素数の積のことです。例えば8#は2*3*5*7=210です。
これは以前の記事で紹介した、rubyのprimeメソッドを使い、1位とれました!!!(108文字)

require'prime'
p (1..gets.to_i).select{|x|x.prime?}.inject(:*)/(1..gets.to_i).select{|x|x.prime?}.inject(:*)

普通にn#/m#を計算していますが、今振り返ると、こう書いた方が短いですね(合ってるハズ・・・)。

require'prime'
x=gets.to.i
y=gets.to.i
p ((y+1)..x).select{|x|x.prime?}.inject(:*)


まぁなんであれ、新しく習得したスキルで解けるのは嬉しい!
続けていくぞ!