https://coderun.yandex.ru/problem/triangles/description Сложная

Условие

Петя достаточно давно занимается в математическом кружке, поэтому он уже успел изучить не только правила выполнения простейших операций, но и такое достаточно сложное понятие как симметрия. Для того, чтобы получше изучить симметрию, Петя решил начать с наиболее простых геометрических фигур – треугольников. Он скоро понял, что осевой симметрией обладают так называемые равнобедренные треугольники. Поэтому теперь Петя ищет везде такие треугольники.

Напомним, что треугольник называется равнобедренным, если его площадь положительна, и у него есть хотя бы две равные стороны.

Недавно Петя, зайдя в класс, увидел, что на доске нарисовано n точек. Разумеется, он сразу задумался, сколько существует троек из этих точек, которые являются вершинами равнобедренных треугольников.

Требуется написать программу, решающую указанную задачу.

Примеры

Ввод: 3 0 0 2 2 -2 2 Вывод: 1

Ввод: 4 0 0 1 1 1 0 0 1 Вывод: 4

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlin.math.pow

fun triangles(points: List<Pair<Int, Int>>): Int {
    var count = 0
    
    points.forEach { point1 ->
        val map = mutableMapOf<Double, MutableList<Pair<Int, Int>>>()
        
        points.forEach { point2 ->
            val distance = (point1.first - point2.first).toDouble().pow(2) +
                    (point1.second - point2.second).toDouble().pow(2)
            
            // Проверяем, есть ли уже точки с таким же расстоянием
            if (map.containsKey(distance)) {
                map[distance]!!.forEach { point3 ->
                    // Проверяем, не лежат ли три точки на одной прямой
                    if ((point3.second - point1.second) * (point2.first - point1.first) !=
                        (point3.first - point1.first) * (point2.second - point1.second)
                    ) {
                        count++
                    }
                }
                map[distance]!!.add(point2)
            } else {
                map[distance] = mutableListOf(point2)
            }
        }
    }
    return count
}

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val count = reader.readLine().trim().toInt()
    val points = List(count) {
        reader.readLine()
            .trim()
            .split(" ")
            .map { it.toInt() }
            .let { Pair(it[0], it[1]) }
    }

    val res = triangles(points)
    writer.write(res.toString())
    writer.newLine()
    
    reader.close()
    writer.close()
}