Tôi nhân nguồn, bạn (có thể) nhân sản lượng!


18

Bài tập

Nhiệm vụ là viết một chương trình đưa ra một số nguyên dương nhất quán nhưng khác tùy ý (vì vậy lớn hơn 0). Đây là cách nắm bắt: khi nguồn được lặp lại lần (mã được nối / nối với chính nó), chương trình sẽ có xác suất xuất ra và xác suất còn lại là xuất ra không thay đổi.xNN11NNxN-1Nx

Thí dụ

Giả sử rằng nguồn ban đầu của bạn là XYZvà tạo ra số nguyên 3. Sau đó:

  • Với : nên xuất với xác suất (50% thời gian) và với xác suất cũng vậy (50 % thời gian).N= =2XYZXYZ31223= =612

  • Với : nên xuất với xác suất (66,666% thời gian) và với xác suất (33.333% thời gian)N= =3XYZXYZXYZ32333= =913

  • Với : nên xuất với xác suất (75% thời gian) và với xác suất (25% của thời gian)N= =4XYZXYZXYZXYZ33443= =1214

và như thế....

Quy tắc

Lưu ý: Thách thức này là một (nhiều) phiên bản khó của một này .


Chương trình có thể đọc mã nguồn của nó không?
đại từ của tôi là monicareinstate

3
@someone Vâng, nó được cho phép.
Ông Xcoder

Câu trả lời:


16

R , 66 35 byte

-29 byte nhờ digEmAll .

-2 byte nhờ Giuseppe .

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

Hãy thử trực tuyến!

Kiểm tra phân phối cho N = 4.

Chìa khóa là sự phân công đúng ->. Khi mã được nhân lần, các cuộc gọi đầu tiên sẽ được chỉ định và chỉ cuộc gọi cuối cùng sẽ được in.NN-1sampleA

Giải pháp nguyên bản, phức tạp hơn:

R , 66 byte

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

Hãy thử trực tuyến!

Hãy thử trực tuyến (lặp lại 3 lần)!

Sử dụng hai thủ thuật: 1) gọi hàm chính của mối quan tâm ?, để chúng ta có thể gọi nó mà không kết thúc chương trình bằng dấu ngoặc và 2) sử dụng các biến TTT, với mã bắt đầu bằng Tvà kết thúc bằng ?T.

Flà bộ đếm lặp. ?được định nghĩa lại như một chức năng mà phải mất một tham số boolean: nếu đầu vào của ?TRUE(hoặc T), nó sẽ thực hiện lấy mẫu ngẫu nhiên được yêu cầu; nếu đầu vào là FALSE(hoặc 0), nó không làm gì cả. Giá trị của TTđược định nghĩa là 0, do đó, ?Tviệc lấy mẫu nhưng ?TTkhông làm gì cả.

Khi nguồn được lặp lại, nó trông như thế này:

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

do đó, cuộc gọi giữa sẽ ?TTkhông có gì ngoài cuộc gọi cuối cùng tạo ?Tra kết quả ngẫu nhiên.


5
Tôi không nghĩ rằng tôi đã từng thấy ->được sử dụng trong môn đánh gôn trong tình huống <-không thể xảy ra; tuyệt quá
Giuseppe

PS tôi sẽ đưa tiền thưởng này vào một lúc nào đó.
Giuseppe

2
Thật tuyệt vời!
digEmAll


@digEmAll gọn gàng hơn nhiều, cảm ơn!
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])

Hãy thử trực tuyến!

-1 byte nhờ @Nishioka

Đây là một giải pháp Python 3 không truy cập trực tiếp vào nguồn chương trình. Làm điều này trong Python 3 khó khăn hơn Python 2 vì các câu lệnh in bình thường kết thúc bằng dấu ngoặc đơn đóng nên không có nhiều lựa chọn để thay đổi hành vi của nó trong khối nguồn ban đầu tiếp theo. Sẽ rất thú vị khi xem các giải pháp sáng tạo hơn trong Python 3.


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

@Nishioka Cảm ơn. Cập nhật.
Joel




4

Python 3 , 78 76 75 byte

Sử dụng thủ thuật tương tự như trong liên kết đã được đăng, đây là một Python (với x = 1).

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

Hãy thử trực tuyến!

-2 byte nhờ ông Xcoder cho (n-1)công thức của mình ~-ncó độ ưu tiên cao hơn *
-1 byte nhờ Nishioka


1
Co vẻ tôt vơi tôi! import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#nên hoạt động với -2 byte
Ông Xcoder

1
Tôi chưa bao giờ thấy cách làm này n-1! Tôi thích nó, cảm ơn :)
Pâris Douady


Một byte -1 khác nhưng với cách tiếp cận khác một chút: tio.run/##K6gsycjPM/7/ Khăn
Nishioka

vâng tôi làm vì random()<1/n;-)
Pâris Douady





2

Bùa mê , 31 byte

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

Hãy thử trực tuyến!

Sử dụng cấu trúc tương tự như câu trả lời này để đếm số lần nguồn được sao chép:

Luồng thực thi

Thay vì xuất số thứ n trong danh sách, chúng tôi sử dụng giá trị đó để tạo ngẫu nhiên một số, nếu kết quả không phải là 0, hãy in 1, nếu không thì in số đó.


2

Japt , 9 8 byte

(°Tö)ΪT

Kiểm tra nó | Nhân đôi | Xác nhận gấp ba lần
phân phối 10000 lần chạy sau 10 lần lặp lại

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

Bản gốc, 13 11 10 9 byte

Lưu ý không gian dấu.

NoÎp°T ö 

Kiểm tra nó | Nhân đôi | Xác nhận gấp ba lần
phân phối 10000 lần chạy sau 10 lần lặp lại

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 shell 71 ), 78 byte

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

Không có liên kết tio, spidermonkey trên tio đã quá cũ ...

Firefox (Spidermonkey) coi nhận xét là một phần của chức năng f. Kết quả là(''+f).length sẽ là b+79nnơi b <78 và (n + 1) là số lần mã nguồn được lặp lại.

Lỗi này (? Tôi không chắc chắn. Tôi thích đó là lỗi của đặc tả JavaScript hơn là bất kỳ trình thông dịch nào ) đã được gửi cho BMO bởi người khác ngay sau khi câu trả lời này được đăng: https://bugzilla.mozilla.org/ show_orms.cgi? id = 1579792 . (Cả chủ đề bmo và tweet đều không được đăng bởi tôi.)


Có chuyện gì với (async x=>x)()? Tại sao nó không đồng bộ?
Tomáš Zato - Phục hồi Monica

@ TomášZato Đó là nghĩa đen async. Vì vậy, cuộc gọi lại x=>f(...)sẽ được gọi sau khi chức năng fđược xác định.
tsh


1

Than , 12 byte

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

Hãy thử trực tuyến! Dựa trên câu trả lời của tôi cho câu hỏi liên kết. Đầu ra nvới xác suất ¹/ₙ, nếu không 1. Giải trình:

⎚               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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.