LoginSignup
6
1

競プロの問題をnibblesで解く②

Last updated at Posted at 2024-03-22

はじめに

前回に引き続き、簡単な問題を通してnibblesの解説をしていきたいと思います。
今回はリストの入力を扱いたいと思います。
リファレンスを眺めながら見ていただくと若干わかりやすいかもです。
では、早速問題を解いていきましょう。

今回もフォーマットはkotatsugameさんのこちらの記事から、丸パクリさせていただきました。(いつもありがとうございます。)

入力形式

解法

Byte数
コード

コメント

問題

ABC344 B - Delimiter

$ A_1 $
$ A_2 $
$ \vdots $
$ A_N $

$A_1, A_2, \cdots A_N$ を $A_N, A_{N-1}, \cdots A_1$ の順に出力します。

2byte
\_

最近の問題でちょうど良いものがありました。
nibblesでは「 _ 」で一行目の入力をリストとして取得できます。
また、今回のように数字が一列に並んでいる場合も、例外的に数値をリストとして取得できます。

この性質について、わかりやすさのために、pythonで例を載せておきます。

_
A = list(map(int, input().split())  # 基本これ
A = [int(input()) for _ in range(N)]  # 例外パターン(今回)

リストで取れたら後は「 \ 」をつけてreverseしてあげればOKです。

JOI 2020/2021 一次予選 (第1回) A - 2 番目に大きい整数

$A \quad B \quad C$

$A \quad B \quad C$ のうち、2番目に大きい数を出力します。

5byte
=2`<_

一行の数字入力ですので「_」を使います。
あとはソート「 `< 」してあげた後に、インデックス指定「 = 」を使用すればOKです。
nibblesはプログラミング言語では珍しく、1-indexedなので = の引数は2にしましょう。
1-indexedの方がコードゴルフの観点では有利でしょうという想いがあるそうです。

ついでに、nibblesのsortの計算量は$O(N^2)$なのでたまに結構辛いです。

AGC001 A - BBQ Easy

$ A $
$ L_1 \quad L_2 \quad \ldots \quad L_{2N} $

$L$をソートして、奇数番目の値の和を出力します。

12byte
+`%2`<=2;;$

だんだん暗号感が増してきました。
やってることは単純ですので、下記の順に一つずつ見ていきます。
①$ L $をソート
②$L$の奇数番目の値を取得
③和を計算

①Lをソート

「 ;;$ 」で数字の行がまとめて取得できます。

pythonで見るとこんな感じ。

;;$
ints = [list(map(int, input().split())) for _ in range(XX)]  # ;;$

$L$をソート ⇒ 二行目をソートですのでインデックス指定の「 = 」と合わせて、「 `<=2;;$ 」となります。

②Lの奇数番目の値を取得

奇数番目を取得する際に便利な演算 step があります。
「 `%[数字] [配列] 」を指定すると、配列の要素を数字ステップごとに取得できます。

例として、1~10までのリストを見てみます。
「 , [数字] 」(カンマ+数字)で、1からのリストを生成できます。

`%2 ,10 -> 1 3 5 7 9
`%3 ,10 -> 1 4 7 10
`%100 ,10 -> 1

今回、$L$の奇数番目を取得したいので、「 `%2 」がそのまま使えます。

ここまでで作成した
「 `%2`<=2;;$ 」をテストケース2で実行してみます。

入力

$ 5 $
$ 100 \quad 1 \quad 2 \quad 3 \quad 14 \quad 15 \quad 58 \quad 58 \quad 58 \quad 29 $

出力
$ 1 $
$ 3 $
$ 15 $
$ 58 $
$ 58 $

(nibblesでは、配列は勝手に改行区切りで出力してくれます。)
$ L $ をソートした結果は $ 1\quad 2\quad 3 \quad 14 \quad 15 \quad 29 \quad 58 \quad 58 \quad 58 \quad 100 $ なので、期待通りの出力ですね。

③和を計算

最後にこの配列の和を取ります。
+ 演算子は配列を引数に取るとsumを取ってくれるので、+ を付けて完成です。

12byte
+`%2`<=2;;$

おわりに

リファレンスとにらめっこしながらそれっぽい関数を使ってみる、使い方がわからなかったらソースの方で詳しく見てみる、そんな感じで解き進めていくのがオススメです。
次回は、map、filterを扱ってみたいと思います。これらはめちゃくちゃ頻出ですが、最初はわかりづらい部分ですので、ぜひ見てみてください。

6
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1