Скрипт Stack Exchange определяет, какие пять комментариев к вопросам или ответам изначально видны на главной странице сайтов по количеству голосов на них; отображаются пять комментариев с наибольшим количеством голосов. Ваша задача - воссоздать это поведение.
Напишите полную программу или функцию, принимающую ввод через STDIN, аргументы командной строки или аргументы функции, и печатает или возвращает первые пять оценок комментариев. Входные данные будут массивом целых чисел, представляющих количество голосов в комментариях к некоторому сообщению. Например, ввод
0, 2, 5, 4, 0, 1, 0
означает, что у первого комментария нет голосов, у второго - два, у третьего - пять, у четвертого - четыре и т. д. Порядок оценок комментариев должен оставаться неизменным в выходных данных.
Если входные данные содержат пять или меньше оценок комментариев, то выходные данные не должны содержать ничего, кроме указанных. Если два или более баллов за комментарий одинаковы, должны отображаться первые баллы. Вы можете предположить, что входной массив будет содержать как минимум один комментарий.
Числа в выходных данных должны быть легко различимы (поэтому 02541 для случая 1 недопустимо). В противном случае нет никаких ограничений на выходной формат; числа могут быть разделены пробелом или новой строкой, или они могут быть в формате списка и т. д.
Тестовые случаи:
[0, 2, 5, 4, 0, 1, 0] -> [0, 2, 5, 4, 1]
[2, 1, 1, 5, 3, 6] -> [2, 1, 5, 3, 6]
[0, 4, 5] -> [0, 4, 5]
[1, 1, 5, 1, 1, 5] -> [1, 1, 5, 1, 5]
[0, 2, 0, 0, 0, 0, 0, 0] -> [0, 2, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 0, 0] -> [0, 0, 0, 0, 1]
[5, 4, 2, 1, 0, 8, 7, 4, 6, 1, 0, 7] -> [5, 8, 7, 6, 7]
[6, 3, 2, 0, 69, 22, 0, 37, 0, 2, 1, 0, 0, 0, 5, 0, 1, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 2] -> [6, 69, 22, 37, 5]
Последний пример был взят из этого вопроса переполнения стека .
Если возможно, укажите в своем сообщении ссылку, по которой ваша заявка может быть размещена в Интернете.
Это код гольф, поэтому выигрывает самый короткий код в байтах. Удачи!
Ответы:
Желе , 6 байт
Попробуйте онлайн! или проверьте все тестовые случаи одновременно .
Как это работает
источник
Python 2, 58 байт
Проверьте это на Ideone .
Как это работает
list.remove
удаляет первое вхождение, если его аргумент из указанного списка. Обращая список x , мы, по сути, достигаем того, что он удаляет последнее вхождение вместо этого.Таким образом, достаточно продолжать удалять комментарий с минимальным количеством голосов, пока не будет получен список не более чем из пяти комментариев. После этого мы снова обращаемся к списку, чтобы восстановить первоначальный порядок.
источник
Pyth, 11 байт
Мы рассчитываем пересечение мультимножества input (
Q
) с пятью самыми большими элементами вQ
(в порядке их появленияQ
), а затем возьмем первые пять из них.Попробуй это здесь .
источник
<5SQ
эквивалентно тому<SQ_5
, что сохраняет 1 байт.b[:-a]
... Я думаю, что в какой-то момент это могло произойти.MATL , 16 байт
При этом используется текущая версия (10.2.1) , которая является более ранней, чем эта проблема.
Попробуйте онлайн!
объяснение
источник
JavaScript,
74 65 6261 байт3 байта от спасибо @ user81655. 1 байт, спасибо @apsillers.
Показать фрагмент кода
источник
Питон 3, 76
Сохранено 9 байтов благодаря Кевину, напомнившему мне, что я могу злоупотреблять, если заявления в списке комп.
Сохранено 5 байт благодаря DSM.
Довольно простое решение прямо сейчас. Возьмите 5 лучших результатов, а затем проанализируйте список, добавив их в результат по мере их нахождения.
Вот мои тестовые случаи, если кто-то хочет их:
источник
05AB1E ,
1211 байтКод:
Объяснение:
Использует кодировку CP-1252.
источник
CJam, 16 байтов
Безымянный блок (функция), который принимает массив и возвращает массив.
Тестирование.
объяснение
источник
Утилиты Bash + GNU, 36
Ввод / вывод форматируется как разделенные новой строкой списки через STDIN / STDOUT.
Попробуйте онлайн.
источник
Python, 68 байт
Пример запуска.
Комок встроенных модулей. Я думаю, что лучший способ объяснить это - пробежаться по примеру.
enumerate
превращает список в пары индекс / значение (техническиenumerate
объект).Сначала пары сортируются по наибольшему значению, сохраняя текущий порядок индекса для связей. Это ставит во главу угла самые высоко оцененные комментарии, сорванные ранее постом. Затем, 5 лучших таких комментариев принимаются.
Поместите пять лучших комментариев обратно в порядок публикации, а затем удалите индексы, сохраняя только баллы.
источник
PowerShell v4,
12097 байтЭкспериментируя вокруг, я нашел альтернативный подход, который добавил в игру некоторые дополнительные байты. Тем не менее, похоже, что это специфично для PowerShell v4 и того, как эта версия обрабатывает сортировку хеш-таблицы - по умолчанию кажется, что в v4, если несколько значений имеют одно и то же значение, он принимает значение с «более низким» ключом, но вы не гарантированы, что в v3 или ранее, даже при использовании упорядоченного ключевого слова в v3. Я не полностью проверял это на PowerShell v5, чтобы сказать, если поведение продолжается.
Эта версия только для v4 принимает входные данные как
$a
, а затем создает новую пустую хеш-таблицу$b
. Мы перебираем все элементы ввода,$a|%{...}
и каждая итерация добавляет пару ключ / значение$b
(делается путем предварительного увеличения вспомогательной переменной$d
в качестве ключа для каждой итерации). Тогда мыsort
$b
на основеValue
, тоselect
на-l
ast5
, затемsort
наName
(то есть ключе) и, наконец, выводим только.Value
s из полученного хэша.Если введено менее 5 элементов, он просто отсортирует по значению, выберет последние пять (то есть все из них), пересортирует по ключу и выведет.
Более старый, 120 байт, работает в более ранних версиях
Тот же алгоритм, что и у Моргана Треппа ответе , что, очевидно, свидетельствует о том, что великие умы думают одинаково. :)
Принимает ввод, проверяет, меньше ли количество элементов или равно 5, и если да, выводит вход и выходит. В противном случае мы создаем ArrayList
$b
(с непомерно длинным[System.Collections.ArrayList]
приведением) из пяти верхних элементов$a
. Затем мы перебираем$a
и для каждого элемента, если он есть,$b
выводим его, а затем удаляем из$b
(и вот почему нам нужно использовать ArrayList, поскольку удаление элементов из массива не поддерживается в PowerShell, поскольку они технически исправлены размер).Требуется v3 или выше для
-in
оператора. Для ответа , который работает в более ранних версиях, обмен$_-in$b
на$b-contains$_
в общей сложности 126 байт .источник
Haskell, 62 байта
Пример использования:
map snd.sort.take 5.sortOn((0-).snd).zip[0..] $ [5, 4, 2, 1, 0, 8, 7, 4, 6, 1, 0, 7]
->[5,8,7,6,7]
.Как это работает: дополнить каждый элемент индексом, отсортировать по убыванию, взять первые 5 элементов, отсортировать по индексу и удалить индекс.
источник
PHP 5,
107102Сохранено 5 байтов благодаря @WashingtonGuedes
Ungolfed
Попытайся.
источник
1 1 5 1 1 5
, ваше представление производит вывод1 5 1 1 5
вместо правильного1 1 5 1 5
.Руби, 82
8789байт$><<eval($*[0]).map.with_index{|x,i|[i,x]}.sort_by{|x|-x[1]}[0,5].sort.map(&:last)
звонить:
ruby test.rb [1,2,2,3,4,5]
исходная отправка - 56 байт, но в некоторых тестах она не выполняется и не поддерживает $ stdin и $ stdout
_.reduce([]){|a,x|a+=_.sort.reverse[0..4]&[x]if !a[4];a}
объяснение
источник
Java 7, 155 байт
Ungolfed & тест-код:
Попробуй это здесь.
Выход:
источник
Юлия, 48 байт
Попробуйте онлайн!
Как это работает
Комментарий c 1 имеет более высокий приоритет, чем комментарий c 2, если выполняется одно из следующих условий:
Это определяет общий порядок комментариев, и задача состоит в том, чтобы найти пять комментариев, которые имеют наивысший приоритет.
Вместо сортировки комментариев по приоритету (что изменило бы их порядок, для каждого комментария c мы подсчитываем комментарии, которые имеют больший или равный приоритет. Мы сохраняем c тогда и только тогда, когда это число равно 5 или меньше.
Чтобы частично отсортировать комментарии по количеству голосов, мы делаем следующее. Пусть x будет вектором столбца, содержащим подсчет голосов. Затем
x'
транспонирует x - тем самым создавая вектор строки - иx.<x'
создает булеву матрицу, которая сравнивает каждый элемент x с каждым элементом x T .Для x = [0, 2, 5, 4, 0, 1, 0] это дает
Суммируя по строкам (через
sum(...,2)
), мы подсчитываем количество комментариев, которые имеют строго больше голосов, чем комментарий по этому индексу.Для примера вектора это дает
Далее мы подсчитываем количество комментариев с равным количеством голосов, опубликованных ранее, чем этот комментарий. Мы достигаем этого следующим образом.
Сначала мы строим таблицу равенства с
x.==x'
, что compraes элементов х с элементами х Т . Для нашего примера вектора это дает:Далее мы используем
cumsum
для расчета кумулятивных сумм каждого столбца матрицы.Диагональ (
diag
) содержит количество комментариев, которые имеют одинаковое количество голосов и происходят не позднее соответствующего комментария.Добавляя два вектора строк, которые мы создали, мы получаем приоритеты ( 1 - самый высокий) комментариев.
Комментарии с приоритетами от 1 до 5 должны отображаться, поэтому мы определяем их индексы с помощью
find(....<6)
и получаем соответствующие комментарииx[...]
.источник
Python 3.5, 68 байт
Не подходит для моего ответа на Python 2 , но только на три байта длиннее его порта на Python 3, и я думаю, что он достаточно отличается, чтобы быть интересным.
Ввод / вывод в форме кортежей. Проверьте это на repl.it .
источник