初心者
入門
Python3
基礎
練習問題

「自作Python100本ノック」5日目(Googleサマーインターン選考問題受けてみた:20本〜25本目)

More than 1 year has passed since last update.

「自作Python100本ノック」5日目です。

今日はGoogleのサマーインターンのOnline Quizを午前受けました。

問題の内容に関しては漏洩すると怒られちゃうため報告できないのですが、

「1個1個の対処は出来るんだけど、え、これ全部同時対応できるようにしないといけないの?!」

「はい?そもそも問題文の意味が分からないんですが・・・」

状態でした。

まあ、 19年卒でも20年卒でもない自分にも問題を受けさせてくれただけでGoogleさんには感謝しています。

ってか、そんなことより学内には頼りになる先生いないし、どうにかしてプログラミングの師匠を見つけなくては!!

と焦っております。

あ、あとちなみに今日誕生日でした。それどころじゃないですね。

さて、

「自作Python100本ノック」とは何ぞや?

どの程度のレベル感なのか?

どのように進めて行くのか?

など詳しくはこちらに整理してありますのでまずはそちらを確認するようお願いします。

それでは始めていきます!

(※Googleの問題とここで紹介する問題は一切関係がないです)


Q21: 支払いパターンを計算して表示

問題:あなたは、500 円玉を A 枚、100 円玉を B 枚、50 円玉を C 枚持っています。

これらの硬貨の中から何枚かを選び、合計金額をちょうどX円にする方法は何通りありますか。

条件

Xは50の倍数である

こんなにシンプルに解けると気持ちいいですよね。   

   


q21.py

def cal_patern(a,b,c,x):

count = 0
for i in range(a + 1):
for j in range(b + 1):
for k in range(c + 1):
if 500 * i + 100 * j + 50 * k == x:
count += 1
return count

cal_patern(3,5,6,1500)


[出典]AtCoderBiginnerContest087


Q22: ポケットを叩くとビスケットが2倍

問題:Saraは、「ふしぎなポケット」を手に入れた。

「ふしぎなポケット」は、いくつかビスケットを入れて叩くと、入れたビスケットの数が2倍になる。

Saraは最初1枚のビスケットを持っていて、「ふしぎなポケット」を使ってちょうどN枚のビスケットにして、全部食べたいと思っている。

(食べきれないので枚数をオーバーしてはいけない)

この時、ちょうどN枚にするには、Saraは最低何回ポケットを叩く必要があるか求めてください。

この手の問題はもう簡単ですね。

    


q22.py

def pocket(aim):

count = 0
biskets = 1
while biskets < aim:
count += 1
biskets = 2 ** count
else:
print("{}回ポケットを叩いてください".format(count))

pocket(10)


[出典]yuki2006


Q23: パスワードの安全性を確認する

問題: 与えられて文字列がパスワードとして安全かどうか確認せよ。

条件:安全なパスワードとは10文字以上であり、大文字、小文字、数字が必ず1つは含まれているものとする。

   

いよいよChekiOの問題を解いてみます。

not andを使い、タブーなものだけをどんどん入れていくという発想が良いですよね。

   


q23.py

def check_pass(password):

if len(password) >= 10 and not password.isalpha() and not password.isnumeric() and not password.islower() and not password.isupper():
return True
else:
return False
print(check_pass("aiasgiHSU43"))

[出典]ChekiO:House Password


Q24: 文字列の内最頻な文字を表示(小文字,alphabet順)

条件:与えられる文字列に制限はないが、結果は全て小文字で表示し

1番多い頻度の文字が複数個存在する場合は、アルファベット順で早い方を表示

   

max()によって1番countの多いものを取り出すという発想が良いですよね。


q24.py

import string

def find_frequent_word(text):
text = text.lower()
return max(string.ascii_lowercase, key=text.count)

a = find_frequent_word("aiasfiah faihasjn8348 y5iHsuasHuUUUUUuuuurbuurugjsghfoas")
print(a)


[出典]ChekiO:The Most Wanted Letter


Q25 文字列の内最も連続された文字の個数を数える

これは、シンプルでありながら解き方が人によって異なり面白いため、2つ回答のパターンを載せておきます。

   

↓自分の解き方


q25_a.py

def long_repeat(line):

if line=='':
return(0)
else:
count=1
count_chr=[1]
for i in range(1,len(line)):
if line[i-1]==line[i]:
count +=1
else:
count = 1
count_chr.append(count)
return max(count_chr)

↓別の解き方


q25_b.py

def long_repeat(line):

count = 1
maxi = 1
if line != "":
for i in range(1,len(line)):
if line[i] == line[i-1]:
count+=1
if count > maxi:
maxi = count
else:
count = 1
return maxi
else:
return 0

[出典]ChekiO:Non-unique Elements


感想

今日は、GoogleのOnline Quizの結果がどうしても悔しかったので、結構難しめの問題を解いてみました。

そもそもChekiOを1人で解くのは難しいという人が対象で、最後の10問にChekiOのHome問題を持ってこようと思っていたのですが、衝動的にここで解いてしまいました。。。

(さて、今後の問題をどうしていけば良いのか本格的に迷走し始めたぞ。。)

まあ、その日その日で見つけた問題を解いていけば良いか。

とりあえず今日はここまでです。

ChekiOでは世界中の優れたプログラマの人が解答を公開し共有してくれているので、もっと他の解答をみたい!もっと勉強したい!という人は出典から探してみてください!

それでは!

->6日目