enzyu
@enzyu

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

AtCoder(Python)のbool値パズル

解決したいこと

始めの三行でTrueまたはFalseを代入してAtCoderという文字列を出力する問題です。
こういったものが初めてなのもあって、このパズル問題の解答がなぜ成り立つのか分かりません。
よろしくお願いします。
https://atcoder.jp/contests/APG4bPython/tasks/APG4bPython_cp

解答例(正答)

a = True  # True または False
b = False  # True または False
c = True  # True または False

# ここから先は変更しないこと

assert (a is True) or (a is False)
assert (b is True) or (b is False)
assert (c is True) or (c is False)

if a:
    print("At", end="")
else:
    print("Yo", end="")

if not a and b:
    print("Bo", end="")
else:
    print("Co", end="")

if a and b and c:
    print("foo!", end="")
elif True and False:
    print("year!", end="")
elif not a or c:
    print("der", end="")

print("")

自分で試したこと

aはtrueとしてbがfalseの場合、条件式がfalse値のnotなのでBoが出力されると思ってしまいます。
それに仮にbをtrueにしたとしても、aがtrue値である以上derを出力できないのではないでしょうか。
なぜこの解答が正しいのか分からないのでよろしくお願いします。

0

1Answer

aはtrueとしてbがfalseの場合、条件式がfalse値のnotなのでBoが出力されると思ってしまいます。

if not a and b: ←このif文のことだと思いますが、これは、
if (not a) and b: と等価です。
よって、aはtrueとしてbがfalseの場合は、elseになります。

それに仮にbをtrueにしたとしても、aがtrue値である以上derを出力できないのではないでしょうか。

同様に elif not a or c:elif (not a) or c: と等価です。cがtrueですから、"der"になります。

0Like

Comments

  1. @enzyu

    Questioner

    ありがとうございます!
    すっきり分かりました、よく考えればnotもただの演算子ですし特別な書き方をしているわけでもないので、一つのみにかかるのが当たり前ですよね。
    次からは無自覚の思い込みがないかもっと注意して考えてみようと思います。

  2. 演算子の優先順位は、言語によって違うこともあるので、言語仕様を確認するとよいです。
    if not a and bと書いた時に、if not (a and b)と評価する言語もあるということです)

    もし解決でよろしければ、当Q&Aをクローズしてください。

Your answer might help someone💌