Zagadka jest całkiem prosta i da się ją - przy odrobinie cierpliwości - rozwiązać bez pomocy komputerów. Ja - z braku cierpliwości - napisałem sobie oczywiście prosty skrypt w Pythonie:
import pandas as pd
from pprint import pprint
dates = pd.date_range(start="2023-01-01", end="2023-12-31")
solution = set()
for d1 in dates:
for d2 in dates:
if (sorted([d1.month, d1.day]) == sorted([d2.month+d2.day, d2.month*d2.day])):
solution.add(((d2.month, d2.day), (d1.month, d1.day)))
pprint(solution)
print(len(solution))
Wynik:
{((1, 1), (1, 2)),
((1, 1), (2, 1)),
((1, 2), (2, 3)),
((1, 2), (3, 2)),
((1, 3), (3, 4)),
((1, 3), (4, 3)),
((1, 4), (4, 5)),
((1, 4), (5, 4)),
((1, 5), (5, 6)),
((1, 5), (6, 5)),
((1, 6), (6, 7)),
((1, 6), (7, 6)),
((1, 7), (7, 8)),
((1, 7), (8, 7)),
((1, 8), (8, 9)),
((1, 8), (9, 8)),
((1, 9), (9, 10)),
((1, 9), (10, 9)),
((1, 10), (10, 11)),
((1, 10), (11, 10)),
((1, 11), (11, 12)),
((1, 11), (12, 11)),
((1, 12), (12, 13)),
((2, 1), (2, 3)),
((2, 1), (3, 2)),
((2, 2), (4, 4)),
((2, 3), (5, 6)),
((2, 3), (6, 5)),
((2, 4), (6, 8)),
((2, 4), (8, 6)),
((2, 5), (7, 10)),
((2, 5), (10, 7)),
((2, 6), (8, 12)),
((2, 6), (12, 8)),
((2, 7), (9, 14)),
((2, 8), (10, 16)),
((2, 9), (11, 18)),
((2, 10), (12, 20)),
((3, 1), (3, 4)),
((3, 1), (4, 3)),
((3, 2), (5, 6)),
((3, 2), (6, 5)),
((3, 3), (6, 9)),
((3, 3), (9, 6)),
((3, 4), (7, 12)),
((3, 4), (12, 7)),
((3, 5), (8, 15)),
((3, 6), (9, 18)),
((3, 7), (10, 21)),
((3, 8), (11, 24)),
((3, 9), (12, 27)),
((4, 1), (4, 5)),
((4, 1), (5, 4)),
((4, 2), (6, 8)),
((4, 2), (8, 6)),
((4, 3), (7, 12)),
((4, 3), (12, 7)),
((4, 4), (8, 16)),
((4, 5), (9, 20)),
((4, 6), (10, 24)),
((4, 7), (11, 28)),
((5, 1), (5, 6)),
((5, 1), (6, 5)),
((5, 2), (7, 10)),
((5, 2), (10, 7)),
((5, 3), (8, 15)),
((5, 4), (9, 20)),
((5, 5), (10, 25)),
((5, 6), (11, 30)),
((6, 1), (6, 7)),
((6, 1), (7, 6)),
((6, 2), (8, 12)),
((6, 2), (12, 8)),
((6, 3), (9, 18)),
((6, 4), (10, 24)),
((6, 5), (11, 30)),
((7, 1), (7, 8)),
((7, 1), (8, 7)),
((7, 2), (9, 14)),
((7, 3), (10, 21)),
((7, 4), (11, 28)),
((8, 1), (8, 9)),
((8, 1), (9, 8)),
((8, 2), (10, 16)),
((8, 3), (11, 24)),
((9, 1), (9, 10)),
((9, 1), (10, 9)),
((9, 2), (11, 18)),
((9, 3), (12, 27)),
((10, 1), (10, 11)),
((10, 1), (11, 10)),
((10, 2), (12, 20)),
((11, 1), (11, 12)),
((11, 1), (12, 11)),
((12, 1), (12, 13))}
95
Widać, że jest 95 różnych par dat spełniających warunki zagadki.
A jak Wam poszło?
1Cichemu wyszło 126. Nie zaliczam.

2Waldek stwierdził za pomocą kilku formuł w Excelu, że 96. Blisko, ale nie zaliczam. Nota bene nie do końca rozumiem Waldkowe formuły - a konkretnie to nie widzę gdzie ma zdefiniowane podwójne permutacje dat (trzeba sprawdzić wszystkie możliwe pary). A może metoda Waldka jest poprawna i się chłop po prostu walnął o 1, na przykład licząc podwójnie parę 2 lutego i 4 kwietnia? No nie wiem.

3Butter jako pierwszy nadesłał poprawne rozwiązanie, uzyskane za pomocą skryptu w Pythonie. Gratuluję wygranej.

from datetime import date, timedelta
res = []
_date = date(2023,1,1)
delta = timedelta(days = 1)
for x in range(365):
d1 = {
"day" :_date.day,
"month" : _date.month,
"date" :_date}
res.append(d1)
_date += delta
wynik = 0
for x in res:
suma = x['day'] + x['month']
iloczyn = x['day'] * x['month']
szuk = [ pos for pos in res if ((pos['day'] == suma) and pos['month'] == iloczyn) or ((pos['day'] == iloczyn) and (pos['month'] == suma)) ]
if len(szuk) >0:
wynik += len(szuk)
wynik_print = '{0:02d}-{1:02d} --> '.format(x['day'],x['month'])
for px in szuk:
wynik_print += ' {0:02d}-{1:02d} '.format(px['day'],px['month'])
print(wynik_print)
print('---------')
print(wynik)
Skrypt Buttera (powyżej) jest nieco bardziej skomplikowany od mojego, ale z drugiej strony nie wymaga używania niestandardowych bibliotek i w dodatku wyświetla wyniki w bardziej elegancki sposób:
01-01 --> 02-01 01-02 02-01 --> 03-02 02-03 03-01 --> 04-03 03-04 04-01 --> 05-04 04-05 05-01 --> 06-05 05-06 06-01 --> 07-06 06-07 07-01 --> 08-07 07-08 08-01 --> 09-08 08-09 09-01 --> 10-09 09-10 10-01 --> 11-10 10-11 11-01 --> 12-11 11-12 12-01 --> 13-12 01-02 --> 03-02 02-03 02-02 --> 04-04 03-02 --> 06-05 05-06 04-02 --> 08-06 06-08 05-02 --> 10-07 07-10 06-02 --> 12-08 08-12 07-02 --> 14-09 08-02 --> 16-10 09-02 --> 18-11 10-02 --> 20-12 01-03 --> 04-03 03-04 02-03 --> 06-05 05-06 03-03 --> 09-06 06-09 04-03 --> 12-07 07-12 05-03 --> 15-08 06-03 --> 18-09 07-03 --> 21-10 08-03 --> 24-11 09-03 --> 27-12 01-04 --> 05-04 04-05 02-04 --> 08-06 06-08 03-04 --> 12-07 07-12 04-04 --> 16-08 05-04 --> 20-09 06-04 --> 24-10 07-04 --> 28-11 01-05 --> 06-05 05-06 02-05 --> 10-07 07-10 03-05 --> 15-08 04-05 --> 20-09 05-05 --> 25-10 06-05 --> 30-11 01-06 --> 07-06 06-07 02-06 --> 12-08 08-12 03-06 --> 18-09 04-06 --> 24-10 05-06 --> 30-11 01-07 --> 08-07 07-08 02-07 --> 14-09 03-07 --> 21-10 04-07 --> 28-11 01-08 --> 09-08 08-09 02-08 --> 16-10 03-08 --> 24-11 01-09 --> 10-09 09-10 02-09 --> 18-11 03-09 --> 27-12 01-10 --> 11-10 10-11 02-10 --> 20-12 01-11 --> 12-11 11-12 01-12 --> 13-12 --------- 95
4Rozie nadesłał swoje rozwiązanie nazajutrz rano. Z jakiegoś powodu wyszło mu 48:

days_month_count = {
1: 31,
2: 29,
3: 31,
4: 30,
5: 31,
6: 30,
7: 31,
8: 31,
9: 30,
10: 31,
11: 30,
12: 31,
}
possible = set()
created = set()
for month in range(1, 13):
for day in range(1, days_month_count[month]):
possible.add((month, day))
new_day1 = month * day
new_month1 = month + day
new_day2 = month + day
new_month2 = month * day
created.add((new_month1, new_day1))
created.add((new_month2, new_day2))
count = 0
for to_check in created:
if to_check in possible:
print(to_check)
count += 1
print(count)
5Pod wieczór przyszło rozwiązanie Piotra - nie dość, że poprawne, to jeszcze zrobione algorytmem w SQL. Szacun!
with __numbers AS (select * from(values(1),(2),(3),(4),(5),(6)) as n(num)),
_numbers as (select a.* from __numbers a cross join __numbers),
numbers as (select row_number() over(order by a.num) rownum from _numbers a),
longmonthdays as (select rownum day from numbers where rownum <= 31),
shortmonthdays as (select rownum day from numbers where rownum <= 30),
februarydays as (select rownum day from numbers where rownum <= 28),
shortmonths as (select * from (values(4),(6),(9),(11)) as n(month)),
longmonths as (select * from (values (1),(3),(5),(7),(8),(10),(12)) as n(month)),
february as (select 2 as month),
longdates as (select day.*,month.* from longmonthdays day cross join longmonths month),
shortdates as (select day.*, month.* from shortmonthdays day cross join shortmonths month),
februarydates as (select day.*, month.* from februarydays day cross join february month),
alldates as (
select day, month from longdates
union all select day, month from shortdates
union all select day, month from februarydates
),
datecombinations AS (
select
a.day [my day],
a.month [my month],
b.day [friend day],
b.month [friend month]
from
alldates a
inner join alldates b on a.day + a.month = b.month
and a.day * a.month = b.day
union
select
a.day [my day],
a.month [my month],
b.day [friend day],
b.month [friend month]
from
alldates a
inner join alldates b on a.day * a.month = b.month
and a.day + a.month = b.day
)
select
row_number() over(
order by
[my day]
) num,
[my day],
[my month],
[friend day],
[friend month]
from
datecombinations
order by 2, 1
6Rozie zorientował się, że jego poprzednie rozwiązanie miało pewne wady i nadesłał nowe, lepsze. Też mu wyszło 48, ale dużo szybciej i bardziej elegancko:
mm = [1, 2, 3, 4, 6, 12] # possible month after multiplication
ms = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] # possible month after addition
solutions = set()
for m in mm:
for n in ms:
if m * n < 31 and m + n < 13:
solutions.add((m * n, m + n))
if m + n < 31 and m * n < 13:
solutions.add((m + n, m * n))
print(len(solutions))
Wydaje mi się, że Rozie próbuje tu rozwiązać inne zadanie niż przedstawione w zagadce...

P.S. Dzięki dla Waldka za przypomnienie mi o terminach - faktycznie kompletnie wyleciało mi z głowy, żeby opublikować odpowiedź. Swoją drogą mam żelazną zasadę nie publikowania zagadki zanim nie przygotuję wpisu z odpowiedzią, więc ten tutaj po prostu wisiał sobie na zapleczu i czekał na publikację. Kwestia paru kliknięć 🙂
7P.S.2. Aha, całkiem zapomniałem o tym, że w międzyczasie - zresztą za namową znajomego - spróbowałem rozwiązać tę zagadkę za pomocą popularnego ostatnio ChatGPT. Oto rezultaty:

Jak widać do osobliwości technologicznej jeszcze daleko 🙂
„licząc podwójnie parę 2 lutego i 4 kwietnia”
Tak było, tzn tak jest. Rzeczywiście popełniłem niegodny błąd i czuję się wstrętnie.
Przyznam, że szukałem haczyków w tej zagadce i sprawdzałem na różne sposoby wiele z nich (np. datę 29 lutego). Przeoczyłem jednak oczywiste. Tak mi wstyd…
Naprawdę.
„Swoją drogą mam żelazną zasadę nie publikowania zagadki zanim nie przygotuję wpisu z odpowiedzią, więc ten tutaj po prostu wisiał sobie na zapleczu i czekał na publikację”.
Znaczy – znałeś nasze odpowiedzi, zanim my je uzyskaliśmy:
Bądź uwielbiony, miłosierny Boże, Wszechmocny Stwórco, dobry nasz Panie.
Cześć Ci oddajem w najgłębszej pokorze, w Bóstwa Twojego tonąc oceanie.
Jakiś hymn czy dwa, spoko, ale aż takie rymy to mi się jednak nie należą.
Chodziło mi bardziej o to, że zanim opublikuję zagadkę, mam już przygotowany wpis z odpowiedzią. Natomiast ponumerowane po kolei zgłoszenia czytelników dopisuję na bieżąco później.
Zresztą w tym akurat przypadku między nadejściem odpowiedzi numer 6 a publikacją wpisu minęło całkiem sporo czasu, więc wszystko się zgadza.
Te peany to tylko drobny żarto-uśmiech ściągnięty z jakiejś przypadkowej strony religio-wyznawców. Tak poza tym to, rzecz jasna, nie możesz być Bogiem, gdyż zapomniałeś o dacie publikacji rozwiązania. Bóg by nie zapomniał…
W jednej z książek Pratchetta była bogini odpowiedzialna za blokowanie się chochli w szufladzie. Ja mogę być bogiem od zapominania. Panteon teraz jest pełen najróżniejszego dziwactwa 🙂
Szuflandia, Szuflandia…
Więc bądź uszafladowiona, bogini chochli.
Jeśli już o bogach i bóstwach: Bardzo, ale to najbardziej bardzo spodobał mi się cytat:
„If you broke down holy water into hydrogen and oxygen you could make a holy hydrogen bomb”.
Kilka cytatów z twojej strony już wcześniej mi się podobało (z siedem razy nawet się śmiałem), ale ten przebija wszystko. To jest KWINTESENCJA. Trzeba tylko spojrzeć w głąb. W głąb bomby wodorowej. Serdecznie pozdrawiam…
Ech, machnąłem się w warunku poprawności miesiąca i w niektórych przypadkach zaliczyło mi daty z miesiącami większymi od 12 – nie wiem, jakim cudem udało mi się tego nie zauważyć w wynikach. Po poprawieniu wyszło już dobrze.
Nie tylko liczyłem co innego, niż przedstawione w zagadce, ale dodatkowo z błędem. Chodzi oczywiście o linię
Za mało o 1 w górnym zakresie.
I tak, policzyłem po prostu ile unikalnych dat można utworzyć przez mnożeniododawanie.