UniLecs #149_1. Pit-stops

UniLecs #149_1. Pit-stops

UniLecs

Задача: на кольцевом треке расположены N пит-стопов. Если у спорткара случилась поломка или закончилось топливо, то пилот может доехать до ближайшего пит-стопа (можно сдать назад до питстопа, если он находится ближе всех).

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

Входные данные: pitstops[] - массив позиций пит-стопов, Dist - общая дистанция трека.

Вывод: максимально возможное расстояние до ближайшего пит-стопа.

Пример: pitstops = [4.5, 0.5, 2, 1], Общая дистанция трека = 5.

Answer = 1.25

Реализация:

  1. @akolosov364, JS, Rust: 1.1 балла
Наибольшее расстояние до ближайшего питстопа будет наибольшее растояние между двумя питстопами пополам,  т.к. трасса круговая стоит добавить ещё 1 точку, а именно расстояние между первым и последним питстопом и произвести расчет.

https://gist.github.com/KolosovAO/1796cf880f0bb1d78990638b6c22996a

Test JS: https://repl.it/@AlieksieiKoloso/task149

Test Rust: https://repl.it/@AlieksieiKoloso/task149rust


2. @jinxonik, Ruby: (1 + 3*0.5 + 17*0.1) = 4.2 балла

Краткое описание методов:

1. Сортировка, перебор значений с получением разницы (на первой итерации вычисляется разница между последним пит-стопом первого круга и первым второго круга). 1 - прямая сортировка, 1A - обратная сортировка (другое вычисление на 1-й итерации), 1B - прямая сортировка + обратный перебор индексов (downto).
2. Сортировка, добавление первого пит-стопа второго круга в массив (чтобы не вычислять "по ходу", как в методе №1), перебор соседних пар с получением разницы. 2° - each_cons, 2°A - inject, 2°B - обычный цикл.
2¹. Обратная сортировка, корректировка (чтобы первый пит-стоп был на старте), перебор соседних пар с получением разницы. Без добавления доп. элемента в массив. 2¹ - each_cons, 2¹A - inject, 2¹B - обычный цикл.
2². Сортировка, корректировка (чтобы последний пит-стоп был на фишине), перебор с получением разницы. Также без добавления доп. элемента в массив. 2² - each_cons, 2²A - inject, 2²B - обычный цикл.
3. Добавление первого пит-стопа второго круга в массив, перебор всех пар с вычислением разницы между пит-стопами. Без сортировки. 3 - combination, 3A - permutation, 3B - вложенные циклы.
4°. Поэтапное вычитание двух максимальных элементов с последующим их удалением из массива. 4° - вычитание максимальных элементов, 4°A - вычитание минимальных элементов, 4°B - вычитание и максимальных, и минимальных элементов.
4¹. Поэтапное вычитание двух максимальных элементов без удаления их из массива.
4¹ - вычитание максимальных элементов, 4¹A - вычитание минимальных элементов, 4¹B - вычитание и максимальных, и минимальных элементов.

https://gist.github.com/jin-x/44faa9c2c806f3f80018abd083527d46


3. @kirillmotrichkin, Python: 1 балл

Сортируем массив, потом проходим по массиву и ищем самый большой интервал, а потом не забываем про интервал "через старт".

https://gist.github.com/superkiria/a559d8547a13840e475c35f5aaf65f6b

Test: https://repl.it/@superkiria/unilecs149


4. @egormasharskii, С++: 1 балл

Сортируем по координате, а потом обходим все пары последовательных остановок и находим максимальное расстояние. Не забываем поделить его пополам.
@egormasharskii, С++

https://gist.github.com/myegor/826cf00f182b0be09dcedbebb36981f8

Test: http://cpp.sh/4nl2l


5. Антон, Rust, C, С++, C#, Haskell, Go, Python: 1 + 0.5 + 6*0.1 = 2.1 балла

Т. о., чтобы найти глобальный максимум расстояния до ближайшего пит-стопа, нужно выбрать максимальную дистанцию между соседними пит-стопами и взять от неё половину. Немного более внимательного отношения требует последняя позиция, т. к. следующий пит-стоп для неё — первый в списке. 

Rust: https://gist.github.com/AnthonyMikh/80c54a75422d1268d795e10315594ceb

Test Rust: https://gist.github.com/AnthonyMikh/80c54a75422d1268d795e10315594ceb

https://gist.github.com/AnthonyMikh/d92a13887690910aea9d5acd0e7ec51e

Test (C): https://repl.it/repls/DarkPristineEnterprise

Test (C++): https://repl.it/repls/ComposedWeakSpreadsheets

Test (C#): https://repl.it/repls/PeruMountainousFtpclient

Test (Go): https://goplay.space/#_86P_twlOHv

Test (Haskell): https://repl.it/repls/OpulentSilentDehardwarization

Test (Python): https://repl.it/repls/TimelyFuzzyOutcome


6. @voodoo_woodpecker, VBA, JS, Python, R: 1 + 2*0.5 + 3*0.1 = 2.3 балла

Первый метод -- самое простое решение, сортируем список питстопов и идём по нему. Рассчитываем растояния между соседними питстопами и запоминаем максимальное. Возвращаем 1/2 этого расстояния, так как можно двигаться и вперёд и назад.
Второй метод -- вместо сортировки списка создаём список сортированых индексов, то есть позиция i в списке показывает на i по величине элемент массива. Например список [1,3,2] -> индексы сортированного списка [0,2,1]. Далее аналогично проходжим по массиву и вычисляем расстояния, выбирая максимальное.
Третий метод -- без использования сортировки. Вынимаем из списка питстопов минимальный питстоп и рассчитываем расстояние между ним и предыдущим питстопом, запоминаем максимальное.

https://gist.github.com/MikePeleah/b8c68103682347fb807d03c75ba95bb0

Report Page