🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2031閲覧

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

Zett-8

総合スコア8

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/11/14 02:20

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

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

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

go

1package main 2 3import ( 4"bufio" 5"fmt" 6"math/big" 7"os" 8"strconv" 9"strings" 10) 11 12var sc = bufio.NewScanner(os.Stdin) 13var out = bufio.NewWriter(os.Stdout) 14 15func nextLine() string { 16 sc.Scan() 17 return sc.Text() 18} 19 20func nextInt() uint64 { 21 sc.Scan() 22 i, e := strconv.ParseUint(sc.Text(), 10, 64) 23 if e != nil { 24 panic(e) 25 } 26 return i 27} 28 29func uint64Array(arr []string) (newArr []uint64) { 30 for i, _ := range arr { 31 n, _ := strconv.ParseUint(arr[i], 10, 64) 32 newArr = append(newArr, n) 33 } 34 return 35} 36 37func main() { 38 _ = int(nextInt()) 39 L := uint64Array(strings.Split(nextLine(), " ")) 40 41 for i := len(L)-1; i > 0; i-- { 42 if L[i-1] > L[i] { 43 if L[i-1] -= 1; L[i-1] > L[i] { 44 fmt.Println("No") 45 os.Exit(0) 46 } 47 } 48 } 49 50 fmt.Println("Yes") 51} 52

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

python

1import sys 2sys.setrecursionlimit(20000000) 3input = sys.stdin.readline 4 5def main(): 6 n = int(input()) 7 nums = list(map(int, input().split())) 8 9 for x in reversed(range(1, len(nums))): 10 if nums[x-1] > nums[x]: 11 nums[x-1] -= 1 12 13 if nums[x-1] > nums[x]: 14 print('No') 15 sys.exit() 16 17 print('Yes') 18 19 20if __name__ == '__main__': 21 main()

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

投稿2019/11/16 16:55

yudedako67

総合スコア2047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zett-8

2019/11/17 06:52

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

0

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

投稿2019/11/15 01:56

nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zett-8

2019/11/15 02: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系のエラーではないと考えています。
nobonobo

2019/11/15 02:34

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

2019/11/15 05:28

それが...atcoderのテストケースは全て以下にアップロートされるはずなんですが、 https://www.dropbox.com/sh/arnpe0ef5wds8cv/AAAk_SECQ2Nc6SVGii3rHX6Fa なぜかabc133 ~ abc143あたりのファイルが欠落しており、通らないテストケースのinputを知ることができないのです... nobonoboさんに見ていただいて、どこか見てわかるような間違った書き方をしているわけではない、とわかっただけでも安心しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問