Hasilkan Fungsi Monotonik

12

Gambaran

Dalam tantangan ini, tugas Anda adalah secara acak menghasilkan fungsi matematika monoton antara dua set.

Memasukkan

Input Anda adalah dua bilangan bulat positif sdan n.

Setelah mendapatkan input ini, program Anda akan menghasilkan fungsi matematika acakf dari set ke . Dengan kata lain, adalah "aturan" yang mengambil -tuple bilangan bulat antara dan , dan mengembalikan satu bilangan bulat tersebut. Selain itu, harus monoton dalam pengertian berikut. Jika dan dua- tuple seperti itu berlaku untuk setiap koordinat , maka .{0,1,...,s-1}n{0,1,...,s-1}fn0s-1fABnA[i] ≥ B[i]if(A) ≥ f(B)

Distribusi tepat dari fungsi monotonik ftidak masalah, selama masing-masing fungsi tersebut memiliki probabilitas positif yang dihasilkan (dengan asumsi RNG sempurna).

Keluaran

Output Anda akan menjadi enumerasi input dan output dari f. Ini harus berisi semua n-tupel bilangan bulat di antara 0dan s-1dalam beberapa urutan, masing-masing diikuti oleh output yang sesuai dari f. Format output yang tepat fleksibel (sesuai alasan).

Contohnya

Input s = 3dan n = 2mungkin menghasilkan output

(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 0
(1, 1) 1
(1, 2) 2
(2, 0) 1
(2, 1) 1
(2, 2) 2

Ini berisi semua pasangan di atas set {0, 1, 2}tepat sekali, dan masing-masing diikuti oleh nilai- fnya. Kondisi monotonisitas juga terpenuhi. Tupel diberikan di sini dalam urutan leksikografis, tetapi ini tidak perlu.

Sebagai contoh lain, s = 2dan n = 4mungkin menghasilkan

(0, 0, 0, 0) 0
(0, 0, 0, 1) 0
(0, 0, 1, 0) 0
(0, 0, 1, 1) 0
(0, 1, 0, 0) 1
(0, 1, 0, 1) 1
(0, 1, 1, 0) 1
(0, 1, 1, 1) 1
(1, 0, 0, 0) 0
(1, 0, 0, 1) 1
(1, 0, 1, 0) 0
(1, 0, 1, 1) 1
(1, 1, 0, 0) 1
(1, 1, 0, 1) 1
(1, 1, 1, 0) 1
(1, 1, 1, 1) 1

Berikut ini adalah semua output yang mungkin untuk s = 2dan n = 2(hingga penataan ulang tupel); program Anda harus secara acak menampilkan salah satunya:

(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 0
-------
(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 0
(1,0) 1
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 1
(1,1) 1
-------
(0,0) 1
(0,1) 1
(1,0) 1
(1,1) 1

Aturan dan Penilaian

Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan. Kode dengan penjelasan lebih disukai.

Tidak ada batasan pada kompleksitas waktu, tetapi saya akan memberikan bonus -15% jika solusi Anda selalu dijamin selesai dalam jumlah waktu tertentu (tergantung pada input, dan dengan asumsi RNG sempurna yang berjalan dalam waktu konstan) .

Zgarb
sumber
Mungkin membantu jika Anda benar-benar menghitung semua fungsi yang mungkin untuk kasus kecil seperti s = 2 n = 2. Saya harus membaca deskripsi beberapa kali untuk memahami bagaimana keacakan akan ikut bermain.
Sparr
@Parr Ide bagus; diedit.
Zgarb
adalah persyaratan runtime yang dibatasi? Saya merenungkan solusi yang menghasilkan fungsi acak hingga menemukan yang monoton.
Sparr
@Parr Saya pikir saya akan menambahkan bonus untuk runtime terbatas, sehingga solusi seperti itu tidak akan didiskualifikasi.
Zgarb
@Zgarb - mungkin Anda harus membuat bonus besar untuk solusi yang dibatasi dan kemungkinan selesai dalam waktu satu jam.
Glen O

Jawaban:

4

Pyth, 35 byte (38 - 15% = 31,45 lebih jauh ke bawah)

#I!sm><FhMds<MCeMd^JC,mOQK^UQvzK2JB

Demonstrasi

Input dalam format:

n
s

Output dalam format:

[[value, tuple], [value, tuple], ...]

Cukup membuat kemungkinan acak dan mengujinya.


Alternatif versi 37 byte yang saya yakin memenuhi syarat untuk bonus:

Of!sm><FhMds<MCeMd^T2mC,d^UQvz^UQ^Qvz

Demonstrasi

Ini dimulai dengan menghasilkan semua fungsi monotonik yang mungkin, kemudian mengeluarkannya secara acak. Ini jauh lebih lambat, dan paling disukai 2,2.

isaacg
sumber
Contoh yang bagus dengan input 3, 2. Sayangnya, saya bahkan tidak mendapat respons 3, 3dari pelaksana pyth online. Apakah ada loop tanpa akhir untuk kombinasi ini ?!
bobbel
@ Bobbel Eksekusi online memiliki batas waktu, saya pikir. Saya mencobanya secara lokal.
isaacg
@Bobbel Ini bukan loop infitie yang sangat lambat. Ini juga berfungsi untuk 2, 4, tetapi tidak banyak lagi.
isaacg
@ Bob Saya menambahkan sesuatu yang lebih lambat.
isaacg
1

CJam, 40 byte - 15% = 34 byte

q~1$\m*\1$,m*{W$\.+2m*{:.<2b}%1&!},mR]zp

Pendekatan ini menghasilkan semua fungsi yang valid dan kemudian memilih secara acak. Run time setidaknya O (s 2s n ) , tetapi konstan untuk input yang diberikan.

Saya ragu inilah yang ada dalam pikiran OP, tetapi dijamin akan selesai dalam waktu tertentu (tergantung pada input [...]) dan karenanya memenuhi syarat untuk bonus.

Cobalah online di penerjemah CJam .

Dennis
sumber
1

Julia, 64 byte (-15% = 54,4)

g(s,n)=(K=rand(0:s-1,ntuple(n,i->s));for i=1:n K=sort(K,i)end;K)

Tidak Disatukan:

function g(s,n)
  # Generates a random n-dimensional array with s per dimension
  # and all values being integers between 0 and s-1
  K=rand(0:s-1,ntuple(n,i->s))
  # Loop over the various dimensions
  for i=1:n
    # Sort in the current dimension
    K=sort(K,i)
  end
  return K
end

Ini akan berjalan dengan cepat, dengan satu-satunya masalah yang mungkin terjadi dengan memori untuk s dan n yang cukup besar (g (10,10) harus menghasilkan array 10 ^ 10, jadi jelas itu akan kehabisan memori - bahkan jika setiap nomor adalah satu byte, itu 10 gigabytes data).

Output adalah pengindeksan berbasis 1, jadi untuk menentukan hasil untuk input yang diberikan, Anda perlu menambahkan satu untuk setiap nilai input. Misalnya, untuk menemukan f (1,2,6,0,3), Anda perlu memeriksa K[2,3,7,1,4].

Glen O
sumber