Ситуация:
Несколько ( M
) гномов нашли сундук гоблина с N
золотыми монетами и должны их разделить. Из-за древних правил, регулирующих распределение добычи у пиратов в порядке старшинства, самый старый гном должен получить на одну монету больше, чем следующий самый старый гном, и так далее, чтобы у самого молодого гнома было M-1
меньше монет, чем у самого старого гнома. Кроме того, ни один гном не должен вносить какие-либо монеты (т. Е. Никакие отрицательные монеты ни одному гному)
Помогите гномам разделить монеты таким образом или скажите им, что это невозможно.
Код победителя должен всегда отвечать правильно (этот вызов является детерминированным) и следовать общим правилам игры в гольф .
вход
Вам дается целое число N (3 ≤ N ≤ 1000) для количества монет и целое число M (3 ≤ M ≤ N) для количества дварфов, разделенных пробелом.
Выход
Если невозможно разделить монеты так, как этого хотят гномы, выведите -1 (минус одна). В противном случае выведите номера монет, которые получит каждый гном, от самой старой до самой молодой. Разделите числа пробелами.
Образцы :
вход
3 3
выход
2 1 0
вход
9 3
выход
4 3 2
вход
7 3
выход
-1
вход
6 4
выход
3 2 1 0
Ответы:
J -
32292825Некороче, чем другое решение J,нои использует другую идеюОтвет на количество монет, которые получает гном самого высокого ранга, прост
N/M+(M-1)/2
(если это целое число), мы строим отрицание этого-:@-.@]-%
. Затемi:
создает массив2 1 0 _1 _2
для аргумента,_2
и мы берем из него М элементов.источник
i:
. Вы можете сохранить еще три символа, написав%
вместо[%]
и используя-.@]
вместо(1-])
.J - 30 символов
Очень весело в гольф. Многое получилось аккуратно.
Объяснение:
/
- Возьмите разделенные пробелом целые числа в качестве аргумента и вставьте функцию между ними. То есть рассмотрим N левый аргумент функции в скобках(...)
и M правый аргумент.i.&-
- Отрицать (-
), а затем взять целые числа (i.
). Обычно, когда вы делаете что-то подобное,i.5
вы получаете0 1 2 3 4
. Однако, когдаi.
получает отрицательное число, он переворачивает этот список вывода. Так, напримерi._5
, даст4 3 2 1 0
.s=.+/&
- Выполните указанное выше действие для каждого аргумента (&
), а затем создайте таблицу сложений (+/
) из этих массивов. Теперь у нас есть таблица, в которой каждая строка является возможным распределением монет среди дварфов, хотя, возможно, нет, когда есть N монет. Наконец, этот глагол создания таблиц настолько полезен, что мы назовем егоs
и будем использовать позже.+/@s~
- Теперь мыs
снова используем , но поменяем местами (~
) порядок аргументов, чтобы мы транспонировали таблицу. Это простой способ получения суммы каждой строки после создания таблицы (+/@
), связанный с тем, как J суммирует многомерные списки.i.[
- В этом списке сумм мы ищем левый аргумент для глагола, т. Е. N. Если N - элемент, мы получаем этот индекс: иначе мы получаем длину списка, который, в частности, является недопустимым индексом.{ ::_1:
- Теперь мы пытаемся использовать индекс, чтобы вытащить строку из таблицы вs
.{
выдаст ошибку домена, если индекс недействителен, поэтому в этом случае мы ловим ошибку (::
) и возвращаем -1 (_1:
). Это обрабатывает все. Поскольку мы используемi.&-
ранее, распределение монет будет в порядке убывания, как было необходимо.Использование:
источник
9 3
должен вернуться4 3 2
, а не-1
. Кажется, в вашем примере используется транспозиция?9 3
дает4 3 2
и7 3
дает_1
, как и ожидалось.R -
7170676665 символовUngolfed:
Решение:
Если M число карликов, то последовательность платного золота можно разложить на две особые серии. Сначала серия, заканчивающаяся нулем: M-1, ..., 2, 1, 0 и постоянная серия c, c, ..., c. Сумма первой серии всегда M * (M-1) / 2. Таким образом, если остаток (x = N - M * (M-1) / 2) можно разделить без остатка (по модулю, равному 0), каждый карлик получает x / M плюс часть убывающего ряда.
Использование:
источник
m*(m+1)/2
наsum(1:m)
PHP (187)
Это моя первая попытка игры в гольф, и я знаю, что это может быть лучше, но все же :)
Golfed:
Ungolfed:
Выполнить в оболочке
Основная идея:
Монеты могут быть разделены по этим правилам, если одно из них верно:
Если это так, мы берем за основу среднее количество монет на гнома (ACPD). Но мы должны начинать с самого высокого и выходить, пока не достигнем самого низкого. Таким образом, мы делаем цикл со счетчиком, начинающимся с ACPD + счетчик остальных гномов к верхнему концу, и продолжаем, пока не достигнем ACPD - счетчик остальных гномов к нижнему концу.
Это в основном то же самое, если дварфы странные (то есть 5 дварфов - средний - 3, и на обоих концах осталось 2), но не если они четные - именно поэтому мы полагаемся на пол И раунд.
Проблемы на данный момент: Работает со слишком низким количеством монет, что означает, что некоторые гномы будут избиты и лишены своего драгоценного заработка. И это грустно. Или, по крайней мере, если вы любите гномов.
Решение :
Более разумное решение :
Монеты металлические. Заставьте гномов расплавить их всех, а затем бросьте их в меньшем / большем количестве монет, чтобы они были делимы в любом случае.
Самое умное решение :
Укради их гору, переименуй себя в Смауг и сохрани все это для себя. В конце концов, почему вы должны беспокоиться о сварливых гномах?
источник
Питон 3 (100)
Использование той же идеи, что и @Geobits, но в соответствии с требованиями ввода и вывода.
источник
Питон 3 -
1091071031029093Используя ту же идею, что и Evpok, но с рядом улучшений.
Улучшения:
источник
[::-1]
лучше моего решения. +1Питон 3 - 114
Работает, проверяя,
N-(M*(M-1)/2)
делится ли наM
. Новое в python, поэтому любые советы приветствуются.Пример Ideone.com
источник
print
стиль выражения Python 2 ? Или как последняя строка (else:print -1
) не приводит к ошибке?C # - 322
Ужасная оценка, но я выбрал другой подход и начал использовать
goto
:)Я сокращу это позже.
источник
Convert.ToInt16
звонки до простоint.Parse
. Вы можете объявить любую предварительно назначенную переменную с помощьюvar
(вместо, например,int[]
). Ваши параметры командной строки не нужно вызыватьargs
. И вы можете псевдоним часто используемых типов, какusing C = Console
. Я также думаю, что для такого решения лучше представить интервал без изменений, а не сохранять только пару символов. О, и я не совсем уверен, почемуgoto
здесь лучше, чем альтернативы ...Java 210
источник
class A{public static void main(String[]a)
он действителен и экономит 3 символа. После каждогоif
и вокруг каждогоfor
удаляйте пробелы ... и т. Д.R:
777370 символовСоздайте вектор, идущий от (M-1) до 0, и добавляйте 1 к каждому числу, пока сумма не перестанет уступать N. Если она выше, выведите -1, иначе выведите вектор.
С отступом и немного безголовый:
Пример использования:
источник
Юлия, 45
Просто немного алгебры, заняло у меня намного больше времени, чем следовало.
источник
JavaScript - 76
Я мог бы написать это короче на другом языке, но еще не было решения JS, так что вот оно:
Запустите в консоли.
Пример ввода:
Выход:
Входные данные:
Выход:
Входные данные:
Выход: -1
Жаль, что console.log так долго пишется :) К сожалению, объявление
l=console.log.bind(console)
не делает его короче и простоl=console.log
не работает.Входные данные:
Выход:
источник
c=console
иc.log()
сократить его.Golfscript, 35
Как это работает
В следующем примере ввод
9 3
.источник
Delphi XE3 (176)
Как это работает.
Читает 2 целых числа, монеты и гномы.
Вычитает разницу на карлика.
Если оставшийся мод гномов> 0, это невозможно.
Иначе получить равную долю за дварфа в цикле дварфов-1 до 0 и печатает dwarfIndex + равную долю
Ungolfed
источник
Mathematica 65
Функция,
g
генерирует все увеличивающиеся на единицу последовательности длиной m от 0 до n и проверяет, суммирует ли любая из них m. В случае успеха последовательность возвращается; в противном случае возвращается -1.Последовательности сделаны
Partition
включения списка {0,1,2,3… m} во все возможные подсписки из n смежных целых чисел.Есть, конечно, более эффективные способы достижения того же эффекта, но те, которые я нашел, требуют больше кода.
Примеры
источник
С 131
Ungolfed
Это компилируется с предупреждением, потому что main не имеет типа. Если это не действует в правилах игры в гольф, мне нужно добавить пять символов.
источник
Кобра - 198
Сайт Кобры
Разъяснение:
Требуется для запуска кода
Принимает ввод и сохраняет его как
a
иb
Инициализирует список вывода
l
и инициализирует общее количество денегt
и количество монет, которые нужно добавить в каждую стопку гномов.n
Находит минимально возможную ценность денег, в результате чего у всех дварфов будет допустимое количество монет в их стопке
Определяет, сколько монет добавить в каждую стопку, чтобы общая требуемая сумма была> = к общей сумме доступных денег.
Заполняет список кучами денег разных размеров
Выходы либо
-1
или вl
зависимости является ли общие требуемыми деньги равны общей доступной ценаисточник
Perl 5 , 78 + 1 (-n) = 79 байт
Попробуйте онлайн!
источник
Питон (
1009694):Хороший, зачетный ответ.Не больше, но теперь оно короче.Ungolfed:
Выход:
источник