Распределите число в список значений как можно более равных, чья сумма равна этому числу

15

Вероятно, простой вызов кода-гольфа. Учитывая 2 положительных целых числа mи n, составьте список nзначений, которые являются положительными целыми числами, сумма которых равна числу m. Либо все значения в выходных данных являются одинаковыми, либо разница точно равна 1.

Примеры

Например

  • m=6и n=3станет2, 2, 2
  • m=7и n=3станет 2, 2, 3или 2, 3, 2или 3, 2, 2
  • m=7и n=2станет 3, 4или4, 3
  • m=7и n=1станет7
  • m=7и n=8сгенерирует ошибку, потому что сумма 8 натуральных чисел не может быть 7.
  • m=10и n=4станет 3, 3, 2, 2или любая другая перестановка

правила

  • И вход, и выход только о положительных целых числах.
  • Либо все значения в выходных данных являются одинаковыми, либо разница точно равна 1.
  • Порядок значений в списке не важен.
  • Сумма значений в списке равна m.
  • Когда это не разрешимо, генерируют ошибку или ложное значение (например, в случае m = 7 и n = 8).
  • В результате других правил m=8и n=3будет генерировать любую из перестановок 3, 3, 2(не 2, 2, 4)

Победитель

Это код-гольф, поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.

Кристиан Вестербик
источник
Я предполагаю, что ноль не является положительным?
TheLethalCoder
Это действительно так: en.wikipedia.org/wiki/Integer#Order-theoretic_properties
Кристиан
1
@aras Я не математик, но то, что я прочитал, обычно зависит от контекста. Кто-то говорит, что он без знака, кто-то как положительный, так и отрицательный, кто-то положительный и т. Д.
TheLethalCoder
1
@TheLethalCoder между тем, в Java (и с плавающей точкой в ​​целом), float a = -0f, b = 0f; System.out.println(a == b); System.out.println(a + "," + b);... производит trueи -0.0,0.0. Видите, положительный 0 и отрицательный 0 - это явно два разных числа ... реализация так говорит!
сократовский феникс

Ответы:

2

Gaia , 4 байта

…÷l¦

Для этого есть почти просто встроенный ...

объяснение

…     Get the range [0 .. m-1].
 ÷    Split into n roughly even length chunks. Throws an error if the number of chunks if 
       more than the list's length.
  l¦  Get the length of each chunk.
Бизнес Кот
источник
Я думал, что было также 4-байтовое решение с 05AB1E. Теперь, когда этого нет, мне легче принять решение. Поздравления и спасибо!
Кристиан
5

Mathematica, 33 байта

#>#2&&Last@IntegerPartitions@##1&

вход

[63, 11]

выход

{6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5}

выводит False, когда это не разрешимо

J42161217
источник
5

MATL , 7 байт

:gie!Xs

Когда решения не существует, выводом является массив, содержащий по крайней мере один ноль, что является ложным в MATL.

Попробуйте онлайн!

объяснение

Рассмотрим входы m = 10и n = 4.

:      % Implicitly input m. Push [1 2 ... m]
       % STACK: [1 2 3 4 5 6 7 8 9 10]
g      % Logical: convert nonzeros to 1
       % STACK: [1 1 1 1 1 1 1 1 1 1]
i      % Input n
       % STACK: [1 1 1 1 1 1 1 1 1 1], 4
e      % Reshape into matrix with n rows, padding with zeros
       % STACK: [1 1 1;
                 1 1 1;
                 1 1 0;
                 1 1 0]
!      % Transpose
       % STACK: [1 1 1 1;
                 1 1 1 1;
                 1 1 0 0]
Xs     % Sum of each column. Implicitly display
       % STACK: [3 3 2 2]
Луис Мендо
источник
4

Древесный уголь , 15 байт после применения NDD 1

¿÷NNIEIη÷⁺IθιIη

Попробуйте онлайн!

Ничего не выводится, если нет решения. Ссылка на подробную версию .

1 NDD = Neil-Driven Development.

Мой предыдущий ответ:

Древесный уголь , 32 27 24 20 байт

NμNν¿÷μνIEν⁺÷μν‹ι﹪μν

Попробуйте онлайн!

Ничего не выводится, если нет решения. Ссылка на подробную версию .

Конечно, я не смог бы сыграть в гольф без помощи Нейла.

Чарли
источник
Удаление Castоператора работает по некоторым причинам, но это не идеальный алгоритм ... У меня есть 16-байтовое решение.
Нил
@Neil Challenge принят!
Чарли
Мне нравится предопределенная переменная, но теперь, зная, что она Castработает со списками, я сократил до 11 байт ...
Нил
@Neil И я все еще не могу использовать Map, как на земле это работает ??
Чарли
Mapэто как версия выражения for, вплоть до использования той же переменной цикла. Таким образом, в вашем примере вместо того, чтобы каждый раз выдвигать выражение в список, он Mapавтоматически собирает их и оценивает список результатов.
Нил
3

R , 33 байта

function(m,n)diff(trunc(0:n*m/n))

Порт Луиса Мендо, октавский ответ . Довольно грустно, что это почти на 50% короче, чем мой предыдущий ответ.

Попробуйте онлайн!

предыдущий ответ, 63 байта:

function(m,n,o=rep(m%/%n,n),d=m-sum(o))o+c(rep(0,n-d),rep(1,d))

Анонимная функция , которая принимает два (обязательные) аргументов mи n, и два необязательных те , которые для целей игр в гольф. Возвращает вектор в порядке возрастания. В случае неудачи первое значение будет 0равно Falsey в R, посколькуif используется только первое значение вектора (с предупреждением).

По сути это эквивалентно следующей функции:

function(m,n){o=rep(m%/%n,n)
d=m-sum(o)
o+c(rep(0,n-d),rep(1,d))}

Попробуйте онлайн!

Giuseppe
источник
pryr::f(diff(trunc(0:n*m/n)))работает и короче!
JAD
2

Желе , 7 6 байт

:ȧœsL€

Попробуйте онлайн!Ничего не выводит для фальши.

Как это устроено

:ȧœsL€    Main link. Arguments: m (integer), n (integer)
:         Integer division. Yields 0 if m < n; a positive integer otherwise.
 ȧ        Logical AND. Yields 0 if m < n; m otherwise.
  œs      Split into n roughly equal groups. Since the left argument is an integer,
          this implicitly converts it to [1..m] (or [] for 0) before splitting.
    L€    Length of €ach. If the inputs were 7 and 3, the previous result would be
          [[1,2,3],[4,5],[6,7]], so this would give [3,2,2].
ETHproductions
источник
2

TI-Basic, 23 байта

:Prompt M,N
:N(M≥N
:int(Ans⁻¹randIntNoRep(M,M+N-1

Возвращает ERR: DIVIDE BY 0 при ошибке

Oki
источник
2

Октава , 24 байта

@(m,n)diff(fix(0:m/n:m))

Код определяет анонимную функцию. Выходными данными является числовой массив (вектор строки). Когда нет этого массива, он содержит хотя бы один ноль, что ложно в Octave.

Попробуйте онлайн!

объяснение

0:m/n:mпроизводит массив n+1значений от 0к mс шагом m/n. fixокругляет каждую запись в сторону0 , иdiff вычисляет последовательные различия.

В качестве примера, здесь все промежуточные результаты для m = 7, n = 3:

>> 0:m/n:m
ans =
         0    2.3333    4.6667    7.0000

>> fix(0:m/n:m)
ans =
     0     2     4     7

>> diff(fix(0:m/n:m))
ans =
     2     2     3
Луис Мендо
источник
Массив, содержащий ноль, является ложным. Это кажется натяжкой, но я тоже не знаю Октаву. Исходя из Javascript с его принуждениями, я бы сказал, почему, черт возьми, нет. +1 от меня.
Кристиан
@ChristiaanWesterbeek Спасибо! Звучит странно, если вы пришли с других языков, но это так в MATLAB / Octave
Луис Мендо,
2

Haskell , 93 89 88 87 86 71 байт

m!n|n<=m=e$m:(0<$[2..n])
e(a:b:x)|b<a=e$a-1:e(b+1:x)
e(a:x)=a:e x
e x=x

Попробуйте онлайн!

объяснение

Основная функция здесь e. eвозьмем список и, по сути, проведем скалкой по нему слева направо. Пока в списке есть элемент, который больше, чем его сосед справа, мы переместим один элемент вправо.

Теперь все, что нам нужно сделать, это передать этой функции достаточно односторонний список и позволить ей творить чудеса. Список, который мы выберем, mсопровождается n-1нулями. Так как это легко сделать.

Последнее, что нам нужно сделать, это убедиться, что ошибка обрабатывается. Для этого мы просто выбрасываем Non-exhaustive patterns in functionошибку, пока m>n.

Пост Рок Гарф Хантер
источник
Я думаю , вы можете избавиться от error[], не сумев с неисчерпывающим рисунком вместо: m!n|m>n=e$m:replicate(n-1)0.
Лайкони
И (0<$[1..n-1])короче чем replicate(n-1)0.
Лайкони
2

C # (.NET Core) , 86 82 71 байт

using System.Linq;a=>b=>new int[b].Select((x,i)=>(i<a%b?1:0/(a/b))+a/b)

выдает ошибку для неверных входных данных.

Попробуйте онлайн!

-4 байта благодаря TheLethalCoder

-11 байт благодаря Оливье Грегуар

LiefdeWen
источник
1
На данный момент это всего лишь фрагмент кода; вам просто нужно обернуть его в анонимную функцию или a=>b=>в начале.
TheLethalCoder
@TheLethalCoder Хмм, ты уверен? Разве мне не нужно добавлять, using System.Collections.Genericесли я верну IEnumerable<int>?
LiefdeWen
Я все равно ошибся, потому что вы возвращаете массив (я неправильно прочитал первую часть троичного). Но только если это показано в вашем коде и если вы видите, как это IEnumerable<int>будет в определении функции, вам не нужно будет включать using.
TheLethalCoder
Нет, ваш совет все еще хорош, так как код без .ToArray () все еще компилируется.
LiefdeWen
1
@ OlivierGrégoire Вы правы, извините и спасибо.
LiefdeWen
2

Haskell, 48 байтов

m#n|m>=n=iterate(\(a:b)->b++[a+1])(0<$[1..n])!!m

Начнем со списка nнулей. Повторениеm раз: возьмите первый элемент, добавьте один и поместите его в конец списка.

Сбой с ошибкой сопоставления с образцом, если n < m.

Попробуйте онлайн!

Ними
источник
1

Брайнгольф , 30 байт

.M>.M/v.mR>[.]$_v%!?[R1+>v]|R=

Попробуйте онлайн!

Принимает входные данные в обратном порядке ( nэто первый вход,m второй)

Делит m на n, дублирует время результата n, затем перебирает и увеличивает один m % nраз

Skidsdev
источник
1

Пакетная, 71 байт

@if %1 geq %2 for /l %%i in (1,1,%2)do @cmd/cset/an=(%1+%%i-1)/%2&echo(

cmd/cset/aне выводит разделитель, поэтому я должен использовать echo(( (избегает печати ECHO is on.).

Нил
источник
1

PHP> = 7.1, 62 байта

for([,$s,$n]=$argv;$n;)$s-=$r[]=$s/$n--^0;$r[0]?print_r($r):0;

PHP Sandbox Online

Йорг Хюльсерманн
источник
Нажал на вашу ссылку в Песочнице, нажал Выполнить код, и я получил ошибку Parse.
Кристиан
@ChristiaanWesterbeek По умолчанию в песочнице используется PHP 7.0.3.
Нил
1
В других языках, таких как Octave и MATL, ноль в массиве считается ложным, но я не верю, что это имеет место с php. Я полагаю, что результат должен быть ложным в рамках правил языка, на котором написана программа.
Кристиан
1
@ChristiaanWesterbeek исправлено
Йорг Хюльсерманн
1

Javascript (ES6), 57 56 53 41 байт

m=>n=>m>=n&&[...Array(n)].map(_=>m++/n|0)

Ответ теперь включает в себя умный способ создания ценностей. Спасибо @Neil

использование

f=m=>n=>m>=n&&[...Array(n)].map(_=>m++/n|0)

f(6)(3) // [2, 2, 2]
f(7)(3) // [3, 2, 2]
f(7)(2) // [4, 3]
f(7)(1) // [7]
f(7)(8) // false
f(8)(3) // [3, 3, 2]

история

Первый мой

(m,n)=>m>=n&&Array(n).fill(~~(m/n)).map((v,i)=>v+(i<m%n))

(m,n)=>m>=n&&Array(n).fill().map((v,i)=>~~(m/n)+(i<m%n))

Затем добавлен оператор распространения и синтаксис каррирования, полученный @Arnauld

m=>n=>m>=n&&[...Array(n)].map((v,i)=>~~(m/n)+(i<m%n))
Кристиан Вестербик
источник
1
_=>m++/n|0сохраняет кучу байтов.
Нил
0

Pyth , 13 байт

KE?>KQ0lMcK*d

Попробуйте онлайн! Выход 0по ошибке.

Обман, 6 байт

lMcE*d

Попробуйте онлайн! Массив содержит 0ошибку включения. К сожалению , это не falsy в Pyth .

объяснение

KE?>KQ0lMcK*dQ    # Implicit input Q for m
KE                # Store n in K
           *d     # Generate a string of length Q containing only spaces
         cK       # Chop this string in K pieces of equal sizes, initial piece longer if necessary
       lM         # For each string, compute the length. Here we already have our result. However if the array contain a zero, we must output a falsy value
  ?>KQ            # If K > Q...
      0           # Then display zero, otherwise display the array
Джим
источник
0

CJam , 13 12 байт

{_2$>/,/z:,}

Попробуйте онлайн!

Это анонимный блок, который принимает входные данные как n mв стеке. Это был бы хороший ответ, но требование обработки ошибок полностью убило его.

Ошибки с делением на ноль, когда невозможно решить.

объяснение

{   e# Stack:                | 3 10
 _  e# Duplicate:            | 3 10 10
 2$ e# Copy from back:       | 3 10 10 3
 >  e# Greater than:         | 3 10 1 (true)
 /  e# Divide:               | 3 10
    e# This will cause an error on invalid input.
 ,  e# Range:                | 3 [0 1 2 3 4 5 6 7 8 9]
 /  e# Split on nth element: | [[0 1 2] [3 4 5] [6 7 8] [9]]
 z  e# Transpose array:      | [[0 3 4 9] [1 4 7] [2 5 8]]
 :, e# Length of each:       | [4 3 3]
}

Если требование обработки ошибок снято, его можно сократить до 7 байтов, что составляет более 40%:

{,/z:,}
Esolanging Fruit
источник