Go 言語で標準出力に書き出す競技プログラミングのアレ

  • 11
    Like
  • 0
    Comment
More than 1 year has passed since last update.

まえがき

前回 入力編 の続きです.

はじめに

競技プログラミングでは,標準出力にスペースまたは改行で区切られた大量の数値や文字列を書き出すことがよくあります.(以下,前回 と同じなので略)

答え: bufio.Writer を使う

大量の出力を高速に行なうためには,

  • 出力をバッファする
  • 細かい単位でフラッシュしない

ことが必要です.os.Stdoutfmt.Println はここまで面倒をみてくれないので,bufio.Writer を使います.出力が短かいので効果の出る例ではありませんが,サンプルです:

package main

import (
    "bufio"
    "fmt"
    "os"
)

var wtr = bufio.NewWriter(os.Stdout)

func main() {
    fmt.Fprintln(wtr, "Hello")
    fmt.Fprintln(wtr, "World")
    _ = wtr.Flush()
}

これを実行してみます.

$ go run main.go
Hello
World

標準出力に書き出されているのを確認できます.

おわりに

今回は競技プログラミングにありがちな,標準出力への書き出しをより速く行う方法を考えてみました.今回使ったパッケージ,関数などを整理します.

  • bufio
    • NewWriter
    • Writer.Flush
  • fmt
    • Fprintln
  • os
    • Stdin

入力と違って標準で備わっているものが十分使い易いので,ライブラリとして整備するほどでもないでしょうか.Java だと java.io.PrintWriter あたりに相当しそうです.