Monotonik Bir İşlev Oluşturun


12

genel bakış

Bu zorlukta, göreviniz rastgele iki set arasında monotonik bir matematiksel fonksiyon oluşturmaktır .

Giriş

Girişleriniz iki pozitif tamsayıdır sve n.

Bu girdileri aldıktan sonra, programınız setten ' e rastgele bir matematiksel fonksiyon üretecektir . Başka bir deyişle, ve arasında bir tamsayı dizisi alan ve böyle bir tamsayıyı döndüren bir "kural" dır . Ayrıca, aşağıdaki anlamda monotonik olmalıdır . Eğer ve her iki koordinat için geçerli olan iki grup ise , o zaman .f{0,1,...,s-1}n{0,1,...,s-1}fn0s-1fABnA[i] ≥ B[i]if(A) ≥ f(B)

Monotonik fonksiyonların kesin dağılımı, bu fonksiyonların fher birinin pozitif bir üretilme olasılığı olduğu sürece (mükemmel bir RNG olduğu varsayılarak) önemli değildir.

Çıktı

Çıktınız, girdilerinin ve çıktılarının bir numaralandırması olacaktır f. Tüm ihtiva eder narasındaki tamsayılar -tuples 0ve s-1her biri karşılık gelen çıkış takip eder, bazı sırayla f. Tam çıkış formatı esnektir (akıl içinde).

Örnekler

Girdiler s = 3ve n = 2çıktı üretebilir

(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

Set üzerindeki tüm çiftleri {0, 1, 2}tam olarak bir kez içerir ve her birini f-değer ile takip eder . Monotonite koşulu da yerine getirilmiştir. Tupler burada sözlükbilimsel sırayla verilir, ancak bu gerekli değildir.

Başka bir örnek olarak, s = 2ve n = 4kudreti üretmek

(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

Aşağıdakiler s = 2ve çıkışlar için olası tüm çıktılar n = 2; programınız bunlardan birini rastgele çıkarmalıdır:

(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

Kurallar ve Puanlama

Tam bir program veya işlev yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez. Açıklamalı kod tercih edilir.

Zaman karmaşıklığı konusunda herhangi bir kısıtlama yoktur, ancak çözümünüzün her zaman belirli bir sürede bitmesi garanti edilirse % -15 bonus vereceğim (girişlere bağlı olarak ve sabit zamanda çalışan mükemmel bir RNG varsayarak) .


S = 2 n = 2 gibi küçük bir durum için tüm olası işlevleri tamamen numaralandırırsanız yardımcı olabilir. Rasgeleliğin nasıl devreye gireceğini kavramak için açıklamayı birkaç kez okumak zorunda kaldım.
Sparr

@Sparr İyi fikir; düzenlendi.
Zgarb

sınırlı çalışma zamanı bir gereksinimdir? Monotonik bir çözüm bulana kadar rastgele işlevler üreten bir çözüm düşünüyoruz.
Sparr

@Sparr Sanırım sınırlı çalışma zamanı için bir bonus ekleyeceğim, bu yüzden böyle bir çözüm diskalifiye edilmeyecek.
Zgarb

@Zgarb - belki de bir saat içinde bitmesi ve bitmesi muhtemel çözümler için büyük bir bonus vermelisiniz.
Glen O

Yanıtlar:


4

Pyth, 35 bayt (% 38-15 = daha aşağıda 31,45)

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

gösteri

Girdi şu biçimde:

n
s

Çıktı şu biçimde:

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

Sadece rastgele olasılıklar üretir ve bunları test eder.


Bonus için uygun olduğuna inandığım alternatif 37 baytlık sürüm:

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

gösteri

Bu, tüm olası monotonik fonksiyonları üreterek başlar, daha sonra rastgele bir tane üretir. Çok daha yavaş ve tepesinde 2,2.


Girdi ile güzel bir örnek 3, 2. Ne yazık ki, 3, 3çevrimiçi pyth uygulayıcısında bir yanıt bile almadım . Bu kombinasyon için sonsuz bir döngü var mı ?!
bobbel

@bobbel Çevrimiçi yürütücünün zaman aşımı olduğunu düşünüyorum. Yerel olarak deniyorum.
isaacg

@bobbel Bir infitie döngüsünün çok yavaş olmadığı çok değil. Ayrıca işe yarıyor 2, 4, ama çok fazla değil.
isaacg

@bobbel Daha yavaş bir şey ekledim.
isaacg

1

CJam, 40 bayt -% 15 = 34 bayt

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

Bu yaklaşım tüm geçerli fonksiyonları oluşturur ve ardından rastgele seçer. Çalışma süresi en az O (s 2s n ) , ancak belirli bir giriş için sabittir.

OP'nin aklında olan şeyin bu olduğundan şüpheliyim, ancak belirli bir süre içinde (girişlere bağlı olarak [...]) bitmesi garanti edilir ve bu nedenle bonus için hak kazanır.

CJam yorumlayıcısında çevrimiçi deneyin .


1

Julia, 64 bayt (-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)

Ungolfed:

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

Bu hızlı bir şekilde çalışacak, tek olası sorun yeterince büyük s için hafızada olmak ve n (g (10,10) bir 10 ^ 10 dizisi üretmek zorunda, bu yüzden her sayı olsa bile bellek tükenecek bir bayt, bu 10 gigabayt veri).

Çıkış 1 tabanlı indeksleme olduğundan, belirli bir girişin sonucunu belirlemek için her giriş değerine bir tane eklemeniz gerekir. Örneğin, f'yi (1,2,6,0,3) bulmak için incelemeniz gerekir K[2,3,7,1,4].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.