CodinGameの"Clash of Code"に引き続きハマっています。
楽しすぎる。何なの?エンタメの極地?
Clash of Codeの問題は3種類あり(どれが出るかはやるまで分からない)、
・問題早解き(こういうプログラムを書け、と指示がある)
・リバース式 問題早解き(入力例と出力例のペアがあって、法則を見つけるのは自分)
・コードゴルフ(こういうプログラムを、極力少ない文字数で書け)
があります。
これまで、早解きはちゃんと取り組めていましたが、コードゴルフの方はさっぱりでした(Javaだし)。とりあえず解いて出すだけで、文字数などは気にしてませんでした。
ただ、この本を手に入れまして。
コードゴルフの方も、何をどうすればいいのか少しずつ勉強中です。
さて、今回は我ながら頑張った(=その回で1位だった)コードゴルフを書いていきます。だって嬉しいんだもん!
制限時間15分の中で、解答が一旦完成した後に文字数を更に減らしていく作業が楽しいです。
もし「こうやればもっと減らせるよ」みたいなのあれば教えてください。きっとまだまだテクニックがあるので。
N個の各数字に対してmod Mを計算し、その合計を出力する
入力
M N A1, A2, ..., AN
出力
(A1 mod M)+(A2 mod M)+...+(AN mod M)です。
例えば、入力が
3 4 1 5 6 7
なら、答えは 4 です。
こう書きました(85文字)
M=readline() N=readline() i=readline().split(' ') for(j=s=0;j<N;)s+=i[j++]%M print(s)
forの3つ目の"j++"を、for()の外で書けたときは嬉しいですね。してやったり、的な。たった1文字の短縮ですが。
文字列の"鳥のさえずり化"問題
入力
String
出力
aiueoAIUEOが来たら、そのあとに'p'と、もう1回母音を入れろ、という問題
例えば
"AtCoder"⇒"ApAtCopodeper"
こう書きました(128文字)
s=readline() a="" for(i=0;i<s.length;i++)a+=['A','I','U','E','O','a','i','u','e','o'].includes(s[i])?s[i]+'p'+s[i]:s[i] print(a)
3行目、もっとうまく書く方法はないだろうか・・・!
JavaScriptでprint()を使うと改行して出力されちゃうので、上記のように「解答用文字列(今回は"a")に追加していって、最後にそれをprint」というやり方で書いています。
0から始まるN刻みの等差数列をM個目まで出力
入力
M N
出力
タイトルの通り。例えば
5 3 ⇒ 0 3 6 9 12
こう書きました(70文字)
s=readline().split(' ') a="0" for(j=1;j<s[0];)a+=" "+j++*s[1] print(a)
シンプルに書けたかと!
いやー、コードゴルフも楽しいですね。制限時間が15分(改良にも限界がある)というのが、飽き性の自分に合っている気がします。
Clash of Codeしかやっていないですが、CodinGame内のレーティングも上昇してきました。やる気も上昇。
引き続き頑張るぞー!
コードゴルフですごかったコード(bash)
「A,T,C,Gから成る文字列が与えられるので、'A'と'T'を、'C'と'G'を交換せよ」という問題。
ACTG ⇒ TGAC
ということです。
これ、Bashで12文字で正解の人がいて・・・こんなコードでした。
tr ACGT TGCA
Bash、すごい。
様々な言語が平等に採点されるシステムなので、色んな言語の知識を(浅くでもいいから)知っておきたいですね。
コードゴルフじゃないけど、Pythonの小ネタ
「複数単語の英語文が与えられるので、各単語の頭文字だけ大文字にしなさい」という問題がありました。
hEllO world ⇒ Hello World
という感じですね。問題文で「title形式にしなさい」というような書き方をされてました。
ほんで、Javaで普通に書いていたのですが、なんとPythonで18秒で正解した方がいらっしゃいまして・・・!
コードを見てみたら、こんな内容でした。こんな関数あるんですね・・・
import sys import math s = input() print(s.title())
便利な関数があるのう・・・と思いました。
早解きに関しては、書く速さも大切ですが、いかに便利関数を知っているかも大切ですね。