Wychodzi mi 210. Ale może też wyjść w zasadzie każda wielokrotność 210. Wartości logiczne zdań są takie:
[False, True, True, True, False, True, True, False, False, False]
Wyliczone maszynowo, sprawdzone „ręcznie”. Nie dają sprzeczności, ale też nie dają konkretnego wyniku, a jedynie listę dzielników.
EDIT: A nie. Z fałszywości zdania 9 wynika, że nie może być to 420, ani żadna inna wielokrotność 210 (bo już 420 ma 22 dzielniki). Dlatego odpowiedzią jest 210.
Poniżej wklejam kod:
Pytanie 9 ciężko było zaimplementować używając tej architektury, więc „przełączałem” je ręcznie. Pytanie, jakie było proste dla człowieka rozumowanie, które pozwoliło rozwiązać zagadkę bez pomocy komputera. Bo doszedłem do tego, że zdania 1, 9 i 10 są fałszywe. A potem utknąłem.
[False, True, True, True, False, True, True, False, False, False]
Wyliczone maszynowo, sprawdzone „ręcznie”. Nie dają sprzeczności, ale też nie dają konkretnego wyniku, a jedynie listę dzielników.
EDIT: A nie. Z fałszywości zdania 9 wynika, że nie może być to 420, ani żadna inna wielokrotność 210 (bo już 420 ma 22 dzielniki). Dlatego odpowiedzią jest 210.
Poniżej wklejam kod:
Kod:
def f1(guesses):
return guesses[9 - 1] or guesses[10 - 1]
def f2(guesses):
return (guesses[1 - 1] and not guesses[2 - 1]) or (not guesses[1 - 1] and guesses[2 - 1])
def f3(guesses):
current = 0
longest = 0
for i in guesses:
if i:
longest = max([current, longest])
current = 0
else:
current += 1
longest = max([current, longest])
return longest >= 3
def f4(guesses):
first = None
last = None
for i, guess in enumerate(guesses, 1):
if guess:
if not first:
first = i
last = i
if last and first:
return [last - first]
else:
return [9999]
def f5(guesses):
return sum(i for (i, guess) in enumerate(guesses, 1) if guess)
def f6(guesses):
return not guesses[6 - 1] or any(guesses[7 - 1:])
def f7(guesses):
return [i for (i, guess) in enumerate(guesses, 1) if guess]
def f8(guesses):
return sum(10 for guess in guesses if guess)
def f9(guesses):
return False
def f10(guesses):
current = 0
longest = 0
for i in guesses:
if i:
current += 1
else:
longest = max([current, longest])
current = 0
longest = max([current, longest])
return longest < 3
fs = [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10]
if __name__ == '__main__':
for i in range(1024):
guesses = [bit == '1' for bit in f'{i:010b}']
numbers = set()
divisors = []
for i, f in enumerate(fs):
result = f(guesses)
if isinstance(result, bool):
if result != guesses[i]:
break
elif isinstance(result, int) and guesses[i]:
numbers.add(result)
elif isinstance(result, list) and guesses[i]:
divisors += result
else:
if len(numbers) == 0:
print(guesses, divisors)
elif len(numbers) > 1:
continue
number = numbers.pop()
for divisor in divisors:
if number % divisor:
break
else:
print(guesses, number)