🔙
🔝

【paiza問題集 解説】
paizaの森練習問題コンテスト過去問題セット4

花言葉

花言葉

  • 例1

  • s = input()
    
        if s == 'rose':
            print('I love you')
        elif s == 'cosmos':
            print('harmony')
        elif s == 'tulip':
            print('perfect lover')
        elif s == 'hydrangea':
            print('heartlessness')
        else:
            print('amiability')
    
    
  • 例2

  • flower_langs = {
        'rose': 'I love you',
        'cosmos': 'harmony',
        'tulip': 'perfect lover',
        'hydrangea': 'heartlessness',
        'jasmine': 'amiability'
    }
    
    s = input()
    print(flower_langs[s])
    

    Dランクレベルなので例1の書き方をしますが、辞書の習得がまだの場合は例2の書き方ができるようになるとデータが扱いやすくなりますので、がんばって習得してください。😘

    今からでも! → 「2章 辞書型

じゃんけん

じゃんけん

  • 例1

  • h = input()
    
    if h == 'R':
        print('P')
    elif h == 'P':
        print('S')
    else:
        print('R')
    
  • 例2

  • janken = {'R': 'P', 'P': 'S', 'S': 'R'}
    
    h = input()
    print(janken[h])
    

    先程の「花言葉」と同じ構造で、そのプログラム例の見様見真似で作れます。キーも値も一文字で見やすいので、辞書の理解を確認するのに適した問題だと思います。😊

四季

四季

  • 例1

  • m = int(input())
    
    if m >= 3 and m <= 5:
        print('spring')
    elif m >= 6 and m <= 8:
        print('summer')
    elif m >= 9 and m <= 11:
        print('autumn')
    else:
        print('winter')
    
  • 例2

  • m = int(input())
    
    if 3 <= m <= 5:
        print('spring')
    elif 6 <= m <= 8:
        print('summer')
    elif 9 <= m <= 11:
        print('autumn')
    else:
        print('winter')
    
  • 例3

  • seasons = {0: 'winter', 1: 'spring', 2: 'summer', 3: 'automn'}
    
    m = int(input())
    n = m // 3 % 4
    print(seasons[n])
    

    条件式を範囲の形で書くプログラムです。例1の and を使った書き方が一般的ですが、Python3では例2の様な、よりわかりやすい書き方ができ、例1の書き方で比較演算子の書き間違いなどのありがちなミスを大幅に減らせることが期待できます。

    例3は、「n = m // 3 % 4 の所でなんかうまいことやってるんだろうな」くらいには考えられると思いますが、この式のしくみを実際に目で見てみましょう。

    for i in range(1, 13):
        n = i // 3 % 4
        print(f"{i:>2}月 : {n}")
    
     1月: 0
     2月: 0
     3月: 1
     4月: 1
     5月: 1
     6月: 2
     7月: 2
     8月: 2
     9月: 3
    10月: 3
    11月: 3
    12月: 0

  • まず i // 3 だけで出力してみます。

  • for i in range(1, 13):
        n = i // 3
        print(f"{i:>2}月 : {n}")
    
     1月: 0
     2月: 0
     3月: 1
     4月: 1
     5月: 1
     6月: 2
     7月: 2
     8月: 2
     9月: 3
    10月: 3
    11月: 3
    12月: 4

    12月のところだけ 4 になってしまいます。これを 0 にするために % 4 で割った余りを求めるようにして 0 にしているわけです。

    試しに1年 24ヶ月にしてみると…、

    for i in range(1, 25):  # 24ヶ月
        n = i // 3 % 4
        print(f"{i:>2}月 : {n}")
    
     1月: 0
     2月: 0
     3月: 1
     4月: 1
     5月: 1
     6月: 2
     7月: 2
     8月: 2
     9月: 3
    10月: 3
    11月: 3
    12月: 0
    13月: 0
    14月: 0
    15月: 1
    16月: 1
    17月: 1
    18月: 2
    19月: 2
    20月: 2
    21月: 3
    22月: 3
    23月: 3
    24月: 0

    きちんと3ヶ月毎に次の季節が巡ってきます。

    数学では適した公式を利用して問題を解決することが多いですが、プログラミング(に限りませんが)では自分で式を考えて作ることがとても多いです。いや、ほとんどそうです。予め存在する公式を知っているならばそれを使うだけでよいのですが、知らなくても無理矢理自力で導き出せることも多々あります。もしかしたら世紀の大発見とも言われても不思議ではないような式が、プログラムの一部に埋もれて見過ごされてきているなんてものも、プログラミング史上幾万とあったかもしれません。冗談抜きで。😅

    規則的なものには必ず「法則」がありますので、その法則を見つけて式化できれば、より簡潔なプログラムに仕上がるかもしれません。例えば、1番目から始まる i と 0 から始まる要素番号を紐付けるために、i 番目の i を、

    a[i - 1]
    

    とするのも立派な式化です。難しそうと思っても、やってるみると案外できてしまいます。

    今後も規則的なものを見つけたら、ぜひ法則を見つけて式化に挑戦してみてください。


    四季(式)だけにね。😉

オルタネーティングキャップス

オルタネーティングキャップス

  • 例1

  • s = input()
    print(s.lower())
    

    文字列に .lower() メソッドを使うと、文字列内の英大文字がすべて英小文字に変換されます。英小文字や数字、記号、日本語文字は変化ありません。その他ギリシャ文字などの大文字も小文字に変換されます。

    反対に .upper() メソッドを使うと、英小文字がすべて英大文字に変換されます。

  • 例2

  • s = input()
    
    alphabets = {}
    for i in range(ord('A'), ord('Z')+1):
        alphabets[chr(i)] = chr(i+32)
    
    text = ''
    for char in s:
        if char in alphabets.keys():
            text += alphabets[char]
        else:
            text += char
    
    print(text)
    

    例1の方法を使えば済む問題なのですが、これをメソッドを使わない方法で書いてみます。


    alphabets = {}
    for i in range(ord('A'), ord('Z')+1):
        alphabets[chr(i)] = chr(i+32)   # 大文字を小文字に変換する為
    

    この部分は「英大文字を英小文字に変換する」ための辞書をつくっています。

    ord('A') というのは、unicode表の 'A' に対応する文字コード 65 に変換する機能です。 ord('Z')90 です。 ord('Z') に +1 しているのは、 range(65, 90) とすると、'A' から 'Y' までしかループしないので、+1 して調整しています。

    chr(i+32) は unicode表の 'a' に対応する文字コードが 97 なので、65 に 32 を足して 97 にする為です。それを chr() 関数を使って文字コードを対応する文字に変換しています。

    これをループさせると、

    alphabets = {'A': 'a', 'B': 'b', …… , 'Z': 'z'}

    という辞書ができあがります。

    次に、

    text = ''
    for char in s:
        if char in alphabets.keys():
            text += alphabets[char]
        else:
            text += char
    

    この部分は、入力された文字列 s を1文字ずつ取り出して、その文字が alphabets のキー(大文字)にあるかどうかを調べ、あればその文字を小文字にして text に追加し、なければそのままの文字を追加しています。


    大変な作業ですね。😓

    例2を内包表記で書くと以下のようになります。

    s = input()
    alphabets = {chr(i): chr(i+32) for i in range(ord('A'), ord('Z')+1)}
    text = [alphabets[char] if char in alphabets.keys() else char for char in s]
    print(*text, sep='')
    # または
    # print(''.join(text))
    

    .lower() が便利。😊

パワー 100 倍

パワー 100 倍

  • 例1

  • p = int(input())
    print(p * 100)
    
  • 例2

  • p = input()
    print(p + '00')
    
  • 例3

  • p = input()
    print(f"{p}00")
    

    一見、簡単そうに見える問題ですが、条件に『1 ≦ p ≦ 10^1000』とあります。10^1000 とは 10 の 1000 乗、つまり 1 に 0 が 1000個つく巨大な数になります。(Python3 では 10**1000 と表記します)

    10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    10^1000光年はどのくらいの距離ですか? (Chat GPT)

    Python3 なら例1でも問題ないのですが、言語によっては、そして現在の 64ビットCPUのコンピュータではこのような巨大な数が扱えません。


    そんな時は、入力を文字列で受け取って、単に末尾に '00' を付けるだけでOKです。でもこれ、文字列であって数ではないので演算は無理です。😅

おつり

おつり

    p = int(input())
    coins = [500, 100, 50, 10, 5, 1]
    
    coin = 0
    for c in coins:
        d, p = p // c, p % c
        coin += d
    
    print(coin)
    

    数の大きいコインから割り算をして、商をお釣りのコインの枚数 coin に足していくと求められます。余りは残りのお釣りです。

    p = 813 の時

    500 → 1 枚, 残り 313円
    100 → 3 枚, 残り 13円
     50 → 0 枚
     10 → 1 枚, 残り 3円
      5 → 0 枚
      1 → 3 枚, 残り 0円
    -----------------------------------
    8

    p // c, p % cdivmod(p, c) に置き換えてもイケます。👍

ゾロ目

ゾロ目

  • 例1

  • x = int(input())
    print(x - x % 11)
    

    この問題で言う「ゾロ目」とは11の倍数です。x を 11 で割った余りを x から引くとそれが答えになります。

    x = 90

    90 % 11 = 2 (90÷11 = 8 余り 2)

    90 - 2 = 88

    x = 64

    64 % 11 = 9 (64÷11 = 5 余り 9)

    64 - 9 = 55

    x = 60

    60 % 11 = 5 (60÷11 = 5 余り 5)

    60 - 5 = 55

  • 例2

  • x = int(input())
    print(x // 11 * 11)
    

    もう1つ、11 で割って余りを切り捨て、商を11倍することでも求められます。

    x = 90

    90 // 11 = 8

    8 * 11 = 88

いちばんお得

いちばんお得

  • 例1

  • g1, p1 = map(int, input().split())
    g2, p2 = map(int, input().split())
    
    choco1 = p1 / g1
    choco2 = p2 / g2
    
    if choco1 < choco2:
        print(1)
    else:
        print(2)
    
  • 例2

  • chocolates = [p / g for _ in range(2) for g, p in [map(int, input().split())]]
    print(chocolates.index(min(chocolates)) + 1)
    

    例1は問題に素直に書いたプログラムです。例2は回りくどい書き方に見えるかもしれませんが、比較するチョコをいくらでも増やせます。

重さの計算

重さの計算

    n, k, x = map(int, input().split())
    
    a = x / k
    b = a * n
    
    print(int(b))
    
    k 個のボールの重さが合計 x グラム
    x グラム を k で割ると、ボール1個の重さになる
    n 個のボールの重さは何グラム?
    ボール1個の重さ × n 個

    あとは小数点以下を切り捨てて画面に出力すれば完了です。

寒暖差

寒暖差

    a = [int(input()) for _ in range(10)]
    
    for i in range(9):
        if abs(a[i] - a[i+1]) >= 3:
            print('Yes')
            break
    else:
        print('No')
    

    寒暖差は前後の日の最高気温とのなので、例えば、29度と26度を比較するとその差は3度です。26度と29度を比較してもその差は3度です。どちらから引き算してもその差は3度です。ですので、差を求めた値の絶対値が寒暖差となります。

    寒暖差が3度以上の所を見つけたら、Yes を画面に出力して完了です。1つ見つけられればよいのでもうそれ以上調べる必要はありません。
    1つも無かった時はループをそのまま抜けて else が実行され、No が画面に出力されます。