Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32

Поиск ромба с наибольшей площадью

09.12.2014, 03:17. Показов 816. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В разделе С++ очередная простая задачка, как раз для трех строчек на Haskell
Дано множество точек на плоскости в виде списка пар их целочисленных координат. Нужно найти среди них ромбы и вычислить площадь наибольшего, ответ в виде пары - список целочисленных координат вершин ромба и его нецелочисленная площадь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.12.2014, 03:17
Ответы с готовыми решениями:

Поиск ромба с наибольшей площадью
Дано множество точек на плоскости в виде: x: 0 5 3 3 ... y: 1 1 0 2 ... Нужно найти среди них ромбы и вычислить площадь наибольшего,...

Найти треугольник с наибольшей площадью
Задана таблица из N чисел. Сколько треугольников можно составить из этих чисел? Найти треугольник с наибольшей площадью.

Напечатать координаты треугольника с наибольшей площадью
Даны координаты вершин 2 треугольников. Напечатать координаты треугольника с наибольшей площадью и эту площадь

4
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
09.12.2014, 03:40
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import Data.List((\\), maximumBy)
import Data.Function(on)
 
task points = maximumBy (compare `on` snd) [
  ([a,b,c,d], s [a,b,c,d])
  | a <- points,
    b <- points \\ [a],
    c <- points \\ [a,b],
    d <- points \\ [a,b,c],
    let ds = zipWith dist2 [a,b,c,d] [b,c,d,a] in init ds == tail ds
  ]
 
dist2 (x1,y1) (x2,y2) = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)
s [a,b,c,d] = sqrt (fromInteger $ dist2 a c * dist2 b d) / 2
2
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
09.12.2014, 05:23  [ТС]
Если я не ошибся в своих предположениях, что упорядоченный по вершинам ромб имеет только один вариант трактовки диагоналей, то как-то вот так:
Haskell
1
2
3
4
5
6
7
8
9
10
import Data.List (nub, sort)
 
r :: [(Int, Int)] -> (Double, [(Int, Int)])
r = maximum.map (\l->(s l,l)).filter isRomb.p4.sort.nub where
    p4 l = [[a,b,c,d]| a<-l, b<-l, c<-l, d<-l, a<b, b<c, c<d]
    isRomb [a,b,c,d] = all (==r2 (a,b)).map r2 $ [(a,c),(b,d),(c,d)]
    s [a,b,c,d] = (fromIntegral $ r2 (a,d) * r2 (b,c))**0.5/2
    r2 ((x,y), (x',y')) = (x-x')^2 + (y-y')^2
 
main = print $ r [(0,5),(0,-5),(-12,0),(12,0),(5,7),(-3,0),(3,0)]
1
Модератор
 Аватар для Curry
5158 / 3486 / 536
Регистрация: 01.06.2013
Сообщений: 7,562
Записей в блоге: 9
09.12.2014, 13:30
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import Data.List(maximumBy)
import Data.Function(on)
import Control.Monad (guard)
 
 
maxRomb points = maximumBy (compare `on` snd) $ do
    a@(ax,ay) <-points    -- Перебираем по паре точек из списка
    b@(bx,by) <- points
    guard $ a /= b        -- ...  это должна быть не одна точка
    let lab = (bx-ax)^2+(by-ay)^2 -- квадрат расстояния между точками
    c@(cx,cy) <- points   -- выбираем третью точку
    guard $ c /= b -- не равную предыдущей
    let xac = cx-ax  
    let yac = cy-ay
    let lac = xac^2+yac^2  
    guard $ lab == lac -- но с тем же расстоянием до a
    d@(dx,dy) <- points
    guard $ d == (bx+xac,by+yac) -- координаты последней точки ромба известны. Находим, есть ли точка в списке
    let lad = (dx-ax)^2 + (dy-ay)^2  -- диагонали
    let lbc = (cx-bx)^2 + (cy-by)^2  -- для расчёта площади 
    return ((a,b,c,d), sqrt (fromInteger $ lad * lbc) / 2)
 
main = print $ maxRomb [(0,5),(0,-5),(-12,0),(12,0),(5,7),(-3,0),(3,0)]
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
09.12.2014, 20:10
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- Проверка очередной тройки: образуют ли равнобедренный треугольник
-- и есть ли "замыкающая" вершина ромба
-- Возвращает площадь ромба или -1
 
chk3 :: [(Int,Int)] -> (Int,Int,Int) -> Int
chk3 p (i,j,k) | ((x2-x1)^2+(y2-y1)^2 == (x3-x1)^2+(y3-y1)^2) && (x4,y4) `elem` p = abs $ (x1-x3)*(y2-y3)-(x2-x3)*(y1-y3)
               | otherwise = -1
                 where [x1,x2,x3]=map fst $ map (p!!) [i,j,k]
                       [y1,y2,y3]=map snd $ map (p!!) [i,j,k]
                       x4=x1+x2+x3
                       y4=y1+y2+y3
 
-- Поиск максимума
        
task :: [(Int,Int)] -> Int
task p = maximum $ map (chk3 p) [(i,j,k) | i<-[0..n], j<-[i+1..n], k<-[j+1..n]]
         where n=(length p)-1 
 
Main> task [(0,5),(0,-5),(-12,0),(12,0),(5,7),(-3,0),(3,0)]
120
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.12.2014, 20:10
Помогаю со студенческими работами здесь

напечатать номер треугольника с наибольшей площадью
задано n треугольников координатами своих вершин на плоскости. напечатать номер треугольника с наибольшей площадью. вычисление сторон и...

Найти треугольник с наибольшей (наименьшей) площадью
Заданы площади равнобедренных треугольников, найти треугольник с наибольшей (наименьшей) площадью и вывести во сколько раз сторона большего...

Найти треугольники с наибольшей и наименьшей площадью
Элементы массива X=(X1,X2,...,Xn) представляет собой дляни отрезков Определить, можно ли из отрезков (1,2,3),(2,3,4),(3,4,5,), построить...

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

Рекурсия: найти номер треугольника с наибольшей площадью
1. Задано N Треугольников координатами своих вершин на плоскости. Напечатать номер треугольника с наибольшей площадью. Вычесление сторон и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru