Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Интересная задачка для проверки программиста СУБД / 23 сообщений из 23, страница 1 из 1
20.09.2007, 14:53
    #34814722
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
В ветке по SQL вычитал.
Тест дали при приеме на работу (для фоксистов тоже подойдет):
Kochegra"Имеется набор чисел:
2, 3, 4, 5, 6, 8, 25, 37, 50, 58, 70, 150, 370, 500, 760, 900
Необходимо распределить эти числа на 4 группы по 4 числа и расставить арифметические знаки так, чтобы внутри групп было верно равенство:
A<знак>B = C <знак>D, где <знак> - *, /, +, -

Решение желательно представить в виде SQL – скрипта."

Зацепило Порешал на фоксовом SQL с небольшими добавками чисто фокса для ускорения. Получилось.
Кому интересно в форуме по SQL третий день решают уже все по полочкам разложили.
...
Рейтинг: 0 / 0
20.09.2007, 15:57
    #34815014
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
Уже отписался в том топике:
смысл в том, что остается всего три проверки, а все чет такие многоярусные ямбы пишут )
...
Рейтинг: 0 / 0
21.09.2007, 09:03
    #34816509
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
Dima TВ ветке по SQL вычитал.
Тест дали при приеме на работу (для фоксистов тоже подойдет):
Kochegra"Имеется набор чисел:
2, 3, 4, 5, 6, 8, 25, 37, 50, 58, 70, 150, 370, 500, 760, 900
Необходимо распределить эти числа на 4 группы по 4 числа и расставить арифметические знаки так, чтобы внутри групп было верно равенство:
A<знак>B = C <знак>D, где <знак> - *, /, +, -

Решение желательно представить в виде SQL – скрипта."

Зацепило Порешал на фоксовом SQL с небольшими добавками чисто фокса для ускорения. Получилось.
Кому интересно в форуме по SQL третий день решают уже все по полочкам разложили.
1. Получил полное пересечение верных равенств - 646 верных равенств.
2. Выкинул к черту равенства, содержащие один и тот же набор цифр (а то выборки долго ходят) - 86 равенств.
3. Получил непересекающиеся наборы из четырех равенств без учета перестановок - 72 набора.
4. Выкинул к черту наборы, содержащие перестановки из равенств - 3 решения.

Итого существует 3 набора, без учета значных перестановок (выкинутых в пункте 2). Доказать не могу, но кажись всего 3 набора должно быть.
...
Рейтинг: 0 / 0
21.09.2007, 09:49
    #34816636
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
У меня получилось 646 равенств
...
Рейтинг: 0 / 0
21.09.2007, 10:08
    #34816705
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
Мое решение:
Код: plaintext
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.
CREATE CURSOR c_Znach (znach c( 3 ))
INSERT INTO c_znach (znach) VALUES  ('2')
INSERT INTO c_znach (znach) VALUES  ('3')
INSERT INTO c_znach (znach) VALUES  ('4')
INSERT INTO c_znach (znach) VALUES  ('5')
INSERT INTO c_znach (znach) VALUES  ('6')
INSERT INTO c_znach (znach) VALUES  ('8')
INSERT INTO c_znach (znach) VALUES  ('25')
INSERT INTO c_znach (znach) VALUES  ('37')
INSERT INTO c_znach (znach) VALUES  ('50')
INSERT INTO c_znach (znach) VALUES  ('58')
INSERT INTO c_znach (znach) VALUES  ('70')
INSERT INTO c_znach (znach) VALUES  ('150')
INSERT INTO c_znach (znach) VALUES  ('370')
INSERT INTO c_znach (znach) VALUES  ('500')
INSERT INTO c_znach (znach) VALUES  ('760')
INSERT INTO c_znach (znach) VALUES  ('900')

CREATE CURSOR c_Znak (znak c( 1 , 0 ))
INSERT INTO c_Znak (znak) VALUES ('+') 
INSERT INTO c_Znak (znak) VALUES ('-')
INSERT INTO c_Znak (znak) VALUES ('*')
INSERT INTO c_Znak (znak) VALUES ('/')

SELECT c1.znach+cc1.znak+c2.znach+'='+c3.znach+cc2.znak+c4.znach result ;
from c_znach c1, c_znach c2, c_znach c3, c_znach c4, ;
c_znak cc1, c_znak cc2 ;
where c1.znach not in ( c2.znach, c3.znach, c4.znach) AND  ;
c2.znach not in ( c1.znach, c3.znach, c4.znach) AND  ;
c3.znach not in ( c1.znach, c2.znach, c4.znach) AND  ;
c4.znach not in ( c1.znach, c2.znach, c3.znach)  AND ;
EVALUATE(c1.znach+cc1.znak+c2.znach) = EVALUATE(c3.znach+cc2.znak+c4.znach)
...
Рейтинг: 0 / 0
21.09.2007, 13:56
    #34817783
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
GoshaSУ меня получилось 646 равенств
646 равенств. Это часть задачи: Получить размещение 16 чисел по 4 местам и 4 знаков по 2 местам, чтобы соблюдались условия задачи.
А задача на самом деле глубже. Нужно получить набор из четырех равенств, то есть размещение 16 чисел по 16 местам и 4 знаков по 8 местам, по условиям задачи. В лоб одним селектом это не решается, так как количество вычислений = 16! * 8! / 4! = 35150287011840000 перестановок для проверки условия.
Поэтому для начала находятся все возможные равенства: 16! / 12! + 4! / 2! = 524160 из них выбираются только верные. Остается 646 равенств. После того, как я отбросил равенства, содержащие одинаковые знаки на одинаковых местах и одинаковый набор цифр, их остается 181.
Затем из 181 равенства нужно собрать наборы по 4 равенства, чтобы все цифры и знаки были разные. Таких наборов 64. Если ставить условие, чтобы все цифры были разные, а на знаки пофигу, то таких наборов - 3.
...
Рейтинг: 0 / 0
21.09.2007, 13:59
    #34817797
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
[quot Kruchinin Pahan]16! / 12! + 4! / 2! = 524160[quot]
Туплю: 16! / 12! * 4! / 2! = 524160
...
Рейтинг: 0 / 0
21.09.2007, 14:59
    #34818135
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
181 -о выражение и одним запросом можно сделать, не сильно его модифицировав. Однако убрать еще повторяющиеся циферы, это уже сложней, надо голову включать :)
...
Рейтинг: 0 / 0
21.09.2007, 15:39
    #34818283
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
Чет не то делаю :)
в итоге только одно уровнение осталось
...
Рейтинг: 0 / 0
21.09.2007, 18:10
    #34818752
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
Ура, сделал, уложился в 130 строк кода, две ХР, для красивости и уменьшения кода.
результат 42 варианта.
...
Рейтинг: 0 / 0
21.09.2007, 18:43
    #34818848
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
В общем получилось вот так:
Конечно не совсем красиво, но все же
Код: plaintext
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.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
CREATE CURSOR c_Znach (znach n( 3 , 0 ))
INSERT INTO c_znach (znach) VALUES  ( 2 )
INSERT INTO c_znach (znach) VALUES  ( 3 )
INSERT INTO c_znach (znach) VALUES  ( 4 )
INSERT INTO c_znach (znach) VALUES  ( 5 )
INSERT INTO c_znach (znach) VALUES  ( 6 )
INSERT INTO c_znach (znach) VALUES  ( 8 )
INSERT INTO c_znach (znach) VALUES  ( 25 )
INSERT INTO c_znach (znach) VALUES  ( 37 )
INSERT INTO c_znach (znach) VALUES  ( 50 )
INSERT INTO c_znach (znach) VALUES  ( 58 )
INSERT INTO c_znach (znach) VALUES  ( 70 )
INSERT INTO c_znach (znach) VALUES  ( 150 )
INSERT INTO c_znach (znach) VALUES  ( 370 )
INSERT INTO c_znach (znach) VALUES  ( 500 )
INSERT INTO c_znach (znach) VALUES  ( 760 )
INSERT INTO c_znach (znach) VALUES  ( 900 )

CREATE CURSOR c_Znak (znak c( 1 ))
INSERT INTO c_Znak (znak) VALUES ('+') 
INSERT INTO c_Znak (znak) VALUES ('-')
INSERT INTO c_Znak (znak) VALUES ('*')
INSERT INTO c_Znak (znak) VALUES ('/')

SELECT distinct ;
pMySort0(c1.znach, c2.znach, c3.znach, c4.znach, cc1.znak, cc2.znak,   1 ) as a, ;
pMySort0(c1.znach, c2.znach, c3.znach, c4.znach, cc1.znak, cc2.znak, - 1 ) as z1, ;
pMySort0(c1.znach, c2.znach, c3.znach, c4.znach, cc1.znak, cc2.znak,   2 ) as b,	;
pMySort0(c1.znach, c2.znach, c3.znach, c4.znach, cc1.znak, cc2.znak,   3 ) as c, ;
pMySort0(c1.znach, c2.znach, c3.znach, c4.znach, cc1.znak, cc2.znak, - 2 ) as z2, ;
pMySort0(c1.znach, c2.znach, c3.znach, c4.znach, cc1.znak, cc2.znak,   4 ) as d, ;
 000000  as id_res, ;
STR(pMySort0(c1.znach, c2.znach, c3.znach, c4.znach, cc1.znak, cc2.znak,   1 ), 3 , 0 )+;
pMySort0(c1.znach, c2.znach, c3.znach, c4.znach, cc1.znak, cc2.znak, - 1 )+;
STR(pMySort0(c1.znach, c2.znach, c3.znach, c4.znach, cc1.znak, cc2.znak,   2 ), 3 , 0 )+'='+;
STR(pMySort0(c1.znach, c2.znach, c3.znach, c4.znach, cc1.znak, cc2.znak,   3 ), 3 , 0 )+;
pMySort0(c1.znach, c2.znach, c3.znach, c4.znach, cc1.znak, cc2.znak, - 2 ) +;
STR(pMySort0(c1.znach, c2.znach, c3.znach, c4.znach, cc1.znak, cc2.znak,   4 ), 3 , 0 ) as formula;
from c_znach c1, c_znach c2, c_znach c3, c_znach c4, ;
c_znak cc1, c_znak cc2 ;
where c1.znach not in ( c2.znach, c3.znach, c4.znach) AND  ;
c2.znach not in ( c1.znach, c3.znach, c4.znach) AND  ;
c3.znach not in ( c1.znach, c2.znach, c4.znach) AND  ;
c4.znach not in ( c1.znach, c2.znach, c3.znach) AND ;
EVALUATE(STR(c1.znach, 3 , 0 )+cc1.znak+STR(c2.znach, 3 , 0 )) = EVALUATE(STR(c3.znach, 3 , 0 )+cc2.znak+STR(c4.znach, 3 , 0 )) ;
INTO CURSOR c_res READWRITE  
*Все формулы без повторений  181  шт.
UPDATE c_res SET id_res=RECNO()
*проставляем id формул
SELECT distinct ;
pMySort1(c1.id_res, c2.id_res,  c3.id_res, c4.id_res, 1 ) id_a, ;
pMySort1(c1.id_res, c2.id_res,  c3.id_res, c4.id_res, 2 ) id_b, ;
pMySort1(c1.id_res, c2.id_res,  c3.id_res, c4.id_res, 3 ) id_c, ;
pMySort1(c1.id_res, c2.id_res,  c3.id_res, c4.id_res, 4 )  id_d;
from c_res c1, c_res c2, c_res c3, c_res c4 ;
WHERE ;
c1.a not in (c2.a,c3.a,c4.a,c2.b,c3.b,c4.b,c2.c,c3.c,c4.c,c2.d,c3.d,c4.d) AND ;
c1.b not in (c2.a,c3.a,c4.a,c2.b,c3.b,c4.b,c2.c,c3.c,c4.c,c2.d,c3.d,c4.d) AND ;
c1.c not in (c2.a,c3.a,c4.a,c2.b,c3.b,c4.b,c2.c,c3.c,c4.c,c2.d,c3.d,c4.d) AND ;
c1.d not in (c2.a,c3.a,c4.a,c2.b,c3.b,c4.b,c2.c,c3.c,c4.c,c2.d,c3.d,c4.d) AND ;
c2.a not in (c3.a,c4.a,c3.b,c4.b,c3.c,c4.c,c3.d,c4.d) AND ;
c2.b not in (c3.a,c4.a,c3.b,c4.b,c3.c,c4.c,c3.d,c4.d) AND ;
c2.c not in (c3.a,c4.a,c3.b,c4.b,c3.c,c4.c,c3.d,c4.d) AND ;
c2.d not in (c3.a,c4.a,c3.b,c4.b,c3.c,c4.c,c3.d,c4.d) AND ;
c3.a not in (c4.a,c4.b,c4.c,c4.d) AND ;
c3.b not in (c4.a,c4.b,c4.c,c4.d) AND ;
c3.c not in (c4.a,c4.b,c4.c,c4.d) AND ;
c3.d not in (c4.a,c4.b,c4.c,c4.d) INTO CURSOR c_for
*Группировка по  4 -е группы без повторений цифр. Имеем йдишники формул, формулы находятся в c_res. 
SELECT c1.formula, c2.formula,c3.formula,c4.formula ;
FROM c_for c0 ;
INNER JOIN c_res c1 ;
ON c0.id_a=c1.id_res ;
INNER JOIN c_res c2 ;
ON c0.id_b=c2.id_res ;
INNER JOIN c_res c3 ;
ON c0.id_c=c3.id_res ;
INNER JOIN c_res c4 ;
ON c0.id_d=c4.id_res 
*Результат - вывод формул
**************
*процедурки
PROCEDURE pMySort0
LPARAMETERS l1,l2, l3, l4, z1, z2, v
	IF  z1='+' OR z1='*'
		l11=MIN(l1,l2)
		l21=MAX(l1,l2)
	ELSE 
		l11=l1
		l21=l2	
	ENDIF 
	IF  z2='+' OR z2='*'
		l31=MIN(l3,l4)
		l41=MAX(l3,l4)
	ELSE 
		l31=l3
		l41=l4	
	ENDIF 
	IF l11<=l31
		z11=z1
		z21=z2
		l1=l11
		l2=l21
		l3=l31
		l4=l41
	ELSE 
		z11=z2
		z21=z1
		l1=l31
		l2=l41
		l3=l11
		l4=l21	
	ENDIF 
	DO CASE 
		CASE v=- 2 
			RETURN z21		
		CASE v=- 1 
			RETURN z11
		CASE v= 1 
			RETURN l1
		CASE v= 2 
			RETURN l2
		CASE v= 3 
			RETURN l3
		CASE v= 4 
			RETURN l4
	ENDCASE 	
ENDPROC
**********
PROCEDURE pMySort1
LPARAMETERS l1,l2,l3,l4,v
DIMENSION a_tMP( 4 )
a_tmp( 1 )=l1
a_tmp( 2 )=l2
a_tmp( 3 )=l3
a_tmp( 4 )=l4
ASORT(a_tmp)
	DO CASE 
		CASE v= 1 
			RETURN a_tmp( 1 )
		CASE v= 2 
			RETURN a_tmp( 2 )
		CASE v= 3 
			RETURN a_tmp( 3 )
		CASE v= 4 
			RETURN a_tmp( 4 )
	ENDCASE 		
ENDPROC 

...
Рейтинг: 0 / 0
22.09.2007, 09:20
    #34819280
Декоратор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
И это тест при приеме на работу ?
Интересно какая имбицильская фирма так трахает мозг кандидатам.
Сразу же видно было, что задача не привиальная.
...
Рейтинг: 0 / 0
22.09.2007, 14:31
    #34819454
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
ДекораторИ это тест при приеме на работу ?
Интересно какая имбицильская фирма так трахает мозг кандидатам.
Сразу же видно было, что задача не привиальная.
А как трахают мозг имбицильские кандитаты? которых берут на работу со слов "это знаю, это умею и даже это могу", потом выясняется что знает, умеет и может, но процентов на 20 от обозначенного в резюме. В итоге расстаются в течении испытательного срока - время потеряно, ЗП потрачена.

Для поиска хорошего разработчика вполне нормальная задачка для теста. Не требует специфичных знаний, код решения не большой, по коду видно как человек мыслит и пишет.
...
Рейтинг: 0 / 0
22.09.2007, 14:47
    #34819462
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
Kruchinin Pahan1. Получил полное пересечение верных равенств - 646 верных равенств.
2. Выкинул к черту равенства, содержащие один и тот же набор цифр (а то выборки долго ходят) - 86 равенств.
3. Получил непересекающиеся наборы из четырех равенств без учета перестановок - 72 набора.
4. Выкинул к черту наборы, содержащие перестановки из равенств - 3 решения.

Итого существует 3 набора, без учета значных перестановок (выкинутых в пункте 2). Доказать не могу, но кажись всего 3 набора должно быть.
У меня 36 получилось. Изначально выкинул разный порядок уравнений и дубли A+B => B+A, A*B => B*A
остались дубли типа A+B=С+D => С+D=A+B

Про 3 набора тоже доказывать не стал, но думаю делать надо так:
1. По каждому результату упорядочить по возрастанию внутри каждого уравнения: "150*2=370-70" => {2,70,150,370}
2. упорядочить наборы по возрастанию первого элемента
3. select distinct ...

Например:
150*2=370-70 25*4=500/5 37+58=760/8 3*50=900/6
1. {2,70,150,370} {4, 5, 25, 500} {8, 37, 58, 760} {3, 6, 50, 900}
2. {2,70,150,370} {3, 6, 50, 900} {4, 5, 25, 500} {8, 37, 58, 760}
...
Рейтинг: 0 / 0
22.09.2007, 15:32
    #34819490
Интересная задачка для проверки программиста СУБД
10 лет работал фокс-программистом..
теперь с ораклом пришлось подружиться..
в команде правда не работал - писал приложения сам под заказ...
проблем не было никогда...

а тут такая задача - нунах..... не решу, и хвастаться не буду... не решу и все...
даже не вижу применения такому......
че я имбицил по вашему что ли?
...
Рейтинг: 0 / 0
22.09.2007, 15:56
    #34819502
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
ну его нафиг...а тут такая задача - нунах..... не решу, и хвастаться не буду... не решу и все...
даже не вижу применения такому......
че я имбицил по вашему что ли? Раз сознался что не решишь, то - нет
Представь себя на месте работодателя: есть вакансия разработчика с серьезными требованиями и соответственно с зп выше среднего, то почему бы не потестить кандидатов? если с точки зрения кандидата зп тоже выше среднего, то он будет решать. Никто же из студентов не возмущается что вступительные экзамены сдавать надо.

Сам один раз в такую ситуацию попадал. Пришел на собеседование в одну контору занимающуюся разработкой софта. Думал как везде за жизнь погоняю - где работал, что наработал. А они как начали с ходу грузить типа: "вот кусок кода - в чем подвох?" и т.д. до похожей задачи дело не дошло. Не взяли туда меня. Я правда даже рад этому сегодня :)

PS задача не такая уж и сложная, я пару часов потратил.
...
Рейтинг: 0 / 0
22.09.2007, 19:00
    #34819592
Интересная задачка для проверки программиста СУБД
Dima T
Сам один раз в такую ситуацию попадал. Пришел на собеседование в одну контору занимающуюся разработкой софта. Думал как везде за жизнь погоняю - где работал, что наработал. А они как начали с ходу грузить типа: "вот кусок кода - в чем подвох?" и т.д. до похожей задачи дело не дошло. Не взяли туда меня. Я правда даже рад этому сегодня :)

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

а ну если на слабо да дома.. дак может тоже решу за несколько часов.. надеюсь.
но на собеседовании даже бы и не пытался влоб решить задачу, которую, признаюсь раньше даже никогда не видел.
Вот такой я честный млин
...
Рейтинг: 0 / 0
23.09.2007, 01:55
    #34819744
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
GoshaSУра, сделал, уложился в 130 строк кода, две ХР, для красивости и уменьшения кода.
результат 42 варианта.
А не выбросил ли ты лишнего? У меня получилось 197 вариантов

Код: plaintext
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.
* Если числа не прижимать к правому краю, то при сравнении на "больше" или "меньше"
* необходимо будет их явно переводить в числа по VAL()
CREATE CURSOR c_Znach (znach c( 3 ))
INSERT INTO c_znach (znach) VALUES  ('  2')
INSERT INTO c_znach (znach) VALUES  ('  3')
INSERT INTO c_znach (znach) VALUES  ('  4')
INSERT INTO c_znach (znach) VALUES  ('  5')
INSERT INTO c_znach (znach) VALUES  ('  6')
INSERT INTO c_znach (znach) VALUES  ('  8')
INSERT INTO c_znach (znach) VALUES  (' 25')
INSERT INTO c_znach (znach) VALUES  (' 37')
INSERT INTO c_znach (znach) VALUES  (' 50')
INSERT INTO c_znach (znach) VALUES  (' 58')
INSERT INTO c_znach (znach) VALUES  (' 70')
INSERT INTO c_znach (znach) VALUES  ('150')
INSERT INTO c_znach (znach) VALUES  ('370')
INSERT INTO c_znach (znach) VALUES  ('500')
INSERT INTO c_znach (znach) VALUES  ('760')
INSERT INTO c_znach (znach) VALUES  ('900')

CREATE CURSOR c_Znak (znak c( 1 ))
INSERT INTO c_Znak (znak) VALUES ('+') 
INSERT INTO c_Znak (znak) VALUES ('-')
INSERT INTO c_Znak (znak) VALUES ('*')
INSERT INTO c_Znak (znak) VALUES ('/')

SELECT DISTINCT ;
	c1.znach,cc1.znak,c2.znach,'=' as eqive, c3.znach, cc2.znak, c4.znach ;
FROM c_znach c1, c_znach c2, c_znach c3, c_znach c4, ;
	c_znak cc1, c_znak cc2 ;
WHERE c1.znach not in (c2.znach, c3.znach, c4.znach) AND  ;
	c2.znach not in (c3.znach, c4.znach) AND  ;
	c3.znach not in (c4.znach) AND  ;
	c1.znach < c3.znach and ;
	iif(cc1.znak in ("+","*"), c1.znach<c2.znach, .T.) and ;
	iif(cc2.znak in ("+","*"), c3.znach<c4.znach, .T.) and ;
	EVALUATE(c1.znach+cc1.znak+c2.znach) = EVALUATE(c3.znach+cc2.znak+c4.znach) ;
ORDER BY  1 , 3 , 5 , 7 

На вскидку, никаких дублей и повторов не видно...

От перемены мест слагаемых не меняется только результат суммирования и умножения. Поэтому в таких выражениях оставляю только те, где первое слагаемое меньше второго.

От дублей по разные стороны равенства "спасаюсь" явным указанием, что первое число первого равенства должно быть меньше первого числа второго равенства. В этом случае выражения просто не могут "поменяться местами"

Ну, и DISTINCT отсекает явные повторы.
...
Рейтинг: 0 / 0
23.09.2007, 02:52
    #34819752
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
Теперь, разбиваем все полученные комбинации на четверки. Несколько грубовато, но быстро.

Код: plaintext
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.
select distinct ;
	a.znach_a+a.znak_a+a.znach_b+'='+a.znach_c+a.znak_b+a.znach_d, ;
	b.znach_a+b.znak_a+b.znach_b+'='+b.znach_c+b.znak_b+b.znach_d, ;
	c.znach_a+c.znak_a+c.znach_b+'='+c.znach_c+c.znak_b+c.znach_d, ;
	d.znach_a+d.znak_a+d.znach_b+'='+d.znach_c+d.znak_b+d.znach_d, ;
	a.znak_a+a.znak_b+" | "+b.znak_a+b.znak_b + " | " +c.znak_a+c.znak_b+" | "+d.znak_a+d.znak_b ;
from query a, query b, query c, query d ;
into cursor cur4 nofilter ;
where a.znach_a not in (b.znach_a,b.znach_b,b.znach_c,b.znach_d,c.znach_a,c.znach_b,c.znach_c,c.znach_d,d.znach_a,d.znach_b,d.znach_c,d.znach_d) and ;
	a.znach_b not in (b.znach_a,b.znach_b,b.znach_c,b.znach_d,c.znach_a,c.znach_b,c.znach_c,c.znach_d,d.znach_a,d.znach_b,d.znach_c,d.znach_d) and ;
	a.znach_c not in (b.znach_a,b.znach_b,b.znach_c,b.znach_d,c.znach_a,c.znach_b,c.znach_c,c.znach_d,d.znach_a,d.znach_b,d.znach_c,d.znach_d) and ;
	a.znach_d not in (b.znach_a,b.znach_b,b.znach_c,b.znach_d,c.znach_a,c.znach_b,c.znach_c,c.znach_d,d.znach_a,d.znach_b,d.znach_c,d.znach_d) and ;
	b.znach_a not in (c.znach_a,c.znach_b,c.znach_c,c.znach_d,d.znach_a,d.znach_b,d.znach_c,d.znach_d) and ;
	b.znach_b not in (c.znach_a,c.znach_b,c.znach_c,c.znach_d,d.znach_a,d.znach_b,d.znach_c,d.znach_d) and ;
	b.znach_c not in (c.znach_a,c.znach_b,c.znach_c,c.znach_d,d.znach_a,d.znach_b,d.znach_c,d.znach_d) and ;
	b.znach_d not in (c.znach_a,c.znach_b,c.znach_c,c.znach_d,d.znach_a,d.znach_b,d.znach_c,d.znach_d) and ;
	c.znach_a not in (d.znach_a,d.znach_b,d.znach_c,d.znach_d) and ;
	c.znach_b not in (d.znach_a,d.znach_b,d.znach_c,d.znach_d) and ;
	c.znach_c not in (d.znach_a,d.znach_b,d.znach_c,d.znach_d) and ;
	c.znach_d not in (d.znach_a,d.znach_b,d.znach_c,d.znach_d) and ;
	a.znach_a < b.znach_a and ;
	a.znach_a < c.znach_a and ;
	a.znach_a < d.znach_a and ;
	b.znach_a < c.znach_a and ;
	b.znach_a < d.znach_a and ;
	c.znach_a < d.znach_a ;
order by  5 
BROWSE LAST

Получилось 141 уникальная комбинация. Последнее поле - это для наглядного сравнения знаков. Я не понял условие про знаки. Имелось в виду, что в каждой четверке пара знаков одинаковая? Так этого не получается.

Насчет 3 вариантов, тоже не сходится. Вроде бы, дублей в 141 комбинации не наблюдается...
...
Рейтинг: 0 / 0
23.09.2007, 09:35
    #34819783
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
ВладимирМ...
Получилось 141 уникальная комбинация. Последнее поле - это для наглядного сравнения знаков. Я не понял условие про знаки. Имелось в виду, что в каждой четверке пара знаков одинаковая? Так этого не получается.

Насчет 3 вариантов, тоже не сходится. Вроде бы, дублей в 141 комбинации не наблюдается...
На счет доказательства 3-х вариантов наборов я выше писал. Надо знаки выкинуть и упорядочить наборы чисел.
В условии достаточно найти одно решение, поэтому в задаче не уточняется что считать повторами:
1. Перестановка уравнений местами
2. Перестановка чисел в части уравнения (A+B => B+A, A*B => B*A)
3. Перестановка частей уравнения местами (A+B=С+D => С+D=A+B)
4. Перестановка по законам арифметики (A+B=С+D => A-D=С-B, A*B=С/D => A*D=С/B и т.д.)

Я при решении сразу учел п.1 и 2 получилось 36 вариантов. Если ввести правило что повтор - это одинаковое разбиение чисел на четверки, то варианта ответа три:
Код: plaintext
1.
2.
{{ 2 , 3 , 150 , 900 },{ 4 , 5 , 25 , 500 },{ 6 , 50 , 70 , 370 },{ 8 , 37 , 58 , 760 }}
{{ 2 , 6 , 50 , 150 },{ 3 , 70 , 370 , 900 },{ 4 , 5 , 25 , 500 },{ 8 , 37 , 58 , 760 }}
{{ 2 , 70 , 150 , 370 },{ 3 , 6 , 50 , 900 },{ 4 , 5 , 25 , 500 },{ 8 , 37 , 58 , 760 }}

Функция сортировки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
func SortAll
lpara tn11, tn21, tn31, tn41, tn12, tn22, tn32, tn42, tn13, tn23, tn33, tn43, tn14, tn24, tn34, tn44
return padr(Sort4(Sort4(tn11, tn21, tn31, tn41), Sort4(tn12, tn22, tn32, tn42), Sort4(tn13, tn23, tn33, tn43), Sort4(tn14, tn24, tn34, tn44)),  100 )

Func Sort4
lpara tu1, tu2, tu3, tu4
local i, lcRet
local array laU[ 4 ]
laU[ 1 ] = tu1
laU[ 2 ] = tu2
laU[ 3 ] = tu3
laU[ 4 ] = tu4
asort(laU)
lcRet = ''
for i =  1  to  4 
	do case
		case vartype(laU[i]) = 'N'
			lcRet = lcRet + ',' + alltrim(str(laU[i]))
		case vartype(laU[i]) = 'C'
			lcRet = lcRet + ',' + alltrim(laU[i])
	endcase
endfor
return '{' + substr(lcRet,  2 ) + '}'
...
Рейтинг: 0 / 0
23.09.2007, 10:56
    #34819813
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
ВладимирМВроде бы, дублей в 141 комбинации не наблюдается...
Да, получается 141 набор формул. Но задача состоит в том чтобы выстроить эти формулы таким образом:
формула1, формула2, формула3, формула4
однако требуется, чтобы в формулах небыло повторяющихся чисел. Т.е. из заданого набора чисел сделать четыре уравнения, в каждом их которых по четыре числа, каждое число в наборе фигурирует один раз.
...
Рейтинг: 0 / 0
23.09.2007, 13:16
    #34819911
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
По итогам решения созрела мысль что надо изначально искать эти три набора. Убил еще два часа

Я в SQL-форуме отписался что задача чисто алгоритмическая. Порешал с циклами и массивами с целью найти все наборы. Получилось 3 штуки. Код прилагается. Код мог бы быть короче, но как оказалось фокс не берет такую конструкцию:
Код: plaintext
1.
for i[ 1 ] =  1  to  16 
...
Пришлось на do while заменить.
Вариант с select`ами работает заметно быстрее 8 и 58 сек. соответственно
Но если бы этот вариант написать на Си с грамотным использованием указателей, то может и быстрее 8 сек. получится.
...
Рейтинг: 0 / 0
24.09.2007, 14:41
    #34821545
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задачка для проверки программиста СУБД
GoshaS ВладимирМВроде бы, дублей в 141 комбинации не наблюдается...
Да, получается 141 набор формул. Но задача состоит в том чтобы выстроить эти формулы таким образом:
формула1, формула2, формула3, формула4
однако требуется, чтобы в формулах небыло повторяющихся чисел. Т.е. из заданого набора чисел сделать четыре уравнения, в каждом их которых по четыре числа, каждое число в наборе фигурирует один раз.
Так повторов и нет. Вы пробовали выполнить приведенный код? Пробегитесь глазами по результату.

Другой вопрос, следует ли при одной и той же комбинации чисел, но при разных комбинациях знаков считать полученные формулы повтором? Ну, например:

2*150 = 6 * 50
2/ 6 = 50/150

Это одна и та же формула или все-таки разные?

Кстати, что-то на разных машинах второй запрос у меня дает разное количество записей. На одной 42, а на другой 141. На обоих VFP9SP1. Надо будет посмотреть, в чем дело.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Интересная задачка для проверки программиста СУБД / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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