Distribusikan angka menjadi daftar nilai yang sedapat mungkin setara dengan jumlah yang sama dengan angka tersebut

15

Mungkin tantangan kode-golf sederhana. Diberikan 2 bilangan bulat positif mdan n, buat daftar nnilai yang bilangan bulat positif yang jumlahnya sama dengan angka m. Semua nilai dalam output adalah nilai yang sama atau selisihnya tepat 1.

Contohnya

Sebagai contoh

  • m=6dan n=3akan menjadi2, 2, 2
  • m=7dan n=3akan menjadi 2, 2, 3atau 2, 3, 2atau 3, 2, 2
  • m=7dan n=2akan menjadi 3, 4atau4, 3
  • m=7dan n=1akan menjadi7
  • m=7dan n=8akan menghasilkan kesalahan karena jumlah 8 bilangan bulat positif tidak boleh 7.
  • m=10dan n=4akan menjadi 3, 3, 2, 2atau permutasi lainnya

Aturan

  • Baik input dan output hanya tentang bilangan bulat positif.
  • Semua nilai dalam output adalah nilai yang sama atau selisihnya tepat 1.
  • Urutan nilai dalam daftar tidak penting.
  • Jumlah nilai dalam daftar sama dengan m.
  • Ketika tidak bisa dipecahkan, hasilkan kesalahan atau nilai salah (dalam kasus m = 7 dan n = 8 misalnya).
  • Sebagai hasil dari aturan lain m=8dan n=3akan menghasilkan permutasi salah satu dari 3, 3, 2(tidak 2, 2, 4)

Pemenang

Ini adalah kode-golf, sehingga jawaban terpendek yang valid - diukur dalam byte - menang.

Christiaan Westerbeek
sumber
Saya berasumsi nol tidak positif?
TheLethalCoder
Memang itu adalah: en.wikipedia.org/wiki/Integer#Order-theoretic_properties
Christiaan Westerbeek
1
@aras Saya bukan ahli matematika tetapi dari apa yang saya baca biasanya tergantung pada konteks. Ada yang mengatakan itu tidak ditandatangani, beberapa positif dan negatif, beberapa positif dll.
TheLethalCoder
1
@TheLethalCoder sementara itu, di java (dan floating point secara umum), float a = -0f, b = 0f; System.out.println(a == b); System.out.println(a + "," + b);... menghasilkan truedan -0.0,0.0. Lihat, 0 positif dan 0 negatif jelas dua angka yang berbeda ... pelaksanaannya berkata begitu!
Socratic Phoenix

Jawaban:

2

Gaia , 4 byte

…÷l¦

Ada hampir hanya built-in untuk ini ...

Penjelasan

…     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.
Kucing Bisnis
sumber
Saya pikir ada solusi 4 byte juga dengan 05AB1E. Sekarang sudah hilang, membuat saya lebih mudah untuk memutuskan. Selamat dan terima kasih!
Christiaan Westerbeek
8

Python 2 , 48 43 byte

Pengembalian 0kesalahan.

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

Cobalah online!


41 byte (dengan trik @ xnor)

Melempar NameErrorkesalahan.

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

Cobalah online!

Felipe Nardi Batista
sumber
5

Mathematica, 33 byte

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

memasukkan

[63, 11]

keluaran

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

output Salah ketika tidak bisa dipecahkan

J42161217
sumber
5

MATL , 7 byte

:gie!Xs

Ketika tidak ada solusi output adalah array yang berisi setidaknya satu nol, yang falsy di MATL.

Cobalah online!

Penjelasan

Pertimbangkan input m = 10dan 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
sumber
4

Arang , 15 byte setelah menerapkan NDD 1

¿÷NNIEIη÷⁺IθιIη

Cobalah online!

Tidak menghasilkan apa-apa jika tidak ada solusi. Tautan ke versi verbose .

1 NDD = Pengembangan Berbasis Neil.

Jawaban saya sebelumnya:

Arang , 32 27 24 20 byte

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

Cobalah online!

Tidak menghasilkan apa-apa jika tidak ada solusi. Tautan ke versi verbose .

Tentu saja, saya tidak bisa bermain golf tanpa bantuan Neil.

Charlie
sumber
Menghapus Castoperator berfungsi untuk beberapa alasan, tapi ini bukan algoritma yang ideal ... Saya punya solusi 16-byte.
Neil
@Neil Challenge diterima!
Charlie
Saya suka variabel yang telah ditentukan, tetapi sekarang mengetahui bahwa Castberfungsi pada daftar saya turun ke 11 byte ...
Neil
@Neil Dan saya masih tidak bisa menggunakan Map, bagaimana bisa bekerja ??
Charlie
Mapseperti versi ekspresi for, turun menggunakan variabel loop yang sama. Jadi, dalam contoh Anda, alih-alih mendorong ekspresi ke daftar setiap kali, Mapsecara otomatis mengumpulkannya dan mengevaluasi ke daftar hasil.
Neil
3

R , 33 byte

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

Port jawaban Octaf Luis Mendo . Sangat menyedihkan bahwa ini hampir 50% lebih pendek dari jawaban saya sebelumnya.

Cobalah online!

jawaban sebelumnya, 63 byte:

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

Fungsi anonim yang mengambil dua argumen (wajib) mdan n, dan dua yang opsional untuk tujuan bermain golf. Mengembalikan vektor dalam urutan yang meningkat. Untuk kegagalan, nilai pertama adalah 0, yaitu falsey dalam R, sejakif hanya menggunakan nilai pertama dari vektor (dengan peringatan).

Ini pada dasarnya setara dengan fungsi berikut:

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

Cobalah online!

Giuseppe
sumber
pryr::f(diff(trunc(0:n*m/n)))bekerja dan lebih pendek!
JAD
2

Jelly , 7 6 byte

:ȧœsL€

Cobalah online! Tidak menghasilkan apa-apa untuk falsy.

Bagaimana itu bekerja

:ȧœ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].
Produksi ETH
sumber
2

TI-Basic, 23 byte

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

Mengembalikan ERR: DIVIDE OLEH 0 pada kesalahan

Oki
sumber
2

Oktaf , 24 byte

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

Kode mendefinisikan fungsi anonim. Outputnya adalah array numerik (vektor baris). Ketika tidak ada array ini mengandung setidaknya satu nol, yang falsy di Octave.

Cobalah online!

Penjelasan

0:m/n:mmenghasilkan array n+1nilai dari 0hingga mdengan langkah m/n. fixputaran setiap entri menuju0 , dan diffmenghitung perbedaan berturut-turut.

Sebagai contoh, di sini adalah semua hasil antara untuk 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
sumber
Array yang berisi nol adalah falsy. Itu tampak seperti peregangan, tapi aku juga tidak kenal Oktaf. Berasal dari Javascript dengan paksaannya, saya akan mengatakan mengapa tidak. +1 dari saya.
Christiaan Westerbeek
@ChristiaanWesterbeek Terima kasih! Kedengarannya aneh jika Anda berasal dari bahasa lain, tetapi begitulah dalam MATLAB / Oktaf
Luis Mendo
2

Haskell , 93 89 88 87 86 71 byte

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

Cobalah online!

Penjelasan

Fungsi utama di sini adalah e. eakan mengambil daftar dan pada dasarnya menjalankan pin bergulir sepanjang dari kiri ke kanan. Meskipun ada elemen dalam daftar yang lebih besar dari tetangganya ke kanan, kami akan memindahkan satu dari itu ke kanan.

Sekarang yang harus kita lakukan adalah memberi makan fungsi ini daftar yang cukup miring dan memungkinkannya untuk melakukan keajaiban. Daftar yang akan kita pilih hanya mdiikuti oleh n-1nol. Karena itu mudah dibuat.

Hal terakhir yang perlu kita lakukan adalah memastikan bahwa kasus kesalahan ditangani. Untuk ini kami hanya melempar Non-exhaustive patterns in functionkesalahan selama m>n.

Posting Rock Garf Hunter
sumber
Saya pikir Anda dapat menyingkirkan error[]dengan tidak dengan pola non-lengkap sebagai gantinya: m!n|m>n=e$m:replicate(n-1)0.
Laikoni
Juga (0<$[1..n-1])lebih pendek dari replicate(n-1)0.
Laikoni
2

C # (.NET Core) , 86 82 71 byte

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

melempar kesalahan untuk input yang tidak valid.

Cobalah online!

-4 byte terima kasih TheLethalCoder

-11 byte terima kasih kepada OlivierGrégoire

LiefdeWen
sumber
1
Ini hanya cuplikan kode saat ini; Anda hanya perlu membungkusnya dalam fungsi anonim atau a=>b=>di awal.
TheLethalCoder
@TheLethalCoder Hmm Anda yakin? Apakah saya tidak perlu menambahkan using System.Collections.Genericjika saya mengembalikan IEnumerable<int>?
LiefdeWen
Saya tetap salah karena Anda mengembalikan array (saya salah membaca bagian pertama dari terner). Tetapi hanya jika itu ditampilkan dalam kode Anda dan dilihat sebagai IEnumerable<int>akan berada dalam definisi fungsi Anda tidak perlu memasukkan using.
TheLethalCoder
Tidak, Tip Anda masih bagus karena kode tanpa .ToArray () masih dikompilasi.
LiefdeWen
1
@ OlivierGrégoire Anda benar, maaf, dan terima kasih.
LiefdeWen
2

Haskell, 48 byte

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

Mulai dengan daftar n nol. Ulangi mwaktu: ambil elemen pertama, tambahkan satu dan letakkan di akhir daftar.

Gagal dengan kesalahan kecocokan pola jika n < m .

Cobalah online!

nimi
sumber
1

Braingolf , 30 byte

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

Cobalah online!

Mengambil input dalam urutan terbalik (n merupakan input pertama,m kedua)

Dibagi mdengan n, menduplikasi hasil nkali, lalu lewati dan tambah satu per satu m % nkali

Skidsdev
sumber
1

Batch, 71 byte

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

cmd/cset/atidak menghasilkan pemisah apa pun, jadi saya harus menggunakan echo(( (menghindari pencetakan ECHO is on.).

Neil
sumber
1

PHP> = 7.1, 62 byte

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

PHP Sandbox Online

Jörg Hülsermann
sumber
Klik tautan Anda ke Sandbox, klik Jalankan kode dan saya mendapat kesalahan Parse.
Christiaan Westerbeek
@ChristiaanWesterbeek Sandbox default ke PHP 7.0.3.
Neil
1
Dengan bahasa lain seperti Oktaf dan MATL, nol dalam array dianggap palsu, tapi saya tidak percaya ini adalah kasus dengan php. Saya kira hasilnya harus salah dalam aturan bahasa program ditulis.
Christiaan Westerbeek
1
@ChristiaanWesterbeek diperbaiki
Jörg Hülsermann
1

Python 2 , 41 byte

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

Cobalah online!

NameError ketika tidak mungkin.


Python 2 , 43 byte

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

Cobalah online!

ValueError ketika tidak mungkin.

Tidak
sumber
tidak pernah berpikir untuk menggunakan NameErroruntuk keluar melalui kesalahan
Felipe Nardi Batista
1

Javascript (ES6), 57 56 53 41 byte

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

Jawab sekarang termasuk cara yang lebih cerdas untuk menciptakan nilai-nilai. Terima kasih @Neil

Pemakaian

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]

Sejarah

Tambang pertama

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

Kemudian menambahkan operator spread dan sintaks currying tip oleh @Arnauld

m=>n=>m>=n&&[...Array(n)].map((v,i)=>~~(m/n)+(i<m%n))
Christiaan Westerbeek
sumber
1
_=>m++/n|0menghemat banyak byte.
Neil
1

Java (OpenJDK 8) , 80 73 63 61 59 byte

n->m->{for(int i=n;i-->0/(m/n);)System.out.println(m++/n);}

Cobalah online!

Catatan, untuk tujuan kari, mdan ndibalik.

Olivier Grégoire
sumber
0

Pyth , 13 byte

KE?>KQ0lMcK*d

Cobalah online! Keluaran0 pada kesalahan.

Kecurangan, 6 byte

lMcE*d

Cobalah online! Array berisi 0kesalahan saat. Sayangnya ini bukan kepalsuan di Pyth .

Penjelasan

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
sumber
0

CJam , 13 12 byte

{_2$>/,/z:,}

Cobalah online!

Ini adalah blok anonim yang menerima input sebagai n m pada stack. Itu akan menjadi jawaban yang baik, tetapi persyaratan penanganan kesalahan benar-benar membunuhnya.

Kesalahan dengan pembagian-oleh-nol saat itu tidak mungkin dipecahkan.

Penjelasan

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

Jika persyaratan penanganan kesalahan diangkat, ini dapat dipersingkat menjadi 7 byte, yang merupakan penurunan lebih dari 40%:

{,/z:,}
Buah Esolanging
sumber