Situasi:
Beberapa ( M
) kurcaci telah menemukan peti goblin dengan N
koin 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-1
koin 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 kode golf .
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
Jawaban:
J -
32292825Tidaklebih pendek dari solusi J lainnya,tapidan menggunakan ide yang berbedaJawaban untuk jumlah koin yang diperoleh peringkat tertinggi dari gnome adalah sederhana
N/M+(M-1)/2
(jika bilangan bulat), kami membuat negatifnya-:@-.@]-%
. Lalui:
buat array seperti itu2 1 0 _1 _2
untuk argumen_2
dan kita ambil elemen M darinya.sumber
i:
. Anda dapat menyimpan tiga char lainnya dengan menulis%
alih-alih[%]
, dan dengan menggunakan-.@]
alih-alih(1-])
.J - 30 char
Sangat menyenangkan untuk bermain golf. Banyak hal berjalan dengan baik.
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 yangi.5
Anda dapatkan0 1 2 3 4
. Namun, setiap kalii.
menerima angka negatif, ia membalikkan daftar output itu. Jadi misalnyai._5
akan memberi4 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 menyebutnyas
dan menggunakannya lagi nanti.+/@s~
- Sekarang, kita gunakans
lagi, 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 tabels
.{
akan melempar kesalahan domain jika indeks tidak valid, jadi dalam hal ini kami menangkap kesalahan (::
) dan mengembalikan -1 (_1:
). Ini menangani semuanya. Karena kita menggunakani.&-
sebelumnya, distribusi koin akan dalam urutan menurun, seperti yang disyaratkan.Pemakaian:
sumber
9 3
harus dikembalikan4 3 2
, bukan-1
. Sepertinya ada transposisi dalam penggunaan contoh Anda?9 3
memberi4 3 2
dan7 3
memberi_1
, seperti yang diharapkan.R -
7170676665 karakterTidak Disatukan:
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:
sumber
m*(m+1)/2
dengansum(1:m)
PHP (187)
Ini usaha pertama saya bermain golf, dan saya tahu ini bisa lebih baik, tapi tetap saja :)
Golf:
Tidak Disatukan:
Jalankan di shell
Ide dasar:
Koin dapat dipisahkan dengan aturan ini, jika salah satunya benar:
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 :
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?
sumber
Python 3 (100)
Menggunakan ide yang sama dengan @Geobits tetapi sesuai dengan persyaratan input dan output.
sumber
Python 3 -
1091071031029093Menggunakan ide yang sama seperti Evpok, tetapi dengan sejumlah perbaikan.
Perbaikannya adalah:
sumber
[::-1]
lebih baik daripada solusi saya. +1Python 3 - 114
Bekerja dengan memeriksa apakah
N-(M*(M-1)/2)
habis dibagiM
. Baru mengenal python, jadi ada tips yang dihargai.Contoh Ideone.com
sumber
print
gaya pernyataan Python 2 ? Atau bagaimana baris terakhir (else:print -1
) tidak menghasilkan kesalahan?C # - 322
Skor mengerikan tetapi saya mengambil pendekatan yang berbeda dan mulai menggunakan
goto
:)Saya akan mempersingkat nanti.
sumber
Convert.ToInt16
panggilan itu menjadi adilint.Parse
. Anda dapat mendeklarasikan variabel yang telah ditentukan sebelumnya denganvar
(bukan egint[]
). Params baris perintah Anda tidak perlu dipanggilargs
. Dan Anda bisa alias suka jenis yang sering digunakanusing 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 mengapagoto
lebih baik daripada alternatif di sini, baik ...Jawa 210
sumber
class A{public static void main(String[]a)
valid, dan menghemat 3 karakter. Setelah masing-masingif
, dan di sekitar masing-masingfor
, hapus spasi ... dll.R:
777370 karakterBuat 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:
Contoh penggunaan:
sumber
Julia, 45
Hanya sedikit aljabar, butuh waktu lebih lama dari yang seharusnya.
sumber
JavaScript - 76
Saya mungkin bisa menulis ini lebih pendek dalam bahasa lain, tetapi belum ada solusi JS jadi ini dia:
Jalankan di konsol.
Input contoh:
Keluaran:
Memasukkan:
Keluaran:
Memasukkan:
Output: -1
Sayang sekali console.log terlalu panjang untuk mengeja :) Sayangnya menyatakan
l=console.log.bind(console)
tidak membuatnya lebih pendek, danl=console.log
tidak berfungsi.Memasukkan:
Keluaran:
sumber
c=console
danc.log()
mempersingkatnya.Golfscript, 35
Bagaimana itu bekerja
Dalam contoh berikut, inputnya adalah
9 3
.sumber
Delphi XE3 (176)
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
sumber
Mathematica 65
Fungsi,,
g
menghasilkan 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
Partition
memasukkan 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.
Contohnya
sumber
C 131
Tidak disatukan
Ini mengkompilasi dengan peringatan karena main tidak memiliki tipe. Jika ini tidak berlaku dalam aturan golf, saya harus menambahkan lima karakter.
sumber
Cobra - 198
Situs web Cobra
Dijelaskan:
Diperlukan untuk menjalankan kode
Mengambil input dan menyimpannya sebagai
a
danb
Menginisialisasi daftar output
l
, dan menginisialisasi total uang yang dibutuhkant
dan jumlah koin untuk ditambahkan ke setiap tumpukan kurcacin
Menemukan nilai uang serendah mungkin yang akan menghasilkan semua kurcaci memiliki jumlah koin yang diijinkan di tumpukan mereka
Menentukan berapa banyak koin untuk ditambahkan ke setiap tumpukan sehingga total uang yang dibutuhkan adalah> = dengan total uang yang tersedia
Mengisi daftar dengan tumpukan uang yang berbeda ukuran
Keluaran baik
-1
ataul
tergantung apakah total uang yang dibutuhkan sama dengan total uang yang tersediasumber
Perl 5 , 78 + 1 (-n) = 79 byte
Cobalah online!
sumber
Python (
1009694):Sebuah jawaban yang bagus, skor bulat.Tidak lagi, tetapi sekarang lebih pendek.Tidak Disatukan:
Keluaran:
sumber