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

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

新規登録して質問してみよう
ただいま回答率
85.35%
while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

Python

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

Q&A

解決済

1回答

1661閲覧

python AtCoder ABC081B - Shift only について

enjyu

総合スコア11

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

Python

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

0グッド

0クリップ

投稿2020/10/04 14:10

AtCoder の [ABC081B - Shift only ]をpythonで解いているのですが(https://atcoder.jp/contests/abs/tasks/abc081_b)、下記のコードでは解くことが出来ませんでした。

python

1from sys import stdin 2 3n = stdin.readline() 4 5aaa = list(map(int,input().split())) 6 7count = 0 8 9def calc_div(n): 10 return n / 2 11 12all([x % 2 == 0 for x in aaa])#ifリスト内が全部偶数か確認 13 14while True: #ifリスト内が全部偶数の時 15 16 aaa = list(map(calc_div , aaa)) 17 count += 1 18 all([x % 2 == 1 for x in aaa]) 19 20print(count)

他の方の回答や解き方を見て、理解することはできたのですが自分なりのコードで通せるようにしたいです。
独学でプログラミングを勉強し始めたばかりなので、基本的なところを間違えている可能性が高いです。

今まで自分でどこを間違えているのか調べたことを下記に記します。
・コマンドプロンプトで起動したところ、何も表示されずに終了してしまうため、whileの中から抜け出せていないと思い、whileの中でcount=100でbreakする条件をつけ足しました。→count=100のところで抜け、リストの中身を表示してみたところオブジェクトの型らしきものしか表示されませんでした。
・map関数の戻り値がシーケンス?であるためうまく表示されていないことがわかり、list型に変換しました。
・もう一度実行したところ、while条件式の中を抜けることがなくcount=100のところのリストの中身は何回も割った数字になっていました(例 3.0154425151e-22)

このことから、
・奇数になった際に判定がTRUEに変わっていない
・while の条件式でFALSEになっても実行されてしまう。
・2で割る処理が正しくない
等がうまく実行されない原因だと思いますが、躓いてしまいました。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python

1 2aaa = list(map(int,input().split())) 3 4count = 0 5 6def calc_div(n): 7 return n / 2 8 9while all([x % 2 == 0 for x in aaa]): 10 aaa = list(map(calc_div , aaa)) 11 count += 1 12 13print(count)

このことから、

・奇数になった際に判定がTRUEに変わっていない
・while の条件式でFALSEになっても実行されてしまう。
・2で割る処理が正しくない

質問者さんのコードでは
・そもそも偶数/奇数判定は行われていません。(判定するコードはあるがそれが利用されていない)
・whileの条件式がFalseになることはありません。
・「2で割る処理」は良いんじゃないでしょうか。

投稿2020/10/04 15:53

meg_

総合スコア10760

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

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

enjyu

2020/10/05 12:51

回答ありがとうございました。 ・偶数・奇数判定のところの理解が足りていませんでした。 ・whileの件は完全にぼけていました。 またの機会がございましたらよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問