博文

目前显示的是 六月, 2020的博文

Exercism: Anagram (Python)

在一组词中查找变位词。想了两个方法1)是中规中矩变小写,排序对比,2)是生成全部的排列组合存在set里,然后用一个循环直接来查。写了第一种,比较简单。 def find_anagrams(word, candidates):     results = []     convert_word =  lambda x: "".join(sorted(x.lower()))     sorted_word = convert_word(word)        for c in candidates:         if len(c) != len(word):             continue          if sorted_word == convert_word(c) and word.lower() != c.lower():             results.append(c)     return results 看了几个别人的答案,大同小异。有些用列表解析写成一行。但是感觉有点难读,而且加上一个长度的check, 性能会更好些。 return [w for w in candidates if word_sorted == sorted(w.lower()) and not w.lower() == word.lower()]

拜厄练习曲33, 34

图片
第六周了,还在慢慢坚持。这礼拜英国很热,没什么心情练琴。这周弹的33,34又是两首四手连弹的曲子,单练感觉很单调。周末又看了几集琴之林,看到Kai弹钢琴,又多点坚持练琴的动力。

Exercism: Matrix (Python)

输入一个文本矩阵,返回一个简单的矩阵类,可以返回行或列。很简单,中规中矩。 class Matrix:     def __init__(self, matrix_string):         rows = matrix_string.split("\n")         self.__matrix = [list(map(int, row.split(" "))) for row in rows]     def row(self, index):         return self.__matrix[index-1]     def column(self, index):         return [row[index-1] for row in self.__matrix]

Exercism: ISBN Verifier (Python)

验证ISBN码,很好的一个实际问题。题目很简单,主要看怎么把代码写的简练。我使用了三步:1)验证长度 2)验证单个数值 3)验证总和%11。提交后果然发现又有更简单的方法。用正侧表达式来做第一步和第二步一起, [^[0-9]{9,9}[0-9X]$]。 原版: def is_valid(isbn):     isbn_vals = [val for val in isbn if val != "-"]          if len(isbn_vals) != 10:         return False     if isbn_vals[-1] == "X":         isbn_vals[-1] = 10      try:         isbn_vals = [int(val) for val in isbn_vals]     except:         return False     sum_values = sum(val * (10 - i) for i, val in enumerate(isbn_vals))     return sum_values % 11 == 0 优化版: import re def is_valid(isbn):     match = re.search("^[0-9]{9,9}[0-9X]$", isbn.replace("-", ""))     if not match:         return False     isbn_vals = [10 if "X" == val else int(val) for val in isbn if val != "-"]     sum_values = sum(val * (10 - i) for i, val in enumerate(isbn_vals))     return sum_values % 11 == 0

Exercism: Space Age (Python)

根据地球上的时间,来计算其他星球上的时间。开始为每一个星球写了一个方法。后来看了别人的答案,发现可以用setattr来动态添加方法。 原版: EARTH_YEAR_RATIO = { "Mercury": 0.2408467, "Venus": 0.61519726, "Mars": 1.8808158, "Jupiter": 11.862615, "Saturn": 29.447498, "Uranus": 84.016846, "Neptune": 164.79132 } class SpaceAge:     def __init__(self, seconds):         self.__earth_year = seconds / 31557600.0     def on_earth(self):         return round(self.__earth_year,2)     def on_mercury(self):         return round(self.__earth_year / EARTH_YEAR_RATIO["Mercury"], 2)     def on_venus(self):         return round(self.__earth_year / EARTH_YEAR_RATIO["Venus"], 2)          def on_mars(self):         return round(self.__earth_year / EARTH_YEAR_RATIO["Mars"], 2)     def on_jupiter(self):         return round(self.__earth_year / EARTH_YEAR_RATIO["Jupiter"], 2)     def on_saturn(self):         return round(self.__earth_year / EARTH_YEAR_RATIO["Satur

Exercism: RNA Transcription (Python)

我以为超简单一个map就可以解决。但一看其他人的方法,居然还有更简单的,使用str.translate(table),table可以用str.maketrans来生成。 原版 dna_rna_map = {     "G": "C",     "C": "G",     "T": "A",     "A": "U", } def to_rna(dna_strand):     rna = ""     for c in dna_strand:         rna += dna_rna_map[c]     return rna 优化版 def to_rna(dna_strand):     return dna_strand.translate(str.maketrans("GCTA", "CGAU"))

Exercism: Darts (Python)

根据飞镖的坐标来算分数,很简单。看了几个其他人的答案,几个启发: 1. 算坐标可以直接使用math.hypot。 2. math.sqrt可以使用**0.5或者math.pow来做。 3. 可以不使用sqrt来直接使用1,25,100。 4. 大部分人都用if来判断,很少人会extract到一个list里。 import math score_map = [     (1.0, 10),     (5.0, 5),     (10.0, 1),  ] def score(x, y):     pos=math.sqrt((x**2 + y**2))     for p, score in score_map:          if pos <= p:             return score     return 0

Exercism: High Scores (Python)

很简单,主要是看list的用法。第三个方法有点意思,返回list中最大的n个值。开始想用heapq来写一个min heap的方法,但后来发现heapq自带这样一个nlargest,nsmallest的方法。之前在面试中用过类似的题,我从来没有看过一个人直接用过这个方法。看来真的应该好好了解一下Python的文档。 import heapq def latest(scores):     return scores[-1]  def personal_best(scores):     return max(scores) def personal_top_three(scores):     return heapq.nlargest(3, scores)

拜厄练习曲31, 32

图片
居然坚持到第五周了,超过一个月了!不过说实话感觉有点悬了,每次练琴的时间总是吃完饭,女儿上楼睡觉以后。感觉稍微有点累就不想练了。这周练了31,32两首曲子。31弹的连贯起来还挺好听,32没有伴奏听起来很单调。

Exercism: Protein Translation (Python)

感觉是个挺有意思的题。把RNA序列转化成蛋白质名称。不过第一次做的时候,看错题了,以为maping是顺序的,比如(UCU, UCC, UCA, UCG    | Serine), 是必须依次找到4个配对才可以确定是Serine。后来发现没有那么麻烦,mapping实际上是一个set, 任意一个配对都可以map到蛋白质的名字。这样就简单多了。 from enum import Enum STOP = {"UAA", "UAG", "UGA"} class Protein(Enum): METHIONINE = "Methionine" PHENYLALANINE = "Phenylalanine" LEUCINE = "Leucine" SERINE = "Serine" TYROSINE = "Tyrosine" CYSTEINE = "Cysteine" TRYPTOPHAN = "Tryptophan" Codens_Protein = { "AUG": Protein.METHIONINE, "UUU": Protein.PHENYLALANINE, "UUC": Protein.PHENYLALANINE, "UUA": Protein.LEUCINE, "UUG": Protein.LEUCINE, "UCU": Protein.SERINE, "UCC": Protein.SERINE, "UCA": Protein.SERINE, "UCG": Protein.SERINE, "UAU": Protein.TYROSINE, "UAC": Protein.TYROSINE, &qu

拜厄练习曲30

图片
这是第四周坚持练琴了。不过周一周二很忙,晚上都没时间练,实际上只练了3天。这周只练了一首曲子,拜厄练习曲30,感觉很容易上手,但很难弹熟。看别人演奏时,如果弹的很流畅,速度快些会很好听。但是自己练时,很难速度提上去,一弹快了,就容易出错,脑袋反应不过来😓。 >

Exercism: Robot Name (Python)

机器人名字。两个条件:1. 随机命名2个字母加3个数字。2 reset方法重制名字不能重复。 第一个很简单,直接从ascii_uppercase和digits选就可以。 第二个我是用一个set来存之前生成的名字。 看了一些其他的解法,几个其他的方法: 1. digits也可以用randint来做。           str(random.randint(100, 999)) 2. 2个字母加3个数字可以使用choices来做。之前不知道这些方法可以使用k,非常好用。sample 之前没用过,可以返回unique的value, 看上去很好用。         name += "".join(random.choices(string.ascii_uppercase, k=2))         name += "".join(random.sample(string.digits, k=3)) 3. 有一些人在reset里直接使用random重制seed,来防止重名,是个挺好的方法。 import random import string class Robot:     def __init__(self):         self.__used_names = set()         self.name = self.gen_name()     def reset(self):         self.__used_names.add(self.name)         while True:             new_name = self.gen_name()             if new_name not in self.__used_names:                 self.name = new_name                 break     def gen_name(self):         name: str = ""         name += "".join(random.choices(string.ascii_uppercase, k=2))         name += "".j

Exercism: Reverse String (Python)

晚上在exercism上做了一道简单的题,反转字符串。我使用了常规的方法,把字符串转成数组,反转,再合并成字符串。 def reverse(text): tl = [t for t in text] tl.reverse() return "".join(tl) 提交代码后,发现了个更简单的方法。使用list切片 return text[::-1] 看了一下切片的使用方法,好久不用,忘光了。 a=[1,2,3,4,5]  #slice(start, end, step) print(a[1::]) print(a[3::-1]) print(a[1::2]) 还有就是可以直接使用 reversed 方法来直接取得反转的数组。