Python one-liners for Project Euler

· by

Contents

Today, I've been trying to get used to Pythons functional programming tools by solving Project-Euler tasks. To make them more interesting, I've solved them in one line. But I realized, that it is difficult to read online as only about 70 characters get displayed without a scrollbar. So I made multi-line solutions out of them.

These snippets are also good examples what's possible to do with Python and to show that Python is fast.

Problem 24

What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?
from itertools import permutations, islice

print(next(islice(permutations("0123456789"), 999999, 999999 + 1)))

Problem 29

How many distinct terms are in the sequence generated by $a^b$ for $2 \leq a \leq 100$ and $2 \leq b \leq 100$?
d = lambda top: len(set([a ** b for a in range(2, top + 1) for b in range(2, top + 1)]))

Problem 34

145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145. Find the sum of all numbers which are equal to the sum of the factorial of their digits. Note: as 1! = 1 and 2! = 2 are not sums they are not included.
from math import factorial

l = lambda n: reduce(lambda x, y: int(x) + factorial(int(y)), [d for d in "0" + str(n)])
print(reduce(lambda x, y: x + y, filter(lambda x: x == l(x), range(3, 100000))))

Problem 36

The decimal number, 585 = 10010010012 (binary), is palindromic in both bases. Find the sum of all numbers, less than one million, which are palindromic in base 10 and base 2.
palindrom = (
    lambda x: str(x) == str(x)[::-1] and str(bin(x))[2:] == str(bin(x))[2:][::-1]
)
d = lambda top: reduce(lambda x, y: x + y, filter(palindrom, range(0, top + 1)))

Problem 48

The series, $1^1 + 2^2 + 3^3 + ... + 10^{10} = 10405071317$. Find the last ten digits of the series, $1^1 + 2^2 + 3^3 + ... + 1000^{1000}$.
d = lambda top: str(reduce(lambda x, y: x + y, [i ** i for i in range(1, top + 1)]))[
    -10:
]

Problem 52

Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x, contain the same digits in some order.
digits = lambda n, p: set(str(n * p))
d = lambda n: all(digits(n, 1) == digits(n, x) for x in range(2, 7))
print(filter(d, range(0, 1000000)))

Problem 53

How many values of $\binom{n}{r}$, for $1 \leq r \leq n \leq 100$, exceed one-million?
from math import factorial as f

print(
    sum(
        (f(i) / (f(j) * f(i - j))) > 1000000 for i in range(1, 101) for j in range(1, i)
    )
)

Problem 56

Considering natural numbers of the form, $a^b$, finding the maximum digital sum.
print(
    max(
        [
            sum([int(c) for c in str(a ** b)])
            for a in range(1, 100)
            for b in range(1, 100)
        ]
    )
)

Problem 97

Find the last ten digits of the non-Mersenne prime: $28433 \cdot 2^{7830457} + 1$.
print(28433 * (2 ** 7830457) + 1) % (10 ** 10)