Fix problem number

This commit is contained in:
David Doblas Jiménez 2021-10-30 18:56:42 +02:00
parent a311ea75f8
commit 7190721c5f
10 changed files with 163 additions and 88 deletions

View File

@ -32,17 +32,28 @@ def compute():
""" """
primes = sorted(set(list_primes(1_000_000)) - set(list_primes(57_000))) primes = sorted(set(list_primes(1_000_000)) - set(list_primes(57_000)))
digits = {'0':[], '1':[], '2':[],'3':[], '4':[], '5':[],'6':[], '7':[], '8':[], '9':[]} digits = {
"0": [],
"1": [],
"2": [],
"3": [],
"4": [],
"5": [],
"6": [],
"7": [],
"8": [],
"9": [],
}
for d in digits.keys(): for d in digits.keys():
for p in primes: for p in primes:
p = str(p) p = str(p)
if p.count(d) == 3 and p[-1] != d: if p.count(d) == 3 and p[-1] != d:
digits[d].append(p) digits[d].append(p)
for d in {'0', '1', '2'}: for d in {"0", "1", "2"}:
for p in digits[d]: for p in digits[d]:
res = 0 res = 0
i = 10 i = 10
for D in {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}-{d}: for D in {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"} - {d}:
i -= 1 i -= 1
q = int(p.replace(d, D)) q = int(p.replace(d, D))
if is_prime(q) and q > 57_000: if is_prime(q) and q > 57_000:
@ -55,4 +66,4 @@ def compute():
if __name__ == "__main__": if __name__ == "__main__":
print(f"Result for Problem {int(51):003d}: {compute()}") print(f"Result for Problem 51: {compute()}")

View File

@ -23,14 +23,17 @@ def compute():
""" """
for number in range(123456, 1_000_000): for number in range(123456, 1_000_000):
if sorted(str(number)) \ if (
== sorted(str(2*number)) \ sorted(str(number))
== sorted(str(3*number)) \ == sorted(str(2 * number))
== sorted(str(4*number)) \ == sorted(str(3 * number))
== sorted(str(5*number)) == sorted(str(6*number)): == sorted(str(4 * number))
== sorted(str(5 * number))
== sorted(str(6 * number))
):
return number return number
if __name__ == "__main__": if __name__ == "__main__":
print(f"Result for Problem {int(52):003d}: {compute()}") print(f"Result for Problem 52: {compute()}")

View File

@ -41,4 +41,4 @@ def compute():
if __name__ == "__main__": if __name__ == "__main__":
print(f"Result for Problem {int(53):003d}: {compute()}") print(f"Result for Problem 53: {compute()}")

View File

@ -79,7 +79,6 @@ def compute():
def to_numerical(hand: list) -> list: def to_numerical(hand: list) -> list:
return sorted([int(x[:-1]) for x in hand], reverse=True) return sorted([int(x[:-1]) for x in hand], reverse=True)
# 10 Ranks functions. # 10 Ranks functions.
def high_card(str_hand: list) -> list: def high_card(str_hand: list) -> list:
return to_numerical(str_hand) return to_numerical(str_hand)
@ -113,7 +112,6 @@ def compute():
def royal_flush(str_hand: list) -> bool: def royal_flush(str_hand: list) -> bool:
return flush(str_hand) and list(range(14, 9, -1)) == to_numerical(str_hand) return flush(str_hand) and list(range(14, 9, -1)) == to_numerical(str_hand)
replace_map = {"T": 10, "J": 11, "Q": 12, "K": 13, "A": 14} replace_map = {"T": 10, "J": 11, "Q": 12, "K": 13, "A": 14}
score = [0, 0] score = [0, 0]
@ -121,10 +119,25 @@ def compute():
for line in open(file, "r").read().splitlines(): for line in open(file, "r").read().splitlines():
line = replace_values_in_string(line, replace_map).split() line = replace_values_in_string(line, replace_map).split()
hands = line[:5], line[5:] hands = line[:5], line[5:]
for rank in (royal_flush, straight_flush, four_of_a_kind, full_house, flush, for rank in (
straight, three_of_a_kind, two_pair, one_pair, high_card): royal_flush,
should_convert_hand = "str" not in rank.__code__.co_varnames[0] # Checks parameter name. straight_flush,
result = [rank(to_numerical(hand) if should_convert_hand else hand) for hand in hands] four_of_a_kind,
full_house,
flush,
straight,
three_of_a_kind,
two_pair,
one_pair,
high_card,
):
should_convert_hand = (
"str" not in rank.__code__.co_varnames[0]
) # Checks parameter name.
result = [
rank(to_numerical(hand) if should_convert_hand else hand)
for hand in hands
]
if result[0] != result[1]: if result[0] != result[1]:
score[0 if result[0] > result[1] else 1] += 1 score[0 if result[0] > result[1] else 1] += 1
break break
@ -134,4 +147,4 @@ def compute():
if __name__ == "__main__": if __name__ == "__main__":
print(f"Result for Problem {int(54):003d}: {compute()}") print(f"Result for Problem 54: {compute()}")

View File

@ -63,4 +63,4 @@ def compute():
if __name__ == "__main__": if __name__ == "__main__":
print(f"Result for Problem {int(55):003d}: {compute()}") print(f"Result for Problem 55: {compute()}")

View File

@ -35,4 +35,4 @@ def compute():
if __name__ == "__main__": if __name__ == "__main__":
print(f"Result for Problem {int(56):003d}: {compute()}") print(f"Result for Problem 56: {compute()}")

View File

@ -47,4 +47,4 @@ def compute():
if __name__ == "__main__": if __name__ == "__main__":
print(f"Result for Problem {int(57):003d}: {compute()}") print(f"Result for Problem 57: {compute()}")

View File

@ -53,4 +53,4 @@ def compute():
if __name__ == "__main__": if __name__ == "__main__":
print(f"Result for Problem {int(58):003d}: {compute()}") print(f"Result for Problem 58: {compute()}")

View File

@ -45,9 +45,9 @@ def compute():
values in the original text. values in the original text.
""" """
with open('../files/Problem59.txt', 'r') as f: with open("../files/Problem59.txt", "r") as f:
# encrypted = list(map(int, f.read().split(','))) # encrypted = list(map(int, f.read().split(',')))
encrypted = [int(char) for char in f.read().split(',')] encrypted = [int(char) for char in f.read().split(",")]
# print(encrypted) # print(encrypted)
# print(test) # print(test)
plain_text = len(encrypted) // 3 plain_text = len(encrypted) // 3
@ -57,10 +57,10 @@ def compute():
decrypted += chr(ord(k) ^ i) decrypted += chr(ord(k) ^ i)
# assuming Euler will be in the text # assuming Euler will be in the text
if 'Euler' in decrypted: if "Euler" in decrypted:
return sum([ord(c) for c in decrypted]) return sum([ord(c) for c in decrypted])
if __name__ == "__main__": if __name__ == "__main__":
print(f"Result for Problem {int(59):003d}: {compute()}") print(f"Result for Problem 59: {compute()}")

View File

@ -0,0 +1,48 @@
import math
from functools import wraps
def timeit(name):
def profile(original):
import time
@wraps(original)
def wrapper(*args, **kwargs):
t0 = time.perf_counter()
result = original(*args, **kwargs)
t1 = time.perf_counter()
print(f"Time to evaluate problem {int(name[7:]):003d}: {(t1 - t0)*1000:.3f} ms\n")
return result
return wrapper
return profile
def is_prime(n):
if n <2:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
# Returns a list of True and False indicating whether each number is prime.
# For 0 <= i <= n, result[i] is True if i is a prime number, False otherwise.
def list_primality(n):
# Sieve of Eratosthenes
result = [True] * (n + 1)
result[0] = result[1] = False
for i in range(int(math.sqrt(n) + 1)):
if result[i]:
for j in range(i * i, len(result), i):
result[j] = False
return result
# Returns all the prime numbers less than or equal to n, in ascending order
# For example: list_primes(97) = [2, 3, 5, 7, 11, ..., 83, 89, 97].
def list_primes(n):
return [i for (i, is_prime) in enumerate(list_primality(n)) if is_prime]
def is_palindrome(num):
return str(num) == str(num)[::-1]