def yasuharu519(self):

日々の妄想

ChatGPTと競技プログラミングとプログラミング言語学習

2023 年のプログラミング学習

2023年一年を通して継続できたことの一つとしては、競技プログラミングの参加だと思う。LeetCode の問題を解いたりAtCoder のコンテストに参加したりなど、今までに比べて競技プログラミングへのコミットを高めたのだけれど、その振り返りについては別の機会に。

並行して 2023 年行ったこととの一つとしては Rust の学習だった。昔から興味を持っていたものの、他の言語に比べてぱぱっと書けるほど理解力や習熟度が高まっていないように感じていて、その学習を進めていた。

2022 年の末頃から ChatGPT が公開され、自分も課金して GPT-4 を利用させていただいていて、日々とても恩恵に肖っている。本当に様々な分野の事柄をそこそこの精度で返してくれ、どれだけ聞いても嫌な顔せず回答してくれるので、つきっきりのチューターがいつもいてくれるような印象だ。

ChatGPT と翻訳と学習

競技プログラミングの問題がわからないときに、ChatGPT で競技プログラミングの問題を解いてもらって解説してもらおうとすることもあるのだが、これはあんまり得意ではないらしい。うまくいくときもあるのだけれど、解けたとしても直感的な解答しか出ず、TLE になるような解答しか出ないことが多い。

ただ、ChatGPT も自然言語で書かれた競技プログラミングの問題を解くことは難しくても、言語から言語に書き換えることは得意なようだ。最初 Python で Accepted になるような解答を書いた後、ChatGPT に Rust に書き換えてもらう。書き換えてもらった Rust 版のコードも大抵の場合 Accepted となることが多い。

その Rust 版に書き換えられたコードを見て「ふむふむこんな書き方があるんだな」とか、「もうちょいこうしても同じ意味になるのでは?」とか考え、ちょっとした書き換えをし、エラーだと怒られ、ACだったコードが AC じゃなくなり、元に戻したりしながら、Rust に慣れて行っている。

この方法の何がいいか

まず前提として、自分の場合 Python は比較的自由に書け、Rust の基本的な文法やシンタックスなどはわかるがそらで Rust のコードを誤りなく書けるほどではないという状態なのだけど、競技プログラミングと ChatGPT を使った学習は新しいプログラミング言語に慣れるのにとても良いように感じている。得意な言語が一つあって他の言語を学ぶようなケースでとても良い。

配列のアクセス、マップのインサートなどの定石を学べる

言語仕様を学んでもなかなか標準クラスの使い方まですぐにはカバーできない。例えば “連想配列に値を代入する” といったコードを書くとする。Python の場合は

d = {}
d["key"] = 1

と書ける。Rust の場合はどうか?

let mut d: HashMap<&str, i32> = HashMap::new();
*d.entry("key").or_insert(0) = 1;

のような書き方ができる。他にも書き方はあるのかもしれないが、こうしたいと思ったときに一つでも書き方を覚えておくことが重要な気がする。どれだけいろんな書き方ができるか、どれだけ素早く書けるかでプログラミング言語の手に馴染み感が変わってくるんだろうと思う。

その言語らしい書き方を学べる

Rust では match 構文が使える。Python で if else で書いていたコードをそのまま Rust でも if else で書けるのだけど、すでにある構文を使って別の書き方で書くことができる。

if n == 1:
    return nums[0]
elif n == 2:
  return max(nums)
else:

みたいなコードは

match n {
    0 => 0,
    1 => nums[0],
    2 => nums[0].max(nums[1])
    _ => {

みたいに書ける。

こういった自分が知らなかったり、馴染みのない構文を使ってみることで、よりその言語らしい書き方を学ぶこともできるし自分の書き方の幅も広がる。

競技プログラミングは判定条件がわかりやすい

競技プログラミングの問題は、そのコードが合っているか合っていないか、目的に沿っているか沿っていないかの判断が明確でわかりやすい。少しでも違う出力になればダメだし、同じ出力でも時間やメモリを食うようになってしまうと Acccept にはならない。実際に「コードを新しい言語で書いて勉強しよう!」と思っても、そのプログラムの題材がないとだめだし、その言語の細かい使い方が頭に入っていないと素早くコードが書けないのである。

その点競技プログラミングは Accept かどうかの判定条件がわかりやすく、「Accept されるコードをどうやって書くか?」という目的からスタートできるので、プログラミングの言語学習二とても良いように感じる。

まとめ

とても散文的になってしまったのだけど最近やっている Rust の学習について。毎年言ってしまっている気もするのだけど、今年はアウトプットも頑張っていこうと思っているのでどんどん出していこうと思う。