การเพิ่มสไตล์อเล็กซ์


57

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

การเพิ่มสไตล์ของ Alex ทำงานเช่นนี้ - มีโอกาส 90% ที่จะคืนค่าผลรวมของตัวเลขสองจำนวนที่ได้รับและโอกาส 10% ที่จะเรียกซ้ำอีกครั้ง Alex ได้เพิ่มหมายเลขแรกและหมายเลขที่สอง + 1 ซึ่งหมายความว่าอาจเป็นไปได้ การเพิ่มอาจปิดได้ตั้งแต่ 1 ครั้งขึ้นไป

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบที่ใช้จำนวนเต็มสองจำนวนและ Alex- เพิ่มพวกเขาตามที่กำหนดไว้ คุณอาจคิดว่าโปรแกรมของคุณจะไม่ล้นหากภาษาของคุณไม่มีหางซ้ำ (โปรดทราบว่าคุณไม่จำเป็นต้องใช้มันซ้ำ ๆ ตราบใดที่ความน่าจะเป็นเหมือนเดิม)

การดำเนินการอ้างอิง (Groovy)

int alexAdd(int a, int b) {
  int i = new Random().nextInt(11);
  if(i == 1) {
    return alexAdd(a,b+1);
  } else {
    return a + b;
  }
}

ลองเล่นซอนี้ออนไลน์

ลีดเดอร์บอร์ด

var QUESTION_ID=66522,OVERRIDE_USER=8478;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


6
มันให้ผลรวมของตัวเลขสองตัวบวกกับตัวแปรสุ่มเรขาคณิตที่มีความน่าจะเป็นล้มเหลว 1/10
xnor

@ xnor เป็นหลักใช่ ฉันกำหนดมันแบบวนซ้ำเพื่อให้ง่ายต่อการเข้าใจ แต่คุณไม่จำเป็นต้องทำซ้ำ (เช่นวิธีแก้ปัญหา CJam ไม่ได้)
สปาเก็ตต์

10
เหตุใดจึงใช้ sandbox นี้เป็นเวลา 20 นาที ดูเหมือนว่าจะหายไปจากจุดแซนด์บ็อกซ์
Peter Taylor

3
@ PeterTaylor ปัญหาเล็กน้อยที่แก้ไขแล้วเกือบจะในทันทีและคำถามนั้นง่ายมากฉันไม่คิดว่าจะต้องอยู่ในกล่องทรายนานขนาดนั้น (มันถูกมองโดย 10 คนซึ่งฉันคิดว่าเป็นเพื่อนที่เพียงพอแล้ว ตรวจสอบสำหรับความท้าทายที่เรียบง่ายดังกล่าว) เหตุผลหลักที่ฉันมีไว้ในกล่องทรายก็เพื่อดูว่าผู้คนคิดว่ามันง่ายเกินไปหรือไม่
สปาเก็ตตี้

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

คำตอบ:


40

Pyth, 8

u+G!OTsQ

ลองออนไลน์

สิ่งนี้ใช้โหมดที่สองของ Pyth ในการลดขนาดที่มองหาอินพุตซ้ำแล้วออก

คำอธิบาย

u+G!OTsQ  ##  Implicit: Q=eval(input())
u     sQ  ##  reduce with 2 arguments, which causes a loop until the reduce gets the
          ##  same argument twice
 +G       ##  lambda G,H: G + ...
   !OT    ##  boolean not of random value from 0 to 9 inclusive

หาก alex-add พิเศษเกิดขึ้นมันจะทำงานอีกครั้ง แต่ถ้าไม่ออกก็จะออก


13
นี่คือเวทมนต์ดำบริสุทธิ์ O_o
Doorknob

1
นี่ ... ไร้สาระ
แมว

36

Python 2, 55 ไบต์

from random import*
lambda a,b:a+b+18-len(`1+random()`)

นี่เป็นวิธีที่แปลกประหลาดอย่างยิ่งที่จะทำ

ฟังก์ชั่นrandomให้ลอยใน [0,1) และการแสดงสตริงโดยค่าเริ่มต้นมี 16 หลักหลังจุดทศนิยมรวมเป็น 18 ตัว แต่เนื่องจากการข้าม 0 ถูกละเว้นมันอาจจะสั้นกว่า การอ่านตัวเลขจากจุดสิ้นสุดแต่ละคนมีโอกาส 1/10 ในการเป็น 0 และเราหยุดเมื่อเรากดตัวเลขที่ไม่ใช่ศูนย์ ดังนั้นจำนวนศูนย์ต่อท้ายจึงมีการกระจายเช่นเดียวกับจำนวนการเรียกซ้ำที่ Alex ทำดังนั้นเราจึงสามารถสุ่มตัวอย่างจากการแจกแจงนี้ได้ 18 ลบความยาวสตริง

ที่จริงแล้ว Python จะแสดงตัวเลขมากกว่า 18 หลักสำหรับตัวเลขขนาดเล็กบางครั้งแม้แต่เครื่องหมายทางวิทยาศาสตร์ดังนั้นเราจึงเพิ่ม 1 เพื่อแก้ไขสิ่งนี้

นี้จะไม่ให้มากขึ้นกว่า 15 มากกว่าผลรวม แต่ที่ตกลงเพราะ 10 ^ 15 มีมากน้อยกว่าโอกาสที่รังสีคอสมิกขัดขวางการคำนวณ


1
ขออภัยคำตอบนี้ไม่ถูกต้องเนื่องจากมีโอกาส 10 ^ -15 ในการทำงานไม่ถูกต้องซึ่งเมตาโพสต์ที่เชื่อมโยงไว้ถูกห้ามอย่างชัดเจน
pppery

22

R, 60 47 28 ไบต์

function(a,b)a+b+rgeom(1,.9)

นี่เป็นวัตถุฟังก์ชั่นที่ไม่มีชื่อที่รับสองตัวเลขและส่งกลับตัวเลข มันไม่ได้ใช้การเรียกซ้ำ

ดังที่ xnor ชี้ให้เห็นในความคิดเห็นปัญหานี้สามารถดูได้โดยเพิ่มตัวเลขสองตัวพร้อมกับตัวแปรสุ่มเรขาคณิตที่มีความน่าจะเป็นล้มเหลว 1/10

ทำไมถึงเป็นเช่นนั้น คิดในแง่ของการเรียกซ้ำตามที่อธิบายไว้ในโพสต์ ในการวนซ้ำแต่ละครั้งเรามีโอกาส 10% ในการเพิ่ม 1 และเรียกซ้ำและ 90% โอกาสของการออกจากฟังก์ชันโดยไม่ต้องเพิ่มต่อไป การวนซ้ำแต่ละครั้งเป็นการทดลอง Bernoulli ที่เป็นอิสระของตัวเองพร้อมผลลัพธ์ "เพิ่ม 1, ชดเชย" (ล้มเหลว) และ "ออก" (สำเร็จ) ดังนั้นความน่าจะเป็นของความล้มเหลวคือ 1/10 และความน่าจะเป็นของความสำเร็จคือ 9/10

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

ที่นี่เราสามารถใช้ประโยชน์จากชุดการกระจายความน่าจะเป็นแบบบิวด์อินและการใช้งานที่กว้างขวางของ R rgeomซึ่งส่งคืนค่าแบบสุ่มจากการแจกแจงเชิงเรขาคณิต

Ungolfed:

f <- function(a, b) {
    a + b + rgeom(n = 1, prob = 0.9)
}

13

Minkolang 0.14 , 19 11 12 ไบต์

นี่คือรุ่น "ฟังก์ชั่น"; จะอนุมานaและมีอยู่แล้วในกองปรากฏพวกเขาออกและผลักดันรุ่นแก้ไขb a+bเทียบเท่าใกล้เคียงกับฟังก์ชั่นใน Minkolang คือการใช้Fซึ่งปรากฏออกb, aและกระโดดไป(a,b)ใน codebox จากนั้นเมื่อตัวนับรายการโปรแกรมเข้าชมfมันจะข้ามไปยังตำแหน่งที่Fใช้

(+$01$h`d)xf

นี้เป็นรุ่นที่โปรแกรมเต็มรูปแบบ15 ไบต์ ( nnรับสองตัวเลขจากอินพุตและN.เอาต์พุตผลลัพธ์และหยุด)

nn(+$01$h`d)xN.

ฉันขโมยอัลกอริทึมจากคำตอบของ Doorknob ; ห่วงในขณะที่ทำซ้ำตราบใดที่หมายเลขสุ่มที่สร้างขึ้นมีค่าน้อยกว่า 0.1 โดยเพิ่ม 1 ในแต่ละครั้ง ลองได้ที่นี่ (โปรแกรมเวอร์ชันเต็ม) และเรียกใช้ 100 ครั้งที่นี่

คำอธิบาย

(              Open a while loop
 +             Adds the top two items of the stack
  $0           Pushes 0.1
    1$h        Pushes a random number between 0.0 and 1.0, inclusive
       `       Pops b,a and pushes a > b
        d      Duplicate the top of stack
         )     Close the while loop when the top of stack is 0
          x    Dump the extra, leading 0

dส่วนที่ฉลาดที่สุดที่นี่คือ ด้านบนสุดของสแต็ก ณ เวลานั้นจะเป็น 0 หรือ 1 หากเป็น 0 วงขณะที่จะออก มิฉะนั้นจะดำเนินต่อไป เมื่อฉันซ้ำด้านบนของสแต็กมันจะเป็น[a+b,1]ครั้งที่สองผ่านการวนซ้ำดังนั้น+เมื่อเริ่มต้นเพิ่ม 1 (และเช่นเดียวกันสำหรับการเดินทางครั้งต่อไป)


นี่เป็นฟังก์ชั่นจริงๆเหรอ? ฉันสแกนอย่างรวดเร็วผ่านเอกสารภาษาและไม่สามารถหาคำอธิบายฟังก์ชันใด ๆ ที่อธิบายได้ จากคำอธิบายดูเหมือนว่าส่วนรหัส
Reto Koradi

@RetoKoradi: ฉันสามารถใส่ "รหัสส่วน" ในบรรทัดของตัวเองข้ามไปที่ 0kF (โดยที่ k เป็นจำนวนบางส่วน) และกระโดดกลับด้วย f ที่ส่วนท้าย นั่นคือสิ่งที่ใกล้เคียงที่สุดที่คุณจะไปถึงฟังก์ชั่นใน Minkolang
El'endia Starman

2
ในทางเทคนิคนั้นไม่ชอบพูดว่า "ส่วนรหัส CJam ของฉันเป็นฟังก์ชั่นคุณเพียงแค่ต้องล้อมรอบด้วยวงเล็บปีกกา"? อย่างน้อยที่สุดคุณควรรวมfจุดสิ้นสุดในจำนวนถ่าน (และในทางเทคนิคขึ้นบรรทัดใหม่ก่อนหน้านี้หากคุณรู้สึกอวดความสามารถพิเศษ แต่ฉันไม่คิดว่ามันจำเป็น)
Doorknob

1
หากภาษานั้นไม่มีฟังก์ชั่นคุณสามารถโพสต์โปรแกรมทั้งหมดได้เสมอ ความเข้าใจของฉันคือเมื่อมันบอกว่า "ฟังก์ชั่น" มันจะต้องมีฟังก์ชั่นที่มีชื่อหรือฟังก์ชั่นที่ไม่ระบุชื่อ (ซึ่งโดยทั่วไปจะเป็นนิพจน์ที่สามารถกำหนดให้กับตัวแปรฟังก์ชั่น) ฉันเคยโพสต์สิ่งที่คล้ายกับสิ่งนี้ใน CJam และมาร์ตินรีบโทรหาฉันโดยบอกว่ามันเป็นส่วนของโค้ดไม่ใช่ฟังก์ชั่น
Reto Koradi

@RetoKoradi: เอาล่ะเข้าใจได้ คุณคิดอย่างไรกับคำแนะนำของ Doorknob?
El'endia Starman

12

CJam, 12 11 ไบต์

{{+Amr!}h;}

ขอบคุณ @ MartinBütterสำหรับการบันทึกไบต์ด้วยเคล็ดลับอันชาญฉลาดนี้!

{         }
 {     }h    Do-while that leaves the condition on the stack.
  +          Add: this will add the numbers on the first iteration...
   Amr!      ... but a `1` (i.e. increment) on future ones.
         ;   Pop the remaining 0.

คำตอบเก่า:

{+({)Amr!}g}

ลองมันออนไลน์

คำอธิบาย:

{          }  A "function."
 +            Add the input numbers.
  (           Decrement.
   {     }g   A while loop.
    )         Increment.
     Amr      Random number [0,9).
        !     Boolean NOT.

อัลกอริทึมพื้นฐานคือ "ในขณะที่ (โอกาส 0.1 ครั้ง) เพิ่มจำนวน" ซึ่งไม่จำเป็นต้องเรียกซ้ำ


8

Javascript ES6, 38 ไบต์

f=(a,b)=>Math.random()<.1?f(a,b+1):a+b

f=(a,b)=>new Date%10<1?f(a,b+1):a+bfor 35 bytes
WallyWest

2
@WallyWest โชคไม่ดีที่ความน่าจะเป็นเมื่อใช้การDateประทับเวลาจะไม่ถูกต้องเพราะถ้าประเมินtrueแล้วมันจะเพิ่ม1ต่อไปตลอดเวลาที่เหลือของมิลลิวินาที
user81655

ฉันลองการกระจายแบบเรขาคณิตf=(a,b)=>a+b-~~Math.log10(Math.random())แต่มันยาวกว่า 2 ไบต์
Neil

8

MATL , 14 13 12 ไบต์

is`r.1<tb+w]

นี่เป็นเพียงวิธีวนรอบเพิ่มอินพุต (ป้อนเป็น[a b]) จากนั้นเพิ่มหนึ่งในขณะที่ตัวเลขสุ่มสม่ำเสมอระหว่าง 0 และ 1 น้อยกว่า 0.1 คำอธิบายแบบเต็มด้านล่าง:

i         % input [a b]
s         % sum a and b
`         % do...while loop                                      
  r       % get a uniformly distributed pseudorandom numbers between 0 and 1       
  .1      % push 0.1 onto the stack                                   
  <       % is the random number less than 0.1?
  t       % duplicate the T/F values                                        
  b       % bubble a+b to the top of the stack                       
  +       % add the T/F to a+b     
  w       % swap elements in stack to get the other T/F back to exit/continue the loop                           
]         % end    

เอาออก 1 ไบต์โดยการเปลี่ยนสเป็คอินพุต (จากii+ถึงis)


วิธีเก่านั้นใช้ฐานการบันทึก -10 ของตัวเลขสุ่มระหว่าง 0 และ 1 เพื่อหาจำนวนที่จะเพิ่มa+bอย่างไรก็ตามมันจะทำงานซ้ำได้ถึง 15 ครั้งเนื่องจากความแม่นยำของจุดลอยตัว

iir10,2$YlZo-+

ในรหัสนี้10,2$YlZo-ทำการลอการิทึมฐาน 10 ของตัวเลขสุ่มและปัดเศษเป็นจำนวนเต็มที่ใกล้เคียงที่สุด


ความคิดเห็นที่เป็นธรรมถึงแม้ว่าฉันต้องการเห็นคุณสร้าง 15 ด้วยวิธีแก้ไขปัญหาอื่น ๆ ที่นำเสนอ: P อีกวิธีหนึ่งสำหรับ 15 ไบต์เป็นเวอร์ชันลูปแบบง่าย: ii+`10Yr1=tb+w]ยังไม่ตีกอล์ฟ
David

อันที่จริงฉันสามารถทำให้วงสั้นลงได้! ขอบคุณ @ThomasKwa!
David

ทำได้ดีมาก!
Luis Mendo

7

Binary- Encoded Golfical , 32 29 + 1 ( -xธง) = 30 ไบต์

Hexdump (แก้ไขด้วยตนเองเพื่อแก้ไขข้อบกพร่องในส่วน image-to-binary ของ transpiler ซึ่งได้รับการแก้ไขแล้ว):

00 B0 02 15 14 0C 01 14 15 14 1B 1E 3A 14 0C 01
14 00 0A 14 38 00 01 23 1D 4C 14 17 14

การเข้ารหัสนี้สามารถแปลงกลับเป็นการแสดงกราฟิกดั้งเดิมโดยใช้ยูทิลิตี้ Encoder ที่รวมอยู่หรือรันโดยตรงโดยใช้-xแฟล็ก

ภาพต้นฉบับ: ป้อนคำอธิบายรูปภาพที่นี่

ขยาย 50x:

ป้อนคำอธิบายรูปภาพที่นี่

คำอธิบาย: แถวบนสุดเป็นบล็อกหลัก มันอ่านตัวเลขคัดลอกมันไปทางขวาอ่านตัวเลขอื่นเพิ่มพวกมันคัดลอกผลลัพธ์ไปทางขวาทำของ RNG บางอย่างและด้วยความน่าจะเป็น 90% จะพิมพ์ผลลัพธ์ของการเพิ่ม เวลาที่เหลือจะถูกส่งไปยังแถวด้านล่างซึ่งจะทำให้เซลล์หนึ่งอยู่ในเซลล์แรกและกลับไปที่แถวหลักก่อนที่จะมีคำแนะนำเพิ่มเติม


2
คุณสามารถเพิ่มคำอธิบายได้ไหม? นี่สุดยอดมาก
แมว

7

Python, 66 65 64 63 ไบต์

from random import*
g=lambda*s:randint(0,9)and sum(s)or g(1,*s)

ลองออนไลน์

ขอบคุณ Sherlock9 สำหรับการแก้ไขและบันทึกไบต์

ขอบคุณ Mathias Ettinger สำหรับไบต์อื่น

ขอบคุณ mbomb007 สำหรับไบต์




@ ASCII-only การใช้.9>random()ไม่ได้เป็น 9-out-of-10 เนื่องจากการกระจายของลอยที่ไม่สม่ำเสมอ
Mego

6

Julia 30 ไบต์

f(a,b)=rand()>0.9?f(a,b+1):a+b

นี่เป็นฟังก์ชั่นวนซ้ำfที่รับสองตัวเลขและคืนค่าจำนวนชนิดเดียวกัน มันควรจะทำงานได้ดีสำหรับประเภทตัวเลขใด ๆ

ก่อนอื่นเราตรวจสอบว่าการสุ่มลอยตัวระหว่าง 0 และ 1 มากกว่า 0.9 ถ้าเป็นเช่นนั้นเราจะชดใช้ด้วย somethin พิเศษเล็กน้อยมิฉะนั้นเราก็แค่เพิ่ม


6

TI-BASIC ขนาด 15 ไบต์

While rand<.1
Ans+.5
End
sum(Ans

Ansนี้จะใช้เวลาการป้อนข้อมูลที่เป็นรายการที่สองจากองค์ประกอบ ในขณะที่ตัวเลขสุ่มมีค่าน้อยกว่า0.1จะทำการบวก vectorized 0.5ในรายการ เพิ่มแต่ละองค์ประกอบโดย0.5เพิ่มผลรวมด้วย 1 ฉันเชื่อว่านี่เป็นโซลูชัน TI-BASIC ที่สั้นที่สุด

โปรแกรม 9 ไบต์sum(Ans)-int(log(10randไม่ทำงานเพราะrandมีเพียง 14 หลักของความแม่นยำและดังนั้นจึงไม่สามารถให้จำนวนน้อยกว่า 10 -14


1
น่าสังเกตว่ามันจะเพิ่ม 14 คุณจะต้องดูหมูบินและนรกแข็งตัว และตามเวลาที่คุณเพิ่ม 14 ฉันจะทำอะไรกับชีวิตของฉัน
Nic Hartley

5

APL, 17 ไบต์

{1=?10:⍺∇⍵+1⋄⍺+⍵}

นี่คือฟังก์ชัน dyadic ที่ไม่มีชื่อ

Ungolfed:

{1=?10:            ⍝ If a random number between 1 and 10 is 1,
       ⍺∇⍵+1       ⍝ Recurse on the inputs with one incremented
            ⋄⍺+⍵}  ⍝ Otherwise return the sum of the inputs

5

Pyth, 14 12 ไบต์

KsQW!OT=hK;K

Pyth Golf ตัวจริงของฉัน!

นำข้อมูลเกี่ยวกับ STDIN a,bในรูปแบบ

คำอธิบาย:

KsQ       read STDIN, assign sum to variable K
W         while...
  !OT       not rand(10)
  =hK;      increment K
K         implicit-output of K

ขอบคุณ @FryAmTheEggman สำหรับการกำจัดสองตัวอักษรโดยให้ทางฉันสั้นลงเพื่อเพิ่มตัวแปร!


5

Vitsy , 12 10 ไบต์

aR)[1+0m]+
aR          Get a random number in [0,10)
  )[    ]   If its truncated int is 0, do the stuff in brackets.
    1+0m    Add 1 to one of the items and execute the 0th index of code.
         +  Add the numbers together.

ลองออนไลน์!

โปรดทราบว่านี่เป็นโอกาสเล็กน้อยที่จะเกิดข้อผิดพลาดสแต็กมากเกินไป เรากำลังพูดถึง(.1)^400โอกาส มันออกจากข้อผิดพลาดเนื่องจากฉันทำให้เกิดการเรียกซ้ำ


4

เสียงกระเพื่อม, 58 ไบต์

ครั้งแรกที่ฉันเขียน Lisp!

(defun +(a b)(if(<(random 10)9)(- a(- b))(- a(-(+ b 1)))))

คุณสามารถใช้การเพิ่มพิเศษนี้ได้ตามปกติโดยเพิ่มใน Lisp:

> (+ 1 3)
4
> (+ 1 3)
5

ฉันชอบที่จะได้ยินคำแนะนำในขณะที่ฉันยังใหม่กับภาษา


จะ(- a(- -1 b))ทำงานอย่างไร บันทึก 2 ไบต์ถ้าเป็นเช่นนั้น
Neil

@ Neil ฉันไม่คิดว่าจะทำงานได้เพราะฟังก์ชั่นควรจะเรียกซ้ำ
sudo rm -rf slash

ขอบคุณที่อธิบายว่าทำไมการแสดงออกจึงดูยุ่งยาก
Neil

4

จริงจัง 10 ไบต์

,Σ1±╤_G_\+

โปรแกรมนี้สร้างตัวแปรสุ่มจากการแจกแจงเชิงเรขาคณิตโดยแปลงการกระจายแบบสม่ำเสมอ มันจะใส่เป็นรายการ: [2,3](วงเล็บปีกกาไม่จำเป็น) ลองมันออนไลน์

คำอธิบาย:

,Σ1±╤_G_\+
,Σ          get sum of input
  1±╤_      push ln(0.1)
      G_    push ln(random(0,1))
        \   floored division
         +  add

กำหนดตัวแปรสุ่มX ~ Uniform(0, 1)ก็สามารถเปลี่ยนเป็นตัวแปรสุ่มที่มีสูตรY ~ Geometric(p)Y = floor(log(X)/log(p))


3

Mathematica ขนาด 32 ไบต์

If[RandomReal[]<.1,+##,#0@##+1]&

คำอธิบาย:

                               &   A function returning
If[                           ]     if
   RandomReal[]                       a random number in [0,1)
               <                     is less than
                .1                    .1
                  ,                 , then
                   +                 the sum of
                    ##                all arguments
                      ,             , otherwise,
                       #0@            this function applied to
                          ##           all arguments
                            +        plus
                             1        one.

โปรดทราบว่าฟังก์ชั่นนี้ใช้งานได้กับอินพุตจำนวนเท่าใดก็ได้




3

C, 71 51 39 37 ไบต์

รหัสแรกกอล์ฟทำใน C ... ฉันไม่คิดว่ามันจะชนะอะไรและอาจจะเล่นกอล์ฟได้มาก

แก้ไข 3: ตัด 2 ไบต์ด้วย @Mego โดยเขียน. 1 แทน 0.1 และเขียนตัวดำเนินการประกอบ

a(x,y){return(rand()<.1?a(1,y):y)+x;}

แก้ไข 2: cuted 12 bytes ต่อไปนี้ gnu99 ทุกตัวแปรจะเป็น int หากไม่ได้ระบุไว้เป็นอย่างอื่น กันไปสำหรับประเภทกลับของฟังก์ชั่น

a(x,y){return rand()<0.1?a(x,y+1):x+y;}

แก้ไข: ตัด 20 ไบต์ลืมว่า. h พื้นฐานไม่จำเป็นใน C99 (ใช้ gcc เป็นต้น) มันจะสร้างคำเตือน :)

int a(int x,int y){return rand()<0.1?a(x,y+1):x+y;}

โซลูชัน 71 ไบต์:

#include <stdlib.h>
int a(int x,int y){return rand()<0.1?a(x,y+1):x+y;}

หากคุณต้องการเห็นผลลัพธ์จำนวนมากคุณสามารถใช้รหัสต่อไปนี้

#include <stdio.h> 
#include <stdlib.h>
int a(int x,int y){return rand()<0.1?a(x,y+1):x+y;}

int main(void) 
{
    int i,j;
    for(i=0;i<10;i++)
        for(j=0;j<10;j++)
            printf("%d + %d = %d\n",i,j,a(i,j));
    return 0;
}

3

MATL , 12 13 14ไบต์

r.1H$YlY[ihs

อินพุตเป็นของฟอร์ม[3 4]นั่นคือเวกเตอร์แถวที่มีตัวเลขสองตัว

ตัวอย่าง

>> matl r.1H$YlY[ihs
> [3 4]
7

คำอธิบาย

สิ่งนี้สร้างตัวแปรสุ่มทางเรขาคณิตโดยไม่มีลูปโดยใช้การแปลง AA โดยตรงกับตัวแปรสุ่มที่สม่ำเสมอ โปรดทราบว่าจะใช้บันทึก0.1 aแทนบันทึกa / log 0.1 เพื่อบันทึก 1 ไบต์

r        % random number with uniform distribution in (0,1)
.1       % number 0.1
H$       % specify two inputs for next function
Yl       % logarithm in specified base (0.1)
Y[       % floor. This produces the geometric random variable with parameter 0.1
i        % input vector of two numbers
h        % concatenate horizontally with the previously generated random value
s        % sum of vector elements


3

Mouse-2002 , 41 39 38 ไบต์

ไม่มีการเรียกซ้ำ

&TIME &SEED ??&RAND k*&INT 9=[+1+!|+!]

อธิบาย:

&TIME &SEED               ~ painfully obvious

? ?                       ~ get some input
&RAND 10 * &INT 8 >       ~ get a random number 0-1 * 10, make it an int & check if >8
[                         ~ if true
  + 1 + !                 ~ add the input then add 1 and print
|                         ~ else
  + !                     ~ add and print
]                         ~ endif
$                         ~ (implicit) end of program

หรือถ้าคุณเป็นแฟนบอยของฟังก์ชั่นการเขียนโปรแกรมและการเรียกซ้ำเป็นข้อตกลงของคุณแล้ว57 ไบต์ :

&TIME &SEED #A,?,?;!$A&RAND k*&INT 9=[#A,1%,2%1+;|1%2%+]@

อธิบาย:

&TIME &SEED            ~ painfully obvious

#A, ?, ?; !            ~ call with input & print

$A                     ~ begin a definition of a function A

  &RAND 10 * &INT 8 >  ~ same as above
  [
    #A, 1%, 2% 1 +;    ~ call with args and add 1
  |
    1% 2% +            ~ else just add
  ]
@                      ~ end func
$                      ~ as above

3

Jelly , 7 ไบต์ (ไม่ใช่การแข่งขัน)

‘⁵XỊ¤¿+

ลองออนไลน์!

มันทำงานอย่างไร

‘⁵XỊ¤¿+  Main link. Arguments: n, m (integers)

    ¤    Combine the three atoms to the left into a niladic chain.
 ⁵       Yield 10.
  X      Pseudo-randomly generate a positive integer not greater than 10.
   Ị     Insignificant; test if the generated integer is 1 (or less).
     ¿   While chain yields 1:
‘          Increment n.
      +  Add m to the result.

3

APL (Dyalog Unicode) , 13 12 ไบต์SBCS

โดยทั่วไปเช่นเดียวกับวิธีการแก้ปัญหาของ Pyth FryAmTheEggman -1 ต้องขอบคุณ Erik the Outgolfer

ฟังก์ชั่นเงียบสงบไม่ระบุชื่อ

{⍵+1=?10}⍣=+

ลองออนไลน์!

+ เพิ่มข้อโต้แย้ง

{}⍣= ใช้ฟังก์ชั่นต่อไปนี้จนกว่าแอพพลิเคชั่นสองตัวที่ต่อเนื่องกันจะมีผลลัพธ์เหมือนกัน

?10 จำนวนเต็มแบบสุ่มในช่วง 1-10

1= หนึ่งเท่ากับ (เช่น1 / 10 THโอกาส)

⍵+ เพิ่มการโต้แย้งไปที่


/คุณสามารถใช้จำนวนเต็มสองจำนวนเป็นสองข้อโต้แย้งและลบ
Erik the Outgolfer

@EriktheOutgolfer ใช่
อดัม

2

Perl 6 , 26 ไบต์

จริงๆแล้วมันทำซ้ำ:

sub f{.1>rand??f |@_,1!![+] @_} # 31 bytes

สร้างลำดับที่ว่างเปล่าของ1s ตามด้วยอาร์กิวเมนต์แล้วรวมทั้งหมดเข้าด้วยกัน

{[+] {1}...^{rand>.1},|@_} # 26 bytes

(สามารถใช้อาร์กิวเมนต์จำนวนเท่าใดก็ได้)

ใช้:

# give the lambda a name
my &f = {...}

say f 1,2; # one of 3,4,5 ... *


2

Pyth, 11 ไบต์

+sQ-18l`hO0

พอร์ต Pyth โดยตรงของฉันคำตอบหลาม

+             Add up
 sQ            the sum of the input and
   -           the difference of
    18          18 and
      l`         the string length of
        hO0       one plus a random number in [0,1)

2

อ็อกเทฟ 20 ไบต์

@(a,b)a+b+geornd(.9)

0.9ผลรวมของปัจจัยการผลิตรวมทั้งตัวอย่างที่สุ่มจากการกระจายเรขาคณิตกับพารามิเตอร์


2

อย่างจริงจัง 13 ไบต์

,,1W+9uJYWDkΣ

ใช้กลยุทธ์ที่คล้ายกันกับคำตอบ CJam ของ Doorknob (จำนวนเพิ่มขึ้นในขณะที่สุ่มลอยน้อยกว่า 0.1) ยกเว้นว่าจะใช้จำนวนเต็มและเพิ่มขึ้นในขณะที่จำนวนเต็มแบบสุ่ม[0,9]น้อยกว่า 1 การขาดการเรียกซ้ำง่าย ๆ ทำให้เจ็บ

ลองใช้ออนไลน์ (ต้องป้อนข้อมูลด้วยตนเอง)

คำอธิบาย:

,,1W+9uJYWDkΣ
,,1            get input, push 1
   W     W     while loop:
    +            add top two elements
     9uJ         push a random integer in [0, 9]
        Y        push 1 if random value is falsey (0) else 0
          DkΣ  decrement top value and add everything together

ขณะที่ลูปออกจากสแต็กดังนี้:

n: the # of times the random value was < 0.1, plus 1
b: the second input
a: the first input

การเลื่อนnขึ้นด้วย 1 จำเป็นต้องเรียกใช้ห่วงในขณะที่วิ่งเนื่องจาก0มีความผิดพลาด มันจัดการได้อย่างง่ายดายด้วยโดย decrementing หลังจากห่วงขณะดังนั้นผลสุดท้ายคือna + b + (n - 1)


2

MATLAB, 51 ไบต์

function f(a,b)
if rand > .1;a+b;else;f(a,b+1);end

พบผลลัพธ์ในตัวแปรอัตโนมัติ 'ans'

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