• Home
  • About
    • taichi photo

      taichi

      ars longa vita brevis.

    • Learn More
    • Twitter
    • LinkedIn
  • Posts
    • All Posts
    • All Tags
  • Projects

Python100本ノック(〜100本目)

12 May 2018

Reading time ~10 minutes

Python100本ノック(〜30本目)

「自作Python100本ノック10日目(63本目〜70本目)」
「自作Python100本ノック11日目(71本目〜80本目)」
「自作Python100本ノック12日目(81本目〜88本目)」
「自作Python100本ノック13日目(89本目〜90本目)」
「自作Python100本ノック14日目(91本目〜95本目)」
「自作Python100本ノック15日目(96本目〜100本目)」

Q63: 現在の日付をtoday.txtというテキストファイルに文字列の形で書き込みなさい

    

from datetime import date

now = date.today()
now_str = now.isoformat() #文字列の形にする
with open("today.txt", "wt") as outfile:
    outfile.write(now_str)

now_str

Q64:today.textから日付を解析し取り出しなさい

   

import time
fmt = '%Y-%m-%d'
time.strptime(today_string, fmt)

Q65:ディレクトリの扱いの練習

問題: カレントディレクトリと親ディレクトリのファイルのリストをそれぞれ表示せよ。     

# カレントディレクトリのファイルのリストを作ろう
import os
os.listdir('.')

# 親ディレクトリのファイルのリストを作ろう
os.listdir('..')

Q66:自分の誕生日が何曜日だったか確認

weekday()で簡単に特定できるとは驚きました。 自分は何曜日に生まれたのかという長年の謎がこれで解決されました。    

from datetime import date
my_time = date(1998, 5, 11)

my_time.weekday() #月曜が0、日曜が6

Q67:自分が生まれてから10,000日になるのはいつか確認

忘れないようにします!     

from datetime import timedelta
my_future = my_time + timedelta(days=10000)
my_future

Q68:以下のデータフレームを作成せよ。

スクリーンショット 2018-05-16 13.37.52.png

    

df = pd.DataFrame(
    {'名前': ['朝倉', '鈴木', '山中', '田中', '山本'],
     '年齢': [17, 43, 40, 12, 62],
     '性別':['男', '男', '女', '男', '女']})
df

Q69:年齢が35歳よりも下の人だけを表から取り出しなさい

df_1 = df[df['年齢'] < 35]
df_1

Q70: 内容の追加

問題:なんか適当に新しい行と新しい列を追加してみましょう 例:新たに「池田」を追加すし、新たに「居住地」と言う   列を追加する

       

# 行の追加
row = pd.DataFrame({'名前': ['池田'],
                    '年齢': [1989],
                    '性別': '男'})
# 行の追加(行: axis=0, 列: axis=1)
df_2 = pd.concat([df,row], axis=0)
df_2

# indexを変更
# np.agrangeで0〜6の数字が並んだ配列を生成
df_2.index = np.arange(len(df_2))
df_2


# 列の追加
# 新たな列を代入
df_2['居住地'] = ['東京', '大阪', '北海道', '宮城', '富山', '大分']
df_2

Q71:内容の削除

問題:「性別」の列を削除せよ    

# 列を削除(行: axis=0, 列: axis=1)
df_3 = df_2.drop('性別', axis=1)
df_3

Q71+: 列名を変更

問題:「名前」を「name」、「年齢」を「age」、「居住地」を「residence」に変更せよ    

df_4.columns = ['name', 'age', 'residence']
df_4

Q72: リュカ数

問題: 整数 N が与えられるので、N 番目のリュカ数を求めてください。 ただし、リュカ数は i 番目のリュカ数を Li とすると、 L0=2 L1=1 Li=Li−1+Li−2(i≧2) と定義される数とします。

上の説明でもわからない人のために補足すると、リュカ数とは、原理はフィボナッチ数列と同じなんですが1番目が2,2番目が1と決められている数列になります。    

def lucas(n):
    n = int(n)
    if n == 0:
        return 2
    elif n == 1:
        return 1
    else:
        return lucas(n - 1) + lucas(n - 2)

lucas(4)

[参考]やるだけPython競プロ日誌

Q73: 途中式の自動作成

問題: 4 つの 0 以上 9 以下の整数 A,B,C,D を順に受けとります。 A op1 B op2 C op3 D = 7 となるように、op1,op2,op3 に + か - を入れて式を自動で作り表示しなさい。 なお、答えが存在しない場合は”impossible”と表示し、また答えが複数存在する場合は全て表示させなさい。     

def put_formula(n):
    a,b,c,d = list(str(n))
    sign = "+-"
    aws_list = []
    for i in range(2):  # 1つ目の記号
        for j in range(2):  # 2つ目の記号
            for k in range(2):  # 3つ目の記号
                if eval(a+sign[i]+b+sign[j]+c+sign[k]+d) == 7:
                    aws = (str(a+sign[i]+b+sign[j]+c+sign[k]+d)+"=7")
                    aws_list.append(aws)
                    print(aws)
    if len(aws_list) == 0:
        print("impossible")
        
put_formula(1161)

[参考]やるだけPython競プロ日誌

Q74: Wikipediaにある車種をすベてスクレイピングせよ

Pythonでのスクレイピングの方法です。 超便利です。     

import requests
from bs4 import BeautifulSoup

r = requests.get('https://hikkoshi.suumo.jp/sankaku/')
soup = BeautifulSoup(r.text, 'html.parser')
titleTags = soup.select('a')
names = []
for titleTag in titleTags:
    name = titleTag.text.strip()
    names.append(name)
#distinct_names = list(set(names))

names_uniq = []
for d_name in names:
    if d_name not in names_uniq:
        names_uniq.append(d_name)


print(names_uniq)

Q75 :文章の最初の文字を表示

問題: 与えられた文章の内、最初の文字を表示しなさい 条件: ’.’や’,’や空白は文字としてカウントしない。 例:  first_word(“Hello world”) == “Hello” first_word(“ a word “) == “a” first_word(“greetings, friends”) == “greetings” first_word(“… and so on …”) == “and” first_word(“Hello.World”) == “Hello”     

def first_word(text: str) -> str:
    if text.find(",")>= 0:
        text2= text.replace(',', ' ')
    if text.find(".")>=0:
        text2=text.replace('.', ' ')
    texts = text2.split()
    return texts[0]

first_word("..... greetings, friends")

[出典]ChekiO:Elementary

Q76 :テキスト内で2回目にシンボルが出てくるのは何番目か

問題:テキスト文と文字がそれぞれ与えられる。    与えられたテキスト文のうち、文字が2回目に出てくるのはテキスト文のうち何番目かを表示せよ。     

def second_index(text, symbol):
    count = 0
    for i in range(len(text)):
        if text[i] == symbol:
            count += 1
            if count == 2:
                return i
    return None

second_index("I am a good student but you are not a good student", "g")

[出典]ChekiO:Elementary

Q77: 1番高いストックは何か

問題:株名と株価が辞書型で与えられる、1番高いストックを表示せよ。     

#株名と株価の辞書
stock_dict = {
    'CAC': 10.0,
    'ATX': 390.2,
    'WIG': 1.2
}

#1番高いストックを表示する関数
def best_stock(data):
    max = 0
    code = ""
    for stock in data:
        print(stock)
        if data[stock] > max:
            max = data[stock]
            code = stock
    return code

best_stock(stock_dict)

[出典]ChekiO:Elementary

Q78:単語の出現頻度を表示せよ

問題:文章と、いくつかの単語が与えられる。 文章のうち、それぞれの単語が何回含まれているか表示せよ。 例:popular_words(‘'’When I was OneI had just begunWhen I was TwoI was nearly new ‘’’, [‘i’, ‘was’, ‘three’, ‘near’]) == {‘i’: 4, ‘near’: 0, ‘three’: 0, ‘was’: 3}

nearがnearlyにカウントされないようにするのが意外と大変でした。(split()を使うだけ)     

def popular_words(text: str, words: list) -> dict:
    text = text.lower().split()
    count_list = []
    for word in words:
        count = text.count(word)
        count_list.append(count)
    aws = dict(zip(words, count_list))
    return aws

[出典]ChekiO:Elementary

Q79: 三目並べの自動判定

問題:下の例のように、”O”と”X”が並べられた三目並べの結果を自動で表示させる関数を作りなさい。 勝った方を結果として表示し、引き分けの場合は”D”と表示させなさい。

checkio([
    "X.O",
    "XX.",
    "XOO"]) == "X"
checkio([
    "OO.",
    "XOX",
    "XOX"]) == "O"
checkio([
    "OOX",
    "XXO",
    "OXX"]) == "D"

   答え

def check_osxs(result):
    judge = "D"
    for i in range(3):
        if result[i][0] == result[i][1] == result[i][2] != ".":
            judge = result[i][0]
        elif result[0][i] == result[1][i] == result[2][i] != ".":
            judge = result[0][i]
    if result[0][0] == result[1][1] == result[2][2] != ".":
            judge = result[0][0]
    elif result[0][2] == result[1][1] == result[2][0] != ".":
            judge = result[0][2]
    return judge

check_osxs([
        "X.O",
        "XX.",
        "XOO"])

[出典]ChekiO:Home

Q80: 守られるチェスのコマ(ポーン)の個数を計算

問題:チェスのボーンが置かれているマスがいくつか与えられる。そのうち、守られているボーンの個数を答えよ。

ちょっと流石に、これだけじゃ問題文として不足しているのですが、画像なしだときついんで、本家のこちらを見てください。    

def safe_pawns(pawns):
    pwans = list(pawns)
    cols = {"a":0,"b":1,"c":2,"d":3,"e":4,"f":5,"g":6,"h":7}
    s_pwans = []
    for i in pawns:
        target = []
        for j in pwans:
            if int(i[1])+1 == int(j[1]):
                target.append(j)
        for k in target:
            if abs(cols.get(k[0]) - cols.get(i[0])) == 1:
                s_pwans.append(k)
                if s_pwans.count(k) > 1:
                    s_pwans.pop()
    return len(s_pwans)

aws = {"b4","c4","d4","e4","f4","g4","e3"}
safe_pawns(aws)

[出典]ChekiO:Home

Q81: TwoSums

問題:整数配列とターゲットが渡された時、整数配列の内足したら答えがターゲットになる2つの数字を返しなさい。 例: twosums([2, 7, 11, 15],9) ==> 2,7

combinationモジュール知りませんでした!    

from itertools import combinations
 
def twosums(x, target):
    for item in combinations(x, 2):
            if sum(item) == target:
                return item
            
nums = [2, 7, 11, 15]
target = 9
twosums(nums, target)

[出典]言語処理100本ノック with Python(第1章)

Q82: Reverse Integer

問題: 渡される整数を逆にして返せ

(あれ?さっきから全然文章問題じゃなくない??….)

x[::-1]で文字列を逆数にできるの面白いですね!

ちなみに、これが原因で私はしばらくエラーと戦ってました。 逆数に関してはそのほかにも、ここを見ると面白いです。    

def reverse_integer(x):
    return int(str(x)[::-1])
 
reverse_integer(1534236469)

[出典]言語処理100本ノック with Python(第1章)

Q83:Roman to Int (ローマ字から整数へ)

問題: (0~4999)までのローマ字を数字に変換せよ。ちなみにローマ数字と整数は以下。 ` let romanValues = [“M”, “CM”, “D”, “CD”, “C”, “XC”, “L”, “XL”, “X”, “IX”, “V”, “IV”, “I”] let arabicValues = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1] `

def roman_to_int(roman):
    values={'M': 1000, 'D': 500, 'C': 100, 'L': 50, 
                                'X': 10, 'V': 5, 'I': 1}
    """Convert from Roman numerals to an integer."""
    numbers = []
    for char in roman:
        numbers.append(values[char]) 
    total = 0
    for num1, num2 in zip(numbers, numbers[1:]):
        if num1 >= num2:
            total += num1
        else:
            total -= num1
    return total + num2

roman_to_int("XI")

[出典]言語処理100本ノック with Python(第1章)

Q84: Valid Parentheses

問題: (), {}, []など,括弧が有効であるかチェックをしてBoolを返しない。

上記の確固が有効に使われている場合は、文字としては認識されないはずなので、それを利用していく解き方となります。 辞書の使い方としても良い練習になるかと。     

def isvalid(x):
    table = {'(': ')', '{': '}', '[': ']'}
    stack = []
    for elm in x:
        if elm in table.keys():
            stack.append(table[elm])
        elif elm in table.values() and elm != stack.pop():
                return False
    return False if len(stack) else True
 
isvalid('[aaa]'), isvalid('('), isvalid('()[]{}'), isvalid('(]'), isvalid('([)]'), isvalid('{()}')

[出典]言語処理100本ノック with Python(第1章)

Q85: 「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ

   

stre = 'パタトクカシーー'
print(stre[0::2])#str[::2]でも同様

[出典]言語処理100本ノック with Python(第1章)

Q86: 「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ

zip()でそれぞれから要素を1つずつ持って来ます。    

str1 = 'パトカー'
str2 = 'タクシー'

print(''.join([a + b for a, b in zip(str1, str2)]))

[出典]言語処理100本ノック with Python(第1章)    

Q87: 単語の文字数

strr = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
strr = strr.replace('.', "")
strr = strr.replace(',', "")
strr = strr.split()

a_list = []

for word in strr:
    a_list.append(len(word))

print(list)

[出典]言語処理100本ノック with Python(第1章)    

Q88: Typoglycemia

問題: スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ. 条件: 長さが4以下の単語は並び替えない。

(例えば”I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind .”)を与え,その実行結果を確認せよ.     

import random

text = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
words = text.split()
shuffled_list = []

for word in words:
    if len(word) < 4:
        pass
    else:
        char_list = list(word)
        mid_list = char_list[1:-1]
        random.shuffle(mid_list)
        word = word[0] + "".join(mid_list) + word[-1]
    shuffled_list.append(word)

shuffled_str = " ".join(shuffled_list)
print(shuffled_str)

[出典]言語処理100本ノック with Python(第1章)

Q89: 全て偶数だったらひたすら割るやつ

問題: 渡辺君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行います。 黒板に書かれている整数すべてを,2で割ったものに置き換える。 渡辺君は最大で何回操作を行うことができるかを求めてください。

条件: 数字はリスト型で与えられる。

例:  count_odd([16,12,24) ==> 2 1 回操作を行うと (8, 6, 12) になります。2 回操作を行うと (4, 3, 6) になります。2 個目の 3 が奇数なため 3 回目の操作は行えません。

個人的にwhileの使い方に慣れてなく、考えるのに結構時間かかりました。。。 map()とか使ってリスト内の数字を同時に2で割って、あまりの合計が0でなかったらみたいな式を作りたかったのですが、作れず。    

def count_n(n_list):
    counts = []
    for n in n_list:
        count = 0
        while n % 2 == 0:
            count += 1
            n = n / 2
        else:
            counts.append(count)
    aws = min(counts)
    print(aws)
    
count_n([16,16,4])

[参考]B - Shift only

Q90: 大きい数字からとるゲーム

問題: N 枚のカードがあり、0 〜 N までの整数が被らないように書かれています。 Alice と Bob はこれらのカードを使ってゲームを行います。ゲームでは 2 人が交互に 1 枚ずつカードを取っていきます。Alice が先にカードを取ります。 2 人がすべてのカードを取ったときゲームは終了し、取ったカードの数の合計がその人の得点になります。 2 人とも自分の得点を最大化するように最適戦略をとったとき、Alice は Bob より何点多くの得点を獲得できるかを求めてください。

元の問題が解けなかったので、自分で解けるような問題に変えました。 本当は、カードの数字はランダムにしたかったのですが、うまくいかず結局カードの数字は「0 〜 N」というつまらない問題になってしまいました。 物足りたい人は、[参考]から元の問題を是非解いて見てください。(そして教えてください)     

from numpy import random

def num_fight(card_number):
    cards = list(range(card_number))
    count = 0
    alice_cards = []
    bob_cards = []
    while len(cards) != 0:
        taken_card = max(cards)
        cards.remove(taken_card)
        count += 1
        if count % 2 == 1:
            alice_cards.append(taken_card)
        else:
            bob_cards.append(taken_card)
    alice_score = sum(alice_cards)
    bob_score = sum(bob_cards)
    aws = alice_score - bob_score
    
    print(aws)
    
num_fight(10)

[参考]B - Card Game for Two

Q91: 1を何回書いたか

問題: 高橋君は 1 以上 N 以下のすべての整数を10進表記で1回ずつ紙に書きました。 この作業で、高橋君は 1 という数字を何個書いたでしょうか。     

def count_one(n):
    counts = 0
    for i in range(1,n+1):
        str_i = str(i)
        count = str_i.count("1")
        counts += count
    return counts
        
        
        
count_one(100)

[出典]D - 1

Q92: リモコン

問題文: 高橋君は、エアコンの設定温度を変更しようとしています。 現在の設定温度は A 度ですが、これを B 度に設定したいと思っています。 エアコンのリモコンは 1 回ボタンを押すことで、 1 度設定温度を下げる、もしくは上げる 5 度設定温度を下げる、もしくは上げる 10 度設定温度を下げる、もしくは上げる の、6 種類の操作のいずれか 1 つを実行することが出来ます。 高橋君が設定温度を A 度から B 度に変更するために押すボタンの最小回数を求めなさい。     

def remocon(a,b):
    target = b - a
    min_count = 100
    for o in range(100):
        for f in range(100):
            for t in range(100):
                if o + 5 * f + 10 * t == target or  -1 * o + -5 * f + -10 * t == target:
                    count = o + f + t
                    if min_count > count:
                        min_count = count
                        a_o = o
                        a_f = f
                        a_t = t
     
    print(a_o, a_f, a_t)
    
remocon(10,5)

[出典]リモコン

Q93: 高橋くんと魔法の箱

問題: 高橋くんは魔法の箱を持っています。

この箱に整数を入れるとそれに対応した整数が出てきます。 出てくる整数は入れた整数だけによって決まり、同じ整数を入れると毎回同じ結果が得られます。 高橋くんは任意の整数 x について、x を入れた時と 2x を入れた時に出てくる整数が同じであることに気づきました。 高橋くんが入れた整数が N 個与えられるので、最大で何種類の整数が出てくるか答えてください。

問題文をいかに読み取ることができるかが鍵になりますね。     

ans = set([])
for i in l:
    while i % 2 == 0:
        i = i // 2
  
    ans.add(i)

print(len(ans))

[出典]高橋くんと魔法の箱

Q94: 123引き算ゲーム

問題: 最初に、数字 n が与えられます。 1 , 2 , 3 の中から好きな数字を選び、 与えられた数字に対し、引き算を行う、という処理を行うことできます。 この処理は 100 回まで行うことが可能であり、最終的に数字を 0 にすることが目標のゲームです。 しかし、計算途中でなってはいけないNG数字が 3 つ(リスト型で)与えられており、 この数字に一時的にでもなってしまった瞬間、このゲームは失敗となります。 NG数字が n と同じ場合も失敗となります。 あなたは、このゲームが、目標達成可能なゲームとなっているか調べたいです。 目標達成可能な場合はYES、そうでない場合はNOと出力してください。     

def substract_game(n, ng_words):
    count = 0
    flag = 0
    a = ng_words[0]
    b = ng_words[1]
    c = ng_words[2]
    while count < 100 and n != (a or b or c) and n >=4:
        if not (n-3 in ng_words):
            count += 1
            n = n-3
        elif not (n-2 in ng_words):
            count += 1
            n = n-2
        elif not (n-1 in ng_words):
            count += 1
            n = n-1
        else:
            flag = 0
            break
    
    if (n == 1 or n == 2 or n ==3) and count<=99:
        n = 0
        flag = 1
    
    if n > 0:
        flag = 0
    
    if flag == 1:
        print('YES')
    else:
        print('NO')
        
substract_game(100, [29,54,43])

[出典]C -123引き算

Q95: 割り切れる日付

問題: 高橋君は割り切れる日付が好きです。   

割り切れる日付とは、年÷月÷日の計算結果が整数になる日付のことです。   

例えば今日の日付は 2012 年 5 月 2 日ですが、 2012÷5÷2=201.2 となり整数ではないので、今日の日付は割り切れる日付ではありません。   

高橋君は割り切れる日付が好きでたまらないので、次の割り切れる日付を心待ちにして、毎日今日が割り切れる日付かどうかをチェックしてしまいます。    彼に少しでも多くの仕事をしてもらうために、入力として与えられた日付以降で最初に来る割り切れる日付を求めなさい。    ただし、入力として与えられた日付が割り切れる日付だった場合は、与えられた日付が答えになります。   

例: check_date(“2012/05/02”)  ==> ”2013/01/01”    

from datetime import date, timedelta

def check_date(today):
    Y, M, D = [int(n) for n in today.split('/')]
    dt = date(Y, M, D)
    while True:
        if Y % M == 0 and (Y / M) % D == 0:
            break
        dt += timedelta(days=1)
        Y = dt.year
        M = dt.month
        D = dt.day
    
    print(dt.strftime('%Y/%m/%d'))
    

check_date("2017/05/11")

[出典]割り切れる日付

Q96:完全数

問題: 高橋君は完全なものが大好きです。

自然数には、完全数というものがあります。 完全数というのは、自分以外の約数の総和が自分と等しくなる自然数のことです。 例えば 6 の場合 1+2+3=6となるので完全数です。 それに対して、自分以外の約数の総和が自分より小さくなる場合は不足数と言い、大きくなる場合は過剰数と言います。

高橋君には今気になっている自然数があります。高橋君のために、それが完全数なのか不足数なのか過剰数なのか判定してください。

def perfect_number(n):
    y_num = []
    for i in range(2, n):
        if n % i == 0:
            y_num.append(i)
            m = n // i
            y_num.append(m)
    y_num.append(1)
    y_num = set(y_num)
    sum_y = sum(y_num)
    if sum_y == n:
        print("完全数です")
    else:
        print("完全数ではありません")
       
perfect_number(6)            

[出典]AtCoder Regular Contest 026

Q97: ハミング距離

問題: 2つの整数が与えられます。 これらを2進法に直した時の「ハミング距離」を測りなさい。

ハミング距離とは、2つの数字のうち、異なっている箇所の個数のことです。 いやいやまだよくわかんねえよって方は、これ以上自分には説明できないので本家の問題文の方を確認ください!

今回は、2進数のハミング距離なので、XORをして、「1」を数えているだけですね。 2進数にするformat() 、XORをするn ^ mそして、count()といった関数がすでにあるので組み合わせるだけですね。

def hamming_distance(n, m):
    return format(n ^ m, 'b').count('1')

hamming_distance(17, 117)

[出典]CheckiO: Elementary

Q98:Numbers Factory

問題: 2桁の整数が与えられる。 その整数の約数を出力しなさい。 条件: 約数は全て1桁であること。    答えが複数存在する場合は、約数の個数が1番少なくなる方を出力すること。

# 正しい方
def checkio(number):
    ret = []
    for i in range(9, 1, -1):
        while not number % i:
            number /= i
            ret.append(i)
            if number == 1:
                return int(''.join(map(str, sorted(ret))))
    return 0

ちなみにこれ私解けませんでした。 ↓ちなみに私の答え

# 自分のやつ
def checkio(n):
    list_n =[1,2,3,4,5,6,7,8,9]
    if n < 10:
        return n

    factors = []
    for d in range(9,1, -1):
        if n >= 10 and n % d == 0 and  d != 1:
            factors.append(d)
            n = n / d
        else:
            continue
    if n in list_n:
        factors.append(n)
    else:
        return 0
    if len(factors) == 1:
        return 0
    else:
        factors = ['{:.0f}'.format(n) for n in factors]
        factors.sort()
        s = ''.join([str(n) for n in factors])
        print(s)
        return int(float(s))
    
    

checkio(20)

[出典]CheckiO: Simple

Q99:Number Base

問題: ある進数(radix)で記された数字(str_number)が与えられます。 この数字を10進法に直して表示しなさい。

条件 そもそも与えられた数字が、与えられた進法で表すことができないもの出会った場合は”-1”と表示

例: convert_10(“AF”, 16) == 175 convert_10(“101”, 2) == 5 convert_10(“Z”, 36) == 35 convert_10(“AB”, 10) == -1

def convert_10(str_number, radix):
    try:
        return int(str_number, radix)
    except ValueError:
        return -1

convert_10(3C5,16)

[出典]Number Base

Q100:Double Substring

問題: あるテキストが与えられます。 そのテキストの内、ある文字列が2回登場した場合、その文字列の文字数を表示してください。

例: double_substring(‘aaaa’) ==> 2 double_substring(‘abc’) ==> 0 double_substring(‘aghtfghkofgh’) ==> 3 # fgh

def double_substring(line):

    s = []
    for i in range(len(line)-1) :
        for j in range(i+1,len(line)+1) :
            if line[i:j] in line[j:] :
                s.append(len(line[i:j]))
    
    if len(s)>0 :
        return max(s)
    else :
        return 0

[出典]Double Substring

##感想 最後は、AtCoderのコンテスト問題とCheckiOに頼りまくりました。 ただ、やっていてひしひしと感じるのは

「確かに実力が上がっている!」

と言うことです。

最初なんかCheckiOが解けねええええって悩んでいたのに、 今では、問題選ぶ時問題文読んで「これは流石に簡単すぎるしなあ」と言っているレベルにまでいきました。 (逆に今度はAtCoderのC問題解けねえええええとなっていますが)

さて、今回でとりあえず「自作Python100本ノック」終えることができました。 時間があれば、問題のレベルや種類に合わせて並び替えて行こうかとも思っています。

とりあえず、自分と同じような悩みを持っていた人たちに役立ったら良いなと思います。 これからも自分は「そこそこの学生エンジニア」を目指し自分はPythonをガンガン勉強していくので、 フォロー等してもらえればなと思います。

Twitterでは現在Pythonの啓蒙活動に勤しんでいるのでそちらの方も見てもらえればと思います!

それでは!

##完走者(Twitterで完走したと報告してもらえれば順次載せます!) 1人目:@thipot 完走コメント: 「終わったー(≧∀≦) 中々難しかったー、分からなかった問題もあったから忘れた頃にもう一度解き直してリベンジしたいぜよ」    2人目:@ks_mocchaso 完走コメント: 「回を追うごとにPythonの知識が少しずつ増えていき、楽しさも増していきました。 解くのに時間がかかるときでも、辛抱強く取り組めたのは良かったです。 この演習での経験を活かして卒業研究のクオリティを上げられたらと思います!」



TechnologyPython Share Tweet +1