🔙
🔝

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

占い

占い

    n = int(input())
    print('Yes' if n == 7 else 'No')
    

    内包表記で書いてみました。😉

    内包表記の書き方は「2章 内包表記」で学べます。

年収計算

年収計算

    a, b, c = map(int, input().split())
    
    coe = c // 5  # 係数
    print(a + coe * b)
    

    真っ先に 文で処理することを考えたと思われますが、めんどくさいなとも思われたのではないでしょうか?😅

    問題をよく見ると、親切にも上記プログラム例のように書ける設定になっています。😉

気温

気温

    x  = int(input())
    
    if x >= 35:
        print('extremely hot day')
    elif x >= 30:
        print('hot summer day')
    elif x >= 25:
        print('summer day')
    elif x < 0:
        print('ice day')
    else:
        print('normal day')
    

    この問題はフィボナッチ数列のプログラムと同じように、評価順に注意しなければなりません。

    評価順を逆順にすると、38度の時、x >= 35'extremely hot day' が出力されるはずでも 25度以上の時の評価が先に実行され、summer day が出力されてしまいます。

    複数の 文が連なる時、が使われる時は常にこの性質のことを思い出して注意してください。

気温2

気温2

  • 例1

  • _ = input()
    x = list(map(int, input().split()))
    print(max(x) - min(x))
    
  • 例2

  • _ = input()
    x = list(map(int, input().split()))
    
    x.sort()
    print(x[-1] - x[0])
    

    例1はリストから最大値と最小値を探して差を求めています。

    例2は昇順ソートをし、最大値になっている末尾の要素から、最小値になっている先頭の要素を引いて求めています。

ブロックの埋め込み

ブロックの埋め込み

    n, m = map(int, input().split())
    print(n * m // 2)
    

    Cランク問題とあるので『単純にこの式でいいはずなんだけど、認識甘いのかな?』と怖気づいていたのですが、これでよかったみたいです。😅

    マスの総数が奇数の場合はマスが1つ余り、偶数の場合はぴったり収まる塩梅です。

最も大きな最大公約数

最も大きな最大公約数

    n = int(input())
    print(n // 2)
    

    突然、数学が苦手な我々ネコを混乱に陥れる魔法を使ってきました。以前の我々は抗える術を持っておらず、出題者の策から逃れるためには全力で退避するほかありませんでした(❎クリック)。しかし今の我々には ChatGPT(※) という叡智の加護があります。

    ※ 『chat(シャ)』はフランス語で「猫」のこと


    ChatGPT『「最大公約数」とは、複数の整数に共通する約数の中で、最も大きな整数のことです。』

    ネコ『約数ってなに?』(自滅)


    茶番はこれくらいにして、「約数」とは『整数を割り切ることが出来る数』のことです。12 なら 1, 2, 3, 4, 6, 12 で割れば割り切ることができます。

    最大公約数とは、複数の整数、例えば 8 と 12 の場合、それぞれの約数は「1, 2, 4, 8」と「1, 2, 3, 4, 6, 12」です。この2つ(複数)の整数に共通する約数(公約数)は 「1, 2, 4」 です。この公約数の最大の数が最大公約数、つまり 4 です。

    from math import gcd
    print(gcd(8, 12))
    
    4

    問題の中に『1 から n までの範囲にある全ての異なる整数の組のうち』とあります。1 から n までの整数を全て 1 から順に割っていって調べることをしなくても、プログラム例の式で求められます。奇数でも偶数でも、与えられた整数を 2 で割った商がそのまま『最も大きな最大公約数 (以下 🐈🐾 と呼ぶ)』となります。

    n = 17 の時

    17 を 2 で割った商は 8 です。
    8 × 2 = 16
    16 の約数は 1, 2, 4, 8, 16
    16 未満の数で 16 と共通する約数を持つ数は 8 です。
    8 の約数は 1, 2, 4, 8

    ちなみに 17 の約数は 1, 17 です。17 は素数ですしおすし。

    奇数は 2 で割り切れません。必ず 3 以上の奇数でないと割り切れる数はありません(1 は問題外)ので、ある偶数より大きい奇数のほうの🐈🐾が大きくなるということはありません。ですので与えられた数を 2 で割った数がそのまま 🐈🐾 と決まってしまいます。

    整数 → 🐈🐾
    17 → 1
    16 → 8
    15 → 5
    14 → 7
    13 → 1
    12 → 6
    11 → 1
    10 → 5
     9 → 3
     8 → 4
     7 → 1
     6 → 3
     5 → 1
     4 → 2
     3 → 1
     2 → 1

    ちなみに 1 になるところが全て素数です。

    こんな解説で合ってるかな?😅

三冠王

三冠王

    n = int(input())
    scores = [[float(b), int(r), int(h)] for _ in range(n) for b, r, h in [input().split()]]
    
    max_brh = [max(tpl) for tpl in zip(*scores)]
    
    result = 'Nobody'
    for player in scores:
        if 3 == (top:=sum(score==mx for score, mx in zip(player, max_brh))):
            result = 'Triple'
            break
        elif 2 == top:
            result = 'Double'
    
    print(result)
    

    わかりにくく書いちゃった。w^^[\

    標準入力の時に一気に型変換して、二次元リストで各プレイヤーの成績を収めてあります。

    max_brh には、zip(*scores) で [[打率リスト], [打点リスト], [本塁打数リスト]] に転置し、そしてそれぞれの最大値をリストにするということを一気に行なってから、それをテキトーに名付けた max_brh に代入しています。

    result = 'Nobody'
    for player in scores:
        if 3 == (top:=sum(score==mx for score, mx in zip(player, max_brh))):
            result = 'Triple'
            break
        elif 2 == top:
            result = 'Double'
    

    ここは特に、

    if 3 == (top:=sum(score==mx for score, mx in zip(player, max_brh))):
    

    この一行がとんでもないですね。😂
    zip(player, max_brh) で各プレイヤーの「打率」「打点」「本塁打数」をそれぞれの最大値を組み合わせて文の score, mx にそれぞれ代入しています。その2つを比較して同じなら True、異なるなら False をリストの要素としています。出来上がったリストは例えば二冠なら、

    [True, False, True]

    となっています。このリストの要素を sum() 関数で合計し、top にその値を代入します。True は 1、False は 0 として計算されます。要するに True の個数です。

    全て True の場合は「三冠王」なので画面に Triple を出力し、それ以上調べても無意味なので break します。


    elif 2 == top:
    

    この top は、先程の 文の中で作って代入した True(1) の個数が入っています。三冠の時と同じ様に二冠かどうかを判定します。二冠だった時でも、他に三冠を取っている人がいるかもしれませんので、ループは続けます。


    三冠が見つかった時は、その場で Triple を画面に出力し、二冠が見つかった時はループを抜けた後に Double を画面に出力し、どちらも見つからなかった場合は予め用意しておいた Nobody を画面に出力してこのプログラムを終了します。

    ちなみに w^^[\ は、

    「w」「^」「^」「[」「\」

    「て」「へ」「へ」「゜」「ろ」

    てへぺろ

    です。 (>ڡ`*)ゞ