質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.78%

同じロジックだが、GoだとWAになる [Atcoder]

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,017

score 7

Goの勉強がてら、atcoderで一度pythonで解いた問題をGoで解き直しています。

下記の問題を解いていたところ、ロジックは同じにも関わらず、なぜかGoだといくつかのテストケースでWAがでてしまい、思い当たる改善部分がなく途方にくれています。
(問題に正解したいのではなく、同じロジックなのになぜGoの方は通らないのか理解したいです)

C - Build Stairs https://atcoder.jp/contests/abc136/tasks/abc136_c

package main

import (
"bufio"
"fmt"
"math/big"
"os"
"strconv"
"strings"
)

var sc = bufio.NewScanner(os.Stdin)
var out = bufio.NewWriter(os.Stdout)

func nextLine() string {
    sc.Scan()
    return sc.Text()
}

func nextInt() uint64 {
    sc.Scan()
    i, e := strconv.ParseUint(sc.Text(), 10, 64)
    if e != nil {
        panic(e)
    }
    return i
}

func uint64Array(arr []string) (newArr []uint64) {
    for i, _ := range arr {
        n, _ := strconv.ParseUint(arr[i], 10, 64)
        newArr = append(newArr, n)
    }
    return
}

func main() {
    _ = int(nextInt())
    L := uint64Array(strings.Split(nextLine(), " "))

    for i := len(L)-1; i > 0; i-- {
        if L[i-1] > L[i] {
            if L[i-1] -= 1; L[i-1] > L[i] {
                fmt.Println("No")
                os.Exit(0)
            }
        }
    }

    fmt.Println("Yes")
}

このpythonのcodeでは無事ACになります。

import sys
sys.setrecursionlimit(20000000)
input = sys.stdin.readline

def main():
    n = int(input())
    nums = list(map(int, input().split()))

    for x in reversed(range(1, len(nums))):
        if nums[x-1] > nums[x]:
            nums[x-1] -= 1

        if nums[x-1] > nums[x]:
            print('No')
            sys.exit()

    print('Yes')


if __name__ == '__main__':
    main()

まだGoに関して理解できていない挙動があるのではないかとモヤモヤしています。
わかる方よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

いくつかコードを投げて失敗したテストケースの特徴を調べてみたところ、答えが”No"かつ問題サイズがある程度大きいもので失敗しているようだったので詳しく見てみると、Goの仕様上sc.Text()で読み込める長さが相当短いようで、入力の2行目がちゃんと読み取れていないことが原因のようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/17 15:52

    ありがとうございます! inputが正しくできていないとはまったく気が付きませんでした。
    実はこの問題以外でも、合ってるはずなのにいくつかのテストケースでWAやREでてしまうことがありまして、途方に暮れていたのですが、これで納得がいきました。

    本当に助かりました、ありがとうございます。

    キャンセル

-1

「"math/big"をインポートしているのに使っていない。」でしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/15 11:28

    ご回答ありがとうございます。

    実はコード内には他にも問題を解くためのfuncを定義しており、math/bigは以下のような形で使っております。

    ```go
    func gcd(m, n uint64) uint64 {
    x := new(big.Int)
    y := new(big.Int)
    z := new(big.Int)
    a := new(big.Int).SetUint64(m)
    b := new(big.Int).SetUint64(n)
    return z.GCD(x, y, a, b).Uint64()
    }
    ```

    定義済みのfuncを全て含めるとかなり長くなるので今回は省略して投稿しておりました。
    わかり辛くてすみません。

    また、全てのケースでREやWAになるのではなく、半数ほどは正解になるので、import系のエラーではないと考えています。

    キャンセル

  • 2019/11/15 11:34

    あとは実際に差異の出たサンプルデータを提供してもらえれば。

    キャンセル

  • 2019/11/15 14:28

    それが...atcoderのテストケースは全て以下にアップロートされるはずなんですが、
    https://www.dropbox.com/sh/arnpe0ef5wds8cv/AAAk_SECQ2Nc6SVGii3rHX6Fa

    なぜかabc133 ~ abc143あたりのファイルが欠落しており、通らないテストケースのinputを知ることができないのです...

    nobonoboさんに見ていただいて、どこか見てわかるような間違った書き方をしているわけではない、とわかっただけでも安心しました。
    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る