pontz_rwのブログ

プログラミング等の備忘録

ITP1_9_D: Transformation

文字列変換 | プログラミング入門 | Aizu Online Judge

文字列操作に関する問題

解答

入力値を分割する際の要素数や、文字列操作する際のインデックスに注意します。

# coding: utf-8

str = input()
q = int(input())

for _ in range(q):
    line = input().split()
    c = line[0]
    a = int(line[1])
    b = int(line[2]) + 1

    if c == 'replace':
        str = str[:a] + line[3] + str[b:]
    elif c == 'reverse':
        str = str[:a] + str[a:b][::-1] + str[b:]
    else:
        print(str[a:b])

AtCoder Beginner Contest 001

abc001.contest.atcoder.jp

A - 積雪深差

# coding: utf-8

H1 = int(input())
H2 = int(input())

print(H1 - H2)

B - 視程の通報

問題文に従って条件分岐します。

m = int(input())

if 100 > m:
    print('00')
elif 5000 >= m:
    print("{:02d}".format(m // 100))
elif 30000 >= m:
    print(m // 1000 + 50)
elif 70000 >= m:
    print((m // 1000 - 30) // 5 + 80)
else:
    print(89)

C - 風力観測

round()は偶数寄りに丸めらます。そのため、round(1.5)の結果は2ですが、round(2.5)の結果も2になります。

# coding: utf-8


def deg_to_dir(deg):
    """Summary line.

    風向から方位を返します。

    Args:
        deg (int): 風向

    Returns:
        string: 方位

    """
    degs_list = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE',
                 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW']
    deg_index = ((deg * 10 + 1125) // 2250) % 16
    return degs_list[deg_index]


def dis_to_w(dis):
    """Summary line.

    風程から風力を返します。

    Args:
        des (int): 風程

    Returns:
        w (int): 風力

    """
    w = -1
    ws_list = [0.0, 0.3, 1.6, 3.4, 5.5, 8.0, 10.8,
               13.9, 17.2, 20.8, 24.5, 28.5, 32.7]
    r_dif = int(dis * 10 + 0.5) / 10
    for n in ws_list:
        if r_dif >= n:
            w += 1
        else:
            break
    return w


def dir_w(deg, dis):
    """Summary line.

    風向、風程から方位と風力を返します。

    Args:
        deg (int): 風向
        des (int): 風程

    Returns:
        (strint, int): (方位, 風力)のタプル

    """
    w = dis_to_w(dis)
    if w == 0:
        dir = 'C'
    else:
        dir = deg_to_dir(deg)
    return (dir, w)

Deg, Dis = map(int, input().split())

result = dir_w(Deg, Dis)

print(*result)

D - 感雨時刻の整理

降り始め・降り終わりをそれぞれ直前・直後の 5 分単位の時刻に丸めます。

降り始めは、5による剰余を引くことで簡単に求めることができます。

# 13:23 の場合、1323 mod 5 = 3 なので、13:23 - 3 = 13:20
start -= start % 5

降り終わりは、5から5による剰余を引いた結果を足すことで、求めることができます。

# 14:01 の場合、1401 mod 5 = 1 なので、14:01 + (5 - 1) = 14:05
end += 5 - end % 5

しかしこの計算では、0分、5分の場合に、余計に5分足してしまうことになります。

# 14:00 の場合、1400 mod 5 = 0 なので、14:00 + (5 - 0) = 14:05
end += 5 - end % 5

そのため、5による剰余が0の場合は0を足し、1から4の場合は5から5による剰余を引いた結果を足すようにします。

そこで、5による剰余に4を足し、5で割った商の整数部分を結果に掛けることにします。そうすることで、剰余が0の場合は0を掛けることになり、結果0を足し、1から4の場合は1を掛けることで結果を足すようになります。

# 14:00 の場合、1400 mod 5 = 0 なので、
# ((4 + 0) // 5) * (5 - 0) = 0 * 5 = 0
# つまり、14:00 + 0 = 14:00
#
# 14:01 の場合、1401 mod 5 = 1 なので、
# ((4 + 1) // 5) * (5 - 1) = 1 * 4 = 4
# つまり、14:00 + 1 = 14:05
end += ((4 + end % 5) // 5) * (5 - end % 5)

最後に、56分以降は、時間(hour)も繰り上げなければなりません。

ここでは、100による剰余を求めることで分(minute)を抜き出し、56分を基準に、つまり、56で割った整数部の商に40を掛けることで時間を繰り上げます。

# 14:56 の場合、 1456 mod 100 = 56 、56 // 56 = 1 なので、
# 1 * 40 = 40
end % 100 // 56 * 40

これで、降り終わりが丸めることができます

# 14:56 の場合、
# 1456 mod 5 = 1 、1456 mod 100 = 56 なので、
# ((4 + 1) // 5) * (5 - 1) + (56 // 56 * 40)
# (1 * 4) + (1 * 40) = 44
# つまり、1456 + 44 = 1500 => 15:00
end += ((4 + end % 5) // 5) * (5 - end % 5) + (end % 100 // 56 * 40)

解答

# coding: utf-8

N = int(input())
times_set = []
results = []
start_index = 0
end_index = 1
tmp_start = -1
tmp_end = -1

for i in range(N):
    start, end = map(int, input().split('-'))
    start -= start % 5
    end += ((4 + end % 5) // 5) * (5 - end % 5) + end % 100 // 56 * 40
    times_set.append([start, end])

times_set.sort()

for time_set in times_set:
    if tmp_start == -1:
        tmp_start = time_set[start_index]
        tmp_end = time_set[end_index]
    elif time_set[start_index] <= tmp_end:
        if tmp_end <= time_set[end_index]:
            tmp_end = time_set[end_index]
    else:
        results.append("{:04d}-{:04d}".format(tmp_start, tmp_end))
        tmp_start = time_set[start_index]
        tmp_end = time_set[end_index]

results.append("{:04d}-{:04d}".format(tmp_start, tmp_end))

for result in results:
    print(result)

ITP1_9_B: Shuffle

シャッフル | プログラミング入門 | Aizu Online Judge

文字列の切り取り、結合に関する問題

解答

インデックスに気を付けて文字列を操作します。

# coding: utf-8

while True:
    cards = input()
    if cards == '-':
        break
    m = int(input())

    for i in range(m):
        h = int(input())
        cards = cards[h:] + cards[:h]

    print(cards)

ITP1_9_A: Finding a Word

単語の検索 | プログラミング入門 | Aizu Online Judge

指定された単語の数を出力する問題

解答

count()を使用することで、リスト内の指定の値を持つ要素の数を取得することができます。

# coding: utf-8

count = 0
W = input().lower()

while True:
    T = input()
    if T == 'END_OF_TEXT':
        break
    count += T.lower().split().count(W)

print(count)

ITP1_8_D: Ring

リング | プログラミング入門 | Aizu Online Judge

指定した文字列が含まれるかどうか判定する問題

解答1. 入力値を2倍

入力値と同じ内容の文字列を加えます。

inを使用し、文字列に指定した値があるかどうかを調べます。

# coding: utf-8

s = input()
p = input()

if p in (s + s):
    print('Yes')
else:
    print('No')

解答2. 文字列を1字ずつ移動

まず、inを使用し、指定した値があるかどうかを調べます。

値がある場合、Yesを出力し、処理を終了します。
値がない場合、先頭の文字を最後に移動し、またinを使用して値があるかどうかを調べます。

sの長さ分まで繰り返しても値がない場合、Noを出力して処理を終了します。

# coding: utf-8

s = input()
p = input()
flg = False

for i in range(len(s)):
    if p in s:
        flg = True
        break
    s = s[1:] + s[:1]

if flg:
    print('Yes')
else:
    print('No')

文字列sを破壊したくない場合はこちら

# coding: utf-8

s = input()
p = input()
flg = False

for i in range(len(s)):
    if p in s[i:] + s[:i]:
        flg = True
        break

if flg:
    print('Yes')
else:
    print('No')

ITP1_8_C: Counting Characters

文字のカウント | プログラミング入門 | Aizu Online Judge

アルファベットの数を数える問題

解答

まずアルファベットのaからzまでを含んだ文字列を用意します。
入力値は、終了条件が指定されていないため、例外をキャッチしたタイミングで入力値を受け取る処理から抜けます。

アルファベットの数を求めるのには、count()を使用します。
count()は文字列に対して、引数で指定した値がいくつ含まれているのかを返します。

アルファベットをaから順番に1文字ずつ取り出し、入力値にいくつ含まれているかを出力します。

# coding: utf-8

alpha = 'abcdefghijklmnopqrstuvwxyz'
text = ''

while True:
    try:
        text += input().lower()
    except EOFError:
        break

for a in alpha:
    print('{} : {}'.format(a, text.count(a)))