Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пятничная задачка - про привидения / 5 сообщений из 5, страница 1 из 1
26.08.2016, 01:30:22
    #39298287
DelphiUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка - про привидения
Привет всем!
Как-то на работе, коллега Федя рассказал про нововведения в 11-й версии Оракла.
Надо было на чем-то опробовать, вот вспомнил про задачу, которую и вам предлагаю решить, если конечно она не покажется слишком легкой или неинтересной.

Требуется написать SQL запрос, решающий следующую задачу.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
В небольшом шотландском городке стояла школа, в которой учились ровно 1000 школьников. 
У каждого из них был шкаф для одежды – всего 1000 шкафов, причём шкафы были пронумерованы числами о 1 до 1000. 
А ещё в этой школе жили привидения – ровно 1000 привидений. Каждый школьник, уходя из школы, запирал свой шкаф,
а ночью привидения начинали играть со шкафами, то отпирая, то запирая их. Однажды вечером школьники, как обычно, 
оставили запертыми все шкафы. Ровно в полночь появились привидения. Сначала первое привидение открыло все шкафы;
 потом второе привидение закрыло те шкафы, номер которых делился на 2; затем третье привидение поменяло позиции 
(то есть открыло шкаф, если он был закрыт, и закрыло – если он был открыт) тех шкафов, номер которых делился на 3;
 следом за ним четвёртое привидение поменяло позиции тех шкафов, номер которых делился на 4 и т.д. Как только 
тысячное привидение поменяло позицию тысячного шкафа, пропел петух, и все привидения срочно убрались восвояси.

 Не скажете ли вы, сколько осталось открытых шкафов после посещения привидений?



P.S.
Побеждает тот, кто напишет самый короткий (по количеству символов) запрос, который выведет номера открытых шкафов.
...
Рейтинг: 0 / 0
26.08.2016, 03:16:34
    #39298291
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка - про привидения
Очевидные варианты:

Код: plsql
1.
2.
3.
with t as (select level n from dual connect by level <=1000)
select t.n from t, t g where mod(t.n,g.n)=0 group by t.n
having mod(count(*),2)=1



Код: plsql
1.
2.
3.
select n from(select * from dual model dimension by(1 n)measures(0 s)
rules iterate(1000)(s[for n from 1 to 1000 increment 1]=nvl(s[cv()],0)+1-sign(mod(cv(n),iteration_number+1)))
)where mod(s,2)=1 
...
Рейтинг: 0 / 0
26.08.2016, 03:26:23
    #39298292
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка - про привидения
А вот решение без "нововведений в 11-й версии Оракла", зато реально короткое :)
Код: plsql
1.
select level*level n from dual connect by level*level <=1000
...
Рейтинг: 0 / 0
26.08.2016, 08:13:56
    #39298345
DelphiUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка - про привидения
andrey_anonymous,
Хорошо, особенно последний вариант - совсем короткий :)
...
Рейтинг: 0 / 0
26.08.2016, 08:30:42
    #39298348
DelphiUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка - про привидения
andrey_anonymous,
Твое решение правильное, короткое, в-общем, зачет!
У меня решение, так сказать "в лоб", без математического анализа, с с открытием-закрытием дверей каждым привидением :)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пятничная задачка - про привидения / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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