<kaggle_start><code>from learntools.core import binder

binder.bind(globals())
from learntools.python.ex3 import *

print("Setup complete.")

# # 1.
# 多くのプログラミング言語では、[`sign`](https://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E9%96%A2%E6%95%B0)が組み込み関数として用意されています。Pythonにはありませんが、自分で定義(作成)することができます。
# 下のセルに、数値を受け取り、それが負ならば-1、正ならば1、0ならば0を返す`sign`という関数を作成してください！
# コードはここに書いてください！"sign"という関数を作成します。
# Check your answer
q1.check()
# q1.solution()


# # 2.
# 前回の演習で作った`to_smash`関数に「logging（ログの出力、ここではprint関数を用います）」を追加しましょう！
def to_smash(total_candies):
    """与えられた数のキャンディを3人の友達に均等に配った後、捨てなければならない余りのキャンディの数を返します。
    捨てなければならない余りのキャンディーの数を返します。
    >>> to_smash(91)
    1
    """
    print("Splitting", total_candies, "candies")
    return total_candies % 3


to_smash(91)


# `total_candies = 1`で実行するとどうなるでしょうか？
to_smash(1)


# それは素晴らしい文法ではありません!（=ベストプラクティスではありません）
# 下のセルの定義を変更して、プリント文の文法を修正してください。(キャンディが1つしかない場合は、複数形の"candies"ではなく、単数形の "candy"を使用しないといけません)
# (訳注: ひとつしかない時って a candyではないんですね〜〜）
def to_smash(total_candies):
    """与えられた数のキャンディを3人の友達に均等に配った後、捨てなければならない余りのキャンディの数を返します。
    捨てなければならない余りのキャンディーの数を返します。
    >>> to_smash(91)
    1
    """
    print("Splitting", total_candies, "candies")
    return total_candies % 3


to_smash(91)
to_smash(1)


# この問題を正解したあと、解答を見る場合は、以下のコードセルを実行してください。
# 解答を見る（このコードセルを実行すると表示されます！）
q2.solution()


# # 3. 🌶️(難しめの問題です)
# チュートリアルでは、天気に対して外出する準備ができているかどうかを判断すること学びました。その時、私(作者)は、もし、、
# - 傘を持っていれば、雨に濡れたりする心配はないです。
# - または、雨がそれほど強くなく、フードがあれば、雨に濡れたりする心配はないです。
# - そうでなければ、雨が降っていて、仕事の日でなければ、私はまだ大丈夫です。(そもそも外出しないから)
# 以下の関数は、このことをPythonの式にしてます。このコードにはバグがあります。それを見つけることができますか？
# `prepared_for_weather`のコードが間違っていることを証明するには、次のいずれかを考えてください。
# - 関数が `False` を返す (しかし、本当は`True` を返すべきだった)、または
# - 関数が `True` を返した (しかし、本当は`False` を返すべきだった)。
# この問題に正解すると、Correctが出力（表示）されます。
def prepared_for_weather(have_umbrella, rain_level, have_hood, is_workday):
    # このコードを変更しないでください。私たちの目的は、バグを見つけることだけで、修正することではありません
    return (
        have_umbrella
        or rain_level < 5
        and have_hood
        or not rain_level > 0
        and is_workday
    )


# これらの入力の値を変更して、prepared_for_weatherのケースを表すようにします。
# これは間違っています。
have_umbrella = True
rain_level = 0.0
have_hood = True
is_workday = True
# 上の変数を利用して、prepared_for_weather関数が返す値を確認します。
actual = prepared_for_weather(have_umbrella, rain_level, have_hood, is_workday)
print(actual)
# 答え合わせをする
q3.check()
# q3.hint()
# q3.solution()


# # 4.
# 以下の関数 `is_negative` はうまく動いています。これは、与えられた数（入力された数）が負であれば`True`を、そうでなければ`False` を返します。
# 例) 5 が与えられると(つまり、`is_negative(5)` )、`True`
# -5が与えられると(つまり、`is_negative(-5)` )、`False`
# しかし、コードの長さが長すぎます。実はもっと短く書くことができるんです。なんと、この関数のコード行数を**75%**減らすことができます。
# たった**1行**のコードで同じことができます。それを関数 `concise_is_negative` に入れてみましょう。(HINT: Pythonの三項演算子は必要ありません)
# (訳注: これは、`def concise_is_negative(number):`これを含めずに1行です。）


def is_negative(number):
    if number < 0:
        return True
    else:
        return False


def concise_is_negative(number):
    pass  # ここに1行で書いてください。(これ以降の問題も)書くときはpassという文字は消してください。


# 答え合わせをします
q4.check()
# q4.hint()
# q4.solution()


# # 5a.
# The boolean variables `ketchup`, `mustard` and `onion` represent whether a customer wants a particular topping on their hot dog. We want to implement a number of boolean functions that correspond to some yes-or-no questions about the customer's order. For example:
# bool型の変数(True or False) である`ketchup`, `mustard`, `onion` は，お客さんがホットドッグに特定のトッピングをしたいかどうかを表します．お客さんの注文に関するイエスかノーかの質問に対応するいくつかのbool型がreturnされる関数を実装したいと考えています。例えば、以下のようなものです。
def onionless(ketchup, mustard, onion):
    """お客様に玉ねぎのトッピングがいるかどうかを伺います。"""
    return not onion


def wants_all_toppings(ketchup, mustard, onion):
    """お客様に "the works"（3つのトッピング）がいるかどうかを伺います。"""
    pass


# 答え合わせをします
q5.a.check()
# q5.a.hint()
# q5.a.solution()


# # 5b.
# 次の関数では、docstring(def .....  の下にある赤い文字のこと)の説明に合わせて中身を書いていってください！


def wants_plain_hotdog(ketchup, mustard, onion):
    """お客様がトッピングなしのプレーンなホットドッグを注文しているかを返します。"""
    pass


# 答え合わせをします
q5.b.check()
# q5.b.hint()
# q5.b.solution()


# # 5c.
# 次の関数では、docstring(def .....  の下にある赤い文字のこと)の説明に合わせて中身を書いていってください！


def exactly_one_sauce(ketchup, mustard, onion):
    """お客様がケチャップかマスタードのどちらか一方をトッピングするよう頼んでいます。
    (この操作は「排他的論理和("exclusive or")」という名前でおなじみでしょう)
    """
    pass


# 答え合わせをします
q5.c.check()
# q5.c.hint()
# q5.c.solution()


# # 6. 🌶️(難しめの問題です)
# 整数を入力し、`bool()`という関数を呼び出すと， 0に等しい場合は`False`を，そうでない場合は`True`を返すことを見てきました。
# ex) `bool(1)` -> `False`
# では、`int()`を呼び出すとどうなるでしょうか？下のノートブックセルで試してみてください。
# これを利用して，「お客さんはトッピングをちょうど1つ欲しいのか」という英文に対応する簡潔な関数を書くことができるでしょうか？
# 次の関数では、docstringの英語の説明に合わせてボディを記入します。
#
def exactly_one_topping(ketchup, mustard, onion):
    """お客様がホットドッグに3つのトッピングのうちどれか1つだけを希望しているかどうかを返します。"""
    pass


# 答え合わせをします
q6.check()
# q6.hint()
# q6.solution()


# # 7. 🌶️(難しめ) (Optional)
# In this problem we'll be working with a simplified version of [blackjack](https://en.wikipedia.org/wiki/Blackjack) (aka twenty-one). In this version there is one player (who you'll control) and a dealer. Play proceeds as follows:
# - The player is dealt two face-up cards. The dealer is dealt one face-up card.
# - The player may ask to be dealt another card ('hit') as many times as they wish. If the sum of their cards exceeds 21, they lose the round immediately.
# - The dealer then deals additional cards to himself until either:
# - the sum of the dealer's cards exceeds 21, in which case the player wins the round
# - the sum of the dealer's cards is greater than or equal to 17. If the player's total is greater than the dealer's, the player wins. Otherwise, the dealer wins (even in case of a tie).
#
# When calculating the sum of cards, Jack, Queen, and King count for 10. Aces can count as 1 or 11 (when referring to a player's "total" above, we mean the largest total that can be made without exceeding 21. So e.g. A+8 = 19, A+8+8 = 17)
# For this problem, you'll write a function representing the player's decision-making strategy in this game. We've provided a very unintelligent implementation below:
# この問題では、[ブラックジャック](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%82%B8%E3%83%A3%E3%83%83%E3%82%AF)の簡易版(通称：21)を扱います。このゲームは，プレイヤー1人（あなた）とディーラー1人がいます。プレイは次のように進みます。
# - プレイヤーには，表向きのカードが2枚配られます。ディーラーには表向きのカードが1枚配られます。
# - プレイヤーは何度でもディーラーにカードを配ってもらうことができます（「ヒット」）。カードの合計が21を超えた場合、このゲームは負けとなります。
# - その後、ディーラーは次のいずれかになるまで自分に追加のカードを配ります。
# - ディーラーのカードの合計が21を超えた場合　（この場合はプレイヤーの勝利となります）
# - ディーラーのカードの合計が17以上になる場合。（プレイヤーの合計がディーラーの合計より大きい場合は、プレイヤーの勝ちです。それ以外の場合は、ディーラーの勝ちです（同点の場合も同様））。
#
# カードの合計を計算するとき、ジャックJ、クイーンQ、キングKは10と数えます。エースAは1または11と数えます（上記のプレイヤーの「合計」という場合は、21を超えない最大の合計を意味します。例：A+8=19、A+8+8=17）。)
# この問題では、このゲームにおけるプレイヤーの意思決定戦略を表す関数を書きます。以下に、非常によくない、書き方が悪いコードを書きました。
def should_hit(dealer_total, player_total, player_low_aces, player_high_aces):
    """
    現在のゲームの状態で、プレイヤーがHitする（別のカードを要求する）べきであればTrueを、プレイヤーがStayするのであればFalseを返します。
    手元のカードの合計値を計算する際に、Aを11として数えた時に、21以上にならない場合はエースAを「high」（値が11）として数えます。
    そうでない場合は「low」（値が1）として数えます。
    例えば、プレイヤーの手札が{A, A, A, 7}の場合、11 + 1 + 1 + 7とカウントします。
    となり、player_total=20、player_low_aces=2、player_high_aces=1となります。
    """
    return False


# このゲームでは、カードが最初に配り終わると、そこからは常に２枚以上のカードを2人が持つことになります。
# あなたの関数を呼び出して，プレイヤーとディーラーのゲームをシュミレーションしてみましょう．
# 以下の関数を実行して，シュミレーションされたゲームを見てください．
q7.simulate_one_game()

# 多くのゲームにおける平均勝率が、プレイヤーの意思決定につながります。以下の関数を使って、50000回プレイしたブラックジャックをシミュレートしてみてください（実行するのに、数秒かかるかもしれません）:
q7.simulate(n_games=50000)


# ゲームの状態を完全に無視したプレイヤーは、それでも衝撃的なほど頻繁に勝つことができます！！！
# `should_hit`関数にもう少し賢さを加えて、結果にどのような影響を与えるか試してみてください。
def should_hit(dealer_total, player_total, player_low_aces, player_high_aces):
    """現在のゲームの状態で、プレイヤーがHitする（別のカードを要求する）べきであればTrueを、プレイヤーがStayするのであればFalseを返します。
    手元のカードの合計値を計算する際に、Aを11として数えた時に、21以上にならない場合はエースAを「high」（値が11）として数えます。
    そうでない場合は「low」（値が1）として数えます。
    例えば、プレイヤーの手札が{A, A, A, 7}の場合、11 + 1 + 1 + 7とカウントします。
    となり、player_total=20、player_low_aces=2、player_high_aces=1となります。
    """
    return False


q7.simulate(n_games=50000)
<|endoftext|>
[{"Id": 70261974, "ScriptId": 19225433, "ParentScriptVersionId": NaN, "ScriptLanguageId": 9, "AuthorUserId": 5973981, "CreationDate": "08/05/2021 15:13:17", "VersionNumber": 2.0, "Title": "Exercise: Booleans and Conditionals", "EvaluationDate": "08/05/2021", "IsChange": false, "TotalLines": 284.0, "LinesInsertedFromPrevious": 0.0, "LinesChangedFromPrevious": 0.0, "LinesUnchangedFromPrevious": 284.0, "LinesInsertedFromFork": 131.0, "LinesDeletedFromFork": 105.0, "LinesChangedFromFork": 0.0, "LinesUnchangedFromFork": 153.0, "TotalVotes": 0}]
from learntools.core import binder

binder.bind(globals())
from learntools.python.ex3 import *

print("Setup complete.")

# # 1.
# 多くのプログラミング言語では、[`sign`](https://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E9%96%A2%E6%95%B0)が組み込み関数として用意されています。Pythonにはありませんが、自分で定義(作成)することができます。
# 下のセルに、数値を受け取り、それが負ならば-1、正ならば1、0ならば0を返す`sign`という関数を作成してください！
# コードはここに書いてください！"sign"という関数を作成します。
# Check your answer
q1.check()
# q1.solution()


# # 2.
# 前回の演習で作った`to_smash`関数に「logging（ログの出力、ここではprint関数を用います）」を追加しましょう！
def to_smash(total_candies):
    """与えられた数のキャンディを3人の友達に均等に配った後、捨てなければならない余りのキャンディの数を返します。
    捨てなければならない余りのキャンディーの数を返します。
    >>> to_smash(91)
    1
    """
    print("Splitting", total_candies, "candies")
    return total_candies % 3


to_smash(91)


# `total_candies = 1`で実行するとどうなるでしょうか？
to_smash(1)


# それは素晴らしい文法ではありません!（=ベストプラクティスではありません）
# 下のセルの定義を変更して、プリント文の文法を修正してください。(キャンディが1つしかない場合は、複数形の"candies"ではなく、単数形の "candy"を使用しないといけません)
# (訳注: ひとつしかない時って a candyではないんですね〜〜）
def to_smash(total_candies):
    """与えられた数のキャンディを3人の友達に均等に配った後、捨てなければならない余りのキャンディの数を返します。
    捨てなければならない余りのキャンディーの数を返します。
    >>> to_smash(91)
    1
    """
    print("Splitting", total_candies, "candies")
    return total_candies % 3


to_smash(91)
to_smash(1)


# この問題を正解したあと、解答を見る場合は、以下のコードセルを実行してください。
# 解答を見る（このコードセルを実行すると表示されます！）
q2.solution()


# # 3. 🌶️(難しめの問題です)
# チュートリアルでは、天気に対して外出する準備ができているかどうかを判断すること学びました。その時、私(作者)は、もし、、
# - 傘を持っていれば、雨に濡れたりする心配はないです。
# - または、雨がそれほど強くなく、フードがあれば、雨に濡れたりする心配はないです。
# - そうでなければ、雨が降っていて、仕事の日でなければ、私はまだ大丈夫です。(そもそも外出しないから)
# 以下の関数は、このことをPythonの式にしてます。このコードにはバグがあります。それを見つけることができますか？
# `prepared_for_weather`のコードが間違っていることを証明するには、次のいずれかを考えてください。
# - 関数が `False` を返す (しかし、本当は`True` を返すべきだった)、または
# - 関数が `True` を返した (しかし、本当は`False` を返すべきだった)。
# この問題に正解すると、Correctが出力（表示）されます。
def prepared_for_weather(have_umbrella, rain_level, have_hood, is_workday):
    # このコードを変更しないでください。私たちの目的は、バグを見つけることだけで、修正することではありません
    return (
        have_umbrella
        or rain_level < 5
        and have_hood
        or not rain_level > 0
        and is_workday
    )


# これらの入力の値を変更して、prepared_for_weatherのケースを表すようにします。
# これは間違っています。
have_umbrella = True
rain_level = 0.0
have_hood = True
is_workday = True
# 上の変数を利用して、prepared_for_weather関数が返す値を確認します。
actual = prepared_for_weather(have_umbrella, rain_level, have_hood, is_workday)
print(actual)
# 答え合わせをする
q3.check()
# q3.hint()
# q3.solution()


# # 4.
# 以下の関数 `is_negative` はうまく動いています。これは、与えられた数（入力された数）が負であれば`True`を、そうでなければ`False` を返します。
# 例) 5 が与えられると(つまり、`is_negative(5)` )、`True`
# -5が与えられると(つまり、`is_negative(-5)` )、`False`
# しかし、コードの長さが長すぎます。実はもっと短く書くことができるんです。なんと、この関数のコード行数を**75%**減らすことができます。
# たった**1行**のコードで同じことができます。それを関数 `concise_is_negative` に入れてみましょう。(HINT: Pythonの三項演算子は必要ありません)
# (訳注: これは、`def concise_is_negative(number):`これを含めずに1行です。）


def is_negative(number):
    if number < 0:
        return True
    else:
        return False


def concise_is_negative(number):
    pass  # ここに1行で書いてください。(これ以降の問題も)書くときはpassという文字は消してください。


# 答え合わせをします
q4.check()
# q4.hint()
# q4.solution()


# # 5a.
# The boolean variables `ketchup`, `mustard` and `onion` represent whether a customer wants a particular topping on their hot dog. We want to implement a number of boolean functions that correspond to some yes-or-no questions about the customer's order. For example:
# bool型の変数(True or False) である`ketchup`, `mustard`, `onion` は，お客さんがホットドッグに特定のトッピングをしたいかどうかを表します．お客さんの注文に関するイエスかノーかの質問に対応するいくつかのbool型がreturnされる関数を実装したいと考えています。例えば、以下のようなものです。
def onionless(ketchup, mustard, onion):
    """お客様に玉ねぎのトッピングがいるかどうかを伺います。"""
    return not onion


def wants_all_toppings(ketchup, mustard, onion):
    """お客様に "the works"（3つのトッピング）がいるかどうかを伺います。"""
    pass


# 答え合わせをします
q5.a.check()
# q5.a.hint()
# q5.a.solution()


# # 5b.
# 次の関数では、docstring(def .....  の下にある赤い文字のこと)の説明に合わせて中身を書いていってください！


def wants_plain_hotdog(ketchup, mustard, onion):
    """お客様がトッピングなしのプレーンなホットドッグを注文しているかを返します。"""
    pass


# 答え合わせをします
q5.b.check()
# q5.b.hint()
# q5.b.solution()


# # 5c.
# 次の関数では、docstring(def .....  の下にある赤い文字のこと)の説明に合わせて中身を書いていってください！


def exactly_one_sauce(ketchup, mustard, onion):
    """お客様がケチャップかマスタードのどちらか一方をトッピングするよう頼んでいます。
    (この操作は「排他的論理和("exclusive or")」という名前でおなじみでしょう)
    """
    pass


# 答え合わせをします
q5.c.check()
# q5.c.hint()
# q5.c.solution()


# # 6. 🌶️(難しめの問題です)
# 整数を入力し、`bool()`という関数を呼び出すと， 0に等しい場合は`False`を，そうでない場合は`True`を返すことを見てきました。
# ex) `bool(1)` -> `False`
# では、`int()`を呼び出すとどうなるでしょうか？下のノートブックセルで試してみてください。
# これを利用して，「お客さんはトッピングをちょうど1つ欲しいのか」という英文に対応する簡潔な関数を書くことができるでしょうか？
# 次の関数では、docstringの英語の説明に合わせてボディを記入します。
#
def exactly_one_topping(ketchup, mustard, onion):
    """お客様がホットドッグに3つのトッピングのうちどれか1つだけを希望しているかどうかを返します。"""
    pass


# 答え合わせをします
q6.check()
# q6.hint()
# q6.solution()


# # 7. 🌶️(難しめ) (Optional)
# In this problem we'll be working with a simplified version of [blackjack](https://en.wikipedia.org/wiki/Blackjack) (aka twenty-one). In this version there is one player (who you'll control) and a dealer. Play proceeds as follows:
# - The player is dealt two face-up cards. The dealer is dealt one face-up card.
# - The player may ask to be dealt another card ('hit') as many times as they wish. If the sum of their cards exceeds 21, they lose the round immediately.
# - The dealer then deals additional cards to himself until either:
# - the sum of the dealer's cards exceeds 21, in which case the player wins the round
# - the sum of the dealer's cards is greater than or equal to 17. If the player's total is greater than the dealer's, the player wins. Otherwise, the dealer wins (even in case of a tie).
#
# When calculating the sum of cards, Jack, Queen, and King count for 10. Aces can count as 1 or 11 (when referring to a player's "total" above, we mean the largest total that can be made without exceeding 21. So e.g. A+8 = 19, A+8+8 = 17)
# For this problem, you'll write a function representing the player's decision-making strategy in this game. We've provided a very unintelligent implementation below:
# この問題では、[ブラックジャック](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%82%B8%E3%83%A3%E3%83%83%E3%82%AF)の簡易版(通称：21)を扱います。このゲームは，プレイヤー1人（あなた）とディーラー1人がいます。プレイは次のように進みます。
# - プレイヤーには，表向きのカードが2枚配られます。ディーラーには表向きのカードが1枚配られます。
# - プレイヤーは何度でもディーラーにカードを配ってもらうことができます（「ヒット」）。カードの合計が21を超えた場合、このゲームは負けとなります。
# - その後、ディーラーは次のいずれかになるまで自分に追加のカードを配ります。
# - ディーラーのカードの合計が21を超えた場合　（この場合はプレイヤーの勝利となります）
# - ディーラーのカードの合計が17以上になる場合。（プレイヤーの合計がディーラーの合計より大きい場合は、プレイヤーの勝ちです。それ以外の場合は、ディーラーの勝ちです（同点の場合も同様））。
#
# カードの合計を計算するとき、ジャックJ、クイーンQ、キングKは10と数えます。エースAは1または11と数えます（上記のプレイヤーの「合計」という場合は、21を超えない最大の合計を意味します。例：A+8=19、A+8+8=17）。)
# この問題では、このゲームにおけるプレイヤーの意思決定戦略を表す関数を書きます。以下に、非常によくない、書き方が悪いコードを書きました。
def should_hit(dealer_total, player_total, player_low_aces, player_high_aces):
    """
    現在のゲームの状態で、プレイヤーがHitする（別のカードを要求する）べきであればTrueを、プレイヤーがStayするのであればFalseを返します。
    手元のカードの合計値を計算する際に、Aを11として数えた時に、21以上にならない場合はエースAを「high」（値が11）として数えます。
    そうでない場合は「low」（値が1）として数えます。
    例えば、プレイヤーの手札が{A, A, A, 7}の場合、11 + 1 + 1 + 7とカウントします。
    となり、player_total=20、player_low_aces=2、player_high_aces=1となります。
    """
    return False


# このゲームでは、カードが最初に配り終わると、そこからは常に２枚以上のカードを2人が持つことになります。
# あなたの関数を呼び出して，プレイヤーとディーラーのゲームをシュミレーションしてみましょう．
# 以下の関数を実行して，シュミレーションされたゲームを見てください．
q7.simulate_one_game()

# 多くのゲームにおける平均勝率が、プレイヤーの意思決定につながります。以下の関数を使って、50000回プレイしたブラックジャックをシミュレートしてみてください（実行するのに、数秒かかるかもしれません）:
q7.simulate(n_games=50000)


# ゲームの状態を完全に無視したプレイヤーは、それでも衝撃的なほど頻繁に勝つことができます！！！
# `should_hit`関数にもう少し賢さを加えて、結果にどのような影響を与えるか試してみてください。
def should_hit(dealer_total, player_total, player_low_aces, player_high_aces):
    """現在のゲームの状態で、プレイヤーがHitする（別のカードを要求する）べきであればTrueを、プレイヤーがStayするのであればFalseを返します。
    手元のカードの合計値を計算する際に、Aを11として数えた時に、21以上にならない場合はエースAを「high」（値が11）として数えます。
    そうでない場合は「low」（値が1）として数えます。
    例えば、プレイヤーの手札が{A, A, A, 7}の場合、11 + 1 + 1 + 7とカウントします。
    となり、player_total=20、player_low_aces=2、player_high_aces=1となります。
    """
    return False


q7.simulate(n_games=50000)
