ฉันคูณแหล่งที่มาคุณ (อาจ) เอาท์พุทคูณ!


18

งาน

ภารกิจคือการเขียนโปรแกรมที่ให้ผลลัพธ์เป็นจำนวนเต็มบวก แต่อย่างอื่นโดยพลการx (ให้มากกว่า 0 อย่างเคร่งครัด) นี่คือสิ่งที่จับได้: เมื่อแหล่งที่มาถูกทำซ้ำNครั้ง (รหัสถูกผนวกเข้า / ตัดแบ่งN1เข้ากับตัวมันเอง) โปรแกรมควรมี1Nความน่าจะเป็น Nของเอาต์พุตNxและความน่าจะเป็นที่เหลืออยู่ของN1Nของเอาต์พุตxไม่เปลี่ยนแปลง

ตัวอย่าง

สมมติว่าแหล่งเริ่มต้นของคุณและผลิตจำนวนเต็มXYZ 3แล้ว:

  • สำหรับN=2 : XYZXYZควรแสดงผลลัพธ์3ด้วยความน่าจะเป็น12 (50% ของเวลา) และ23=6โดยมีความน่าจะเป็น12เช่นกัน (50% ของเวลา)

  • สำหรับN=3 : XYZXYZXYZควรแสดงผลลัพธ์3ด้วยความน่าจะเป็นที่23 (66.666% ของเวลา) และ33=9โดยมีความน่าจะเป็น13 (33.333% ของเวลา)

  • สำหรับN=4 : XYZXYZXYZXYZควรแสดงผลลัพธ์3ด้วยความน่าจะเป็น34 (75% ของเวลา) และ43=12 โดยมีความน่าจะเป็น14 (25% ของเวลา)

และอื่น ๆ ....

กฎระเบียบ

หมายเหตุ: ความท้าทายนี้เป็น (มาก) เวอร์ชั่นยากของคนนี้


โปรแกรมสามารถอ่านซอร์สโค้ดของมันได้หรือไม่?
สรรพนามของฉันคือ monicareinstate

3
@someone ใช่ได้รับอนุญาตแล้ว
Mr. Xcoder

คำตอบ:


16

R , 66 35 ไบต์

-29 ไบต์ขอบคุณdigEmAll digEmAll

-2 ไบต์ขอบคุณที่จูเซปเป้

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

ลองออนไลน์!

ตรวจสอบการแจกแจงสำหรับ N = 4

->ที่สำคัญคือการกำหนดชี้ไปทางขวา เมื่อรหัสถูกคูณNครั้งการโทรN1แรกsampleจะถูกกำหนดให้Aและจะพิมพ์เฉพาะการโทรครั้งสุดท้ายเท่านั้น

โซลูชันที่ซับซ้อนและเป็นต้นฉบับมากขึ้น:

R , 66 ไบต์

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

ลองออนไลน์!

ลองออนไลน์ (ซ้ำ 3 ครั้ง)!

ใช้สองเทคนิค: 1) เรียกฟังก์ชันหลักที่น่าสนใจ?เพื่อให้เราสามารถเรียกมันได้โดยไม่ต้องจบโปรแกรมด้วยวงเล็บและ 2) ใช้ตัวแปรTและTTด้วยรหัสที่ขึ้นต้นด้วยTและลงท้ายด้วย?Tและจบลงด้วย

Fเป็นตัวนับการวนซ้ำ ?ถูกนิยามใหม่เป็นฟังก์ชันซึ่งรับอาร์กิวเมนต์บูลีน: ถ้าอินพุตของ?คือTRUE(หรือT) จะทำการสุ่มตัวอย่างแบบสุ่มที่ต้องการ ถ้าอินพุตคือFALSE(หรือ0) มันจะไม่ทำอะไรเลย ค่าของTTถูกกำหนดเป็น0เพื่อ?Tทำการสุ่มตัวอย่าง แต่?TTไม่ทำอะไรเลย

เมื่อแหล่งที่มาซ้ำแล้วซ้ำอีกมันจะเป็นดังนี้:

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

ดังนั้นเสียงกลางจะ?TTไม่แสดงอะไรเลยนอกจากเสียงเรียกสุดท้ายจะให้?Tผลลัพธ์แบบสุ่ม


5
ฉันไม่คิดว่าฉันเคยเห็น->ใช้ในการเล่นกอล์ฟในสถานการณ์ที่<-ไม่สามารถทำได้ มันเจ๋งมาก !!
Giuseppe

ป.ล. ฉันจะให้รางวัลนี้ในบางจุด
Giuseppe

2
ยอดเยี่ยมอย่างแน่นอน!
digEmAll


@digEmAll ขอบคุณมากขอบคุณ!
Robin Ryder

11

Python 3 , 81 79 ไบต์

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

ลองออนไลน์!

-1 ไบต์ขอบคุณ @Nishioka

นี่เป็นโซลูชัน Python 3 หนึ่งที่ไม่สามารถเข้าถึงแหล่งโปรแกรมโดยตรง การทำสิ่งนี้ใน Python 3 มีความท้าทายมากกว่า Python 2 เนื่องจากข้อความสั่งพิมพ์ปกติจบลงด้วยวงเล็บปิดดังนั้นจึงไม่มีทางเลือกมากมายในการเปลี่ยนพฤติกรรมในบล็อกถัดไปของแหล่งข้อมูลเริ่มต้น มันน่าสนใจที่จะเห็นโซลูชั่นที่สร้างสรรค์มากขึ้นใน Python 3


-1 ไบต์:+0 if[]else 1
Nishioka

@Nishioka ขอบคุณ Updated
Joel

11

Bash , 31 ไบต์

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

ลองออนไลน์!

trap ... 0จะเรียกใช้รหัสที่มีอยู่เมื่อออกจาก traps ซ้ำจะเขียนทับเก่า unquote $[arithmetic expansion]จะทำงานทุกครั้งที่มีการตั้งค่ากับดัก


Zsh สามารถบันทึกหนึ่งไบต์ด้วย<<<:

trap "<<<$[RANDOM%++n?1:n]" 0;



4

Python 3 , 78 76 75 ไบต์

ใช้เคล็ดลับแบบเดียวกับในลิงค์ที่โพสต์นี่คือ Python (ที่มี x = 1)

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

ลองออนไลน์!

ขอขอบคุณ Mr. Xcoder -2 ไบต์สำหรับ(n-1)สูตรของเขา~-nซึ่งมีความสำคัญมากกว่า*
-1 ไบต์ขอบคุณ Nishioka


1
ดูดีกับผม! import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#ควรทำงานสำหรับ -2 bytes
Mr. Xcoder

1
ฉันไม่เคยเห็นวิธีนี้ในการทำ n-1! ฉันชอบมันขอบคุณ :)
Pâris Douady

1
-1 ไบต์: tio.run/##K6gsycjPM/7/…
Nishioka

อีก -1 ไบต์ แต่ด้วยวิธีที่แตกต่างกันเล็กน้อย: tio.run/##K6gsycjPM/7/…
Nishioka

ใช่ฉันทำเพราะrandom()<1/n;-)
Pâris Douady





2

เวทมนตร์รูน , 31 ไบต์

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

ลองออนไลน์!

ใช้โครงสร้างเดียวกันกับคำตอบนี้เพื่อนับจำนวนที่ซ้ำกันของแหล่งที่มา:

Execution flow

แทนที่จะเอาท์พุทตัวเลขที่ n ในรายการเราใช้ค่านั้นเพื่อสร้างตัวเลขแบบสุ่มหากผลลัพธ์ไม่ใช่ 0, พิมพ์ 1 หรือพิมพ์หมายเลขอื่น


2

Japt , 9 8 ไบต์

(°Tö)ΪT

ทดสอบ | สองเท่า | สามเท่า
ตรวจสอบการแจกจ่าย 10,000 การทำงานหลังจากทำซ้ำ 10 ครั้ง

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

ดั้งเดิม, 13 11 10 9 ไบต์

สังเกตพื้นที่ต่อท้าย

NoÎp°T ö 

ทดสอบ | สองเท่า | สามเท่า
ตรวจสอบการแจกจ่าย 10,000 การทำงานหลังจากทำซ้ำ 10 ครั้ง

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 เชลล์ 71 ), 78 ไบต์

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

ไม่มีลิงก์ tio, spidermonkey บน tio นั้นเก่าเกินไป ...

Firefox (Spidermonkey) fพิจารณาการแสดงความคิดเห็นเป็นส่วนหนึ่งของฟังก์ชั่น ดังนั้นผลลัพธ์(''+f).lengthจะเป็นb+79nตำแหน่งที่ b <78 และ (n + 1) คือเวลาของซอร์สโค้ดซ้ำ

รถม้าชนิดนี้ (? ฉันไม่แน่ใจฉันอยากให้มันเป็นข้อผิดพลาดของข้อกำหนดจาวาสคริปแทนที่จะเป็นล่าม ) ที่คนอื่นส่งต่อ BMO โดยคนอื่นหลังจากคำตอบนี้โพสต์: https://bugzilla.mozilla.org/ show_bug.cgi? (ไม่มีเธรด bmo หรือทวีตที่โพสต์โดยฉัน)


กับ(async x=>x)()อะไร ทำไมจึงเป็น async
Tomáš Zato - Reinstate Monica

@ TomášZatoมันasyncช่างเลวร้ายจริงๆ ดังนั้นการเรียกกลับx=>f(...)จะถูกเรียกใช้หลังจากfกำหนดฟังก์ชั่นแล้ว
TSH

1

C # (Visual C # Interactive คอมไพเลอร์) , 133 114 112 ไบต์

นี่เป็นครั้งแรก (และหวังว่าครั้งสุดท้าย) ครั้งที่ฉันเคยใช้คำสั่ง preprocessor ของ C #

#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++;

ลองออนไลน์!


1

ถ่าน 12 ไบต์

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

ลองออนไลน์! ตามคำตอบของคำถามที่เชื่อมโยง เอาท์พุทnที่มีความน่าจะเป็นอย่างอื่น¹/ₙ 1คำอธิบาย:

⎚               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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.