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

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

新規登録して質問してみよう
ただいま回答率
85.30%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1426閲覧

【Python3】paizaの位置情報システム(Bランク相当)が解けない

ss2452

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/07/15 08:36

paizaの新・Bランクレベルアップメニューの問題に
【シミュレーション 4】位置情報システム(Bランク相当)
※スキルチェックの問題ではありません

という問題があるのですが、何度やっても正解しません。
(最初の2個しかテストケースが通らない)

考察漏れ、間違い等指摘していただけると幸いです。

問題のURL

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__move_simulation/

該当のソースコード

Python

1from math import floor 2li = [[*map(int,input().split())]for _ in"_"*int(input())] 3t = 0 4px,py=li[0][2],li[0][1] 5for x in range(101): 6 print(floor(py), floor(px)) 7 if x == li[t][0]: 8 py = li[t][1] 9 px = li[t][2] 10 if t < len(li)-1: t += 1 11 tm = li[t][0] - li[t-1][0] 12 py += (li[t][1] - li[t-1][1]) / tm 13 px += (li[t][2] - li[t-1][2]) / tm

試したこと

小数点以下切り捨てと問題文に記載されていたため、mathモジュールをimportしてfloor関数を利用してみました。(結果は失敗)
int()を使用しても、math.trunc()を使用しても失敗しました。

補足情報(FW/ツールのバージョンなど)

Python 3.8.10

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

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

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

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

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

melian

2023/07/15 09:55 編集

> ただし、座標が小数になる場合は小数点以下を切り捨てる。 座標値を表示するときにだけ floor を実行していて、累積値の計算は float 型数値での計算になっています。 py += (li[t][1] - li[t-1][1]) / tm px += (li[t][2] - li[t-1][2]) / tm 小数点以下の切り捨ては毎回行う必要があるのではないでしょうか。(右辺値を切り捨てで整数値にする)
guest

回答1

0

ベストアンサー

こちらの入力例を試してみてください。

2 0 0 0 100 100 10

ご提示のコードだと、以下のような結果を返します。

0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 2 21 2 22 2 23 2 24 2 25 2 26 2 27 2 28 2 29 2 30 3 31 3 32 3 33 3 34 3 35 3 36 3 37 3 38 3 39 3 40 4 41 4 42 4 43 4 44 4 45 4 46 4 47 4 48 4 49 4 50 4 51 5 52 5 53 5 54 5 55 5 56 5 57 5 58 5 59 5 60 5 61 6 62 6 63 6 64 6 65 6 66 6 67 6 68 6 69 6 70 6 71 7 72 7 73 7 74 7 75 7 76 7 77 7 78 7 79 7 80 7 81 8 82 8 83 8 84 8 85 8 86 8 87 8 88 8 89 8 90 8 91 9 92 9 93 9 94 9 95 9 96 9 97 9 98 9 99 9 100 9

x座標がy座標の1/10になるはずなのに、一部そうなっていない箇所があります。
(10 0100 9など)

このような結果となるのは、浮動小数点数の誤差が原因です。
浮動小数点数の0.1を10回足しても、誤差のせいで1にならない、という話を聞いたことが無いでしょうか。
こちらは有名な話なので、検索すればいろいろと記事が見つかります。

ご提示のコードだと、以下の部分で浮動小数点数を何度も足し合わせています。

python

1 py += (li[t][1] - li[t-1][1]) / tm 2 px += (li[t][2] - li[t-1][2]) / tm

最初の入力例だと、pxに毎回0.1を足していることになるので、同じ問題が発生しています。

投稿2023/07/15 10:11

編集2023/07/15 10:19
actorbug

総合スコア2479

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

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

ss2452

2023/07/15 12:12

入力例を提示して頂いたことで、浮動小数点数の誤差についての理解が進みました。 加算の代わりに乗算を行うようプログラムを変更すると無事テストケースを通過することが出来ました。とても勉強になりました。有り難う御座います。 (変更前) +=を使用していた為、誤差による問題が発生していた (変更後) 乗算を行い、除算時にint関数を使用することで解決した
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問