mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
Add Project Euler problem 79 solution 1 (#8607)
Co-authored-by: Dhruv Manilawala <dhruvmanila@gmail.com>
This commit is contained in:
parent
5ca7189563
commit
ebc2d5d79f
0
project_euler/problem_079/__init__.py
Normal file
0
project_euler/problem_079/__init__.py
Normal file
50
project_euler/problem_079/keylog.txt
Normal file
50
project_euler/problem_079/keylog.txt
Normal file
|
@ -0,0 +1,50 @@
|
|||
319
|
||||
680
|
||||
180
|
||||
690
|
||||
129
|
||||
620
|
||||
762
|
||||
689
|
||||
762
|
||||
318
|
||||
368
|
||||
710
|
||||
720
|
||||
710
|
||||
629
|
||||
168
|
||||
160
|
||||
689
|
||||
716
|
||||
731
|
||||
736
|
||||
729
|
||||
316
|
||||
729
|
||||
729
|
||||
710
|
||||
769
|
||||
290
|
||||
719
|
||||
680
|
||||
318
|
||||
389
|
||||
162
|
||||
289
|
||||
162
|
||||
718
|
||||
729
|
||||
319
|
||||
790
|
||||
680
|
||||
890
|
||||
362
|
||||
319
|
||||
760
|
||||
316
|
||||
729
|
||||
380
|
||||
319
|
||||
728
|
||||
716
|
16
project_euler/problem_079/keylog_test.txt
Normal file
16
project_euler/problem_079/keylog_test.txt
Normal file
|
@ -0,0 +1,16 @@
|
|||
319
|
||||
680
|
||||
180
|
||||
690
|
||||
129
|
||||
620
|
||||
698
|
||||
318
|
||||
328
|
||||
310
|
||||
320
|
||||
610
|
||||
629
|
||||
198
|
||||
190
|
||||
631
|
69
project_euler/problem_079/sol1.py
Normal file
69
project_euler/problem_079/sol1.py
Normal file
|
@ -0,0 +1,69 @@
|
|||
"""
|
||||
Project Euler Problem 79: https://projecteuler.net/problem=79
|
||||
|
||||
Passcode derivation
|
||||
|
||||
A common security method used for online banking is to ask the user for three
|
||||
random characters from a passcode. For example, if the passcode was 531278,
|
||||
they may ask for the 2nd, 3rd, and 5th characters; the expected reply would
|
||||
be: 317.
|
||||
|
||||
The text file, keylog.txt, contains fifty successful login attempts.
|
||||
|
||||
Given that the three characters are always asked for in order, analyse the file
|
||||
so as to determine the shortest possible secret passcode of unknown length.
|
||||
"""
|
||||
import itertools
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def find_secret_passcode(logins: list[str]) -> int:
|
||||
"""
|
||||
Returns the shortest possible secret passcode of unknown length.
|
||||
|
||||
>>> find_secret_passcode(["135", "259", "235", "189", "690", "168", "120",
|
||||
... "136", "289", "589", "160", "165", "580", "369", "250", "280"])
|
||||
12365890
|
||||
|
||||
>>> find_secret_passcode(["426", "281", "061", "819" "268", "406", "420",
|
||||
... "428", "209", "689", "019", "421", "469", "261", "681", "201"])
|
||||
4206819
|
||||
"""
|
||||
|
||||
# Split each login by character e.g. '319' -> ('3', '1', '9')
|
||||
split_logins = [tuple(login) for login in logins]
|
||||
|
||||
unique_chars = {char for login in split_logins for char in login}
|
||||
|
||||
for permutation in itertools.permutations(unique_chars):
|
||||
satisfied = True
|
||||
for login in logins:
|
||||
if not (
|
||||
permutation.index(login[0])
|
||||
< permutation.index(login[1])
|
||||
< permutation.index(login[2])
|
||||
):
|
||||
satisfied = False
|
||||
break
|
||||
|
||||
if satisfied:
|
||||
return int("".join(permutation))
|
||||
|
||||
raise Exception("Unable to find the secret passcode")
|
||||
|
||||
|
||||
def solution(input_file: str = "keylog.txt") -> int:
|
||||
"""
|
||||
Returns the shortest possible secret passcode of unknown length
|
||||
for successful login attempts given by `input_file` text file.
|
||||
|
||||
>>> solution("keylog_test.txt")
|
||||
6312980
|
||||
"""
|
||||
logins = Path(__file__).parent.joinpath(input_file).read_text().splitlines()
|
||||
|
||||
return find_secret_passcode(logins)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(f"{solution() = }")
|
Loading…
Reference in New Issue
Block a user