Saya gandakan sumbernya, Anda (mungkin) gandakan hasilnya!

18

Tugas

Tugas ini adalah untuk menulis sebuah program yang output konsisten tetapi sebaliknya sewenang-wenang bilangan bulat positif x (begitu ketat lebih besar dari 0). Inilah intinya: ketika sumber diulang N kali (kode ditambahkan / digabungkan N1 ke dirinya sendiri), program harus memiliki 1NProbabilitas N untuk menghasilkanNxdan probabilitas yang tersisa dariN1N untuk menghasilkanxtidak berubah.

Contoh

Mari kita asumsikan bahwa sumber awal Anda adalah XYZdan menghasilkan integer 3. Kemudian:

  • Untuk N=2 : XYZXYZharus menghasilkan 3 dengan probabilitas 12 (50% dari waktu) dan23=6dengan probabilitas12 juga (50% dari waktu).

  • Untuk N=3 : XYZXYZXYZharus menghasilkan 3 dengan probabilitas 23 (66.666% dari waktu) dan33=9dengan probabilitas13 (33,333% dari waktu)

  • Untuk N=4 : XYZXYZXYZXYZharus menghasilkan 3 dengan probabilitas 34 (75% dari waktu) dan43=12 dengan probabilitas14 (25% dari waktu)

dan seterusnya....

Aturan

Catatan: Tantangan ini adalah versi yang lebih sulit dari ini .

Tuan Xcoder
sumber
Bisakah program membaca kode sumbernya?
kata ganti saya adalah monicareinstate
3
@ seseorang Ya, itu diizinkan.
Tn. Xcoder

Jawaban:

16

R , 66 35 byte

-29 byte terima kasih untuk digEmAll .

-2 byte terima kasih kepada Giuseppe .

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

Cobalah online!

Periksa distribusi untuk N = 4.

Kuncinya adalah tugas ke kanan ->. Ketika kode ini dikalikan N kali, panggilan N1 pertama sampleakan ditetapkan A, dan hanya panggilan terakhir yang akan dicetak.

Asli, solusi yang lebih berbelit-belit:

R , 66 byte

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

Cobalah online!

Coba online (diulang 3 kali)!

Menggunakan dua trik: 1) memanggil fungsi utama yang menarik ?, sehingga kita dapat memanggilnya tanpa mengakhiri program dengan braket, dan 2) menggunakan variabel Tdan TT, dengan kode yang dimulai dengan Tdan diakhiri dengan ?T.

Fadalah penghitung iterasi. ?didefinisikan ulang sebagai fungsi yang mengambil argumen boolean: jika inputnya ?adalah TRUE(atau T), ia melakukan pengambilan sampel acak yang diperlukan; jika inputnya adalah FALSE(atau 0), itu tidak melakukan apa-apa. Nilai TTdidefinisikan sebagai 0, sehingga ?Tmelakukan pengambilan sampel tetapi ?TTtidak melakukan apa pun.

Ketika sumber diulang, terlihat seperti ini:

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

jadi panggilan tengah ?TTtidak menghasilkan apa-apa selain panggilan akhir ?Tmenghasilkan hasil acak.

Robin Ryder
sumber
5
Saya tidak berpikir saya pernah melihat ->digunakan dalam kode golf dalam situasi di mana <-tidak bisa; ini sangat keren!!
Giuseppe
PS Saya akan memberikan hadiah ini di beberapa titik.
Giuseppe
2
Sangat menakjubkan!
digEmAll
@ DigEmall Banyak yang lebih rapi, terima kasih!
Robin Ryder
11

Python 3 , 81 79 byte

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

Cobalah online!

-1 byte terima kasih kepada @Nishioka

Ini adalah salah satu solusi Python 3 yang tidak mengakses sumber program secara langsung. Melakukan ini dalam Python 3 lebih menantang daripada Python 2 karena pernyataan pencetakan normal diakhiri dengan tanda kurung tutup sehingga tidak ada banyak pilihan untuk mengubah perilakunya di blok sumber awal berikutnya. Akan menarik untuk melihat lebih banyak solusi kreatif dalam Python 3.

Joel
sumber
-1 byte:+0 if[]else 1
Nishioka
@Nishioka Terima kasih. Diperbarui.
Joel
11

Bash , 31 byte

trap echo\ $[RANDOM%++n?1:n] 0;

Cobalah online!

trap ... 0akan menjalankan kode yang terdapat pada saat keluar. Berulang trapakan menimpa yang lama. Tanda kutip $[arithmetic expansion]dijalankan setiap kali perangkap baru diatur.


Zsh dapat menyimpan satu byte dengan <<<:

trap "<<<$[RANDOM%++n?1:n]" 0;
Fungsi Gamma
sumber
4

Python 3 , 78 76 75 byte

Menggunakan trik yang sama seperti pada tautan yang diposting, ini Python (dengan x = 1).

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

Cobalah online!

-2 byte terima kasih kepada Tn. Xcoder untuk (n-1)formulanya ~-nyang memiliki prioritas lebih tinggi dari *
-1 byte berkat Nishioka

Pâris Douady
sumber
1
Terlihat bagus untukku! import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#harus bekerja untuk -2 byte
Tn. Xcoder
1
Saya belum pernah melihat cara melakukan n-1 ini! Saya suka, terima kasih :)
Pâris Douady
1
-1 byte: tio.run/##K6gsycjPM/7/…
Nishioka
-1 byte lain tetapi dengan pendekatan yang sedikit berbeda: tio.run/##K6gsycjPM/7/…
Nishioka
ya saya lakukan karena random()<1/n;-)
Pâris Douady
4

Dyalog APL, 25 24 23 22 21 byte

0{×⍺:1+⍵⋄⎕←1⌈⍵×1=?⍵}1

Cobalah online!

dzaima
sumber
3

Gaia , 17 15 14 13 byte

Øgl13÷:(1w&+ṛ

Cobalah online!

Saya secara acak memperhatikan perilaku Øgkemarin ketika melihat melalui dokumen, yang sangat membantu.

Giuseppe
sumber
3

Perl 5, 28 26 byte

-2 byte terima kasih kepada @Grimy

1 if!++$x;say 1<rand$x||$x

TIO

Nahuel Fouilleul
sumber
26:1 if!++$x;say 1<rand$x||$x
Grimmy
terima kasih, variasi yang bagus
Nahuel Fouilleul
2

Pesona Rise , 31 byte

UwR'10<;$\
I+:'RA0)?/1$;
1
l;
y

Cobalah online!

Gunakan struktur yang sama dengan jawaban ini untuk menghitung berapa kali sumber telah digandakan:

Alur eksekusi

Hanya alih-alih mengeluarkan nomor ke-n dalam daftar, kami menggunakan nilai itu untuk secara acak menghasilkan angka, jika hasilnya bukan 0, cetak 1, atau cetak nomor itu.

Draco tidak lagi percaya pada SE
sumber
2

Japt , 9 8 byte

(°Tö)ΪT

Uji itu | Gandakan | Tripled,
Verifikasi distribusi 10.000 kali setelah 10 kali

(°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

Asli, 13 11 10 9 byte

Perhatikan ruang trailing.

NoÎp°T ö 

Uji itu | Gandakan | Tripled,
Verifikasi distribusi 10.000 kali setelah 10 kali

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
Shaggy
sumber
2

JavaScript ( JavaScript shell 71 ), 78 byte

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

Tidak ada tautan tio, spidermonkey di tio terlalu tua ...

Firefox (Spidermonkey) menganggap komentar sebagai bagian dari fungsi f. Hasilnya, (''+f).lengthakan menjadib+79n tempat b <78, dan (n +1) adalah waktu kode sumber diulang.

Buggy ini (? Saya tidak yakin. Saya lebih suka bug dari spesifikasi JavaScript daripada interpreter mana pun ) perilaku telah dikirimkan ke BMO oleh orang lain tepat setelah jawaban ini diposting: https://bugzilla.mozilla.org/ show_bug.cgi? id = 1579792 . (Baik dari bmo thread maupun tweet yang diposting oleh saya.)

tsh
sumber
Ada apa dengan ini (async x=>x)()? Mengapa async?
Tomáš Zato - Reinstate Monica
@ TomášZato Secara harfiah asynchronous. Jadi panggilan balik x=>f(...)akan dipanggil setelah fungsi fdidefinisikan.
tsh
1

C # (Visual C # Interactive Compiler) , 133 114 112 byte

Ini adalah pertama (dan mudah-mudahan terakhir) saya pernah menggunakan arahan C # preprocessor.

#if!I
#define I
static int i;
class p{~p()=>Console.Write(new Random().Next(i)<1?i:1);}p s=new p();
#endif
i++;

Cobalah online!

kata ganti saya adalah monicareinstate
sumber
1

Arang , 12 byte

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

Cobalah online! Berdasarkan jawaban saya untuk pertanyaan terkait. Keluaran ndengan probabilitas ¹/ₙ, jika tidak 1. Penjelasan:

⎚               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
Neil
sumber