前提
AtCoderで初心者向けの課題を解いています。
白昼夢 の課題を Goで実装しているのですが、
標準入力の受け取り方によって 全問AC(正答)の場合と、半数が WA(誤答)の場合に分かれます。
具体的には ① fmt.Scan で読み取ると正答となり、② bufio.Scanner で読み取ると誤答が混ざります。
なぜ後者だと誤答が紛れ込むのかが知りたいです。
尚、その際の入力パターンは不明です。
実現したいこと
- bufio.Scanner を用いて処理した場合の問題点を知りたい
- bufio.Scanner をどの様に用いれば正答を得られるのか知りたい
発生している問題・エラーメッセージ
- 後述のコードで、
fmt.Scan
で読み込むreadA()
関数を用いると全問正答 (AC
) となるが、②bufio.Scanner
で読み込むreadB()
を用いると 19パターン中 8パターン で (WA
) が紛れてしまう - 繰り返しになるが、AtCoder側の入力パターンは不明
該当のソースコード
go
1// 白昼夢 2// https://atcoder.jp/contests/abs/tasks/arc065_a 3 4package main 5 6import ( 7 "bufio" 8 "fmt" 9 "os" 10 "strings" 11) 12 13func main() { 14 var str = readB() // readA() では正答、readB() では誤答が混ざる(AC x 11, WA x 8) 15 16 if check(str) { 17 fmt.Print("YES") 18 } else { 19 fmt.Print("NO") 20 } 21} 22 23func check(line string) bool { 24 keywords := []string{"dream", "dreamer", "erase", "eraser"} 25ChallengeLoop: 26 for line != "" { 27 for _, k := range keywords { 28 if strings.HasSuffix(line, k) { 29 line = strings.TrimSuffix(line, k) 30 continue ChallengeLoop 31 } 32 } 33 return false 34 } 35 return true 36} 37 38func readA() string { 39 var str string 40 fmt.Scan(&str) 41 return str 42} 43 44func readB() string { 45 lines := read() 46 var str = "" 47 if len(lines) > 0 { 48 elm := strings.Split(strings.TrimSpace(lines[0]), " ") 49 str = elm[0] 50 } 51 return str 52} 53 54func read() []string { 55 s := bufio.NewScanner(os.Stdin) 56 var lines []string 57 for s.Scan() { 58 lines = append(lines, s.Text()) 59 } 60 return lines 61} 62
試したこと
- fmt.Scan は標準入力にスペースが含まれる場合、トークン分割して最初のトークンを返す仕様なので、
bufio.Scanner
を用いるreadB()
内でも、読み取った最初の1行に対し、スペースでtrim
した後、最初のトークンを返すようにしている - readB() の実装を以下のように単純化しても結果は変わらなかった
func readB() string { s := bufio.NewScanner(os.Stdin) s.Scan() return s.Text() }
補足情報(FW/ツールのバージョンなど)
- go 1.14
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。