[PYTHON] Nullbasierter Code Wars Kata Yield und Fibonacci-Sequenz

Bei codewars kata können Sie gleichzeitig Programmieren und praktisches Englisch lernen. Wenn Sie ein Github-Konto haben, können Sie in 30 Sekunden loslegen Wenn Sie interessiert sind, beginnen Sie jetzt hier

Übrigens können Sie in vielen anderen Sprachen als Python herausfordern

Q1.https://www.codewars.com/kata/54d512e62a5e54c96200019e/train/python

Given a positive number n > 1 find the prime factor decomposition of n. The result will be a string with the following form :

 "(p1**n1)(p2**n2)...(pk**nk)"
with the p(i) in increasing order and n(i) empty if n(i) is 1.

Example: n = 86240 should return "(2**5)(5)(7**2)(11)"

Geben Sie bei einer positiven ganzen Zahl n die Primzahlen zurück, aus denen sie besteht

my A.


def primeFactors(b ):

    ps = []
    ns = []
    i = 1
    while  not b==1:
        i += 1
        j = 0
        while not b % i:
            b = b / (i)
            j += 1
        if not j == 0:        
            ps.append(i)
            ns.append(j)
            
    return ''.join([ '({})'.format(p) if  n == 1 else '({}**{})'.format(p,n) for p,n in zip(ps,ns)])
   

3000ms

Erster erfolgreicher Versuch


def primeFactors(b ):

    k = 100000000000000
    ps = []
    ns = []
    
    for i in range(2,k):
        mod = 0    
        j = 0
        if b ==1:
            break
        while mod == 0:
            div,mod = divmod(b,i)
            if mod == 0:
                b = b / (i)
                j += 1
        if not j == 0:        
            ps.append(i)
            ns.append(j)
            
    return ''.join([ '({})'.format(p) if  n == 1 else '({}**{})'.format(p,n) for p,n in zip(ps,ns)])

5500ms

Best Answer


def primeFactors(n):
    ret = ''
    for i in range(2, n + 1):
        num = 0
        while(n % i == 0):
            num += 1
            n /= i
        if num > 0:
            ret += '({}{})'.format(i, '**%d' % num if num > 1 else '')
        if n == 1:
            return ret

3000ms Ich speichere das Ergebnis als Liste → für eine Zeichenfolge Dies ist eine Zeichenfolge von Anfang an Die Ausführungszeit ist fast gleich, aber welche ist besser?

Q2.https://www.codewars.com/kata/559a28007caad2ac4e000083/solutions/python

The drawing shows 6 squares the sides of which have a length of 1, 1, 2, 3, 5, 8. It's easy to see that the sum of the perimeters of these squares is : 4 * (1 + 1 + 2 + 3 + 5 + 8) = 4 * 20 = 80

Could you give the sum of the perimeters of all the squares in a rectangle when there are n + 1 squares disposed in the same manner as in the drawing:

Finden Sie die vierfache Summe der Fibonacci-Sequenz

my A.https://www.codewars.com/kata/559a28007caad2ac4e000083/train/python


def perimeter(n):
    # your code
    fibo = [1,1]
    for i in range(n-1):
        fibo.append(fibo[-1] + fibo[-2] )
    return sum(fibo)*4

best A1.

def fib(n):
    a, b = 0, 1

    for i in range(n+1):
        if i == 0:
            yield b 
        else:
            a, b = b, a+b
            yield b
        

def perimeter(n):
    return sum(fib(n)) * 4

Yield ist eine Anweisung, die die Funktion hat, die Ausführung einer Funktion vorübergehend zu stoppen. Wenn Sie Yield anstelle von Return verwenden, können Sie Elemente einzeln zurückgeben, ohne sie in einer Liste usw. zu speichern. Was bedeutet das

length = 5
generator  =fib(length)
for i in range(length):
    print(next(generator),end=', ')

out

1, 1, 2, 3, 5, 

Auf diese Weise kann die for-Schleife in der Funktion auf halbem Weg gestoppt und der Wert zurückgegeben werden. Es scheint, dass diese Summe genommen wird. Weitere Informationen finden Sie unter Kommentarseite usw.

best A2.


def perimeter(n):
    a, b = 1, 2
    while n:
        a, b, n = b, a + b, n - 1
    return 4 * (b - 1)

Dies bedeutet, dass es diese Formel zu verwenden scheint

\sum a_n = a_{n+2} - a_{1}

Ich werde versuchen abzuleiten Die einzige Formel, die ich am häufigsten verwende, ist $ a_ {k} = a_ {k-1} + a_ {k-2} $ ... Denken wir basierend auf $ a_ {n + 2} $. $a_{n+2} = a_{n+1} + a_{n}$ $a_{n+2} = (a_{n} + a_{n-1}) + a_{n}$ $a_{n+2} = a_{n} + 2a_{n-1} + a_{n-2}$ Danach, wenn der Term mit einem Koeffizienten von 2 erweitert wird, so dass der Koeffizient 1 wird. $a_{n+2} = a_{n} + a_{n-1} + 2a_{n-2}+ a_{n-3}$ $…$

a_{n+2} = a_{n} + a_{n-1} + a_{n-2}+…+a_{3}+2a_{1} + a_{0}

Neben dem Übergang $a_{n+2} - a_{1} = \sum a_n $ Es wird sein.

Recommended Posts

Nullbasierter Code Wars Kata Yield und Fibonacci-Sequenz
Code Wars Kata ab Null
Berechnen Sie die Fibonacci-Sequenz mit Generator und Iterator
Codewars Kata ab Null, Nampre
Reihenfolge und Zuordnung