Kaynağı çarparım, siz (muhtemelen) çıktıyı çarparsınız!


18

Görev

Görev, tutarlı ama aksi takdirde keyfi bir pozitif tamsayı x (kesinlikle 0'dan büyük) çıkaran bir program yazmaktır . İşte püf noktası da burası: Kaynak tekrarlandığında N kez (kod / eklenen birleştirilmiş N1 kendisine), program olmalı 1N çıkma olasılığıNxve kalanN-1olasılığıN1Nxçıkışının N değerideğişmedi.

Misal

İlk kaynağınızın XYZtamsayı olduğunu ve ürettiğini varsayalım 3. Sonra:

  • İçin N=2 : XYZXYZçıktılayacaktır 3 bir olasılık ile 12 (zamanın% 50'si) ve23=6 olasılıkla 12 (zamanın% 50'si).

  • İçin N=3 : XYZXYZXYZçıktılayacaktır 3 bir olasılık ile 23 (zamanın% 66.666'sı) ve33=9olasılıkla13=913 (Zamanın% 33.333)

  • İçin N=4 : XYZXYZXYZXYZçıktılayacaktır 3 bir olasılık ile 34 (zamanın% 75'i) ve43=12 ,1olasılık ile14 (zamanın% 25'i)

ve bunun gibi....

kurallar

  • Tam bir program oluşturmalısınız . Çıktı STDOUT'a yazdırılmalıdır.

  • Programınız, teorik olarak, her bir olası değeri yukarıda belirtilen olasılıklarla vermelidir, ancak rastgele uygulama nedeniyle bundan küçük bir sapma iyidir ( uygulamanın farklı bir dağıtım olmaması şartıyla - normal dağıtım bayt sayısı ) .

  • Program (yine teorik olarak) keyfi olarak büyük bir N değeri için çalışmalıdır , ancak hassasiyet nedeniyle teknik sınırlamalar büyük N için iyidir .

  • Çıktı taban 10'da olmalıdır (başka bir tabanda çıktı almak veya bilimsel gösterimle yasaktır). Sondaki / öndeki boşluklara ve önde gelen sıfırlara izin verilir.

  • Başlangıç ​​kaynağı (elbette) en az 1 bayt uzunluğunda olmalıdır. Sen olabilir değil Kaynağınızın kopyaları arasında bir yeni satır varsayalım. Program girdi almamalıdır (veya kullanılmayan, boş bir girdi içermemelidir).

  • Bu , bu nedenle bir yanıtın puanı, (orijinal) kaynağın bayt cinsinden uzunluğudur ve daha düşük bir puan daha iyidir.

Not: Bu sorun bir (çok) daha sert versiyonu bu bir .


Program kaynak kodunu okuyabilir mi?
benim zamirim monicareinstate

3
@someone Evet, izin verilir.
Bay Xcoder

Yanıtlar:


16

R , 66 35 bayt

DigEmAll sayesinde -29 bayt .

Giuseppe sayesinde -2 bayt .

+0->A
x=!0:F
F=F+1
sample(F*x+!x,1)

Çevrimiçi deneyin!

N = 4 için dağılımı kontrol edin.

Anahtar doğru atamadır ->. Kod çarpıldığında N- kez, ilk N-1 çağrı sampleatanacakA ve yalnızca son çağrı yazdırılır.

Orijinal, daha kıvrımlı çözüm:

R , 66 bayt

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

Çevrimiçi deneyin!

Çevrimiçi deneyin (3 kez tekrarlayın)!

İki numara kullanır: 1) ilgilendiğiniz ana işlevi çağırır ?, böylece programı bir parantezle sonlandırmadan çağırabiliriz ve 2) değişkenleri kullanır Tve TTile başlayan Tve biten kodla?T .

Fyineleme sayacıdır. ?bir Boole bağımsız değişken alan bir fonksiyon olarak yeniden tanımlanır: giriş halinde ?olan TRUE(ya da T), gerekli rastgele örnekleme yapar; giriş FALSE(veya 0) ise hiçbir şey yapmaz. Değeri TTolarak tanımlanır 0, böylece?T örnekleme yapar ama ?TThiçbir şey yapmaz.

Kaynak tekrarlandığında, şuna benzer:

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?TT->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

böylece orta çağrı ?TThiçbir şey çıkarmaz ancak son çağrı ?Trastgele sonuç verir.


5
Ben hiç olamazdı ->bir durumda kod golf kullanılan gördüm sanmıyorum <-; bu çok havalı!!
Giuseppe

PS: Bir noktada bunu ödüllendireceğim.
Giuseppe

2
Kesinlikle harika!
digEmAll


@digEmAll Çok daha temiz, teşekkürler!
Robin Ryder

11

Python 3 , 81 79 bayt

+0if[]else 1
from random import*
try:n+=1
except:n=1
print([1,n][random()*n<1])

Çevrimiçi deneyin!

@Nishioka sayesinde -1 bayt

Bu, program kaynağına doğrudan erişmeyen bir Python 3 çözümüdür. Python 3'te bunu yapmak Python 2'den daha zordur çünkü normal yazdırma ifadeleri kapanış paranteziyle biter, bu nedenle başlangıç ​​kaynağının bir sonraki bloğundaki davranışını değiştirmek için çok fazla seçenek yoktur. Python 3'te daha yaratıcı çözümler görmek ilginç olurdu.


-1 bayt:+0 if[]else 1
Nishioka

@Nishioka Teşekkürler. Güncellenmiş.
Joel




4

Python 3 , 78 76 75 bayt

Gönderilen bağlantıdakiyle aynı hileyi kullanarak , burada bir Python olanı (x = 1 ile).

from random import*;n=len(*open(__file__))//75;print(1+~-n*(random()<1/n))#

Çevrimiçi deneyin!

-1 bayttan daha yüksek önceliğe sahip (n-1)formülü için Bay Xcoder'a Nishioka sayesinde -2 bayt~-n*


1
Bana iyi görünüyor! import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#-2 bayt için çalışmalı
Bay Xcoder

1
N-1 yapmanın bu yolunu hiç görmemiştim!
Beğendim


Başka bir -1 bayt ama biraz farklı bir yaklaşımla: tio.run/##K6gsycjPM/7/…
Nishioka

Evet random()<1/n;-) yüzünden yapıyorum
Pâris Douady


3

Gaia, 17 15 14 13 bytes

Øgl13÷:(1w&+ṛ

Try it online!

I randomly noticed the behavior of Øg yesterday when looking through the docs, which helped immensely.





2

Japt , 9 8 bayt

(°Tö)ΪT

Test edin | İki katına | Üçlü
10 tekrardan sonra 10000 çalıştırma dağılımını doğrulayın

(°Tö)ΪT
(            :Prevent the operator that follows from being implicitly applied to the first input variable, U
 °T          :Increment T (initially 0) by 1
   ö         :Random element in the range [0,T)
    )        :Closing the parentheses here instead of after the T saves a byte as there would need to be a space here to close the random method
     Î       :Sign - 0 (falsey) or 1 (truthy)
      ªT     :Logical OR with current value of T

Orijinal, 13 11 10 9 bytes

Sondaki boşluğa dikkat edin.

NoÎp°T ö 

Test edin | İki katına | Üçlü
10 tekrardan sonra 10000 çalıştırma dağılımını doğrulayın

NoÎp°T ö 
N             :Initially, the (empty) array of inputs
 o            :Replace the last element with
  Î           :  Its sign (always 1)
   p          :Push
    °T        :  T (initially 0) incremented
       ö      :Random element of N

2

JavaScript ( JavaScript kabuğu 71 ), 78 bayt

(async x=>x)().then(x=>f((''+f).length/78));f=x=>print(1-~x*Math.random()|0)//

Tio bağlantısı yok, tio'daki spidermonkey çok eski ...

Firefox (Spidermonkey) yorumu işlevin bir parçası olarak görür f. Sonuç olarak, (''+f).lengtholacakb+79n b <78, ve (n + 1) tekrar kaynak kodu katı olduğu.

This buggy (? I'm not sure. I would prefer it is a bug of JavaScript specification rather than any interpreter) behavior had been submit to BMO by someone else just after this answer posted: https://bugzilla.mozilla.org/show_bug.cgi?id=1579792 . (Neither of the bmo thread nor the tweet is posted by me.)


What's with the (async x=>x)()? Why is it async?
Tomáš Zato - Reinstate Monica

@TomášZato It is literally asynchronous. So the callback x=>f(...) will be invoked after function f been defined.
tsh


1

Charcoal, 12 bytes

⎚I⎇‽L⊞Oυω¹Lυ

Try it online! Based on my answer to the linked question. Outputs n with probability ¹/ₙ, otherwise 1. Explanation:

⎚               Remove output from previous iterations
       υ        Initially empty list
        ω       Empty string
     ⊞O         Push
    L           Length
   ‽            Random integer [0..length)
  ⎇             Ternary
         ¹      If nonzero then literal 1
          Lυ    If zero then the new length
 I              Cast to string for implicit print
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.