Port 53

明日のための技術メモ

言語処理100本ノック 2020 第1章 前半

nlp100.github.io

新型コロナウィルスの流行で外出できるわけでもないので、
暇つぶしと勉強兼ねて遊んでみることにした。

競技プログラミングだと絶対使わないようなものも出てくるので、
ちょうどいいかもしれない。

今回は第1章 準備運動の前半(00-04まで)解説を書きます

第1章後半はこちら

目次

00. 文字列の逆順

f:id:saturn-glave:20200429113652p:plain

ABC−A問題でよく見るようなやつだ。
スライスを使って、word[::-1]と書くと逆順に出力できる。

解答

# coding:utf-8

s = "stressed"
print(s[::-1])

01. 「パタトクカシーー」

f:id:saturn-glave:20200429113734p:plain

これもABC−A問題っぽい。必要な部分をさっと切り出して+で結合。

解答

# coding:utf-8
s = "パタトクカシーー"
print(s[0] + s[2] + s[4] + s[6])

02. 「パトカー」+「タクシー」=「パタトクカシーー」

f:id:saturn-glave:20200429113802p:plain

文字列が増えた。文字列の追記+結合が+=でも行けることを地味に知った。

ポイント

文字列の追記は+=でできる

解答

# coding:utf-8
s1 = "パトカー"
s2 = "タクシー"
ans = ""

for i in range(len(s1)):
    ans += s1[i] + s2[i]

print(ans)

03. 円周率

f:id:saturn-glave:20200429113828p:plain

まずスペースで文章を区切る。この時AtCoderでよく使うsplit()が使えるので使う。
このままだとピリオドやカンマが入って邪魔なので、count()を使って数えてその分を除外する。

解答

# coding:utf-8

s = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
word = s.split()
ans = []

for item in word:
    ans.append(len(item) - item.count(',') - item.count('.'))

print(ans)

04. 元素記号

f:id:saturn-glave:20200429114128p:plain

元素記号の覚え方英語版ってこうなのかー、と思いつつ...
単語の順番によって何文字目まで切り出すか違うので、場合分けをする。
単語と単語の位置を別のリスト(keys, values)で持っておき、
最後にdict(zip(keys, values)) で一気に辞書を生成する

ポイント

2つのリストから辞書を生成する時、dict(zip(keys, values))で生成できる

解答

# coding:utf-8

s = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
word = s.split()
keys = []
values = []
n = len(word)

for i in range(n):
    tmp = word[i]

    if i == 0 or 4 <= i <= 8 or i == 14 or i == 15 or i == 18:
        keys.append(tmp[0])
        values.append(i + 1)
    else:
        keys.append(tmp[0:2])
        values.append(i + 1)

ans = dict(zip(keys, values))
print(ans)