1. 

Your goal in this kata is to implement a difference function, which subtracts one list from another and returns the result.

It should remove all values from list a, which are present in list b.

array_diff([1,2],[1]) == [2]

If a value is present in b, all of its occurrences must be removed from the other:

array_diff([1,2,2,2,3],[2]) == [1,3]

def array_diff(a, b):
    c = []
    for i in a:
        if i not in b:
            c.append(i)
    return c


or
def array_diff(a, b):
    return [i for i in a if i not in b]

 

2.

Your job is to write a function which increments a string, to create a new string.

  • If the string already ends with a number, the number should be incremented by 1.
  • If the string does not end with a number. the number 1 should be appended to the new string.

Examples:

foo -> foo1

foobar23 -> foobar24

foo0042 -> foo0043

foo9 -> foo10

foo099 -> foo100

 

不会

def increment_string(strng):
    head = strng.rstrip('0123456789')
    tail = strng[len(head):]
    print(head,tail)
    if tail == "": return strng + "1"
    return head + str(int(tail) + 1).zfill(len(tail))

3. 输入n  输出xy 是x^y == n

import math
def isPP(n):
    i=2
    while i < n:
        if i ** round(math.log(n,i)) == n:
            return [i,round(math.log(n,i))]
        else:
            i+=1
    else:
        return None

4. h bounce window     输出   从窗户可以看到多少次球

h: 扔球的高度, 应大于0

bounce: 球重新弹起来的高度是原来的多少 (0,1)

window : 看球的高度

def bouncingBall(h, bounce, window):
    if h >0 and bounce >0 and bounce<1 and window < h:
        a = 1
        while h * bounce > window:
            a += 2
            h = h*bounce
        else:
            return a
    else:
        return -1

5. 钞票25 50 100, 门票一张25   输入一个列表 ,看看能不能找钱给顾客

test.assert_equals(tickets([25, 25, 50]), "YES")
test.assert_equals(tickets([25, 100]), "NO")

def tickets(people):
  till = {100.0:0, 50.0:0, 25.0:0}

  for paid in people:
    till[paid] += 1
    change = paid-25.0
    
    for bill in (50,25):
      while (bill <= change and till[bill] > 0):
        till[bill] -= 1
        change -= bill

    if change != 0:
      return 'NO'
        
  return 'YES'

 4. 为1234567890 编辑加减乘除: 用到函数套嵌


def zero(f = None): return 0 if not f else f(0)
def one(f = None): return 1 if not f else f(1)
def two(f = None): return 2 if not f else f(2)
def three(f = None): return 3 if not f else f(3)
def four(f = None): return 4 if not f else f(4)
def five(f = None): return 5 if not f else f(5)
def six(f = None): return 6 if not f else f(6)
def seven(f = None): return 7 if not f else f(7)
def eight(f = None): return 8 if not f else f(8)
def nine(f = None): return 9 if not f else f(9)

def plus(y): return lambda x: x+y
def minus(y): return lambda x: x-y
def times(y): return lambda  x: x*y
def divided_by(y): return lambda  x: x/y


Test.assert_equals(seven(times(five())), 35)
Test.assert_equals(four(plus(nine())), 13)
Test.assert_equals(eight(minus(three())), 5)
Test.assert_equals(six(divided_by(two())), 3)

 

5. 输入的是一个字符, 输出跟其他数字不同的数字的序号

iq_test("2 4 7 8 10") => 3 // Third number is odd, while the rest of the numbers are even

iq_test("1 2 1 1") => 2 // Second number is even, while the rest of the numbers are odd

def iq_test(numbers):
    numbers = numbers.split(' ')
    i = 0
    for a in numbers:
        numbers[i] = int(a) % 2
        i += 1
    if numbers.count(0)< numbers.count(1):
        return numbers.index(0)+1
    return numbers.index(1)+1

 

def iq_test(numbers):
    e = [int(i) % 2 == 0 for i in numbers.split()]

    return e.index(True) + 1 if e.count(True) == 1 else e.index(False) + 1

6. 乌龟赛跑  (v1, v2,g)  问乌龟2 在让了g feet 之后啥时能赶上

def race(v1, v2, g):
    if v1 > v2:
        return None
    a = g/(v2-v1)
    m = a*60
    b = a * 60 * 60
    return [int(a),int(m-int(a)*60),int(b-int(a)*3600-int(m-int(a)*60)*60)]
def race(v1, v2, g):
    if v1>v2: return None
    res = g*3600/(v2-v1)
    return [res/3600,res%3600/60,res%60]

 

7. 加密 解密  ,每个第二位 再+上剩下的,循环

"This is a test!", 1 -> "hsi etTi sats!"

"This is a test!", 2 -> "hsi etTi sats!" -> "s eT ashi tist!"

def decrypt(encrypted_text, n):
    while n > 0:
        a =int(len(encrypted_text)/2)
        t3 = encrypted_text[:a]
        t4 = encrypted_text[a:]
        t = ''
        x = 0
        for i in range(0,len(encrypted_text)):
            if i % 2 == 0:
                t += '%s'
            else:
                t += t3[x]
                x +=1
        y = tuple(t4)
        print(t,y)
        encrypted_text = t % y
        n -= 1
    return encrypted_text
# 测试答案都对,但说我% y没有匹配全

正确答案

def decrypt(text, n):
    if text in ("", None):
        return text

    ndx = len(text) // 2

    for i in range(n):
        a = text[:ndx]
        b = text[ndx:]
        text = "".join(b[i:i + 1] + a[i:i + 1] for i in range(ndx + 1))
    return text


def encrypt(text, n):
    for i in range(n):
        text = text[1::2] + text[::2]
    return text

8. 将长度>3 的单词进行缩写,句子中除单词意外的字符不变

"elephant-rides are really fun!")  -----"e6t-r3s are r4y fun!"

自己写的

def abb(x):
    if len(x)>3:
        return x[0]+str(len(x)-2)+x[-1]
    return x


def abbreviate(s):
    s = list(s)
    w =''
    senten = ''
    for i in s:
        if i.isalpha():
            w += i
        else:
            senten = senten+abb(w) + i
            w = ''
    sentence = senten + abb(w)
    return sentence

答案:

import re

regex = re.compile('[a-z]{4,}', re.IGNORECASE)  # 用正则表达式给定了一个格式

def replace(match):
    word = match.group(0)
    return word[0] + str(len(word) - 2) + word[-1]

def abbreviate(s):
    return regex.sub(replace, s)  # 即s 中符合regex所表明的结构的,都替换成replace 函数之后的结果

  为什么replace 不用加()

  match 的值是啥

 

9. n^3 + (n-1)^3 + ... + 1^3 = m if such a n exists or -1 if there is no such n. 输入m ,输出n 或 -1

def find_nb(m):
    x = 0
    n = 1
    while x < m:
        x += n **3
        n += 1
    else:
        if x == m:
            return n-1
        else:
            return -1

10. gap(g,m,n) 在m - n  中, 相邻质数相减=g

运行时间很长  且会输出,【0,x] 结果错误

def gap(g,m,n):
    a = []
    for i in range(m,n):
        x = 2
        while x < int(i/2):
            if i % x == 0:
                break
            else:
                x +=1
        if x == int(i/2):
            a.append(i)
    for i in range(0,len(a)-1):
        if a[i+1]-a[i] == g:
            return [a[i],a[i+1]]
    return None
def gap(g,m,n):
    b = 0
    for x in range(m,n+1):
        if isprime(x) == True:
            a = b
            b = x
            if b - a == g:
                return [a,b]
    return None



def isprime(x):
    i = 2
    while i < int(x / 2):
        if x % i == 0:
            break
        else:
            i += 1
    if i == int(x / 2):
        return True
    else: return False
def gap(g, m, n):
    previous_prime = n
    for i in range(m, n + 1):
        if is_prime(i):
            if i - previous_prime == g: 
                return [previous_prime, i]
            previous_prime = i
    return None
            
    
def is_prime(n):
    for i in range(2, int(n**.5 + 1)):
        if n % i == 0:
            return False
    return True

11. 列表中8个8个反转

11111111  00000000  00001111  10101010
 (byte1)   (byte2)   (byte3)   (byte4)

should become:

10101010  00001111  00000000  11111111
 (byte4)   (byte3)   (byte2)   (byte1)


def data_reverse(data):
    a = ''
    b = ''
    for i in data:
        a += str(i)
        if len(a) == 8:
            b = a + b
            a = ''
    return [int(y) for y in b]

答案:

def data_reverse(data):
    res = []

    for i in range(len(data) - 8, -1, -8):
        print(len(data))
        res.extend(data[i:i + 8])

    return res