Errare…
W krzyżówce liczbowej zamieszczonej w Puzelandzie w sierpniowym numerze „Wiedzy i Życia” popełniłem niegroźny błąd. W jednym z objaśnień znalazła się niewłaściwa litera, co prowadziło do sprzeczności między pierwszym objaśnieniem poziomo, a pierwszym pionowo. Efektem tej sprzeczności była jednocyfrowa liczba, którą należałoby wpisać do diagramu, podczas gdy w całym zadaniu w grę wchodziły tylko dwu- i trzycyfrowe.
Błąd nazwałem niegroźnym ponieważ krzyżówkę można rozwiązać ignorując, czyli usuwając oba sprzeczne objaśnienia, choć jest to nieco trudniejsze. Poniżej bisuję bez owych dwu objaśnień (c poziomo i a pionowo).

Poziomo:
f) c/2
g) k-f
j) l/3
k) 9a
l) c+k
Pionowo:
b) g/2
d) 8h
e) 9i
h) 3b
i) b+j
I dodatkowe trudne zadanie: czy można usunąć jeszcze któreś z dziesięciu podanych objaśnień bez utraty możliwości rozwiązania krzyżówki – oczywiście kompletnego i jednoznacznego.
Komentarze
…Humanum Est:
Poziomo:
f) c/2=51
g) k-f=48
j) l/3=67
k) 9a=99
l) c+k=201
Pionowo:
b) g/2=24
d) 8h=576
e) 9i=819
h) 3b=72
i) b+j=91
Rozwiązując „ręcznie” korzystałem ze wszystkich podanych zależności ale sztuczna inteligencja znajdzie zapewne jakieś nadmiarowości.
Rozwiązanie:
a = 11
b = 24
c = 102
d = 576
e = 819
f = 51
g = 48
h = 72
i = 91
j = 67
k = 99
l = 201
Usunięty liczba
warunek rozwiązań
f = c/2 1
g = k-f 1
j = l/3 1
k = 9a 1
l = c+k 1
b = g/2 1
d = 8h 10
e = 9i 10
h = 3b 1
i = b+j 1
Pojedynczo można usunąć dowolny warunek oprócz:
d = 8h
e = 9i
Po usunięciu d = 8h liczba d ma postać 5?6, czyli:
506, 516, 526, 536, 546, 556, 566, 576, 586, 596.
Po usunięciu e = 9i liczba e ma postać 8?9, czyli:
809, 819, 829, 839, 849, 859, 869, 879, 889, 899.
Minimalizacja:
Minimalna liczba potrzebnych objaśnień wynosi 6.
Maksymalnie można usunąć 4 z 10 objaśnień.
Istnieje aż 20 minimalnych zestawów.
W każdym minimalnym zestawie muszą pozostać:
d = 8h
e = 9i
Wszystkie 20 zestawów czterech objaśnień, które można jednocześnie wykreślić:
1. l = c+k, b = g/2, h = 3b, i = b+j
2. k = 9a, b = g/2, h = 3b, i = b+j
3. k = 9a, l = c+k, h = 3b, i = b+j
4. k = 9a, l = c+k, b = g/2, i = b+j
5. k = 9a, l = c+k, b = g/2, h = 3b
6. j = l/3, k = 9a, h = 3b, i = b+j
7. j = l/3, k = 9a, b = g/2, i = b+j
8. g = k-f, l = c+k, h = 3b, i = b+j
9. g = k-f, l = c+k, b = g/2, i = b+j
10. g = k-f, l = c+k, b = g/2, h = 3b
11. g = k-f, k = 9a, h = 3b, i = b+j
12. g = k-f, k = 9a, b = g/2, h = 3b
13. g = k-f, j = l/3, b = g/2, i = b+j
14. f = c/2, b = g/2, h = 3b, i = b+j
15. f = c/2, k = 9a, h = 3b, i = b+j
16. f = c/2, k = 9a, b = g/2, i = b+j
17. f = c/2, k = 9a, b = g/2, h = 3b
18. f = c/2, g = k-f, h = 3b, i = b+j
19. f = c/2, g = k-f, b = g/2, i = b+j
20. f = c/2, g = k-f, b = g/2, h = 3b
Jak to rozwiązać po wyrzuceniu warunków, na przykładzie 1.
Usuwam: l = c+k, b = g/2, h = 3b, i = b+j.
Zostają objaśnienia:
f = c/2
g = k−f
j = l/3
k = 9a
d = 8h
e = 9i
Z warunku k = 9a wiemy, że a i k są dwucyfrowe. Skoro 9a też ma być dwucyfrowe, to:
a = 10 albo a = 11.
Ale z diagramu a składa się z pierwszej cyfry c i drugiej cyfry f. A ponieważ f = c/2, końcówka f musi pasować do drugiej cyfry a.
Jeśli a = 10, to f kończyłoby się zerem. Wtedy c = 2f kończyłoby się zerem, co dalej psuje skrzyżowania z b/g.
Naturalnie zostaje: a = 11, więc k = 99.
Skoro a = 11, to: pierwsza cyfra c to 1, druga cyfra f to 1.
A f = c/2, więc f jest dwucyfrowe i kończy się na 1.
Zatem f może być:
51, 61, 71, 81, 91
a wtedy c = 2f:
102, 122, 142, 162, 182.
Teraz g = k−f, a k = 99:
jeśli f = 51, to g = 48
jeśli f = 61, to g = 38
jeśli f = 71, to g = 28
jeśli f = 81, to g = 18
jeśli f = 91, to g = 8, odpada, bo g ma być dwucyfrowe.
Z diagramu ostatnia cyfra c jest też pierwszą cyfrą pionowego b, a pierwsza cyfra g jest drugą cyfrą b. To ogranicza pary. Działa tylko:
c = 102, f = 51, g = 48.
Mamy więc
a = 11
c = 102
f = 51
g = 48
k = 99
Teraz e = 9i. Z diagramu:
pierwsza cyfra e to ostatnia cyfra g, czyli 8,
ostatnia cyfra e to ostatnia cyfra k, czyli 9.
Czyli e ma postać:
8?9.
Jedyna liczba postaci 8?9, która jest równa 9i, to:
819 = 9×91.
Zatem:
e = 819, i = 91.
Dalej j = l/3, czyli l = 3j.
Z przecięć z diagramu i = 91 daje ostatnią cyfrę l równą 1. Trzeba więc mieć l = 3j i l kończy się na 1. To daje:
j = 67, l = 201.
Na końcu d = 8h. Z diagramu h ma cyfry z j i l, więc:
h = 72.
A wtedy:
d = 8×72 = 576.
Rozwiązanie
a=11, b=24, c=102, d=576, e=819, f=51, g=48, h=72, i=91, j=67, k=99, l=201.
Najważniejsze najpierw k=9a, potem f=c/2, potem skrzyżowania c/f/g, potem e=9i, potem j=l/3, a na końcu d=8h.
Rozwiązanie przy 5 warunkach
============================
Pozostawione warunki:
1. f = c/2
2. g = k-f
3. j = l/3
4. d = 12g
5. e = 9i
Usunięte pierwotne warunki:
k = 9a
l = c+k
b = g/2
h = 3b
i = b+j
d = 8h zostalo zastąpione przez d = 12g
Rozwiązanie
———–
Korzystamy nie tylko z warunków, ale też ze wspólnych cyfr (skrzyżowań) w diagramie:
– c przecina a i b,
– f przecina d i a,
– g przecina b i e,
– j przecina d i h,
– k przecina i i e,
– l przecina h i i.
1. Warunek f = c/2
——————
c jest trzycyfrowe, a f dwucyfrowe, więc: c = 2f.
Aby c było trzycyfrowe, musi być: f >= 50.
Pierwsza cyfra f jest jednocześnie pierwszą cyfrą d, bo f przecina d.
Zatem d zaczyna się cyfrą 5, 6, 7, 8 albo 9.
2. Warunek d = 12g
——————
Skoro d zaczyna się co najmniej od 5, to: d = 12g >= 500,czyli: g >= 42.
Ponieważ g jest dwucyfrowe, a d trzycyfrowe, mamy też:g <= 83.
Zatem: 42 <= g = 50 i g >= 42, to: k = 92, 93, …, 99.
Zatem pierwsza cyfra k jest zawsze równa 9.
Ta cyfra jest tez pierwszą cyfrą i, więc: i = 9?.
4. Warunek e = 9i
—————–
Skoro: i = 90, 91, …, 99, to: e = 810, 819, 828, …, 891.
Pierwsza cyfra e jest więc zawsze równa 8.
Ale pierwsza cyfra e jest ostatnią cyfrą g.
Zatem g kończy się na 8.
Ponieważ 42 <= g d = 576
g = 58 -> d = 696
g = 68 -> d = 816
g = 78 -> d = 936
Pierwsza cyfra d jest pierwszą cyfrą f.
Zatem:
g = 48 -> f zaczyna sie od 5,
g = 58 -> f zaczyna sie od 6,
g = 68 -> f zaczyna sie od 8,
g = 78 -> f zaczyna sie od 9.
Ale k = f+g ma byc dwucyfrowe.
Dla g = 58 i f zaczynającego sie od 6 mamy już:
f+g >= 60+58 = 118,
więc odpada.
Dla g = 68 i g = 78 tym bardziej suma przekracza liczbę dwucyfrową.
Zostaje tylko:
g = 48
d = 576.
6. Wyznaczenie f, c i k
———————–
Skoro:
g = 48,
to:
k = f+48.
k jest dwucyfrowe i zaczyna sie od 9, a f zaczyna sie od 5.
Możliwe sa tylko:
f = 50 albo f = 51.
Wtedy:
f = 50 -> c = 100, k = 98
f = 51 -> c = 102, k = 99
Ale ostatnia cyfra c jest pierwszą cyfrą pionowego b.
Hasło b nie może zaczynać się od zera, więc c = 100 odpada.
Zostaje:
f = 51
c = 102
k = 99
g = 48
d = 576.
7. Wyznaczenie e i i
——————–
Skoro k = 99, to i zaczyna sie od 9, a e kończy sie cyfrą 9.
Z warunku e = 9i oraz ze skrzyżowań mamy: e = 8?9.
Jedyna możliwość:
i = 91
e = 819,
bo: 9 * 91 = 819.
8. Wyznaczenie j i l
——————–
Warunek:j = l/3 czyli: l = 3j.
Z diagramu j zaczyna sie ostatnią cyfrą d. d = 576, więc: j = 6?.
Z kolei l kończy sie ostatnią cyfrą i a i = 91, więc: l kończy się na 1.
Szukamy liczby j = 6?, takiej ze 3j konczy sie na 1.
Pasuje:
j = 67
l = 201,
bo: 3 * 67 = 201.
Pozostałe hasła wynikają już z cyfr na skrzyżowaniach liczb w diagramie.
a = 11
b = 24
h = 72
Najważniejsze :
f = c/2 daje f >= 50,
potem d = 12g i g = k-f zmuszają g do końcówki 8,
a to zostawia tylko g = 48.
Poziomo:
c=102
f=51
g=48
j=67
k=99
l=201
Pionowo:
a=11
b=24
d=576
e=819
h=72
i=91
Można zrezygnować z informacji h) 3b przy zmianie informacji d) 8h na d) 24b
Przy takiej zmianie rozwiązałem dość szybko. Przypuszczam, że bez tej zmiany też
można zrezygnować z h) 3b, ale znając rozwiązanie trudno mi to sprawdzić.
Najpierw poszukałem warunków, które najostrzej (jak mi intuicja podpowiadała) ograniczają typowanie cyfr. W takiej kolejności umieściłem zagnieżdżone pętle i w tej kolejności prowadziłem wyliczenia. Do wpisania wszystkich cyfr niezbędne okazało się tylko 7 równań spośród 10 podanych w warunkach zadania. Aż trzy można było więc pominąć uzyskując jednoznaczne wypełnienie pól krzyżówki. Te zbędne to:
g=k-f
b=g/2
i=b+j
Diagram krzyżówki wykorzystujący pozostałe siedem równań wygląda tak:
102 51 48 7 1 67 99 201 Oszacowanie zbędności równań byłoby trudne bez przejrzenia wszystkich wariantów w pętlach, tam gdzie się one pojawiają. Oczywiście sam kod programu można znacznie skrócić wyrzucając nadmiarowe wyliczenia (i komentarze), które służą jedynie do ilustracji toku myślenia. int A, B, C, D, E, F, G, H, I, J, K, L; for (A = 10; A < 12; A++) // bo K = 9 * A; obie dwucyfrowe { int A0 = A / 10; // pierwsza cyfra A == pierwszej cyfrze C int C0 = A0; K = 9 * A; // warunek zadania K = 9 * A for (int L0 = 1; L0 < 3; L0++) // pierwsza cyfra L; L < 300, bo L = C + K; K dwucyfrowe + pierwsza cyfra A i C = 1 więc C < 200 { for (int H0 = 1; H0 11) // B jest dwucyfrowe i druga cyfra nie może być == 0, bo to pierwsza cyfra G { D = 8 * H; // warunek zadania if (D >= 100) // D to liczba trzycyfrowa { F = 10 * (D / 100) + A % 10; // wyliczenie D z istniejących cyfr: pierwsza z D i ostatnia/druga z A int J0 = D % 10; // wyliczenie ostatniej cyfry D J = J0 * 10 + H0; L = J * 3; // z warunku zadania J = L / 3 if (L / 100 == L0) // czy pierwsza cyfra L0 == wyliczonemu z warunku zadania L { C = L - K; // z warunku zadania L = C + K if (C % 10 == B / 10) { int K0 = K / 10; I = 10 * K0 + L % 10; // z wyliczonych wcześniej cyfr E = 9 * I; if (E % 10 == K % 10) { int G0 = B % 10; G = G0 * 10 + E / 100; // sprawdzić int Ix = B + J; // I=B+J int Gx = 2 * B; // G=2*B int Kx = F + G; // K=F+G } } } } } } } } }Najpierw poszukałem warunków, które najostrzej (jak mi intuicja podpowiadała) ograniczają typowanie cyfr. W takiej kolejności umieściłem zagnieżdżone pętle i w tej kolejności prowadziłem wyliczenia. Do wpisania wszystkich cyfr niezbędne okazało się tylko 7 równań spośród 10 podanych w warunkach zadania. Aż trzy można było więc pominąć uzyskując jednoznaczne wypełnienie pól krzyżówki. Te zbędne to:
g=k-f
b=g/2
i=b+j
Diagram krzyżówki wykorzystujący pozostałe siedem równań wygląda tak:
102
51 48
7 1
67 99
201
Oszacowanie zbędności równań byłoby trudne bez przejrzenia wszystkich wariantów w pętlach, tam gdzie się one pojawiają. Oczywiście sam kod programu można znacznie skrócić wyrzucając nadmiarowe wyliczenia (i komentarze), które służą jedynie do ilustracji toku myślenia.
int A, B, C, D, E, F, G, H, I, J, K, L;
for (A = 10; A < 12; A++) // bo K = 9 * A; obie dwucyfrowe
{
int A0 = A / 10; // pierwsza cyfra A == pierwszej cyfrze C
int C0 = A0;
K = 9 * A; // warunek zadania K = 9 * A
for (int L0 = 1; L0 < 3; L0++) // pierwsza cyfra L; L < 300, bo L = C + K; K dwucyfrowe + pierwsza cyfra A i C = 1 więc C < 200
{
for (int H0 = 1; H0 11) // B jest dwucyfrowe i druga cyfra nie może być == 0, bo to pierwsza cyfra G
{
D = 8 * H; // warunek zadania
if (D >= 100) // D to liczba trzycyfrowa
{
F = 10 * (D / 100) + A % 10; // wyliczenie D z istniejących cyfr: pierwsza z D i ostatnia/druga z A
int J0 = D % 10; // wyliczenie ostatniej cyfry D
J = J0 * 10 + H0;
L = J * 3; // z warunku zadania J = L / 3
if (L / 100 == L0) // czy pierwsza cyfra L0 == wyliczonemu z warunku zadania L
{
C = L – K; // z warunku zadania L = C + K
if (C % 10 == B / 10)
{
int K0 = K / 10;
I = 10 * K0 + L % 10; // z wyliczonych wcześniej cyfr
E = 9 * I;
if (E % 10 == K % 10)
{
int G0 = B % 10;
G = G0 * 10 + E / 100;
// sprawdzić
int Ix = B + J; // I=B+J
int Gx = 2 * B; // G=2*B
int Kx = F + G; // K=F+G
}
}
}
}
}
}
}
}
}
Wysyłam to jeszcze raz, bo podczas publikowania komentarza pojawił się błąd, podobny do tego, który w przeszłości tego komentarza jednak nie wysyłał. Wtedy prawdopodobnie automatyczny cenzor znalazł w wysyłanej treści coś, co było nieodpowiednie – teraz też część kodu programu została wycięta. Czy uda się powtórka?
Trzecia próba uzupełnienia wyciętego tekstu (druga do usunięcia):
for (int H0 = 1; H0 11) // B jest dwucyfrowe i druga cyfra nie może być == 0, bo to pierwsza cyfra GCzy pierwsze cyfry liczb mogą być zerami ? Bo bez tego nie wychodzi mi żadne rozwiązanie
Nie, zera nieznaczące wykluczamy
mp
a 11
b 24
c 102
d 576
e 819
f 51
g 48
h 72
i 91
j 67
k 99
l 201
Wywalić można warunek
h = 3b
Bezdotykowo
Zacząłem od: dwucyfrowa razy dziewięć równa się dwucyfrowa. Skończyłem na najniższym zerze.
Nie skorzystałem z:
g) k-f
j) l/3
i) b+j