import math
import time
"""
The code uses an input() variable from at the beginning to get the input of the digits.
If you want to use the codde without the input, then please use: logarithm_sums(the input here as a string) in the python terminal
the code takes the input line the same way as it was shown in the example input on the Datatähti webpage.
"""
num_of_digits = input(": ")
time_cost = time.time()
def logarithm_sums(y):
n = 1
x = str(y).split(" ")
the_num_from_before_digits = 1
done = True
input_amount_of_digits = 0
for a_digit in x:
input_amount_of_digits += int(a_digit)
calculated_logarithm = math.log(n, 10)
num_of_digits = math.floor(calculated_logarithm) +1
while done: # this loop runs until we find the number that is factorialised, or until it finds that the input does not correspond a factorial
if num_of_digits >= input_amount_of_digits+1:
print("the number does not correspond to a factorial")
print("the n: ", n)
done = False
if num_of_digits == the_num_from_before_digits and num_of_digits == input_amount_of_digits:
the_factorial = math.factorial(n)
amount_of_numbers_correct = 0
#print("THE NUMBER FACTORIALISED IS: ", the_factorial)
for i in range(10): # we make a loop to check every digit from 0 to 9 if the number (variable n) has the same amount opf them as the input
if str(the_factorial).count(str(i)) == int(x[i]):
amount_of_numbers_correct += 1
if amount_of_numbers_correct == 10: #this is finally the output code, that will show the number that is factorialised if the input is correct
print(n)
#print("the number that is factorialised is: ", n)
#time_cost2 = time.time()
#print("the duration of the code : ", time_cost2-time_cost)
done = False
else:
n += 1
calculated_logarithm += math.log(n, 10)
num_of_digits = math.floor(calculated_logarithm) +1
#print(num_of_digits)
elif num_of_digits == input_amount_of_digits: # if our digits has finally got the same amount of digits as the input, this code will trigger, that checks the digits
the_factorial = math.factorial(n)
amount_of_numbers_correct0 = 0
for i in range(10): # we make a loop to check every digit from 0 to 9 if the number (variable n) has the same amount opf them as the input
if str(the_factorial).count(str(i)) == int(x[i]):
amount_of_numbers_correct0 += 1
if amount_of_numbers_correct0 == 10: #this is finally the output code, that will show the number that is factorialised if the input is correct
print(n)
#print("the number that is factorialised is: ", n)
#time_cost2 = time.time()
#print("the duration of the code : ", time_cost2-time_cost)
done = False
else:
n += 1
calculated_logarithm += math.log(n, 10)
num_of_digits = math.floor(calculated_logarithm) +1
else: #if the factorial of n (which at the end wil be the number that is factorialised) does not have as many digits as the input, this line else: statement will trigger
the_num_from_before = n
the_num_from_before_logarithm =math.log(the_num_from_before, 10)
the_num_from_before_digits = math.floor(the_num_from_before_logarithm) +1
n += 1
calculated_logarithm += math.log(n, 10)
num_of_digits = math.floor(calculated_logarithm) +1
logarithm_sums(num_of_digits)