Rozłóż liczbę na listę wartości możliwie równych, których suma jest równa tej liczbie

15

Prawdopodobnie proste wyzwanie w golfa. Biorąc pod uwagę 2 dodatnie liczby całkowite mi nutwórz listę nwartości, które są dodatnimi liczbami całkowitymi, których suma jest równa liczbie m. Albo wszystkie wartości na wyjściu mają tę samą wartość, albo różnica wynosi dokładnie 1.

Przykłady

Na przykład

  • m=6i n=3stałby się2, 2, 2
  • m=7i n=3stałby się 2, 2, 3lub 2, 3, 2lub 3, 2, 2
  • m=7i n=2stałby się 3, 4lub4, 3
  • m=7i n=1stałby się7
  • m=7i n=8spowodowałoby błąd, ponieważ suma 8 dodatnich liczb całkowitych nie może wynosić 7.
  • m=10i n=4stałby się 3, 3, 2, 2lub inną permutacją

Zasady

  • Zarówno wejście, jak i wyjście dotyczą wyłącznie liczb całkowitych dodatnich.
  • Albo wszystkie wartości na wyjściu mają tę samą wartość, albo różnica wynosi dokładnie 1.
  • Kolejność wartości na liście nie jest ważna.
  • Suma wartości na liście jest równa m.
  • Jeśli nie da się go rozwiązać, wygeneruj błąd lub fałszywą wartość (na przykład w przypadku m = 7 i n = 8).
  • W wyniku innych zasad m=8i n=3będzie generować dowolny z permutacji 3, 3, 2(nie 2, 2, 4)

Zwycięzca

To jest golf golfowy, więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach.

Christiaan Westerbeek
źródło
Zakładam, że zero nie jest dodatnie?
TheLethalCoder
Rzeczywiście jest: en.wikipedia.org/wiki/Integer#Order-theoretic_properties
Christiaan Westerbeek
1
@aras Nie jestem matematykiem, ale z tego, co przeczytałem, zwykle zależy od kontekstu. Niektórzy twierdzą, że jest niepodpisany, inni zarówno pozytywni, jak i negatywni, niektórzy pozytywni itp.
TheLethalCoder
1
@ TheLethalCoder tymczasem w java (i ogólnie zmiennoprzecinkowe) float a = -0f, b = 0f; System.out.println(a == b); System.out.println(a + "," + b);... produkuje truei -0.0,0.0. Widzisz, dodatnie 0 i ujemne 0 są wyraźnie dwiema różnymi liczbami ... implementacja tak mówi!
Socratic Phoenix

Odpowiedzi:

2

Gaia , 4 bajty

…÷l¦

Jest prawie wbudowany w to ...

Wyjaśnienie

…     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.
Business Cat
źródło
Myślałem, że istnieje również 4 bajtowe rozwiązanie z 05AB1E. Teraz, gdy już go nie ma, łatwiej mi zdecydować. Gratulacje i dzięki!
Christiaan Westerbeek
8

Python 2 , 48 43 bajtów

Zwroty 0 w przypadku błędu.

lambda m,n:m/n and[m/n]*(n-m%n)+m%n*[m/n+1]

Wypróbuj online!


41 bajtów (z trikiem @ xnor)

Zgłasza NameErrorbłąd.

lambda m,n:[m/n or _]*(n-m%n)+m%n*[m/n+1]

Wypróbuj online!

Felipe Nardi Batista
źródło
5

Mathematica, 33 bajty

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

Wejście

[63, 11]

wynik

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

Wyjścia Fałsz , gdy nie jest rozwiązywalne

J42161217
źródło
5

MATL , 7 bajtów

:gie!Xs

Gdy nie ma rozwiązania, wynikiem jest tablica zawierająca co najmniej jedno zero, co jest fałszem w Mátl.

Wypróbuj online!

Wyjaśnienie

Rozważ dane wejściowe m = 10i 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]
Luis Mendo
źródło
4

Węgiel drzewny , 15 bajtów po zastosowaniu NDD 1

¿÷NNIEIη÷⁺IθιIη

Wypróbuj online!

Nic nie wyświetla, jeśli nie ma rozwiązania. Link do pełnej wersji .

1 NDD = Rozwój oparty na Neilu.

Moja poprzednia odpowiedź:

Węgiel drzewny , 32 27 24 20 bajtów

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

Wypróbuj online!

Nic nie wyświetla, jeśli nie ma rozwiązania. Link do pełnej wersji .

Oczywiście nie byłbym w stanie grać w golfa bez pomocy Neila.

Charlie
źródło
Usunięcie Castoperatora działa z jakiegoś powodu, ale nie jest to idealny algorytm ... Mam rozwiązanie 16-bajtowe.
Neil,
@Neil Challenge zaakceptowane!
Charlie,
Podoba mi się predefiniowana zmienna, ale teraz wiedząc, że Castdziała na listach, mam do 11 bajtów ...
Neil
@ Neil I nadal nie mogę korzystać Map, jak to działa na Ziemi?
Charlie,
Mapjest jak wersja wyrażenia for, aż do użycia tej samej zmiennej pętli. Zatem w twoim przykładzie, zamiast wypychania wyrażenia na listę za każdym razem, Mapautomatycznie zbiera je i ocenia na listę wyników.
Neil,
3

R , 33 bajty

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

Port odpowiedzi Octave Luisa Mendo . Bardzo smutne, że jest to prawie 50% krótsza niż moja poprzednia odpowiedź.

Wypróbuj online!

poprzednia odpowiedź, 63 bajty:

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

Anonimowa funkcja, która przyjmuje dwa argumenty (obowiązkowe) mi noraz dwa opcjonalne, które są dla celów golfa. Zwraca wektor w kolejności rosnącej. W przypadku awarii pierwszą wartością będzie 0falsey w R, ponieważ ifużywa tylko pierwszej wartości wektora (z ostrzeżeniem).

Jest to zasadniczo odpowiednik następującej funkcji:

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

Wypróbuj online!

Giuseppe
źródło
pryr::f(diff(trunc(0:n*m/n)))działa i jest krótszy!
JAD
2

Galaretka , 7 6 bajtów

:ȧœsL€

Wypróbuj online! Nie daje nic dla fałszu.

Jak to działa

:ȧœ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].
ETHprodukcje
źródło
2

TI-Basic, 23 bajty

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

Zwraca ERR: PODZIAŁ NA 0 w przypadku błędu

OK
źródło
2

Oktawa , 24 bajty

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

Kod definiuje anonimową funkcję. Dane wyjściowe to tablica liczbowa (wektor wiersza). Gdy nie ma, tablica zawiera co najmniej jedno zero, co w Octave jest fałszem .

Wypróbuj online!

Wyjaśnienie

0:m/n:mtworzy tablicę n+1wartości od 0do mz krokiem m/n. fixzaokrągla każdy wpis 0i diffoblicza kolejne różnice.

Na przykład, są tu wszystkie pośrednie wyniki 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
Luis Mendo
źródło
Tablica zawierająca zero jest fałszem. Wydaje się to trudne, ale nie znam też Octave. Pochodząc z Javascript z jego przymusami, powiedziałbym, dlaczego, do diabła, nie. +1 ode mnie
Christiaan Westerbeek
@ChristiaanWesterbeek Thanks! To brzmi dziwnie, jeśli pochodzisz z innych języków, ale tak to jest w MATLAB / Octave
Luis Mendo
2

Haskell , 93 89 88 87 86 71 bajtów

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

Wypróbuj online!

Wyjaśnienie

Główną funkcją jest tutaj e. epobierze listę i zasadniczo poprowadzi wałek do ciasta wzdłuż niej od lewej do prawej. Podczas gdy na liście znajduje się element, który jest większy od sąsiada po prawej, przesuniemy jeden z niego w prawo.

Teraz wszystko, co musimy zrobić, to nakarmić tę funkcję wystarczająco nachyloną listą i pozwolić jej wykonać magię. Po liście, którą wybieramy, mnastępuje n-1zero. Ponieważ jest to łatwe do zrobienia.

Ostatnią rzeczą, którą musimy zrobić, to upewnić się, że sprawa błędu jest obsłużona. W tym celu po prostu wyrzucamy Non-exhaustive patterns in functionbłąd tak długo, jak m>n.

Post Rock Garf Hunter
źródło
Myślę, że można pozbyć się error[]nie dokonując z niewyczerpujący wzoru zamiast: m!n|m>n=e$m:replicate(n-1)0.
Laikoni,
(0<$[1..n-1])Jest także krótszy niż replicate(n-1)0.
Laikoni,
2

C # (.NET Core) , 86 82 71 bajtów

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

zgłasza błąd dla nieprawidłowych danych wejściowych.

Wypróbuj online!

-4 bajty dzięki TheLethalCoder

-11 bajtów dzięki OlivierGrégoire

LiefdeWen
źródło
1
W tej chwili jest to tylko fragment kodu; musisz tylko zawinąć go w anonimową funkcję lub a=>b=>na początku.
TheLethalCoder
@TheLethalCoder Hmm, jesteś pewien? Czy nie muszę dodawać, using System.Collections.Genericjeśli zwracam IEnumerable<int>?
LiefdeWen,
I tak się pomyliłem, ponieważ zwracasz tablicę (źle odczytałem pierwszą część trójki). Ale tylko jeśli jest to widoczne w twoim kodzie i widzisz tak, jak IEnumerable<int>byłoby w definicji funkcji, nie musisz dołączać using.
TheLethalCoder
Nie, Twoja wskazówka jest nadal dobra, ponieważ kod bez .ToArray () nadal się kompiluje.
LiefdeWen,
1
@ OlivierGrégoire Masz rację, przepraszam i dziękuję.
LiefdeWen,
2

Haskell, 48 bajtów

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

Zacznij od listy nzer. Powtórz mczasy: weź pierwszy element, dodaj jeden i umieść go na końcu listy.

Nie powiedzie się z błędem dopasowania wzorca, jeśli n < m.

Wypróbuj online!

nimi
źródło
1

Braingolf , 30 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe w odwrotnej kolejności ( njest to pierwsze wejście,m drugie )

Podziały mwedług n, powiela wynik nrazy, a następnie poprzez pętle i przyrosty jeden przez jeden m % nrazy

Skidsdev
źródło
1

Partia, 71 bajtów

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

cmd/cset/anie wyświetla żadnego separatora, więc muszę go użyć echo(( (unika drukowania ECHO is on.).

Neil
źródło
1

PHP> = 7.1, 62 bajty

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

PHP Sandbox Online

Jörg Hülsermann
źródło
Kliknąłem link do piaskownicy, kliknąłem przycisk Wykonaj kod i wystąpił błąd analizy.
Christiaan Westerbeek
@ChristiaanWesterbeek Domyślnie piaskownica to PHP 7.0.3.
Neil,
1
W innych językach, takich jak Octave i MATL, zero w tablicy jest uważane za fałsz, ale nie sądzę, że tak jest w przypadku php. Podejrzewam, że wynik musi być fałszem zgodnie z zasadami języka, w którym program jest napisany.
Christiaan Westerbeek
1
@ChristiaanWesterbeek naprawiony
Jörg Hülsermann
1

Python 2 , 41 bajtów

lambda m,n:(m%n*[m/n+1]+[m/n or _]*n)[:n]

Wypróbuj online!

NameError kiedy niemożliwe.


Python 2 , 43 bajty

lambda m,n:[c/n for c in range(m,m+n,m>=n)]

Wypróbuj online!

ValueError kiedy niemożliwe.

xnor
źródło
nigdy nie zastanawiałem się nad użyciem NameErrorwyjścia przez błąd
Felipe Nardi Batista
1

JavaScript (ES6), 57 56 53 41 bajtów

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

Odpowiedź zawiera teraz mądrzejszy sposób tworzenia wartości. Dzięki @Neil

Stosowanie

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]

Historia

Pierwsza moja

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

Następnie dodano operator rozprzestrzeniania i składnię curry z końcówką @Arnauld

m=>n=>m>=n&&[...Array(n)].map((v,i)=>~~(m/n)+(i<m%n))
Christiaan Westerbeek
źródło
1
_=>m++/n|0zapisuje kilka bajtów.
Neil,
0

Pyth , 13 bajtów

KE?>KQ0lMcK*d

Wypróbuj online! Dane wyjściowe 0w przypadku błędu.

Oszukiwanie, 6 bajtów

lMcE*d

Wypróbuj online! Tablica zawiera 0błąd. Niestety w Pyth to nie jest fałsz .

Wyjaśnienie

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
Jim
źródło
0

CJam , 13 12 bajtów

{_2$>/,/z:,}

Wypróbuj online!

Jest to anonimowy blok, który przyjmuje dane wejściowe jako n m na stosie. To byłaby dobra odpowiedź, ale wymóg obsługi błędów całkowicie go zabił.

Błędy z dzieleniem przez zero, gdy nie można rozwiązać.

Wyjaśnienie

{   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]
}

Jeśli zniesiono wymóg obsługi błędów, można go skrócić do 7 bajtów, co stanowi spadek o ponad 40%:

{,/z:,}
Esolanging Fruit
źródło