powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Загадка Эйнштейна SQL-запросом
24 сообщений из 24, страница 1 из 1
Загадка Эйнштейна SQL-запросом
    #39472171
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачу подсказали в соседней теме. Это т.н. задача (загадка) Эйнштейна, там где 6 категорий по 5 значений в каждой и 15 ограничений на них.
Сходу не получилось, остаётся 592 записи. Может и подход другой надо, идея была оставить только правильные записи.
Мои исходные данные (оракл), но может кто лучше организует
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
With country as
    (select 1 as cnt_id, 'datch' as country  from dual
        union
    select 2 as cnt_id, 'norv' as country from dual
        union
    select 3 as cnt_id, 'sweed' as country from dual
        union
    select 4 as cnt_id, 'brit' as country from dual
        union
    select 5 as cnt_id, 'germ' as country from dual
    ),

    animal as
    (select 1 as an_id, 'fish' as animal  from dual
        union
    select 2 as an_id, 'dog' as animal from dual
        union
    select 3 as an_id, 'cat' as animal from dual
        union
    select 4 as an_id, 'bird' as animal from dual
        union
    select 5 as an_id, 'horse' as animal from dual
    ),

    cigar as
    (select 1 as ci_id, 'dunhi' as cigar  from dual
        union
    select 2 as ci_id, 'marlbo' as cigar from dual
        union
    select 3 as ci_id, 'rothma' as cigar from dual
        union
    select 4 as ci_id, 'PalMal' as cigar from dual
        union
    select 5 as ci_id, 'PhilMor' as cigar from dual
    ),

    color as
    (select 1 as col_id, 'yel' as color  from dual
        union
    select 2 as col_id, 'red' as color from dual
        union
    select 3 as col_id, 'blue' as color from dual
        union
    select 4 as col_id, 'gree' as color from dual
        union
    select 5 as col_id, 'whit' as color from dual
    ),

    address as
    (select 1 as ad_id, '1' as address  from dual
        union
    select 2 as ad_id, '2' as address from dual
        union
    select 3 as ad_id, '3' as address from dual
        union
    select 4 as ad_id, '4' as address from dual
        union
    select 5 as ad_id, '5' as address from dual
    ),

    drink as
    (select 1 as dr_id, 'tea' as drink  from dual
        union
    select 2 as dr_id, 'milk' as drink from dual
        union
    select 3 as dr_id, 'water' as drink from dual
        union
    select 4 as dr_id, 'beer' as drink from dual
        union
    select 5 as dr_id, 'cafe' as drink from dual
    ),

    mixx as  -- Декартово произведение
    (select *
    from country cnt, animal an, cigar ci, color col , address ad, drink dr ) -- count=15625

select  count( m.country) from mixx m ;


Условия задачи Из вики
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    На одной улице подряд стоят пять домов, каждый — своего цвета. 
В каждом живёт человек, все пять — разных национальностей. 
Каждый человек предпочитает уникальную марку сигарет, напиток и домашнее животное. 
Кроме того:

 1        Норвежец живёт в первом доме.
 2        Англичанин живёт в красном доме.
 3        Зелёный дом находится слева от белого, рядом с ним.
 4        Датчанин пьёт чай.
 5        Тот, кто курит Marlboro, живёт рядом с тем, кто выращивает кошек.
 6        Тот, кто живёт в жёлтом доме, курит Dunhill.
 7        Немец курит Rothmans.
 8        Тот, кто живёт в центре, пьёт молоко.
 9        Сосед того, кто курит Marlboro, пьёт воду.
10        Тот, кто курит Pall Mall, выращивает птиц.
11        Швед выращивает собак.
12        Норвежец живёт рядом с синим домом.
13        Тот, кто выращивает лошадей, живёт в синем доме.
14        Тот, кто курит Phillip Morris, пьет пиво.
15        В зелёном доме пьют кофе.

    Вопрос:

        Кто разводит рыбок?


Модератор: Добавил условия
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472208
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО в декартово произведение надо добавить условия которые по строке проверяются
например "Датчанин имеет кота", "Норвежец курит данхил"
Код: sql
1.
mixx as ... where (country = 'datch' or animal != 'cat') and (country = 'norv' and cigar != 'dunhi') ...


дальше проверять условия на соседство "немец справа от собаки"
Код: sql
1.
select A.* from mixx A join mixx B on (A.country = 'germ' and B.animal = 'dog' and A.address > B.address) or (...)
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472214
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не-не-не, я эти выборки потом делаю. У меня пока затык в закономерностях типа "значения не совпадают" ну и в других неявных.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472217
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сомневаюсь. У тебя address строка, как ты на соседство сравниваешь? Поле числовое должно быть.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472219
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98У меня пока затык в закономерностях типа "значения не совпадают" ну и в других неявных.
Пример дай как в условии написано.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472242
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то я использую по типу
to_number( '2') +- 1 == по-соседству,
хотя позднее ввёл ИДшники.
А номера друг с дргуом прекрасно и строками сравниваются.

Пример ?
Ну там типа "каждый живёт отдельно, цвета у всех разные, все курят разное и т.п." - это спрашивал, или полностью мой текст вместе с ограничениями?
А неявные, например, НОрвежец живёт в '1', при этом по-соседству с синим домом.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472258
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98А неявные, например, НОрвежец живёт в '1', при этом по-соседству с синим домом.
Такого нет в обычной постановке. Это два условия и проверять отдельно: на первом шаге "Норвежец живёт в '1'" на втором "Норвежец живёт по-соседству с синим домом"
exp98Ну там типа "каждый живёт отдельно, цвета у всех разные, все курят разное и т.п." - это спрашивал, или полностью мой текст вместе с ограничениями?
Похоже я это упустил. Надо еще как-то проверить что повторов нет. Надо подумать. Это будет третий шаг.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472262
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, это 2-е и 12-е условие. Путём умозаключения, т.е. неявно, и приводят к полезному выводу.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472266
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T Похоже я это упустил. Надо еще как-то проверить что повторов нет Вот и я тоже упустил. Возможно, что сам подход нужно менять.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472278
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98Dima T Похоже я это упустил. Надо еще как-то проверить что повторов нет Вот и я тоже упустил. Возможно, что сам подход нужно менять.
Похоже среди твоих 592 есть 5 с правильным ответом. Т.е. надо как-то из 592 проверить все комбинации по 5, а это 7.15*10 13 комбинаций. Многовато чтобы тупо перемешивать :(
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472317
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неа, ровно 1 правильная сидит, фильтрацией проверял. Просто лишних ещё дофига.
Я, когда сам решал, сляпал подсобный граф, надеясь, что там будут наглядные подсказки, а потом заполнял матрицу.
Граф на рисунке. Из наглядного, сразу видно, что а3 не м.б. зелёным => это а4 => a5== белый
На этом вся наглядность закончилась.

Вот такого типа рассуждений мне в запросах не хватает.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472355
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98Неа, ровно 1 правильная сидит, фильтрацией проверял. Просто лишних ещё дофига.
Я к тому что 592 это ведь по одному дому на запись, т.е. конечный ответ это какие-то 5 из 592. Т.е. ответ один, но из 5 записей.

Задачка не SQL-ная, поэтому в SQL плохо вписывается.

ИМХО как вариант: пронумеровать записи и выбирать в отдельную таблицу потенциально правильные комбинации, сначала по одному признаку, затем по второму и т.д.
в итоге будет таблица Comb
d1d2d3d4d5123453681012
т.е. каждая комбинация имеет уникальность по одному признаку, например в домах живут разные люди или во всех домах разные животные.

затем из нее
Код: sql
1.
select d1,d2,d3,d4,d5 from Comb group by d1,d2,d3,d4,d5 having count(*) = 5


теоретически должна получиться одна запись с ответом.

Непонятно каков будет размер Comb. Думаю значительно меньше всех возможных комбинаций 5 из 592.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472391
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой способ некрасиво масштабируется на 10 категорий.
Пока есть только смутная мысль ввести доп. поле - "правильная запись/допустимая/возможная", поможет, нет ли - не знаю.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472509
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал свои первые два шага 20566600 (правда немного не так надо условия писать). У меня 74 получилось, а не 592. Посмотри есть там правильные?
Итогоaddrcountryanimalcigarcolordrink1norvbirdPalMalwhitcafe1norvbirdPalMalwhitwater1norvcatdunhiyelcafe1norvcatdunhiyelwater1norvcatmarlbowhitcafe1norvcatmarlbowhitwater1norvcatPhilMorgreebeer1norvfishdunhiyelcafe1norvfishdunhiyelwater1norvfishmarlbowhitcafe1norvfishmarlbowhitwater1norvfishPhilMorgreebeer1norvhorsemarlbobluecafe1norvhorsemarlbobluewater2britbirdPalMalredwater2britcatmarlboredcafe2britcatmarlboredwater2britfishmarlboredcafe2britfishmarlboredwater2datchbirdPalMalwhittea2datchcatdunhiyeltea2datchcatmarlbowhittea2datchfishmarlbowhittea2datchhorsemarlbobluetea2germcatrothmawhitcafe2germcatrothmawhitwater2germfishrothmawhitcafe2germfishrothmawhitwater2germhorserothmabluecafe2germhorserothmabluewater2sweeddogdunhiyelwater2sweeddogmarlbowhitcafe2sweeddogmarlbowhitwater2sweeddogPhilMorgreebeer3britcatmarlboredmilk3britfishmarlboredmilk3germcatrothmawhitmilk3germfishrothmawhitmilk3sweeddogmarlbowhitmilk4britbirdPalMalredwater4britcatmarlboredcafe4britcatmarlboredwater4britfishmarlboredcafe4britfishmarlboredwater4datchcatdunhiyeltea4datchcatmarlbowhittea4datchfishmarlbowhittea4datchhorsemarlbobluetea4germcatrothmawhitcafe4germcatrothmawhitwater4germfishrothmawhitwater4germhorserothmabluewater4sweeddogdunhiyelwater4sweeddogmarlbowhitcafe4sweeddogmarlbowhitwater4sweeddogPhilMorgreebeer5britbirdPalMalredwater5britcatmarlboredcafe5britcatmarlboredwater5britfishmarlboredcafe5britfishmarlboredwater5datchbirdPalMalwhittea5datchcatdunhiyeltea5datchcatmarlbowhittea5datchfishmarlbowhittea5datchhorsemarlbobluetea5germcatrothmawhitcafe5germcatrothmawhitwater5germfishrothmawhitcafe5germfishrothmawhitwater5germhorserothmabluewater5sweeddogdunhiyelwater5sweeddogmarlbowhitcafe5sweeddogmarlbowhitwater

Если верно, то 5 из 74 вполне можно перебором, это всего 2 млрд. комбинаций
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472572
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В твоей версии не увидел.
Я брал отсюда
petruchek_info / problems / einstein-puzzle_html
Для моей версии условий ответ:
Код: html
1.
german	fish	marlbor	green	4	cafe

Там даже само условие 7 гласит Немец курит Marlbo, что видно даже на моём графе. Странно, что никого больше не заинтересовало. Ну а мне опять немного поработать надо.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472670
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98Странно, что никого больше не заинтересовало.
Действительно странно что никто не хочет лопатить инет выискивая какую из 100500 вариаций этой задачи ты решаешь.

Мне второй вариант в вики показался похожим (по набору атрибутов), я его в твой первый пост добавил, потом понял что твой граф не совсем совпадает с ней, а как исправить понятия не имею. Давай свое ТЗ, свои условия.

В принципе неважно, можно решать по ТЗ из вики, т.к. я уже сам решил ее в экселе, только у меня вместо marlbo - rothma. Остальное также как у тебя.

PS В SQL мое решение неправильное получилось, буду думать дальше.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472795
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Незаконченное решение для MS SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
drop table if exists #country
select 'datch' as country
	into #country
	union select 'norv' as country
	union select 'sweed' as country
	union select 'brit' as country
	union select 'germ' as country

drop table if exists #animal
select 'fish' as animal
	into #animal
	union select 'dog' as animal
	union select 'cat' as animal
	union select 'bird' as animal
	union select 'horse' as animal


drop table if exists #cigar
select 'dunhi' as cigar
	into #cigar
	union select 'marlbo' as cigar
	union select 'rothma' as cigar
	union select 'PalMal' as cigar
	union select 'PhilMor' as cigar

drop table if exists #color
select 'yel' as color
	into #color
	union select 'red' as color
	union select 'blue' as color
	union select 'gree' as color
	union select 'whit' as color

drop table if exists #addr
select 1 as addr
	into #addr
	union select 2 as addr
	union select 3 as addr
	union select 4 as addr
	union select 5 as addr

drop table if exists #drink
select 'tea' as drink
	into #drink
	union select 'milk' as drink
	union select 'water' as drink
	union select 'beer' as drink
	union select 'cafe' as drink

-- Варианты записей удовлетворяющие фильтрам на одну запись 
drop table if exists #step1
select * 
	into #step1
	from #addr, #country, #animal, #cigar, #color, #drink
	where ((country = 'norv' and addr = 1) or (country != 'norv' and addr != 1)) --1 Норвежец живёт в первом доме.
		and ((country = 'brit' and color = 'red') or (color != 'red' and country != 'brit')) --2 Англичанин живёт в красном доме.
		and ((country = 'datch' and drink = 'tea') or (country != 'datch' and drink != 'tea'))--4 Датчанин пьёт чай.
		and ((color = 'yel' and cigar = 'dunhi') or (color != 'yel' and cigar != 'dunhi'))--6 Тот, кто живёт в жёлтом доме, курит Dunhill.
		and ((country = 'germ' and cigar = 'rothma') or (country != 'germ' and cigar != 'rothma'))--7 Немец курит Rothmans.
		and ((addr = 3 and drink = 'milk') or (addr != 3 and drink != 'milk'))--8 Тот, кто живёт в центре, пьёт молоко.
		and ((cigar = 'PalMal' and animal = 'bird') or (cigar != 'PalMal' and animal != 'bird'))--10 Тот, кто курит Pall Mall, выращивает птиц.
		and ((country = 'sweed' and animal = 'dog') or (country != 'sweed' and animal != 'dog'))--11 Швед выращивает собак.
		and ((animal = 'horse' and color = 'blue') or (animal != 'horse' and color != 'blue'))--13 Тот, кто выращивает лошадей, живёт в синем доме.
		and ((cigar = 'PhilMor' and drink = 'beer') or (cigar != 'PhilMor' and drink != 'beer'))--14 Тот, кто курит Phillip Morris, пьет пиво.
		and ((color = 'gree' and drink = 'cafe') or (color != 'gree' and drink != 'cafe'))--15 В зелёном доме пьют кофе.

-- Нумерация
drop table if exists #step2
select ROW_NUMBER() OVER(ORDER BY addr, country, animal, cigar, color, drink ASC) AS line, * 
	into #step2
	from #step1 

-- Результат 80 штук
select * from #step2 order by line

-- Комбинации по 5 с неповторяющимся одним атрибутом (4376064 шт)
drop table if exists #comb
select A.line as l1, B.line as l2, C.line as l3, D.line as l4, E.line as l5
	into #comb
	from #step2 A, #step2 B, #step2 C, #step2 D, #step2 E
	where A.line < B.line and B.line < C.line and C.line < D.line and D.line < E.line
			and A.addr != B.addr and A.addr != C.addr and A.addr != D.addr and A.addr != E.addr
			and B.addr != C.addr and B.addr != D.addr and B.addr != E.addr
			and C.addr != D.addr and C.addr != E.addr
			and D.addr != E.addr
union all select A.line as l1, B.line as l2, C.line as l3, D.line as l4, E.line as l5
	from #step2 A, #step2 B, #step2 C, #step2 D, #step2 E
	where A.line < B.line and B.line < C.line and C.line < D.line and D.line < E.line
			and A.country != B.country and A.country != C.country and A.country != D.country and A.country != E.country
			and B.country != C.country and B.country != D.country and B.country != E.country
			and C.country != D.country and C.country != E.country
			and D.country != E.country
union all select A.line as l1, B.line as l2, C.line as l3, D.line as l4, E.line as l5
	from #step2 A, #step2 B, #step2 C, #step2 D, #step2 E
	where A.line < B.line and B.line < C.line and C.line < D.line and D.line < E.line
			and A.animal != B.animal and A.animal != C.animal and A.animal != D.animal and A.animal != E.animal
			and B.animal != C.animal and B.animal != D.animal and B.animal != E.animal
			and C.animal != D.animal and C.animal != E.animal
			and D.animal != E.animal
union all select A.line as l1, B.line as l2, C.line as l3, D.line as l4, E.line as l5
	from #step2 A, #step2 B, #step2 C, #step2 D, #step2 E
	where A.line < B.line and B.line < C.line and C.line < D.line and D.line < E.line
			and A.cigar != B.cigar and A.cigar != C.cigar and A.cigar != D.cigar and A.cigar != E.cigar
			and B.cigar != C.cigar and B.cigar != D.cigar and B.cigar != E.cigar
			and C.cigar != D.cigar and C.cigar != E.cigar
			and D.cigar != E.cigar
union all select A.line as l1, B.line as l2, C.line as l3, D.line as l4, E.line as l5
	from #step2 A, #step2 B, #step2 C, #step2 D, #step2 E
	where A.line < B.line and B.line < C.line and C.line < D.line and D.line < E.line
			and A.color != B.color and A.color != C.color and A.color != D.color and A.color != E.color
			and B.color != C.color and B.color != D.color and B.color != E.color
			and C.color != D.color and C.color != E.color
			and D.color != E.color
union all select A.line as l1, B.line as l2, C.line as l3, D.line as l4, E.line as l5
	from #step2 A, #step2 B, #step2 C, #step2 D, #step2 E
	where A.line < B.line and B.line < C.line and C.line < D.line and D.line < E.line
			and A.drink != B.drink and A.drink != C.drink and A.drink != D.drink and A.drink != E.drink
			and B.drink != C.drink and B.drink != D.drink and B.drink != E.drink
			and C.drink != D.drink and C.drink != E.drink
			and D.drink != E.drink

-- Комбинации по 5 с неповторяющимися всеми атрибутами (360 штук)
drop table if exists #step3
select l1,l2,l3,l4,l5 
	into #step3
	from #comb group by l1,l2,l3,l4,l5 having count(*) = 6 

select * from #step3 order by l1,l2,l3,l4,l5

-- Тут надо допроверку каждой комбинации на условия:
--3 Зелёный дом находится слева от белого, рядом с ним.
--5 Тот, кто курит Marlboro, живёт рядом с тем, кто выращивает кошек.
--9 Сосед того, кто курит Marlboro, пьёт воду.
--12 Норвежец живёт рядом с синим домом.


Алгоритм такой:
1. Выборка вариантов записей (наполнение одного дома) удовлетворяющих фильтрам на одну запись (80 шт)
2. Выборка комбинаций по 5 из 80 внутри которых каждый атрибут уникален (360 комбинаций)
3. Проверка выполнения условий соседства

п.3 не сделал. Там ничего сложного, но букав надо много написать.

Проверил, правильный ответ присутствует. По времени: 30 сек. считает.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472909
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется у меня ко всему ещё строки размножаются при джойнах, ведь я проверку на уникальность не делал.
Что до варианта условий, то изменить их нетрудно, но я вернусь к задаче когда-нить позднее. Хотелось бы довести выборку до тех единственных 5 строк и может быть обкатать для этого какую-нить методику.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472937
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача на комбинаторику и SQL далеко не лучший инструмент для ее решения.

Как вариант можно таким путем пойти:
Представить каждое условие в виде вариантов полей 5*5, т.е. 25 клеток
Например:
1. Норвежец живёт в первом доме: 1 вариант: (1, Норвежец)
2. Англичанин живёт в красном доме. 5 вариантов: (1,Англичанин,Красный), (2,Англичанин,Красный) ...
3. Зелёный дом находится слева от белого, рядом с ним. 4 варианта: (1,Зеленый;2,Белый),(2,Зеленый;3,Белый) ...

Затем смешать во всех комбинациях по одному варианту из каждого вопроса и проверить заполнение, т.е. если все дома заполнились, то наложений нет.

Но это в SQL тоже не полезет, тут проще алгоритмически, вложенными циклами, а варианты представить в виде биткарты, точнее int32 будет достаточно на один вариант. Наложение битовыми операциями.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39472984
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне не даёт покая мысль представлять ветки графа строками таблицы, после чего да, вычёркивать противречия. Первая попытка дала то, что дала. В общем я на потом всё это.
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39473010
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
баян )
10696829
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39473013
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пост в закрытом форуме ((
суть:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
with ids as (select level id from dual connect by level <= 5),
i as (
select i1.id a, i2.id b, i3.id c, i4.id d, i5.id e
from ids i1, ids i2, ids i3, ids i4, ids i5
where i1.id <> i2.id and i1.id <> i3.id and i1.id <> i4.id and i1.id <> i5.id 
  and i2.id <> i3.id and i2.id <> i4.id and i2.id <> i5.id 
  and i3.id <> i4.id and i3.id <> i5.id 
  and i4.id <> i5.id),

nac as (select a angl, b dat, c sved, d nor, e nemec from i),
color as (select a red, b green, c yellow, d blue, e white from i),
anim as (select a dog, b cat, c kon, d bird, e RIBA from i),
drink as (select a water, b beer, c milk, d cofe, e tea from i),
cigar as (select a Bluemaster, b Dunhill, c Blend, d PM, e Prince from i)

select * from nac, color, anim, drink, cigar
where angl = red and sved = dog
  and dat = tea and green = white - 1
  and green = cofe and PM = bird
  and yellow = Dunhill and milk = 3
  and nor = 1 and abs(Blend-cat) = 1
  and abs(kon - Dunhill) = 1 and beer = Bluemaster
  and nemec = Prince and abs(nor-blue)=1
  and abs(Blend-water)=1;

...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39473159
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот-вот, из реализаций вертелись в тумане рекурсивные запросы, но так в тумане и остались, т.к. без словаря я их не помню.

А почему он в закрытом, просто так сложилось?
...
Рейтинг: 0 / 0
Загадка Эйнштейна SQL-запросом
    #39473475
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде как каноническое. На Прологе. Откуда скопировал - не помню. Лежит у меня локально.
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
einstein :-
    Houses = [_,_,_,_,_],
    nth1(1, Houses, [norwegian,_,_,_,_]),
    member([englishman,_,_,_,red], Houses),
    nextto([_,_,_,_,green], [_,_,_,_,white], Houses),
    member([dane,_,_,tea,_], Houses),
    neighbors([_,_,marlboro,_,_], [_,cat,_,_,_], Houses),
    member([_,_,dunhill,_,yellow], Houses),
    member([german,_,rothmans,_,_], Houses),
    nth1(3, Houses, [_,_,_,milk,_]),
    neighbors([_,_,marlboro,_,_], [_,_,_,water,_], Houses),
    member([_,bird,pallmall,_,_], Houses),
    member([swede,dog,_,_,_], Houses),
    neighbors([norwegian,_,_,_,_], [_,_,_,_,blue], Houses),
    member([_,horse,_,_,blue], Houses),
    member([_,_,winfield,beer,_], Houses),
    member([_,_,_,coffee,green], Houses),
    member([Owner,fish,_,_,_], Houses),

    print('Owner of the fish: '), print(Owner), nl,
    print('Full Solution: '), print(Houses), nl.



Думаю что если воспроизвести продукционную машину в любом ЯП
то мы получим возможность решения этой задачи так-же кратко
и лаконично.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Загадка Эйнштейна SQL-запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]