powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Задачка про кубики или параллелепипеды :-) FPD
5 сообщений из 5, страница 1 из 1
Задачка про кубики или параллелепипеды :-) FPD
    #33422026
Vladimir_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть задачка: задан Куб или ПП со сторонами A,B,C, где a1<=A<=a2, b1<=B<=b2, c1<=C<=c2.

Если a2=0 OR a2=a1, то a1=A. Аналогично для B, C.

Все возможные значения занесены в таблицу с полями a1,a2,b1,b2,c1,c2.
Вопрос как найти наиболее подходящий размер кубика по заданным сторонам X, Y, Z?
Если X не попадает в интервал [a1,a2], то выбрать ближайший больший интервал.
Аналогично для Y, Z.
Ранжировка в порядке X, Y, Z.
Такая задачка была решена с использованием фильтров (для каждого размера фильтр сужал область поиска), но мне кажется это не лучшее решение (и достаточно долгое). Может есть предложения?

Интересны также решения многомерных случаев, где размерность >=3.
...
Рейтинг: 0 / 0
Задачка про кубики или параллелепипеды :-) FPD
    #33422502
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то в условии задачи недоговорено.

Код: 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.
CREATE CURSOR test (id i, a1 i, a2 i, b1 i, b2 i, c1 i, c2 i)

INSERT INTO test (id, a1 , a2 , b1 , b2 , c1 , c2 ) ;
VALUES ( 1 ,   1 ,  10 ,  2 ,  20 ,  3  ,  30 )

INSERT INTO test (id, a1 , a2 , b1 , b2 , c1 , c2 ) ;
VALUES ( 2 ,  10 ,  100 ,  20 ,  200 ,  30  ,  300 )

INSERT INTO test (id, a1 , a2 , b1 , b2 , c1 , c2 ) ;
VALUES ( 3 ,  10 ,  50 ,  2 ,  20 ,  30  ,  300 )

x =  500  && заведомо нет такого значения
y =  5  && такое значение встречается с ID =  2 , 3 
z =  5  && такое значение встречается с ID =  1 

SELECT * FROM test WHERE (a1 <= x AND x <= a2) INTO CURSOR a1 
IF RECCOUNT('a1') =  0 
	SELECT MAX(a2) FROM test INTO CURSOR a1
ENDIF 

SELECT * FROM test WHERE (b1 <= y AND y <= b2) INTO CURSOR b1
IF RECCOUNT('b1') =  0 
	SELECT MAX(b2) FROM test INTO CURSOR a1
ENDIF 

SELECT * FROM test WHERE (c1 <= z AND z <= c2) INTO CURSOR c1
IF RECCOUNT('c1') =  0 
	SELECT MAX(c2) FROM test INTO CURSOR a1
ENDIF 

при таких условиях подойдет запись с ID = 2, НО добавим ещё одну запись с ID = 4 и попадающую в диапазон переменной z

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
INSERT INTO test (id, a1 , a2 , b1 , b2 , c1 , c2 ) ;
VALUES ( 4 ,  10 ,  50 ,  2 ,  20 ,  3  ,  30 )

x =  500 
y =  5 
z =  5 

SELECT * FROM test WHERE (a1 <= x AND x <= a2) INTO CURSOR a1 
IF RECCOUNT('a1') =  0 
	SELECT MAX(a2) FROM test INTO CURSOR a1
ENDIF 

SELECT * FROM test WHERE (b1 <= y AND y <= b2) INTO CURSOR b1
IF RECCOUNT('b1') =  0 
	SELECT MAX(b2) FROM test INTO CURSOR a1
ENDIF 

SELECT * FROM test WHERE (c1 <= z AND z <= c2) INTO CURSOR c1
IF RECCOUNT('c1') =  0 
	SELECT MAX(c2) FROM test INTO CURSOR a1
ENDIF 

таким образом получим
- по x = 500 - max(a2)
- по y = 5 - записи с ID = 1,2,4
- по z = 5 - записи с ID = 1,4

И какое соответствие спрашивается надо выбирать? - те нет однозначного решения, а есть набор решений.
...
Рейтинг: 0 / 0
Задачка про кубики или параллелепипеды :-) FPD
    #33424249
Vladimir_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistЧто-то в условии задачи недоговорено.

И какое соответствие спрашивается надо выбирать? - те нет однозначного решения, а есть набор решений.

В задаче не договорено о том, что если заданное значение x, y или Z превышает те, что есть в таблице, то нужно брать максимальное из меньших.
В рассмотренном выше случае
x=500 id=2 запись одна, значит это и есть решение
...
Рейтинг: 0 / 0
Задачка про кубики или параллелепипеды :-) FPD
    #33424275
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, ладно - решение сваял или нет, ещё что-то надо ?
...
Рейтинг: 0 / 0
Задачка про кубики или параллелепипеды :-) FPD
    #33424287
Vladimir_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рассмотрим случай
id a1 a2 b1 b2 c1 c2
1 1 0 1 0 1 0
2 1 2 2 3 1 0
3 1 2 3 4 1 2
4 1 2 3 4 2 3
5 1 2 3 4 3 4

x=1.5, y=2.5 z=3.5

фильтруем по x, для x=1.5 подходят id=2,3,4,5

фильтруем предыдущему фильтру + фильтр по y, для y=2.5 подходят id=3,4,5

фильтруем предыдущему фильтру + фильтр по z, для z=3.5 подходят id=5

решение найдено

При x=3, подходит интервал [1,2] то есть id=2,3,4,5
Дальше аналогично

При x=0.5, подходит интервал [1,0], что означает, интервал [1,1] то есть id=1. Одна запись. Решение найдено
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Задачка про кубики или параллелепипеды :-) FPD
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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