Kurcaci dan Koin

32

Situasi:

Beberapa ( M) kurcaci telah menemukan peti goblin dengan Nkoin emas dan harus membaginya. Karena aturan kuno yang mengatur alokasi rampasan untuk bajak laut dalam urutan senioritas, kurcaci tertua harus mendapatkan satu koin lebih dari kurcaci tertua berikutnya, dan seterusnya, sehingga kurcaci termuda mendapat M-1koin lebih sedikit dari kurcaci tertua. Selain itu, tidak ada kurcaci yang harus melempar koin apa pun (yaitu, tidak ada koin negatif untuk setiap kurcaci)

Bantu kurcaci untuk membagi koin dengan cara ini, atau beri tahu mereka bahwa ini tidak mungkin.

Kode pemenang harus selalu dijawab dengan benar (tantangan ini bersifat deterministik) dan mengikuti aturan umum .

Memasukkan

Anda diberi bilangan bulat N (3 ≤ N ≤ 1000) untuk jumlah koin dan bilangan bulat M (3 ≤ M ≤ N) untuk jumlah kurcaci, dipisahkan oleh ruang.

Keluaran

Jika tidak mungkin membagi koin dengan cara yang diinginkan para kurcaci, cetak -1 (minus satu). Kalau tidak, cetak jumlah koin yang akan diterima setiap kurcaci, dari yang tertua hingga yang termuda. Pisahkan angka dengan spasi.

Sampel :

memasukkan

3 3

keluaran

2 1 0

memasukkan

9 3

keluaran

4 3 2

memasukkan

7 3

keluaran

-1

memasukkan

6 4

keluaran

3 2 1 0
Thomas Mortell
sumber
4
Anda melewatkan "bajak laut".
Rawling
6
relevan
Raystafarian
3
Bagus temukan, @Raystafarian. Mungkin ketika guru mendapatkan pemecah umum untuk kurcaci M, bukan hanya 3, ia akan mengenali bahwa pengguna crowdsourced jawaban :) - terutama jika pemecah itu dalam J.
ProgrammerDan
Pekerjaan rumah atau tidak, itu pertanyaan yang bagus!
Level River St

Jawaban:

18

J - 32 29 28 25

Tidak lebih pendek dari solusi J lainnya, tapi dan menggunakan ide yang berbeda

(]{.[:i:-:@-.@]-%)/ ::_1:

Jawaban untuk jumlah koin yang diperoleh peringkat tertinggi dari gnome adalah sederhana N/M+(M-1)/2(jika bilangan bulat), kami membuat negatifnya -:@-.@]-%. Lalu i:buat array seperti itu 2 1 0 _1 _2untuk argumen _2dan kita ambil elemen M darinya.

desir
sumber
1
+1 untuk penggunaan brilian i:. Anda dapat menyimpan tiga char lainnya dengan menulis %alih-alih [%], dan dengan menggunakan -.@]alih-alih (1-]).
algorithmshark
@algorithmshark Terima kasih sesama penggemar J!
desir
1
Tidak dapat memberi +1 karena tampaknya ada dengan gnome yang baru saja kami rampok. ;)
TheConstructor
11

J - 30 char

Sangat menyenangkan untuk bermain golf. Banyak hal berjalan dengan baik.

((+/@s~i.[){ ::_1:s=.+/&i.&-)/

Penjelasan:

  • /- Ambil bilangan bulat yang dipisahkan spasi sebagai argumen, dan selipkan fungsi di antara mereka. Artinya, anggaplah N argumen kiri ke fungsi dalam kurung (...)dan M argumen kanan.

  • i.&-- Negasikan ( -) dan kemudian ambil bilangan bulat ( i.). Biasanya, ketika Anda melakukan sesuatu seperti yang i.5Anda dapatkan 0 1 2 3 4. Namun, setiap kali i.menerima angka negatif, ia membalikkan daftar output itu. Jadi misalnya i._5akan memberi 4 3 2 1 0.

  • s=.+/&- Lakukan tindakan di atas pada setiap argumen ( &) dan kemudian buat tabel tambahan ( +/) dari array ini. Kami sekarang memiliki tabel di mana setiap baris adalah distribusi koin yang memungkinkan untuk kurcaci M, meskipun mungkin tidak ketika ada koin N. Akhirnya, kata kerja pembuatan tabel ini sangat berguna, kita akan menyebutnya sdan menggunakannya lagi nanti.

  • +/@s~- Sekarang, kita gunakan slagi, tapi kita menukar ( ~) urutan argumen, sehingga kita memindahkan tabel. Ini adalah cara golf untuk mengambil jumlah setiap baris setelah membuat tabel ( +/@), berkaitan dengan cara J menjumlahkan daftar multidimensi.

  • i.[ - Dalam daftar jumlah ini, kami mencari argumen kiri ke kata kerja, yaitu N. Jika N adalah suatu item, kami mendapatkan indeks itu: jika tidak, kami mendapatkan panjang daftar, yang terutama merupakan indeks tidak valid.

  • { ::_1:- Sekarang kita mencoba menggunakan indeks untuk menarik baris dari tabel s. {akan melempar kesalahan domain jika indeks tidak valid, jadi dalam hal ini kami menangkap kesalahan ( ::) dan mengembalikan -1 ( _1:). Ini menangani semuanya. Karena kita menggunakan i.&-sebelumnya, distribusi koin akan dalam urutan menurun, seperti yang disyaratkan.

Pemakaian:

   ((+/@s~i.[){ ::_1:s=.+/&i.&-)/ 9 3
4 3 2
   ((+/@s~i.[){ ::_1:s=.+/&i.&-)/ 7 3
_1
   ((+/@s~i.[){ ::_1:s=.+/&i.&-)/ 6 4
3 2 1 0
   ((+/@s~i.[){ ::_1:s=.+/&i.&-)/ 204 17
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4
algoritme hiu
sumber
Input 9 3harus dikembalikan 4 3 2, bukan -1. Sepertinya ada transposisi dalam penggunaan contoh Anda?
ProgrammerDan
@ProgrammerDan Terima kasih, tidak menangkapnya. Saya salah mengetik contoh. 9 3memberi 4 3 2dan 7 3memberi _1, seperti yang diharapkan.
algorithmshark
Melihat perbaikannya dan memberi +1 dengan tepat: D. Saya harus melihat ke J, terlihat bagus.
ProgrammerDan
7

R - 71 70 67 66 65 karakter

s=scan();m=s[2];x=s[1]-sum(1:m);cat(if(x%%m|-m>x)-1 else x/m+m:1)

Tidak Disatukan:

s = scan()    # Reads N and M by stdin.
m = s[2]
x = s[1] - m*(m-1)/2
cat(if (x %% m | x < -m) -1 else x/m + m:1)

Larutan:

Jika M jumlah kurcaci, maka urutan emas yang dibayar dapat didekomposisi menjadi dua seri tunggal. Pertama, deret yang berakhir dengan nol: M-1, ..., 2, 1, 0 dan deret konstan c, c, ..., c. Jumlah dari seri pertama selalu M * (M-1) / 2. Jadi jika sisanya (x = N - M * (M-1) / 2) dapat dibagi tanpa sisa (modulo sama dengan 0), setiap kurcaci mendapat x / M ditambah bagian dari deret menurun.

Pemakaian:

> s=scan()
1: 10 4
3: 
Read 2 items
> m=s[2]
> x = s[1] - m*(m-1)/2
> cat(if (x %% m || x<0) -1 else x/m + (m-1):0)
4 3 2 1
lambruscoAcido
sumber
-1, pertanyaannya mengharuskan untuk menulis program yang lengkap dan bukan fungsi. Lihat meta.codegolf.stackexchange.com/a/1146/8766
user80551
@ user80551 Anda benar. Sekarang saya mengoreksi cuplikan: sekarang mengambil input yang dipisahkan ruang; outputnya juga tidak menunjukkan lagi '[1]'.
lambruscoAcido
1
Anda dapat menyimpan penggantian karakter lain m*(m+1)/2dengansum(1:m)
Brian Diggs
@ Brian Thx, saya akan mengubah kode saya!
lambruscoAcido
4

PHP (187)

Ini usaha pertama saya bermain golf, dan saya tahu ini bisa lebih baik, tapi tetap saja :)

Golf:

<?php
$b=fgets(STDIN);list($c,$d)=explode(' ',$b);if((($d&1)AND($c%$d==0))OR($c%$d==$d/2)){for($e=floor($c/$d)+floor($d/2);$e>floor($c/$d)-round($d/2);$e--){echo"$e ";}}else{die('-1');}?>

Tidak Disatukan:

<?php
$a = fgets(STDIN);
list($coins, $dwarves) = explode(' ', $a);
if ((($dwarves & 1) AND ($coins % $dwarves == 0)) OR ($coins % $dwarves == $dwarves / 2)) {
    for (
        $i = floor($coins / $dwarves) + floor($dwarves / 2);
        $i > floor($coins / $dwarves) - round($dwarves / 2);
        $i--
    ) {
        echo "$i ";
    }
}
else { 
  die('-1');
}
?>

Jalankan di shell

Ide dasar:

Koin dapat dipisahkan dengan aturan ini, jika salah satunya benar:

  1. Para kurcaci adalah angka ganjil, dan koin-koin dapat dibagi oleh para kurcaci tanpa sisa
  2. Kurcaci adalah bilangan genap, dan koin yang tersisa setelah membagi koin / kurcaci sama dengan setengah dari jumlah kurcaci

Jika demikian, kami mengambil untuk mendasarkan koin rata-rata per katai (ACPD). Tetapi kita harus mulai dari yang tertinggi dan keluaran hingga mencapai yang terendah. Jadi kita membuat lingkaran dengan penghitung mulai dari ACPD + hitungan sisa kurcaci menuju ujung yang lebih tinggi, dan terus sampai kita mencapai ACPD - hitungan sisa kurcaci menuju ujung bawah.

Ini pada dasarnya sama jika kurcaci itu aneh (yaitu 5 kurcaci - yang tengah adalah 3, dan di kedua ujungnya tetap 2), tetapi tidak jika mereka genap - itulah sebabnya kami mengandalkan lantai DAN putaran.

Masalah sejauh ini: Bekerja dengan jumlah koin terlalu rendah, yang berarti beberapa kurcaci akan ditampar dan dirampok dari penghasilan mereka yang berharga. Dan ini menyedihkan. Atau setidaknya jika Anda suka kurcaci.

Solusi :

  1. Pikirkan cara untuk menghitung jumlah koin terendah sehingga penghitungan tidak berakhir dengan kerdil di dalam debu.
  2. Desain kurcaci yang tidak terlalu serakah.

Solusi yang lebih cerdas :

Koin adalah logam. Buat para kurcaci melelehkan semuanya, dan kemudian masukkan dalam jumlah koin yang lebih kecil / lebih besar, sehingga mereka dapat dibagi dalam keadaan apa pun.

Solusi cerdas :

Curi gunung mereka, ganti nama diri Anda menjadi Smaug dan simpan semuanya untuk diri sendiri. Lagi pula, mengapa Anda harus repot-repot dengan para kurcaci pemarah?

Jembatan utara
sumber
4

Python 3 (100)

Menggunakan ide yang sama dengan @Geobits tetapi sesuai dengan persyaratan input dan output.

n,m=map(int,input().split())
κ,ρ=divmod(n-m*(m-1)//2,m)
x=[-1]if ρ else range(κ,κ+m)[::-1]
print(*x)
Evpok
sumber
Terimakasih atas peringatannya. Tidak memperhatikan pemisahan ruang yang ditambahkan ke persyaratan input.
Geobits
Itu mungkin 100 karakter, tetapi karena nama variabel yunani, itu membutuhkan 105 byte.
Jonathan Frech
4

Python 3 - 109 107 103 102 90 93

Menggunakan ide yang sama seperti Evpok, tetapi dengan sejumlah perbaikan.

n,m=map(int,input().split())
k=n/m+m/2
a=int(k)
print(*(range(a,a-m,-1),[-1])[k-a-.5or~a>-m])

Perbaikannya adalah:

  1. Menghilangkan ruang setelah yang lain dan sebelumnya ''. 1 karakter
  2. Menghilangkan '' split di dalam (), karena pemisahan pada spasi adalah default. 3 karakter
  3. Turunkan x dengan 1 mengubah -1 ke +1 di dalam divmod, dan kemudian mengubah fungsi rentang untuk menggunakan opsi urutan terbalik rentang. 3 karakter.
  4. Sunting: ... jika ... lain ... diubah menjadi ... dan ... atau ... 2 karakter.
  5. EDIT: Divmod dibuat eksplisit, r dihapus. 4 karakter.
  6. EDIT: x dihapus, m // n digunakan secara eksplisit. 1 karakter
  7. EDIT: menggunakan ekspresi yang berkilau bintangnya bukan '.join (peta (str, ...)), ditambahkan x untuk menghindari pengulangan cetak (). 12 karakter.
  8. EDIT: Saya menyadari bahwa saya membiarkan sejumlah koin negatif diberikan kepada para Dwarf. Saya mengubah kode untuk menghindari ini.
isaacg
sumber
Bagus sekali, itu instruktif :) Saya mengubah jawaban saya untuk menghapus ruang yang tidak perlu, tetapi trik Anda untuk menyimpan [::-1]lebih baik daripada solusi saya. +1
Evpok
Saya mungkin kehilangan sesuatu, tetapi saya menghitung 93 byte alih-alih 94.
Jonathan Frech
3

Python 3 - 114

n,m=map(int,input().split(' '))
r=range(m);n-=sum(r)
if n%m<1:
 for x in r:print(m-x+n//m-1,end=' ')
else:print -1

Bekerja dengan memeriksa apakah N-(M*(M-1)/2)habis dibagi M. Baru mengenal python, jadi ada tips yang dihargai.

Contoh Ideone.com

Input:
735 30
Output:
39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10
Geobit
sumber
Pernahkah ada versi Python 3 yang mendukung printgaya pernyataan Python 2 ? Atau bagaimana baris terakhir ( else:print -1) tidak menghasilkan kesalahan?
Jonathan Frech
3

C # - 322

using System;using System.Linq;namespace D{class P{static void Main(string[]args){int n=Convert.ToInt16(args[0]);int m=Convert.ToInt16(args[1]);bool b=false;int q=n/2+1;g:b=!b;int[]z=new int[m];for(int i=0;i<m;i++){z[i]=q-i;}if(z.Sum()==n)foreach(int p in z)Console.Write(p+" ");else{q--;if(b)goto g;Console.Write(-1);}}}}

Skor mengerikan tetapi saya mengambil pendekatan yang berbeda dan mulai menggunakan goto:)

Saya akan mempersingkat nanti.

Austin Henley
sumber
1
Anda pasti dapat mempersingkat semua Convert.ToInt16panggilan itu menjadi adil int.Parse. Anda dapat mendeklarasikan variabel yang telah ditentukan sebelumnya dengan var(bukan eg int[]). Params baris perintah Anda tidak perlu dipanggil args. Dan Anda bisa alias suka jenis yang sering digunakan using C = Console. Saya juga berpikir bahwa untuk solusi selama ini, lebih baik menyajikan dengan penspasian garis utuh daripada menyimpan hanya beberapa karakter. Oh, dan saya tidak begitu yakin mengapa gotolebih baik daripada alternatif di sini, baik ...
Aaronaught
3

Jawa 210

class A { public static void main(String[] a){int d=Integer.parseInt(a[0]),c=Integer.parseInt(a[1]);if (2*c%d==0) for (int i=0;i<d;i++) System.out.print((((1+(2*c/d)-d)/2)+i)+" "); else System.out.print(-1);}}
pengguna902383
sumber
2
Selamat datang di PPCG, saya melihat Anda memiliki banyak ruang kosong yang dapat dihapus.
user12205
Anda dapat menghapus lebih banyak ruang untuk mengirim jawaban Anda sedikit lebih jauh - misalnya, class A{public static void main(String[]a)valid, dan menghemat 3 karakter. Setelah masing-masing if, dan di sekitar masing-masing for, hapus spasi ... dll.
ProgrammerDan
Sangat gila bahwa bagian "public static void main (S" adalah selama seluruh solusi J :)
Robert Grant
3

R: 77 73 70 karakter

a=scan();r=a[2]:1-1;while((n=sum(r))<a[1])r=r+1;cat(`if`(n>a[1],-1,r))

Buat vektor dari (M-1) ke 0 dan tambahkan 1 ke setiap angka sampai jumlahnya tidak lagi kalah dengan N. Jika itu unggul, output -1 yang lain menghasilkan vektor.

Diindentasi dan sedikit tidak berbulu:

a=scan()   #Reads in stdin (by default numeric, space-separated)
r=a[2]:1-1 #Creates vector (M-1) to 0
while(sum(r)<a[1])r=r+1 #Increments all member of vector by 1 until sum is not inferior to N
cat( #Outputs to stdout
    `if`(sum(r)>a[1], -1, r) #If superior to N: impossible, returns -1
    )

Contoh penggunaan:

> a=scan();r=a[2]:1-1;while((n=sum(r))<a[1])r=r+1;cat(`if`(n>a[1],-1,r))
1: 9 3
3: 
Read 2 items
4 3 2
> a=scan();r=a[2]:1-1;while((n=sum(r))<a[1])r=r+1;cat(`if`(n>a[1],-1,r))
1: 7 3
3: 
Read 2 items
-1
> a=scan();r=a[2]:1-1;while((n=sum(r))<a[1])r=r+1;cat(`if`(n>a[1],-1,r))
1: 204 17
3: 
Read 2 items
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4
plannapus
sumber
2

Julia, 45

f(n,m)=(x=n/m-m/2+1/2;x%1==0?[x+m-1:-1:x]:-1)
julia> f(6,4)'
1x4 Array{Float64,2}:
 3.0  2.0  1.0  0.0

Hanya sedikit aljabar, butuh waktu lebih lama dari yang seharusnya.

gggg
sumber
2

JavaScript - 76

Perhatikan bahwa k + (k - 1) + ... + (k - (M - 1)) = M (k - (M - 1) / 2) Menyetel ini sama dengan N memberi k = N / M + (M -1) / 2 untuk jumlah tertinggi. Jika ini bilangan bulat, maka k% 1 == 0 dan jumlah yang kami cari adalah k, k - 1, ..., k - (M - 1).

Saya mungkin bisa menulis ini lebih pendek dalam bahasa lain, tetapi belum ada solusi JS jadi ini dia:

N=3;M=3;if((r=N/M+(M-1)/2)%1)console.log(-1);else while(M--)console.log(r--)

Jalankan di konsol.

Input contoh:

N=3;M=3;if((r=N/M+(M-1)/2)%1)console.log(-1);else while(M--)console.log(r--)

Keluaran:

3
2
1 

Memasukkan:

N=6;M=4;if((r=N/M+(M-1)/2)%1)console.log(-1);else while(M--)console.log(r--)

Keluaran:

3
2
1
0

Memasukkan:

N=7;M=3;if((r=N/M+(M-1)/2)%1)console.log(-1);else while(M--)console.log(r--)

Output: -1

Sayang sekali console.log terlalu panjang untuk mengeja :) Sayangnya menyatakan l=console.log.bind(console)tidak membuatnya lebih pendek, dan l=console.logtidak berfungsi.

Memasukkan:

"N=3;M=3;if((r=N/M+(M-1)/2)%1)console.log(-1);else while(M--)console.log(r--)".length

Keluaran:

76
CompuChip
sumber
Anda dapat menggunakan c=consoledan c.log()mempersingkatnya.
user2428118
2

Golfscript, 35

~:M.(*2/-.M%{;-1}{M/M+,-1%M<' '*}if

Bagaimana itu bekerja

Dalam contoh berikut, inputnya adalah 9 3.

          # STACK: "9 3"
~         # Interpret the input string.
          # STACK: 9 3
:M        # Store the top of the stack (number of dwarves) in variable `M'.
.         # Duplicate the top of the stack.
          # STACK: 9 3 3
(         # Decrement the top of the stack.
          # STACK: 9 3 2
*         # Multiply the topmost elements of the stack.
          # STACK: 9 6
2/        # Divide the top of the stack by `2'.
          # STACK: 9 3
          # So far, we've transformed `M' into `M*(M-1)/2', which is the minimum amount of
          # coins all dwarves together will get. This number comes from the fact that the
          # youngest dwarf will get at least 0 coins, the next at least 1 coin, etc., and
          # 0 + 1 + ... + (M - 1) = M*(M-1)/2.
-         # Subtract the topmost elements of the stack.
          # STACK: 6
          # The remaining coins have to get reparted evenly to all dwarves.
.         # Duplicate the top of the stack.
          # STACK: 6 6
M%        # Calculate the top of the stack modulus `M'.
          # STACK: 6 0
{         # If the modulus is positive, the remaining coins cannot get reparted evenly.
    ;-1   # Replace the top of the stack by `-1'.
}
{         # If the modulus is zero, the remaining coins can get reparted evenly.
    M/    # Divide the top of the stack by `M'.
          # STACK: 2
          # This is the number of coins all dwarves will get after giving 1 to the second
          # youngest, etc.
    M+    # Add `M' to the top of the stack.
          # STACK: 5
    ,     # Replace the top of the stack by an array of that many elements.
          # STACK: [ 0 1 2 3 4 ]
          # The rightmost element is the number of coins the oldest dwarf will get.
    -1%   # Reverse the array.
          # STACK: [ 4 3 2 1 0 ]
    M<    # Keep the leftmost `M' elements.
          # STACK: [ 4 3 2 ]
          # There are only `M' dwarves.
    ' '*  # Join the array, separating by spaces.
          # STACK: "4 3 2"
}if
Dennis
sumber
1

Delphi XE3 (176)

uses SysUtils;var d,c,i:integer;begin read(c,d);for I:=1to d-1do c:=c-i;if c mod d>0then writeln(-1)else begin c:=c div d;for I:=d-1downto 0do write(IntToStr(i+c)+' ');end;end.

Bagaimana itu bekerja.

Membaca 2 bilangan bulat, koin, dan kurcaci.
Mengurangi perbedaan per katai.
Jika sisa kurcaci> 0 tidak mungkin.
Lain mendapatkan bagian yang sama per kurcaci dalam satu lingkaran kurcaci-1 ke 0 dan mencetak dwarfIndex + bagian yang sama

Tidak disatukan

uses SysUtils;
var
  d,c,i:integer;
begin
  read(c,d);
  for I:=1to d-1do
    c:=c-i;
  if c mod d>0then
    writeln(-1)
  else
  begin
    c:=c div d;
    for I:=d-1downto 0do
      write(IntToStr(i+c)+' ');
  end;
end.
Teun Pronk
sumber
1

Mathematica 65

Fungsi,, gmenghasilkan semua urutan peningkatan-per-satu, dengan panjang m, dari 0 ke n dan memeriksa apakah ada yang dijumlahkan menjadi m. Jika berhasil, urutan dikembalikan; jika tidak, -1 dikembalikan.

Urutan dibuat dengan Partitionmemasukkan daftar {0,1,2,3 ... m} ke dalam semua daftar kemungkinan n bilangan bulat yang berdekatan.

Tentu saja ada cara yang lebih efisien untuk mencapai efek yang sama, tetapi yang saya temukan memerlukan lebih banyak kode.

n_~g~m_:=If[(s=Select[Partition[0~Range~n,m,1],Tr@#==n&])=={},-1,s]

Contohnya

g[9, 3]

{{2, 3, 4}}


g[3, 3]

{{0, 1, 2}}


g[7, 3]

-1


g[705, 3]

{{234, 235, 236}}


g[840, 16]

{{45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60}}


g[839, 16]

-1

DavidC
sumber
1

C 131

#include <edk.h>
main(int a,char **v){int j=atoi(*++v),k=atoi(*++v)-j*(j-1)/2;k<0||k%j?j=1,k=-1:k/=j;while(j--)printf("%d ",k+j);}

Tidak disatukan

#include <edk.h> //Shortest standard header including stdio.h and stdlib.h
main(int a,char **v)
{
    int j=atoi(*++v),k=atoi(*++v)-j*(j-1)/2;

    k<0||k%j?j=1,k=-1:k/=j;  // If youngest dwarf gets < 0 or amount not equally divisible then set values such that ...

    while(j--)printf("%d ",k+j); // ... loop prints out correct values
}

Ini mengkompilasi dengan peringatan karena main tidak memiliki tipe. Jika ini tidak berlaku dalam aturan golf, saya harus menambahkan lima karakter.

Ahli alkimia
sumber
1

Cobra - 198

Situs web Cobra

class P
    def main
        x,y=Console.readLine.split
        a,b=x to int,y to int
        l=[]
        t=n=0
        for i in b,t+=i
        while (t+=b)<=a,n+=1
        for i in b,l.insert(0,i+n)
        print if(t-b<>a,-1,l.join(" "))

Dijelaskan:

class P
    def main

Diperlukan untuk menjalankan kode

        x,y=Console.readLine.split
        a,b=x to int,y to int

Mengambil input dan menyimpannya sebagai adanb

        l=[]
        t=n=0

Menginisialisasi daftar output l, dan menginisialisasi total uang yang dibutuhkan tdan jumlah koin untuk ditambahkan ke setiap tumpukan kurcacin

        for i in b,t+=i

Menemukan nilai uang serendah mungkin yang akan menghasilkan semua kurcaci memiliki jumlah koin yang diijinkan di tumpukan mereka

        while (t+=b)<=a,n+=1

Menentukan berapa banyak koin untuk ditambahkan ke setiap tumpukan sehingga total uang yang dibutuhkan adalah> = dengan total uang yang tersedia

        for i in b,l.insert(0,i+n)

Mengisi daftar dengan tumpukan uang yang berbeda ukuran

        print if(t-b<>a,-1,l.join(" "))

Keluaran baik -1atau ltergantung apakah total uang yang dibutuhkan sama dengan total uang yang tersedia

Suram
sumber
0

Perl 5 , 78 + 1 (-n) = 79 byte

($d)=/ (.*)/;$,=$";say(($b=$_-($d**2-$d)/2)%$d?-1:map$_+$b/$d,reverse 0..$d-1)

Cobalah online!

Xcali
sumber
-1

Python ( 100 96 94):

Sebuah jawaban yang bagus, skor bulat. Tidak lagi, tetapi sekarang lebih pendek.

def f(n,m):a=range(m)[::-1];b=n-sum(a);c=b/m;d=[i+c for i in a];return(d,-1)[-1in d or c*m!=b]

Tidak Disatukan:

def f(n,m):
 a = range(m)[::-1]
 b = sum(a)
 c = (n-b)/m
 if c * m != n-b: return -1
 d = [i+c for i in a]
 return (d,-1)[-1 in d or c!=n-b]
 if -d in d or c*m!=n-b:
  return -1
 return d

Keluaran:

def f(n,m):a=range(m)[::-1];b=sum(a);c=(n-b)/m;d=[i+c for i in a];return (d,-1)[-1 in d or c*m!=n-b]

f(3,3)
Out[2]: [2, 1, 0]

f(9,3)
Out[3]: [4, 3, 2]

f(7,3)
Out[4]: -1

f(6,4)
Out[5]: [3, 2, 1, 0]
ɐɔıʇǝɥʇu
sumber
2
Ini tidak mengikuti persyaratan input.
Austin Henley
-1, pertanyaannya mengharuskan untuk menulis program yang lengkap dan bukan fungsi. Lihat meta.codegolf.stackexchange.com/a/1146/8766
user80551