Розподіліть число в списку значень якомога рівніше, сума яких дорівнює цьому числу


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


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

Гая , 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

Математика, 33 байти

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

вхід

[63, 11]

вихід

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

Виводить помилково, коли це не вирішується


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 = Нейл-керована розробка.

Моя попередня відповідь:

Вугілля , 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, що є фальсиєю в R, оскількиif використовується лише перше значення вектора (з попередженням).

Він по суті еквівалент наступній функції:

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

Спробуйте в Інтернеті!


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].

2

TI-Basic, 23 байти

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

Повертає ERR: DIVIDE BY 0 на помилку


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

Хаскелл , 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 байт завдяки Олів'є Грегреару


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

Пакет, 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 Пісочниця Інтернет


Клацнув ваше посилання на пісочницю, клацнув Виконати код, і я отримав помилку аналізу.
Крістіан Вестербек

@ChristiaanWesterbeek Пісочниця за замовчуванням PHP 7.0.3.
Ніл

1
З іншими мовами, такими як Octave та MATL, нуль у масиві вважається хибним, але я не вірю, що це стосується php. Я припускаю, що результат повинен бути хибним у відповідності з правилами мови, на якій написано програму.
Крістіан Вестербек

1
@ChristiaanWesterbeek виправлено
Jörg Hülsermann


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))

Потім додали оператор розповсюдження та синтаксис currying curping, підказаний @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помилку on. На жаль, це не хибність в 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:,}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.