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

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

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

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

Q&A

解決済

4回答

1904閲覧

[python]ドラえもん栗まんじゅう問題

FoiFoi

総合スコア15

Python 3.x

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

0グッド

0クリップ

投稿2019/04/04 05:57

やりたいこと

  • dictionaryを関数に入力して、entry_objectの面積合計がtarget_dicの各valueを超えた時にそれぞれのkeyを用いて

"{key}がまんじゅうで一杯になるのに{count}分要します。"

を出力したい。

#現状

  • '東京ドームがまんじゅうで一杯になるのに45分要します。'で終了してしまう

    ↓
dicの1つ目のvalueを検討し、returnを返しroopが終了してしまう
(全てのvalueが検討されない)

  • 理想

'東京ドームがまんじゅうで一杯になるのに45分要します。'
'地球がまんじゅうで一杯になるのに●分要します。'
'太陽がまんじゅうで一杯になるのに△分要します。'

#コード

python

1def baibai_inn_time_counter_1 (entry_object, target_dic): 2 3 count = 0 4 5 while True: 6 for key, value in target_dic.items(): 7 if entry_object * 2 ** count/5 > value: 8 return "{key}がまんじゅうで一杯になるのに{count}分要します。".format(key = key, count = count) 9 else: 10 count += 5

#関数への入力

python

1input_dic = {"東京ドーム":1240000, "地球":1.08269693243E+21, "太陽":1.1494040321933E+46} 2baibai_inn_time_counter_1(6.5e-5, input_dic)

#出力

'東京ドームがまんじゅうで一杯になるのに45分要します。'

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

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

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

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

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

t_obara

2019/04/04 07:51

formatについてお調べになりましたか?「python format」でググればどのように使うべきかがわかりそうですが。ちなみに、地球が●としたいのに、1.82..を入力としているのは何故ですか?
FoiFoi

2019/04/04 08:26

>formatについてお調べになりましたか? 以下サイトを確認しております。 https://note.nkmk.me/python-format-zero-hex/ >地球が●としたいのに、1.82..を入力としているのは何故ですか? 本問題は、entry_obectの個数が5分おきに倍々されていくというものでして、東京ドーム・地球・太陽のそれぞれがなん分後にentry_obectで満ちてしまうかという問題です。 そのため1.082..というのは地球の体積です。
t_obara

2019/04/04 10:21

数字の意味をお聞きしているのではなく、●と印字したいのですよね?それであれば、●を設定すべきではないのでしょうか?という疑問です。あるいは体積を元に●を印字するようなロジックがあるのでしょうか?
FoiFoi

2019/04/04 11:50 編集

>あるいは体積を元に●を印字するようなロジックがあるのでしょうか? はい、こちら体積を個数が増幅するentry_obectが満たすには何分かかるかというロジックが関数内if以下にございます。そのため●は体積という入力を受けて時間(分)が出力されます。
guest

回答4

0

ベストアンサー

提示コードにはいくつか質問点以外にもいくつか問題があります。

まず、entry_object * 2 ** count/5は演算優先順位によりentry_object * 2 ** count / 5と誤動作します。
entry_object * 2 ** (count/5)のように明示的にカッコで優先順位を指定する必要があります。
以下確認コード

for count in range(0,20,5): entry_object = 1 v1 = entry_object * 2 ** count/5 # 誤 v2 = entry_object * 2 ** (count/5)# 正 print(count,v1,v2) """ 0 0.2 1.0 5 6.4 2.0 10 204.8 4.0 15 6553.6 8.0 """

次に、提示コードは入力要素(面積)が昇順であることを前提としているようですが、仕様上、辞書は要素の並びが不定です。よって(名称,面積)のタプルなりで管理する方がよいです。(cpythonでの実装上は問題ないのですが念のため)

最後にfor と whileのループの関係が根本的におかしいです。
以上を修正したコードが以下になります。
なお、コードの確かさを確認するために、まずは手計算できるような単純かつ小さい数値で動かしてみることをお勧めします。

Python

1def baibai_inn_time_counter_1 (entry_object, target_tpl): 2 count = 0 3 ret = [] 4 for t in target_tpl: 5 while True: 6 cur_s = entry_object * 2 ** (count/5) 7 print(count,cur_s) # テスト表示 8 9 if cur_s > t[1]: 10 ret.append("{name}がまんじゅうで一杯になるのに{count}分要します。".format(name = t[0], count = count)) 11 count += 5 12 break 13 count += 5 14 15 return ret 16 17input_dic ={"100㎡?":100, "10㎡?":10, # テストデータ 18 "東京ドーム":1240000, "地球":1.08269693243E+21, "太陽":1.1494040321933E+46} 19# 確実に個数の昇順になるようにタプルで管理&ソートする 20input_tpl = [(k,v) for k,v in input_dic.items()] 21input_tpl = sorted(input_tpl,key=lambda x:x[1]) 22print(input_tpl) 23 24S = 6.5e-5 25#S = 1 # まずは単純な数値で確認 26ret = baibai_inn_time_counter_1(S, input_tpl) 27[print(r) for r in ret] 28""" 2910㎡?がまんじゅうで一杯になるのに90分要します。 30100㎡?がまんじゅうで一杯になるのに105分要します。 31東京ドームがまんじゅうで一杯になるのに175分要します。 32地球がまんじゅうで一杯になるのに420分要します。 33太陽がまんじゅうで一杯になるのに835分要します。 34"""

投稿2019/04/04 08:29

can110

総合スコア38266

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

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

FoiFoi

2019/04/04 11:50

ご回答頂きありがとうございます。 また、コードの不手際までご指摘頂きましてありがとうございます。 一点確認なのですが、 http://www.freia.jp/taka/blog/python3-hash-randomie/index.html 上記サイトでは >Python3.6では、辞書のキー順を維持するので、hash値がどうであっても結果は固定化されます とありますがこちらpythonのバージョンによって辞書のorderが不定か固定か異なるという認識でよろしいでしょうか。
can110

2019/04/04 11:59

はい。3.6以降の(CPythonの)実装仕様上では固定です。 3.7が出ている最近ではあまり気にする必要はないのかもしれませんが、古いマシン・OS環境では一応注意しておく必要があります。
FoiFoi

2019/04/05 00:54

ありがとうございます。
guest

0

  1. 辞書のことは一旦忘れて、場所の名前と面積を入れると何分で一杯になるか出力する関数を書く
  2. その関数を辞書の要素それぞれに対して実行する。

投稿2019/04/04 06:02

ozwk

総合スコア13521

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

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

0

解決済み

python

1def baibai_inn_time_counter (entry_object, target_dic): 2 3 count = 0 4 declare = [] 5 6 for key, value in target_dic.items(): 7 while entry_object * 2 ** (count/5) < value: 8 count += 5 9 else: 10 print("{target}がまんじゅうで一杯になるのに{time}分要します。".format(target = key, time = count))

投稿2019/04/07 07:17

編集2019/04/07 07:19
FoiFoi

総合スコア15

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

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

0

汎用性はないし、雑なコードですが、何かの課題っぽいのでこれで良いのではないでしょうか。

import numpy as np import pandas as pd def baibai_inn_time_counter_1 (entry_object, target_dic): count = 0 res = [] while True: for key, value in target_dic.items(): if entry_object * 2 ** count/5 > value: res.append("{key}がまんじゅうで一杯になるのに{count}分要します。".format(key = key, count = count)) else: count += 5 if len(res)==3: return res

出力結果

['東京ドームがまんじゅうで一杯になるのに45分要します。', '東京ドームがまんじゅうで一杯になるのに55分要します。', '東京ドームがまんじゅうで一杯になるのに65分要します。']

投稿2019/04/04 06:25

bamboo-nova

総合スコア1408

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

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

bamboo-nova

2019/04/04 06:28

あ、課題なら答え出したらいけないのか汗 ちなみに、知り合いがドラえもんの栗饅頭の話で宇宙を多い尽くすのにかかる時間を計算したことがありますが、だいたい17-18時間くらいでしたね笑
FoiFoi

2019/04/04 06:31

ありがとうございます! ただそれであっても ['東京ドームがまんじゅうで一杯になるのに45分要します。' '地球がまんじゅうで一杯になるのに●分要します。' '太陽がまんじゅうで一杯になるのに△分要します。'] というのが求めたい出力でした!
bamboo-nova

2019/04/04 07:56

そのような形にしたいだけなら、以下を追加すればいけますよ。 print('['+res+']')
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問