В прошлом месяце я позаимствовал много книг из библиотеки. Все они были хорошими книгами, наполненными эмоциями и интригами. К сожалению, в некоторые моменты я очень разозлился / расстроился / разочаровался, поэтому порвал несколько страниц.
Теперь библиотека хочет знать, сколько страниц я вырвал за каждую книгу.
Ваша цель - написать программу, которая использует отсортированный список чисел, разделенных запятыми, в качестве входных данных и печатает минимально и максимально возможное количество страниц, которое я мог бы вырвать. Каждая строка представляет книгу, каждое число представляет отсутствующую страницу из книги.
Пример ввода:
7,8,100,101,222,223
2,3,88,89,90,103,177
2,3,6,7,10,11
1
1,2
Пример вывода:
4/5
5/6
3/6
1/1
1/2
4/5
означает, что я мог вырвать 4 или 5 страниц, в зависимости от того, с какой стороны начинается нумерация страниц книги. Можно было бы вырвать страницу 6/7, страницу 8/9, страницу 100/101 и страницу 222/223 (4 страницы). В качестве альтернативы можно было бы вырвать страницу 7/8, страницу 99/100, страницу 101/102, страницу 221/222 и страницу 223/224 (5 страниц).
Помните, что страница книги всегда имеет переднюю и заднюю стороны. Кроме того, нумерация страниц отличается от книги к книге. Некоторые книги имеют четные номера страниц на левой странице; некоторые на правой странице. Все книги читаются слева направо.
Самый короткий код в байтах побеждает. Строгий формат ввода-вывода не требуется. Ваши программы должны быть в состоянии принять одну или несколько книг в качестве входных данных. Повеселись.
4/5
и5/4
)min/max
либо всеmax/min
. (Хотя лично я предпочел бы, чтобы это не было частью спецификации!)programs must be able to take one or more books as input
править? Большинство (если не все) просто обернут код, чтобы проверить одну книгу в цикле или что-то еще. ИМХО, это просто добавляет накладные расходы к ответу практически без выгоды для задачи. На эти вопросы уже получено много ответов, поэтому лучше оставить все как есть, но помните об этом для решения будущих задач.1,3,5,7,9,11,13,15,17,18
- на благо языков, встроенноеsort
метод лексикографических по умолчанию (при условии , требования последовательно отсортировано будет добавлено в спецификацию).Ответы:
05AB1E , 13 байтов
Попробуйте онлайн!
Спасибо Emigna за хедз-ап на изменениях спецификации.
объяснение
источник
Python 2 ,
72566867 байтПопробуйте онлайн!
источник
JavaScript,
104939285807974 байтаБыло бы 57 байтов, если бы не ненужное (на мой взгляд) требование, чтобы каждая пара чисел в выходных данных была последовательно отсортирована, или 47 байтов, если нам нужно было только взять одну книгу в качестве входных данных.
Вход и выход - это массив массивов.
Контрольные примеры
Контрольные примеры разбиты на отдельные книги для лучшей читаемости, а последний случай (который включает в себя крайний
[1,2]
случай) служит иллюстрацией того, что это решение поддерживает несколько входных книг.история
Показать фрагмент кода
источник
[1,3,5,7,9,11,13,15,17,18]
.[0,.5]
вместо того, чтобы использовать,g
когда я заметил ваш комментарий. Не знаю, почему у меня такой ментальный блок с побитовыми операторами! Я надеялся, что сортировка выходных данных не станет обязательным требованием, и что никто не заметит, что я сломалсяsort()
в это время;) Нужно сделать некоторую работу, поэтому скоро вернемся к обновлению.y/2
? В чем причина деления номера страницы пополам для этого алгоритма?Сетчатка 0.8.2 , 60 байт
Попробуйте онлайн! Объяснение:
Преобразуйте номера страниц в одинарные.
Дублируйте список, вставив a
/
.Увеличьте номера страниц в одном экземпляре списка.
Подсчитайте количество страниц, но последовательные четные и нечетные числа считаются только одной страницей.
Сортировать счет в порядке.
Преобразовать счет обратно в десятичную.
источник
,(?=.*/)¶1,
быть что-то вроде,.*/¶1$&
этого?Haskell , 62 байта
Попробуйте онлайн!
источник
Your goal is to write a program, which takes a sorted, comma-delimmited list of numbers as input
)Java (OpenJDK 9) , 163 байта
Попробуйте онлайн!
Пояснения
Примечание: поскольку в этом нет никаких требований, минимальное и максимальное количество страниц не упорядочено.
источник
size
сadd
в Java , чтобы , возможно , сэкономить несколько байт? например,s.add(p/2).size
.APL (Dyalog Unicode) , 37 байт
Попробуйте онлайн!
Это можно сделать менее чем за половину числа байтов, если порядок вывода страниц не имеет значения:
Как?
источник
Perl 5 , 95 + 1 (
-a
) = 96 байтПопробуйте онлайн!
источник
Wolfram Language (Mathematica) , 37 байт
Спасибо @MartinEnder за 8 байтов!
Попробуйте онлайн!
объяснение
В:
{3, 4, 5}
Взять (вход) и (вход + 1).
{{3, 4, 5}, {4, 5, 6}}
Для каждого числа сверху возьмите наибольшее четное число меньше его.
{{2, 4, 4}, {4, 4, 6}}
Для каждого списка сверху разделите список на одинаковые элементы
{{{2}, {4, 4}}, {{4, 4}, {6}}}
и взять длину каждого:
{2, 2}
Сортировать вывод.
источник
SplitBy
:Length@Split@⌊#/2⌋&/@{#,#+1}&
работает. Но тогда еще короче сделать настил перед картойLength@*Split/@⌊{#,#+1}/2⌋&
. И если хотите, вы можете получить тот же счетчик байтов без Юникода:Length@*Split/@{#,#+1}~Floor~2&
Чистый ,
222210204196 байтПопробуйте онлайн!
Требования полной программы абсолютно убивают способность Клин конкурировать.
Для тех, кто обращал внимание на мои ответы в Чистом, вы заметите
import qualified
, что это уродливый хакер, использующий модули, которые не должны использоваться вместе, что необходимо здесь только из-за другого уродливого хака. сGenLib
зависимостьюData.Maybe
вместо вместоStdMaybe
, что является результатом еще одного уродливого хака в библиотеках, переведенных с HaskellData
для получения функциональности до того, как собственные библиотеки Clean будут в равной степени завершены.Принимает ввод через аргументы командной строки.
источник
Perl, 40 байт
Включает
+1
в себяa
Выход не упорядочен.
Предполагает положительные номера страниц (особенно без страницы
0
). Предполагается, что пропущенные страницы упоминаются только один раз. Неважно, заказан вход или нет.Обработка только одной книги за цикл экономит
3
байты для37
:источник