Keacakan itu menyenangkan. Tantangan tanpa poin itu menyenangkan.
Tulis fungsi yang, jika diberi input bilangan bulat n
, akan mengeluarkan satu set (tidak berurutan, unik) n
antara bilangan bulat acak antara 1
dan n^2
(inklusif) sehingga jumlah semua bilangan bulat sama dengann^2
.
Keacakan tidak tidak harus seragam, disediakan setiap set yang valid memiliki non-nol kesempatan untuk terjadi.
Jawaban terpendek dalam byte (per setiap bahasa) menang.
Contohnya
Input (n) = 1, Target (n^2) = 1
Sample of possible outputs:
1
Input = 2, Target = 4
Sample of possible outputs:
3, 1
1, 3
Input = 3, Target = 9
Sample of possible outputs:
6, 1, 2
3, 5, 1
4, 3, 2
Input = 4, Target = 16
Sample of possible outputs:
1, 3, 5, 7
2, 4, 1, 9
8, 3, 1, 4
Input = 5, Target = 25
Sample of possible outputs:
11, 4, 7, 1, 2
2, 3, 1, 11, 8
6, 1, 3, 7, 8
Input = 8, Target = 64
Sample of possible outputs:
10, 3, 9, 7, 6, 19, 8, 2
7, 16, 2, 3, 9, 4, 13, 10
7, 9, 21, 2, 5, 13, 6, 1
Tugas Bonus: Apakah ada rumus untuk menghitung jumlah permutasi yang valid untuk suatu yang diberikan n
?
code-golf
random
combinatorics
Skidsdev
sumber
sumber
Jawaban:
Brachylog (v2), 15 byte (acak) atau 13 byte (semua kemungkinan)
Acak
Cobalah online!
Pengajuan fungsi (terlihat di TIO dengan pembungkus membuatnya menjadi program lengkap).
Penjelasan
Semua kemungkinan
Cobalah online!
Pengajuan fungsi, yang menghasilkan semua kemungkinan output.
Penjelasan
Saya cukup terkejut bahwa
∧≜
berfungsi (Anda biasanya harus menulis∧~≜
untuk memaksa-paksa output daripada input), tetapi ternyata yang≜
memiliki input = output asumsi sehingga tidak masalah ke arah mana Anda menjalankannya.Tugas bonus
Untuk mendapatkan beberapa wawasan tentang urutan jumlah kemungkinan, saya membuat pembungkus TIO berbeda yang menjalankan program pada bilangan bulat berturut-turut untuk memberikan urutan jumlah keluaran:
Perjalanan ke OEIS menemukan bahwa ini adalah urutan yang sudah diketahui, A107379 , dijelaskan cukup banyak seperti dalam pertanyaan (tampaknya Anda mendapatkan urutan yang sama jika Anda membatasi ke angka ganjil). Halaman ini mencantumkan beberapa rumus untuk urutan (meskipun tidak ada yang sangat sederhana; yang kedua terlihat seperti rumus langsung untuk nilai tetapi saya tidak mengerti notasinya).
sumber
x^(n*(n-1)/2)
dalam ekspansi seriProduct_{k=1..n} 1/(1 - x^k)
" (sayangnya tidak langsung sama sekali)A≠≜₁ᵐ
) Menjadikan waktu berjalan lebih cepat rata-rata.05AB1E , 11 byte
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
Python (2 atau 3), 85 byte
Cobalah online!
sumber
R ,
68, 7548 byte (acak) dan 70 byte (deterministik)Metode pengambilan sampel penolakan @ Giuseppe:
Cobalah online!
Golf asli:
Cobalah online!
The
*!!1:2
bisnis adalah untuk menghindari cara yang anehsample
tindakan ketika argumen pertama memiliki panjang 1.sumber
p
secara langsung sebagai indeks alih-alih menghitungnya dan menggunakannya kembali akan menghemat beberapa byte.function(n){while(sum(F)!=n^2)F=sample(n^2,n);F}
untuk 48 juga ...sample(2,1)
yang terjadin=2
. Jadirep
hanya menjamin bahwa ini tidak akan pernah terjadi. Mungkin ada cara yang lebih baik tetapi ini cepat dan saya marahsample
.x*!!1:2
lebih dari iturep(x,2)
jika pertanyaan meta Anda tidak.Jelly , 9 byte
Cobalah online!
Hasilkan semua n-kombinasi dari daftar [1..n²], filter untuk mempertahankannya dengan jumlah n², lalu pilih yang acak.
sumber
Java 10,
250242222 byte-20 byte terima kasih kepada @nwellnhof .
Awas, Jawa masuk .. Ini 'hanya' lima kali selama empat jawaban lainnya digabungkan, jadi tidak terlalu buruk kurasa .. rofl.
Itu berjalan
n=1
melaluin=25
(gabungan) dalam waktu kurang dari 2 detik, jadi saya mungkin akan memposting versi yang dimodifikasi ke versi kecepatan dari tantangan ini (yang saat ini masih di Sandbox) juga.Cobalah online.
Penjelasan:
Dalam pseudo-code kami melakukan hal berikut:
1) Menghasilkan sebuah array berukuran
n+1
mengandung:0
,n
kuadrat, dann-1
jumlah bilangan bulat acak dalam kisaran[0, n squared)
2) Urutkan array ini
3) Buat array kedua dari ukuran
n
yang mengandung perbedaan maju pasanganini tiga langkah pertama akan memberi kita sebuah array yang berisi
n
random integer (dalam rentang[0, n squared)
yang dijumlahkan menjadin
kuadrat.4a) Jika tidak semua nilai acak adalah unik, atau salah satunya adalah 0: coba lagi dari langkah 1
4b) Lain-lain: kembalikan array perbedaan ini sebagai hasilnya
Adapun kode aktual:
sumber
n=25
di bawah 2 detik sangat mengesankan! Saya harus membaca penjelasannya dan melihat bagaimana melakukannya. Apakah ini masih merupakan metode bruteforce?[0, n squared)
pertama, dan kemudian menghitung perbedaan antara nilai-nilai acak yang diurutkan (termasuk memimpin0
dan mengikutin squared
. Jadi saya cukup yakin perbedaan itu seragam juga. Tapi sekali lagi , Saya tidak yakin bagaimana cara membuktikannya. Keseragaman dalam keacakan sebenarnya bukan keahlian saya tbhd
atau saya kehilangan sesuatu?Perl 6 , 41 byte
Cobalah online!
(1 .. $_²)
adalah rentang angka dari 1 hingga kuadrat dari nomor input.pick($_)
secara acak memilih subset berbeda dari rentang ituxx *
mereplikasi ekspresi sebelumnya tanpa batasfirst *.sum == $_²
memilih yang pertama dari set angka yang menjumlahkan kuadrat dari nomor inputsumber
Pyth,
1312 byteCobalah online di sini . Perhatikan bahwa penerjemah online mengalami MemoryError untuk input yang lebih besar dari 5.
Sunting: menyimpan satu byte dengan mengambil pendekatan alternatif. Versi sebelumnya:
Of&qQlT{IT./*
sumber
Python 3 ,
136 134 127 121114 byteCobalah online!
Seorang komentator mengoreksi saya, dan ini sekarang mengenai kedalaman maksimum rekursi pada f (5), bukan f (1). Jauh lebih dekat untuk menjadi jawaban yang bersaing nyata.
Saya pernah melihatnya melakukan f (5) satu kali , dan saya sedang berusaha mengimplementasikannya dengan shuffle.
Saya mencoba membuat beberapa ekspresi lambda
s=...
, tetapi itu tidak membantu pada byte. Mungkin orang lain dapat melakukan sesuatu dengan ini:s=(lambda n:{randint(1,n*n)for _ in range(n)})(n)
Terima kasih kepada Kevin karena telah memangkas 7 byte lagi.
sumber
f(1)
, satu-satunya array yang mungkin dapat dihasilkann=1
adalah[1]
juga ada banyak spasi kosong yang harus dihapus di sini. Ingat ini adalah tantangan kode-golf, jadi tujuannya adalah mencapai bytecount terendahrange(1,n)
->range(n)
Saya percaya harus menyelesaikan bug.return len(s)==n and sum(s)==n*n and s or f(n)
( Coba online 114 byte ).APL (Dyalog Unicode) , 20 byte SBCS
Lambda awalan anonim.
Cobalah online!
{
...}
"dfn";⍵
adalah argumen⍵*2
kuadratkan argumens←
tetapkan kes
(untuk s quare)⍵?
temukann
indeks acak dari 1 ...s
tanpa penggantianc←
ditugaskan untukc
(untuk c andidate)+/
jumlahkan merekas=
dibandingkan dengans
:
jika samac
kembalikan kandidat⋄
lain∇⍵
kembalilah pada argumensumber
APL (Dyalog Classic) , 18 byte
Cobalah online!
menggunakan
⎕io←1
⍳
menghasilkan angka1 2 ... n
(
...)⍣(
...)
terus menerapkan fungsi di sebelah kiri sampai fungsi di sebelah kanan mengembalikan true≢
panjangnya, yaitun
≢?≢×≢
pilihn
bilangan bulat yang berbeda secara acak antara 1 dann
2+.-∘≢
kurangi panjang dari setiap angka dan jumlah0=
jika jumlahnya 0, hentikan perulangan, jika tidak coba lagisumber
MATL ,
1813 byteCobalah online!
sumber
Japt, 12 byte
Cobalah
sumber
à
harus baik-baik saja.Java (JDK) , 127 byte
Cobalah online!
Infinite loop hingga satu set dengan kriteria cocok.
Saya harap Anda punya waktu, karena sangat sloooooow! Bahkan tidak bisa pergi ke 10 tanpa waktu habis.
sumber
if(r.size()==n&s==0)
keif(r.size()+s==n)
.s>0
, jadi ukurannya bisa lebih besar darin
. Ok, dalam kasus itu memang tidak berhasil.n
adalah konstanta, tetapi sayangnya keduanyas
danr.size()
merupakan variabel yang dapat keduanya di bawah atau di atas0
dann
masing - masing.Batch,
182145 bytePenjelasan: Menghitung pick minimum dan maksimum yang diizinkan, mengingat bahwa angka-angka harus diambil dalam urutan menurun, dan memilih nilai acak dalam kisaran. Contoh untuk input
4
:sumber
JavaScript,
647291261260259251239 byteBerkat @Veskah untuk -10 byte pada versi asli dan "Oh yeah, Anda mengeluarkan semua set sedangkan tantangannya meminta yang acak untuk dikembalikan"
Cobalah online!
Buat array
n^2
indeks berbasis 1, sortir array secara acak,n
elemen slice dari array. Sedangkan jumlah elemen acak tidak sama dengann^2
array loop elemen acak; jika jumlah elemen array lebih besar darin^2
dan elemen saat-1
ini tidak sama dengan nol atau elemen saat-1
ini tidak dalam array saat ini, kurangi1
; jika jumlah array kurang darin^2
dan elemen saat+1
ini tidak dalam array, tambahkan1
ke elemen. Jika jumlah array sama dengann^2
break loop, output array.sumber
k++
while
loop mungkin juga dapat direduksi menjadi badan fungsi tunggal yang menerima parameter; dan dapat menggantikan operator bersyarat (ternary) untukif..else
pernyataan tersebut; di antara bagian-bagian lain dari kode yang kemungkinan besar dapat disesuaikan untuk golf; ieg, menghapuslet
pernyataan.if..else
n
?" . menguji hasil yang diharapkan jika algoritma konsisten kembali untukn^2
array output yang dihasilkan dalam satu panggilan ke fungsi, dan secara bersamaan mengingat kemiripan dengan pertanyaan ini N N-dimensi ^ N array yang penuh dengan N .Japt , 20 byte
Cobalah online!
Sangat mengambil keuntungan dari keacakan "Non-seragam", hampir selalu menampilkan
n
angka ganjil pertama , yang terjadi pada jumlahn^2
. Secara teori itu dapat menampilkan set valid lainnya, meskipun saya hanya bisa mengkonfirmasi itu untuk keciln
.Penjelasan:
sumber
Rubi , 46 byte
Cobalah online!
sumber
C (gcc) ,
128125 byteCobalah online!
-3 bytes berkat ceilingcat
CATATAN: Peluangnya sangat jauh dari seragam. Lihat penjelasan untuk apa yang saya maksud dan cara yang lebih baik untuk menguji itu berhasil (dengan membuat distribusi lebih dekat ke seragam [tetapi masih jauh dari itu]).
Bagaimana?
Ide dasarnya adalah hanya memilih angka yang terus bertambah agar tidak khawatir tentang duplikat. Setiap kali kami memilih nomor, kami memiliki peluang tidak-nol untuk 'melewatkannya' jika diizinkan.
Untuk memutuskan apakah kita dapat melewati angka, kita perlu mengetahuiy+ ( y+ 1 ) + ( y+ 2 ) + . . . ditambahkan ke nilai saat ini. Secara khusus kami memerlukan ungkapan di atas kurang dari k ( k + 1 )2+ k ( y+ 1 ) + y< x Sayangnya kita harus sedikit berhati-hati mengatur ulang rumus ini karena pemotongan bilangan bulat dalam C, jadi saya tidak bisa menemukan cara untuk golf itu.
x
jumlah yang tersisa untuk dijangkau,k
jumlah elemen yang masih harus kita gunakan, dany
nilai kandidat saat ini. Jumlah terkecil yang mungkin masih bisa kita pilihx
. Rumusnya adalahMeskipun demikian logikanya adalah memiliki kesempatan untuk membuang apa pun
y
yang memenuhi persamaan di atas.Kode
Trik yang saya sebutkan untuk menguji kode dengan lebih baik melibatkan penggantian
rand()&&
denganrand()%2&&
sehingga ada kemungkinan 50-50 bahwa setiap y yang diberikan dilewati, daripadaRAND_MAX
peluang 1 jika y diberikan digunakan.sumber
p(y),x-=y++)while(rand()&&(i-n)*((~n+i)/2+~y)+y<x)y++;
alih-alih){while(rand()&&(n-i)*(n-i+1)/2+(n-i)*(y+1)+y<x)y++;p(y);x-=y++;}
Bersih , 172 byte
Cobalah online!
sumber
Python (2 atau 3), 84 byte
Cobalah online!
Hits kedalaman rekursi maksimal sekitar l (5)
sumber
Kotlin , 32 byte
Cobalah online!
sumber
Mathematica 40 byte
sumber
RandomChoice@IntegerPartitions[#^2,{#}]&
Bahasa Wolfram (Mathematica) , 49 byte
Cobalah online!
Versi golf oleh @ J42161217.
Bahasa Wolfram (Mathematica) , 62 byte
Cobalah online!
Bagaimana itu bekerja
Terutama didasarkan pada pertanyaan Math.SE ini . Untuk mendapatkan partisin2 ke n bagian yang berbeda, dapatkan partisi n2- ( n2- n ) / 2 = ( n2+ n ) / 2 sebagai gantinya dan tambahkan 0 ⋯ n - 1 untuk setiap elemen. Karena Mathematica memberikan partisi dalam urutan menurun,n - 1 ⋯ 0 ditambahkan sebagai gantinya.
Jawaban untuk Tugas Bonus
Iya nih. Menetapkanp a r t ( n , k ) sebagai jumlah partisi n menjadi tepat k bagian. Maka itu memenuhi hubungan pengulangan berikut:
Anda dapat memahaminya sebagai "Jika sebuah partisi berisi 1, hapus; jika tidak, kurangi 1 dari setiap istilah". Penjelasan lebih lanjut di sini pada pertanyaan Math.SE lain . Dikombinasikan dengan kondisi awalpart(n,1)=1 and n<k⇒part(n,k)=0 , you can compute it with a program. The desired answer will be:
which is, in Mathematica:
Try it online!
sumber
(While[Tr[s=RandomSample[Range[#^2],#]]!=#^2];s)&