初めまして!OCH_Taoと申します!
先日ABC360にて入茶をしたので、記念に記事を投稿します!
はじめに
自己紹介
現在高校三年生のプログラミングとDTMとTRPGが大好きな人です。
自分がなんとなく欲しいツールを暇つぶしで作ったりとのんびりやってます。
最近、ATH-M50xというaudio-technicaのヘッドホンを買ったら、友達も一緒に買い替えてくれて嬉しかったですw
競プロを始めたきっかけ
私の通っている高校には競プロを誰彼構わず勧める一人の先輩がいました。
私は、当時まだプログラミング経験が浅く、学校が用意しているプログラミング入門教材の最初を少しかじった程度の経験しかありませんでした。
具体的に言うと多少のHTMLタグとdocument.write()の知識しかありませんでしたw
そんな私をDTM仲間の友達(前述のお揃いヘッドホンの人)がゲーム制作のチームに誘ってくれました。
そのメンバーの中に現在も師匠として慕っている先輩がいました!
ゲーム制作のプロジェクトが停滞しているとき、プログラミング経験すら浅くアイデア出しでしか活躍できていなかった私にがっつり布教input()から丁寧に教えてくれました!
そのとき最初に触った言語がPythonです。
入茶するまでにしたこと
気を取り直して、入茶するまでにしたことをまとめていこうと思います。
私がしたことは大きく分けて4つです!!
ABCのA埋めをする
まず初めにA埋めとは、ABCのA問題を過去問を全てACするということです。
かなり古い問題だと今と違う要素も多いのであまりおすすめはしませんが、AtCoder ProblemsでA問題が全てAC表示になる光景はこれ以上ない幸せですので皆さんも暇があればやりましょう!
私は暇しかなかったので1日5問ずつ埋めている時期がありましたw
ABCのB埋めをする
これは現在進行形で進めています!
これも古い問題だと普通に難しい問題が紛れているのでまずは最近のものから埋めていきましょうw
昨日(2024/07/03)時点でABC204Bまで埋めています。
毎日コードを書く
私の場合、これが一番の長所であり、唯一の長所であり、「継続は力なり」を証明する確かな証拠でもあります!
最初は5問ずつ解いていましたが、最近は1言語1ACという形で継続しています!
昨日(2024/07/03)時点で最長の言語で200日連続ACしています。
様々な言語にチャレンジしてみる
先ほどから気になる記述が多かったと思いますが、実は私は複数の言語を並行して使っています!
現在はPython、JavaScript(Node.js)、TypeScript(Deno)、C++(GCC)、RustでA問題であれば常にACできる用意ができていますw
ちなみにPython、JavaScript(Node.js)を基本的にはメインで使っているのでB問埋めはこの2言語で進めています。
別に1言語だけしか使えなくても困ることは全くないのですが、実装に困ったとき他の手段があるだけでも心に余裕が生まれます。
ということなのでリアルタイムで参加する際はまずPythonで挑戦します。
ですがごく稀に副言語の強みが活きる場面もあるのでいくつか紹介します。
ABC344B
この問題ではN行の入力が与えられますが、Nが与えられません。
ここでJavaScript(Node.js)で自分が使っている入力方法が活きてきました。
入力を以下の通りとします。
3
2
1
0
これを以下のように入力を受け取ると……
const input = require("fs").readFileSync("/dev/stdin", "utf8").trim().split("\n");
このようになります!
console.log(input);
// [ '3', '2', '1', '0' ]
なんとNが与えられていなくてもN行全ての入力を受け取ることができます!
まあこの入力方法のせいで苦労する場面の方が多いのですが……。
ABC336C
私が人生で初めてACしたC問題です!
これはPythonでもJavaScript(Node.js)でもやること自体は何も変わらないのですが、 単純に当時の自分の知識量の差で助けられたケースです。
この問題では5進数で数字を扱うと簡単に解けるのですが、当時の私はPythonで数値を任意のn進数に変換する方法を知りませんでした。
(ちなみにPythonではNumPyのbase_repr()を使うと任意のn進数に変換できます(nは2~36))
当時の自分は悩み抜いた末、JavaScriptのNumber.prototype.toString()を使って実装しました。
実はコンテスト中にはACできなかったのですが、翌日BigIntの存在を知って再提出したらACできました!
言語に助けられたような阻まれたような……?
AtCoder Problems
URLも貼っておきます!
一般的には夏休みの時期も近いことですし、アサガオの観察だと思って毎日見てみても面白いのではないでしょうか?w
現状まだまだ継続して進めていますのでw
参考にさせてもらったもの等
私に競プロを布教して教えてくれた先輩(以下「師匠」)から難しい問題の解き方を事細かに教えてもらったことは私の記憶が正しければ確かありません。
師匠が教えてくれたのは検索方法です!
AtCoderではコンテスト中にWeb検索をすることが許されています。
そして師匠から、普段使う関数等は教科書と睨めっこして覚えるものでは決してなく、使うたびに都度調べることで自然と覚えていくものだと教わりました!
Pythonを学ぶにあたって師匠からおすすめされたサイトは以下の3つです。
nkmk 様
個人で運営しているとはにわかには信じられない神サイトです!!!
Pythonについてわからないことがここに書いてなかったらもうお手上げですw
そのくらい多用していて重宝しています!
Qiita 様
この記事を読んでいるということは既に皆さん知っているはず!
いつもお世話になっています(すりすり)
Zenn 様
QiitaとZennを組み合わせたらカバーできてない範囲なんて存在しないと私は思い込んでいますw
この3つのサイトがあれば基本Pythonで困ることはないと思っています!
他の言語にもそれぞれお世話になったサイトがあるので紹介します!
MDN
Mozillaが公開しているJavaScriptのリファレンスです!
私の場合、最初にPythonで基本的なプログラミングを身につけていたので、思いついた使いたい関数をJavaScriptではどう使うのか調べる目的でお世話になりました。
RustCoder
とが 様がZennで公開している無料の本です!
現在進行形で読ませてもらっています!
Rustに興味があっても学習方法がわからず全く進められなかったのですが、こちらに出会ってからRust学習が捗っています!
APG4b
AtCoder公式が用意しているC++用の教材です!
テキスト教材と問題がセットになっているだけでなく、サイト内でコーディングもできるので競プロ初心者にこそまず勧めたいです!
そしてAtCoderのシステムに慣れることもできるのでそういった意味でもかなり大事です!
最近Pythonバージョンも増えたのでより布教活動が捗ります!
終わりに
入茶をすることが出来てとてもとても嬉しいです!!!!
次の目標は入緑です…………がまだまだ先は長いなぁと……。
もし入緑したら、記事を書こうと考えているのでその際は読んでくれると凄く喜びます。
初めての記事で拙い文章ではありますが、少しでも役に立った方がいると嬉しいです!
……とまあ書いてますが実はこの記事は師匠へのリスペクト(と言う名のコピペ……おっとげふんげふん)を込めた記事となっております!!
元記事……というよりガッツリ参考にさせてもらった師匠の記事ですw
現在緑の師匠に追いつくべく、まずは茶色を維持できるように精進したいと思います……。
今回入茶記事を書くためだけにわざわざQiitaに新規登録したのですが、これからは数少ないJavaScript使いのために記事を書いてみようと思います!
実際私がJavaScriptを使い始めたとき、標準入力がどのような仕組みで入力を受け取っているのか全く理解できず悪戦苦闘したので、まずはそのあたりから書こうかなw……と思っています!
あとJavaScriptの負の0によって理不尽なWAを受けた人を救いたい……。
長文でしたが最後まで読んでいただきありがとうございました!