技術

PythonでAtCorder259 (A,B,C)

先週末のAtCorder259、参加できず。というわけでおくればせながらやってみました。

これ参戦していたら、Aしか解けていなかったです・・・ 最近のB問題、難しく感じます。

【A】 Growth Record

N, M, X, T, D = map(int, input().split())

if M > X:
    print(T)
else:
    init = T - D * X
    print(init + D * M)

258同様、Aにしては少し凝った問題だと感じました。そもそもAでも、これぐらいは考える要素があるのが普通なんでしょうか。

【B】Counterclockwise Rotation

初見では何やって良いかぜんぜんわからず。直径とx,yの比を考えたりと無駄なことに時間使ってました😓

で、公式解説みてもよくわかりませんでした。

色々ググっていたら、回転の公式というものを使えばいいことがわかりました。で、その回転公式にも行列計算が入っていて、行列の計算方法からやり直すということに。

回転の公式については、以下を参考にしました。
https://mathwords.net/heimenkaiten

で、コードに落とし込んだのはこちら。

import math

a, b, d = map(int, input().split())

# 回転の公式
# ref https://mathwords.net/heimenkaiten
x = math.cos(math.radians(d)) * a - math.sin(math.radians(d)) * b
y = math.sin(math.radians(d)) * a + math.cos(math.radians(d)) * b
print(*[x, y])

「回転の公式」というワードさえ知っていれば、すぐに解ける問題でしたね。やはり数学を一度、勉強しなおしたほうがいいのでしょうか・・・

【C】XX to XXX

問題を見て、考え方はなんとなくわかるものの、どうやってコードに落とし込んで良いのかわからず。なんか標準でそれっぽい関数あるのかと思って、ググったけど見つけられず。

で、コードを1行も書くことなく解説見ました。公式解説で、「ランレングス圧縮」というワードを知って、このワードとPythonでググると以下のページにたどり着きました。

https://qiita.com/Kept1994/items/e9179d1dd7c6455d6883

ここのRHLのコードを使って、その後はWAを何回か出しつつも、パスできました。

S = input()
T = input()

# S = "abbaac"
# T = "abbbbaaac"
# S = "xyzz"
# T = "zyyzz"

from itertools import groupby

# RUN LENGTH ENCODING str -> list(tuple())
# example) "aabbbbaaca" -> [('a', 2), ('b', 4), ('a', 2), ('c', 1), ('a', 1)]
def runLengthEncode(S: str) -> "List[tuple(str, int)]":
    grouped = groupby(S)
    res = []
    for k, v in grouped:
        res.append((k, int(len(list(v)))))
    return res


def judged() -> bool:
    rle_s = runLengthEncode(S)
    rle_t = runLengthEncode(T)

    # 構成文字がそもそも違う
    if len(rle_s) != len(rle_t):
        return False

    for s, t in zip(rle_s, rle_t):
        # 違う文字
        if s[0] != t[0]:
            return False
        else:  # 同じ文字
            # 同じ文字数
            if s == t:
                continue
            # 違う文字数でS側が1文字ならNG
            elif s == 1:
                return False
            # S側が多ければNG
            elif s > t:
                return False
            else:
                continue
    return True


print("Yes" if judged() else "No")

【D】 Circumferences

問題を見て、何やって良いかわからず。

公式解説見ても、特別なことをアルゴリズムを使っていることはなさそうで、その解説内容をどうやってコードに落とし込んでいるのかよくわからなかったので諦めました。

Dにたどり着く頃には、頭が疲れていてそもそも考えること自体が辛くなっています。まずはA〜Cをサクッと解けるようにしたほうが良いのかもと思い始めています。

まとめ

AtCorder259は参加できなかったのですが、もし参加していたら、258同様Aだけしか解けていないという散々な結果になっていたでしょう。

今日の260は、予定は特にないので参戦できそうです。モチベーションがあればですが・・・