Отказ от ответственности: хотя я уже некоторое время нахожусь на этом сайте в развлекательных целях, это мой первый вопрос, поэтому прошу прощения за любые мелкие ошибки.
Задний план
Назначая нам домашнее задание, мой учитель очень раздражает и записывает все проблемы, которые мы должны решать индивидуально. Таким образом, мне всегда нужно копировать, какие проблемы мне приходится решать. Я думал, чтобы сделать мою жизнь проще, я пошлю ему программу, которая может сделать список проблем занимать меньше места.
При написании списка номеров страниц или проблем мы используем тире для обозначения диапазона. Например, 19-21
становится 19, 20, 21
. Если между ними есть пробел, используются два диапазона через запятую: 19-21, 27-31
становится 19, 20, 21, 27, 28, 29, 30, 31
.
Прямо сейчас вы, вероятно, думаете: «это кажется довольно тривиальным». На самом деле, на это уже ответили здесь и здесь .
Однако здесь есть одна загвоздка. Если у нас есть диапазон с равными последовательными цифрами, повторяющиеся цифры могут быть опущены. Например: 15, 16, 17
становится 15-7
и 107, 108, 109
становится 107-9
. Для бонуса, если последняя последовательная равная цифра больше на 1 и последняя цифра верхнего предела меньше или равна цифре нижнего, следующее может быть опущено (извините, если это звучит запутанно; возможно, некоторые примеры прояснят это) , 109-113
становится 109-3
, поскольку нижняя последняя цифра подразумевает увеличение на 10-е место.
Вызов
Ваша программа должна принимать список целых чисел через ввод (независимо от того, что является стандартным для вашего языка или функции). Вы можете решить, является ли этот список разделенным запятыми, разделенным пробелами или фактическим списком / массивом.
Выведите кратчайший путь (сначала отсортированный по количеству диапазонов, затем по сумме символов, включенных в диапазоны), чтобы представить этот список с помощью этой записи. Каждый пунктирный диапазон должен находиться на одной и той же строке, но диапазоны могут быть разделены запятыми или символами новой строки (допускаются завершающие символы новой строки или запятые). Эти диапазоны должны быть в порядке.
Поскольку в нашей школе Wi-Fi ужасен , я должен сделать файл как можно меньше, чтобы отправить его ему. Самый короткий код (в байтах) выигрывает.
Бонусы
Мой учитель небрежный, поэтому есть несколько вещей, которые могут ему помочь. Несколько бонусов складываются посредством умножения, например, бонус -10% (х 90%) и бонус -25% (х 75%) = 90% * 75% = х 67,5% (бонус -32,5%).
- Иногда он ставит их в неправильном порядке (он не учитель математики). Получите бонус -20%, если ваша программа может принимать целые числа, которые не отсортированы по возрастанию.
- Наша книга странная, и каждый раздел начинает считать проблемы с -10. Если ваша программа может принимать отрицательные числа, берите -25%.
- Если он принимает бонус младшей последней цифры, увеличивающий 10-е место, например,
25-32
уменьшая до25-2
, возьмите бонус -50%.
Тестовые случаи
In: 1, 2, 3, 4, 5
Out: 1-5
In: 3, 4, 5, 9, 10, 11, 12
Out: 3-5, 9-12
In: 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160
Out: 149-60
In: 1 2 3 4
Out: 1-4
For bonuses:
In: 109, 110, 111, 112, 113
Out: 109-3
In: 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
Out: 19-9
In: -3, -2, -1, 0, 1, 2
Out: -3-2
In: -3, -2, -1
Out: -3--1
Ответ будет принят в субботу, 19 декабря 2015 года.
GLHF!
1-4 9-2
?149 150 151 152 153 154 155 156 157 178 159 160
?19-9
для19,20,...,29
а не19-29
как текст подразумевает. Так что правильно?Ответы:
LabVIEW, 97 * 0,8 * 0,75 * 0,5 = 29,1 Примитивы LabVIEW
это работает путем подсчета вверх, если число удачных элементов равно 1, а затем создается строка из числа и числа - по модулю 10, а некоторые умножения, вызывающие отрицательные значения, являются сукой.
GIF демонстрирует вход
8,9,10,11
и выходы8-1
. Для ввода-5,-4,-3,1,3,4,5
-5--3,1,3-5
выходит.источник
C ++ 11, 451 * 80% * 75% * 50% = 135,3 байта
Сохранено 9 байт благодаря @ kirbyfan64sos.
Сохранено 19 байт благодаря @JosephMalle и @cat.
Сохранено 11 байтов благодаря @ pinkfloydx33.
Это дает право на все бонусы.
Пример теста параметров и результат:
источник
int
вместоunsigned int
? Сохраняет 9 байтов.gcc
дал:a.cpp: In function ‘std::string f(std::vector<int>)’: a.cpp:8:83: error: ‘to_string’ was not declared in this scope
-std=c++11
; > = 5.0 он включен по умолчанию (на самом деле-std=gnu11
, но достаточно близко).Рубин,
120118 * 0,8 * 0,75 * 0,5 = 35,4 байтаПринимает аргументы командной строки в качестве ввода (запятые в порядке); печатает один диапазон в строке на стандартный вывод.
С пробелами / комментариями:
Контрольные примеры
Особенности, не охватываемые тестовыми случаями
Неупорядоченные входные и одноэлементные диапазоны:
Отрицательные диапазоны (нельзя сокращать большее число с помощью этих):
Сокращение произвольного числа цифр (здесь для ввода используется обычное расширение bash):
источник
((n=c.shift-1)>m)
наm<n=c.shift-1
Javascript ES6, 229 * 80% * 75% * 50% = 68,7 байта
Тестовый ввод
Я использую следующие тестовые данные:
Базовый: 229 байт
Эта версия удовлетворяет требованиям вопроса (a) со всеми бонусами (c, d, e), но висит на отдельных страницах. Он также может обрабатывать дубликаты (f). Он обрабатывает негативные страницы до -10 000, которые можно легко увеличить при (большой) потере скорости.
(Вывод выше показывает пробелы вместо фактических новых строк для краткости)
Отдельные страницы: 233 байта
Эта немного более длинная версия дополнительно удовлетворяет (e) и отображает отдельные страницы в виде диапазона с равными нижним и верхним пределами.
источник
GAP , 355 байт * 0,8 * 0,75 * 0,5 = 106,5
Это удовлетворяет всем бонусам. Чтобы все работало хорошо, мне понадобилось почти 100 дополнительных байтов. Эта функция пропускает только первые цифры, если пробел не переполняет один раз. Например,
9 10 11
выходы,9-1
но9 10 11 12 .. 20 21
выходы9-21
.Если бы GAP был немного менее многословным, я мог бы получить это довольно коротко (также мог бы сэкономить много байтов, если бы не следовал точному синтаксису.) Возможно, завтра я попробую сыграть в гольф немного сложнее. Смотрите ниже тестовые случаи.
ungolfed:
Обратите внимание, что в синтаксисе GAP
[a..b]
эквивалентно[a,a+1,...,b]
. Я считаю, что эти тестовые примеры демонстрируют, что эта программа отвечает всем требованиям. Если что-то не так, дайте мне знать.источник
Lua, 322 * 80% * 75% * 50% = 96,6 байт
Наконец-то сделано с 3-мя задачами, с оценками до 100 байт: D
Golfed
Ungolfed
Вы можете протестировать lua онлайн , чтобы увидеть, как она работает в тестовых примерах, скопировать, вставить функцию, а затем следующий код:
источник
Java, 252 * 80% * 75% * 50% = 75,6 байта
Я решил пойти на метод (намного меньше в Java), вот версия для гольфа:
Golfed
И вот читаемая версия:
При тестировании это результаты:
Выход:
Обновить:
Теперь он может обрабатывать и отрицательные числа, добавляя бонус.
источник
p=s=c=0;c--;
наp=s=0;c=-1;
?c=~(p=s=0)
для очков стиля.Japt, 127 байт * 80% * 75% * 50% = 38,1
Ого, это было чертовски сложно включить все бонусы. Возможно, это можно сделать короче.
Попробуйте онлайн!
Как это работает
Объяснение очень грубое; не стесняйтесь задавать любые вопросы, которые могут у вас возникнуть.
источник
R 167 байт х 80% х 75% х 50% -> 50,1
С отступом, с новыми строками:
Тестовые случаи:
Работает на бонус -50%:
Он принимает несортированный ввод:
Он принимает отрицательные числа:
источник
ш, 135 * .8 * .75 * .5 = 40,5
сценарий оболочки
сценарий awk
где
s
- начало текущей последовательности иo
предыдущее входное значение.источник
-31, -30, -29, -28
увеличивается на 10-е место с-3
по-2
и поэтому должно быть сокращено до-31-8
. Я также вижу двусмысленность, которую он создает, но об этом просят.