はじめに
こちらのpaiza×Qiita記事投稿キャンペーンのDランク問題を、コードゴルフの要領で最小文字数で解答することを目指しました。
言語はJavaScriptです。
他のランクはこちら
多分これが一番短いと思います
文字の一致
process.stdin.some(i=>{[a,b]=(i+"").split`
`;console.log(a==b?"OK":"NG")})
74文字
分割代入を使うことで文字数を削れました。
一番小さい値
a=100;process.stdin.some(i=>console.log((0+i).split`
`.map(j=>a=a>j&&j?+j:a)&&a))
81文字
(文字数削減の観点で)一番難しかったです。
詳しい解説は後述。
足し算
process.stdin.some(i=>{[a,b]=(0+i).split` `;console.log(a- -b)})
64文字
aとbは文字列ですが、前に+を付けることで数値に変換しています。
コメントで教えてもらった a- -b
でも文字列同士の足し算を実現できました。
文字列としての数字同士の引き算は普通に動くのを利用し、a-(-b)=a+bをしています。
Eメールアドレス
process.stdin.some(i=>{[a,b]=(i+"").split`
`;console.log(a+"@"+b)})
67文字
joinやtrimを使うよりも上記の方が短くできました。
N倍の文字列
process.stdin.some(i=>console.log("*".repeat(i)))
49文字
最も美しく書けたと思います。
repeatのカッコの中身は末尾に改行がある文字列でも大丈夫なようです。
解説
標準入力について
paizaではNode.jsの標準入力を使っているようですが、標準入力のコードがまず長いのでここも削りました。
process.stdin.some(i=>{})
だけを使用することで文字数削減を実現しました。
iは入力された値のバッファーで、i+""
で文字列に変換しています。
最初の値が数値の場合は0+i
でも変換できるっぽいです。
文字列にした後はsplit`
`で各行の値を取り出しています。
これは本来は split("\n")
をしているのですが、文字を削減したらこうなりました(改行コードの\nではなくて実際の改行を入れている)
なお、splitした場合は配列の最後に空白文字列が追加されるので注意が必要です。
stdin.on('end',()=>{})すらも削ったので環境によってはエラーが出るかもしれませんが、 paiza環境で動けばヨシ! のノリですので気にするな!
一番小さい値について
a=100;
process.stdin.some(i=>
console.log((0+i).split`
`.map(j=>
a=a>j&&j?+j:a)&&a))
以下のような処理をしています。
- 最小の値(a)の初期値を100に設定
- 入力された値(i)はバッファーなので、
0+i
をして文字列に変換 -
split`
` で改行ごとに区切られた配列に変換 - map関数を使用し、aが各行の値(j)よりも大きければaをjにする
- jは文字列なので、代入時は
+j
で数値に変換しています - jsでは
50>"40"
のように、数値と文字列の比較がちゃんと動くので、a>j
はそのまま比較しています - 仕様上、splitされた最後の値としてjの最後の値は
""
になります。+""は0になってしまうため、""を弾くためにjもif条件に含めています(jsでは""はfalse扱いになります) - mapの方がfor-ofよりも一文字短くできます
- jは文字列なので、代入時は
おわりに
普通に解くと簡単な問題ばかりでしたが、コードゴルフの観点では結構歯応えがありました。
とりあえず、全て100文字以下にできたので満足です。
追記
コメントから案の定さらに短くできるテクニックを教わりました。
どの問題も10文字ほど削減できましたのでこの場を借りて感謝致します。
そして、今度こそ多分これが一番短いと思います。