はじめに
コードゴルフ用言語のnibblesについて、記事が全く存在しなかったので作ってみました。
気になるけど資料が無くて始めにくい。。。という方の参考になればと思います。
あまり詳しいことには触れないので、気になる方はこちらをご覧ください。
今回は、簡単な入力かつ単純な計算で解ける問題を扱います。
ABC001 - 005 A問題の難易度がちょうど良かったため、解いてみます。
各問題のフォーマット下記の通りです。
(kotatsugameさんのこちらの記事から、丸パクリさせていただきました。)
入力形式
解法
コード
コメント
問題
ABC001 A - 積雪深差
$ H_1 $
$ H_2 $
$H_1 - H_2$を出力します。
-$;$
3byteの解答が存在しますが、foldの知識が必要になるため、今回はこちらの解答を考えます。
nibblesの演算は大体が下記の形で行われます。
演算子 引数1 引数2 $\cdots$
リファレンスで引き算に該当する演算を確認してみましょう。
引き算(subtract)のLit, Arg Typesを確認すると、
演算子 | 引数1 | 引数2 |
---|---|---|
- | num | num |
がわかります。
演算子 引数1 引数2 の通りに 「- 5 3」 と書いてみると、 $5 - 3$ ができるわけです。
nibblesでは入力1つ目の数字を「\$」、2つ目の数字を「;$」で受け取れますので、
- $ ;$
最後に不要なスペースを削除すれば完了です。
ちなみに出力にprint文のようなものは必要ありません、勝手に出力してくれます。
ABC002 A - 正直者
$ X \quad Y $
${\rm max} (X,Y)$を出力します。
];$
maxの演算は以下となります。
演算子 | 引数1 | 引数2 |
---|---|---|
] | num | num |
先ほどの問題と同様に、
]$;$
で正しく出力が行われます。
ここで、nibblesには Implicit Args(暗黙的引数) というものが存在します。
簡単に説明すると、最後が\$で終わるとき、大体省略できちゃうよってやつです。
※「\$」単体である必要があります。「;$」を「;」とすることはできません。
先ほどの
]$;$
について、\$と;$の場所を変えても結果は変わりませんから、
];$$
$で終了しているので、これは省略可能です。
];$
無事3byteとなり完了です。
ABC003 A - AtCoder社の給料
$ N $
$(N+1) \times 5000$を出力します。
*5000+1
足し算、掛け算の演算はそれぞれ以下です。
(実際は他の引数にも対応可能なため、リファレンスの表記は異なります。)
演算子 | 引数1 | 引数2 |
---|---|---|
+ | num | num |
* | num | num |
そのまま実装して、
*+$1 5000
5000を前に持ってくるとスペースが削減できますね。
*5000+$1
最後に$と1の場所を反転して、省略すれば完了です。
*5000+1
ABC004 A - 流行
$ N $
$2 \times N$を出力します。
+
$2 \times N$をそのまま実装すると
*2$
\$を省略して「*2」の2byteでしょうか。
ここで、$2 \times N$を$N + N$と考えてみます。
+$$
$が2個並んでますね。
しっかりどちらも省略可能です。よって
+
となるわけです。
ABC005 A - おいしいたこ焼きの作り方
$x \quad y$
$\lfloor y/x \rfloor$を出力します。
/;$
割り算は以下の通りです。
演算子 | 引数1 | 引数2 |
---|---|---|
/ | num | num |
実はnibbles, 整数しか扱えません。
そのため、自動的に切り捨て除算となるので、これをそのまま実装すればOKです。
最後の$省略を忘れずに。
おわりに
下記の問題も簡単な演算で解けるのでぜひ解いてみてください。
次回はもう少し複雑な入力を扱ってみたいと思います。