2
2

さや香の「見せ算」をPythonで実装する

Last updated at Posted at 2023-12-25

はじめに

昨日M1グランプリ2023がありましたね。

個人的にはさや香が好きでしたが、優勝は令和ロマンスでした。

さや香の決勝戦のネタで「見せ算」というものでした。
これは+-*/の四則演算に新たな第5の演算を追加したい、というコンセプトのネタです。
今回はこれを可能な限りプログラミングの世界に落とし込み、実装していきたいと思います。

見せ算の定義

+-*/に当たる部分は「見せ」といい、和差積商に当たる部分は「眼(がん)」と呼びます。

基本ルール

  1. A=Bのとき、A見せB=0
  2. A<Bのとき、A見せB=B

応用ルール

  1. 6見せ9=11. これは、6と9がお互い形が似ているため見つめ合うように近づいて行き、結果11になる.
  2. 2見せ5=11. 6見せ9と同じ論理で11になり、かつ5がスマホをポケットから落とすためそれが小数点となり、1.1になる。
  3. 1見せ100=17. 1が17倒すので83になる

コード

ソースコードはGitHubにPUSH済みです。
本記事ではメインのロジックのみ記載します。

def misezan(a, b):
    a, b = min(a, b), max(a, b)
    
    if a == 6 and b == 9:
        return 11
    
    if a == 2 and b == 5:
        return 1.1
    
    if a == 1 and b == 100:
        return 83
    
    return misezan_basic(a, b)


def misezan_basic(a, b):
    if a == b:
        return 0
    
    if a != b:
        return max(a, b)

input = [(6, 9), (2, 5), (1, 100), (5, 5), (10, 3), (30, 100), (200, 140)]
for a, b in input:
    print(f"{a} 見せ {b} = {misezan(a, b)}")

実行結果↓

$ python3 misezan.py
6 見せ 9 = 11
2 見せ 5 = 1.1
1 見せ 100 = 83
5 見せ 5 = 0
10 見せ 3 = 10
30 見せ 100 = 100
200 見せ 140 = 200

見事、実装できました。

応用ルールの拡張

お気づきの方も多いと思いますが、応用ルールの定義がかなり曖昧です。
その曖昧さにつけこんで、さらに曖昧な応用ルールをChatGPTに考えてもらいました。

プロンプト

# 見せ算
### 定義
+-*/に当たる部分は「見せ」といい、和差積商に当たる部分は「眼(がん)」と呼びます。

### 基本ルール
1. A=Bのとき、A見せB=0
2. A<Bのとき、A見せB=B

### 応用ルール
1. 6見せ9=11. これは、6と9がお互い形が似ているため見つめ合うように近づいて行き、結果11になる.
2. 2見せ5=11. 6見せ9と同じ論理で11になり、かつ5がスマホをポケットから落とすためそれが小数点となり、1.1になる。
3. 1見せ100=17. 1が17倒すので83になる
ーーーーーーーーーーーーーー
上記の定義に従って、応用ルールをお笑い芸人っぽく拡張してください。
例えば、
- 16と91は上下反転させるとおなじに見えるので1111
- 1000以上同士の引数が2つ与えられた場合戦争を起こして10以下の数字まで減る


image.png

面白いルールがでてきたので、これを先程のPythonスクリプトに追加してもらいます。
その結果がこちら↓

def misezan(a, b):
    a, b = min(a, b), max(a, b)

    if a == 6 and b == 9:
        return 11
    if a == 2 and b == 5:
        return 1.1
    if a == 1 and b == 100:
        return 83
    if a == 77 and b == 88:
        return 18
    if a == 404 and b == 505:
        return 6
    if a == 123 and b == 321:
        return 447
    if a == 2020 and b == 3030:
        return 0

    # 基本ルール
    return misezan_basic(a, b)

def misezan_basic(a, b):
    if a == b:
        return 0
    
    if a != b:
        return max(a, b)

input = [(6, 9), (2, 5), (1, 100), (5, 5), (10, 3), (30, 100), (200, 140), 
         (77, 88), (404, 505), (123, 321), (2020, 3030)]
for a, b in input:
    print(f"{a} 見せ {b} = {misezan(a, b)}")

実行結果↓

$ python3 misezan.py
6 見せ 9 = 11
2 見せ 5 = 1.1
1 見せ 100 = 83
5 見せ 5 = 0
10 見せ 3 = 10
30 見せ 100 = 100
200 見せ 140 = 200
77 見せ 88 = 18
404 見せ 505 = 6
123 見せ 321 = 447
2020 見せ 3030 = 0

さいごに

ほかにも面白い追加ルールをコメント欄にてお待ちしてます。

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2