Differences between revisions 3 and 8 (spanning 5 versions)
Revision 3 as of 2018-10-10 15:23:28
Size: 5676
Comment:
Revision 8 as of 2018-10-28 15:20:47
Size: 430
Comment:
Deletions are marked like this. Additions are marked like this.
Line 5: Line 5:
#acl AdminGroup:read,write,delete,revert,admin TadashiIijima:read,write,delete,revert,admin IijimaStaffGroup: IijimaGroup: IijimaObogGroup: GuestGroup: Known: All: #acl AdminGroup:read,write,delete,revert,admin TadashiIijima:read,write,delete,revert,admin IijimaStaffGroup: IijimaGroup: IijimaObogGroup: GuestGroup: Known: All:read
Line 11: Line 11:
[ <<Action(edit)>> ]
<<TableOfContents>>
[[../EP_003a/Contents|*]]
Line 12: Line 15:
 ||<|2>演習(3)||<|2>拡張課題(3a)||<|2>【関数定義】||[じゃんけんの勝敗]を判定する関数||
 ||<|1> [[../EP_003a|EP_02_003a_janken_judge.py|target="_blank"]]||


 * 解答は,(手を文字列で書いて)素直に書くと,下記の関数ですが,ちょっと長くなってしまいましたね.

{{{#!highlight python
def janken_judge_str( hand1, hand2 ):
    if hand1 == hand2:
        return( "あいこ" )
    elif hand1 == "グー":
        if hand2 == "チョキ":
            return( "勝ち" )
        else:
            return( "負け" )
    elif hand1 == "チョキ":
        if hand2 == "パー":
            return( "勝ち" )
        else:
            return( "負け" )
    else:
        if hand2 == "グー":
            return( "勝ち" )
        else:
            return( "負け" )
}}}

 * 手を0,1,2で表現すると,わずか1行(読みやすく関数定義すれば2行)で勝敗が判定できます
  * あいこ,勝ち,負けを0,1,2で表現します

{{{#!highlight python
def janken_judge( x, y ):
    return( ((y-x)+3)%3 )
}}}

 ||X||Y|| ||Y-X||(Y-X)+3||(Y-X)+3)%3||
 ||<-2>||<-2> || ||<-3>||
 ||0||0||グー ||グー ||あいこ || 0 ||3 ||0||
 ||0||1||グー ||チョキ||勝ち || 1 ||4 ||1||
 ||0||2||グー ||パー ||負け || 2 ||5 ||2||
 ||<-2>||<-2> || ||<-3>||
 ||1||1||チョキ||チョキ||あいこ || 0 ||3 ||0||
 ||1||0||チョキ||グー ||負け ||-1 ||2 ||2||
 ||1||2||チョキ||パー ||勝ち || 1 ||4 ||1||
 ||<-2>||<-2> || ||<-3>||
 ||2||2||パー ||パー ||あいこ || 0 ||3 ||0||
 ||2||0||パー ||グー ||勝ち ||-2 ||1 ||1||
 ||2||1||パー ||チョキ||負け ||-1 ||2 ||2||

{{{#!highlight python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ==============================================================================
# * Copyright (c) 2018 IIJIMA, Tadashi
# * (IIJIMA Laboratory, Dept. of Science and Technology, Keio University).
# ==============================================================================
# ソフトウェア工学[02] 拡張課題[02]-(000a) EP_02_000a_.py
# EP(Extended Problem) 02-000a:
# 2018-10-03 飯島 正 (iijima@ae.keio.ac.jp)
# ==============================================================================
# ===== 【関数定義】 「じゃんけんの勝敗」を文字列で返す関数 =====
def janken_judge_str( hand1, hand2 ):
    if hand1 == hand2:
        return( "あいこ" )
    elif hand1 == "グー":
        if hand2 == "チョキ":
            return( "勝ち" )
        else:
            return( "負け" )
    elif hand1 == "チョキ":
        if hand2 == "パー":
            return( "勝ち" )
        else:
            return( "負け" )
    else:
        if hand2 == "グー":
            return( "勝ち" )
        else:
            return( "負け" )
# ==============================================================================
# ===== 【関数定義】 「じゃんけんの勝敗」を0,1,2の整数で返す関数 =====
# X Y Y-X (Y-X)+3 ((Y-X)+3)%3
# 0 0 グー グー あいこ 0 3 0
# 0 1 グー チョキ 勝ち 1 4 1
# 0 2 グー パー 負け 2 5 2
#
# 1 1 チョキ チョキ あいこ 0 3 0
# 1 0 チョキ グー 負け -1 2 2
# 1 2 チョキ パー 勝ち 1 4 1
#
# 2 2 パー パー あいこ 0 3 0
# 2 0 パー グー 勝ち -2 1 1
# 2 1 パー チョキ 負け -1 2 2
# ------------------------------------------------------------------------------
def janken_judge( x, y ):
    return( ((y-x)+3)%3 )
# ==============================================================================
# ===== 【関数定義】 「じゃんけんの勝敗」の文字列を,対応する整数0,1,2から返す関数 =====
# リスト(配列)もしくは辞書を使うともっと簡潔にできる → 後日
def judge_str( x ):
    if x == 0:
        return( "あいこ" )
    elif x == 1:
        return( "勝ち" )
    else:
        return( "負け" )
# ==============================================================================
# ===== 【メイン・プログラム】  =====
# ----- オープニングメッセージ -----
print( "「じゃんけんの勝敗」を判定する: " )
  
# ----- 計算と結果の表示 ----
print()
print( "グー ×グー : ", judge_str( janken_judge( 0, 0 ) ) )
print( "グー ×チョキ: ", judge_str( janken_judge( 0, 1 ) ) )
print( "グー ×パー : ", judge_str( janken_judge( 0, 2 ) ) )

print()
print( "チョキ×グー : ", judge_str( janken_judge( 1, 0 ) ) )
print( "チョキ×チョキ: ", judge_str( janken_judge( 1, 1 ) ) )
print( "チョキ×パー : ", judge_str( janken_judge( 1, 2 ) ) )

print()
print( "パー ×グー : ", judge_str( janken_judge( 2, 0 ) ) )
print( "パー ×チョキ: ", judge_str( janken_judge( 2, 1 ) ) )
print( "パー ×パー : ", judge_str( janken_judge( 2, 2 ) ) )
# ==============================================================================
}}}


<<Include(../EP_003a/Contents)>>
[[../EP_003a/Contents|*]]

拡張問題(3)

[ edit ]

*


概要

[ edit ]

*


ヒント

この課題で使うPythonの機能 (学習のヒント)

[ edit ]

  • この課題で使うPythonの機能 (学習のヒント)

この課題の解き方 (問題解決のヒント)

[ edit ]

  • この課題の解き方 (問題解決のヒント) ....
    • 文字列で与えられた二つの「手」から,勝敗を返す関数janken_judge_str( hand1, hand2 )を定義することができます.

      • 単純に,if-elif-else文で書けそうですね.
    • 0,1,2で,じゃんけんの「手」を表現すると,簡単な計算で,勝敗を0(あいこ), 1(勝ち), 2(負け)で求める関数janken_judge(h1, h2)も定義できます.

      • 更にヒント: 剰余系を使います.
*


実行例

[ edit ]

  • 実行例(1) ... クリックすると拡大します

fig-01

*


プログラム例: 本質的な部分 (授業中に順次公開します)

*


高度な話題 (授業中,もしくは授業後に順次公開します)

[ edit ]

  • 高度な話題へのリンク: 授業の流れを阻害しないように別ページにします

    • (後日の回の授業内容にはなる可能性がありますが,この回の授業内容には含めません).
    • に関するものです.


プログラム例: 配布コード (授業中に順次公開します)

*

*

SoftEng: Python/Prog/Practice/Extended/02/EP_003a (last edited 2018-10-28 15:20:47 by TadashiIijima)