Dartで競技プログラミング~入出力編~
はじめに
大学生の頃はそこそこ取り組んでいた競技プログラミングですが、社会人になってから仕事の勉強に時間を使うようになり、競プロの精進の時間が思うように取れずコンテストの成績も悪くなるばかりだったので距離を置いていました。
最近は仕事にも慣れて以前より仕事以外の時間も取れるようになったので再びAtCoderの水色目指して頑張りたいなと思い始めています。
今回は普段業務で触っているDart言語で競プロで使う入出力を紹介してみます。
普段使っている競プロサイトはAtCoderですが、2022年7月14日現在でAtCoderで使用できるDartのバージョンは2.7.2
。NullSafetyが入る2.12
よりも前のバージョンになるので注意しましょう。
出力編
Dartの標準出力はStdout
クラスのwrite
やwriteAll
、writeln
などもありますが、print
を使うのが一般的です。writeln
とprint
は自動で改行を付与してくれます。
入力編
入力にはStdin
クラスのreadLineSync
を使います。1行ずつ文字列として読み取ってくれます。
import 'dart:io';
// 単独の整数
final n = int.parse(stdin.readLineSync());
// スペース区切りの複数の整数
final a = stdin.readLineSync().split(' ').map((x) => int.parse(x)).toList();
// 縦にN行並んでいる単体の整数
// 例: 2行の場合
// 5
// 10
final a = List.generate(N, (_) => int.parse(stdin.readLineSync()));
// 縦にN行並んでいる複数の整数
// 例: 2行の場合
// 5 10
// 10 20
final ab = List.generate(N, (_) => stdin.readLineSync().split(' ').map((x) => int.parse(x)).toList());
// 文字列
final s = stdin.readLineSync();
毎回これを書いていては面倒なので関数化しておくのが無難なように感じます。
import 'dart:io';
int inputInt() => int.parse(stdin.readLineSync());
List<int> inputIntList() => stdin.readLineSync().split(' ').map((x) => int.parse(x)).toList();
List<int> inputIntListWithLine(int n) => List.generate(N, (_) => int.parse(stdin.readLineSync()));
List<List<int>> inputMultipleIntListWithLine(int n) => List.generate(N, (_) => stdin.readLineSync().split(' ').map((x) => int.parse(x)).toList());
String inputString() => stdin.readLineSync();
おわり
以上がDartでの競技プログラミングでよく使う入出力でした。
以前まで競プロにはRubyで参加していましたが、やはりRubyは簡潔で便利なんだと思わされます。
もし今後もDartで競プロに参加することがあれば続きを書こうと思います。