โคมไฟลาวาแบบง่ายๆ


18

บทนำ:

ฉันคิดว่าทุกคนรู้ว่าโคมไฟลาวาคืออะไร แต่ในกรณีที่พวกเขาไม่ได้:

ป้อนคำอธิบายรูปภาพที่นี่
(แหล่งรูปภาพ)

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

โดยปกติจะใช้เวลาประมาณ 45-60 นาทีสำหรับฐานของหลอดไฟที่จะเพิ่มอุณหภูมิสูงพอที่จะเปลี่ยนขี้ผึ้งให้เป็นขี้ผึ้งเหลว (หากหลอดไฟตั้งอยู่ในพื้นที่ที่อุณหภูมิห้อง)

ข้อมูลเพิ่มเติมเกี่ยวกับ Wikipedia ซึ่งใช้เป็นแหล่งข้อมูลสำหรับข้อความบางส่วนด้านบน

ท้าทาย:

ระบุจำนวนเต็มบวกที่nระบุจำนวนนาทีที่ผ่านไปนับตั้งแต่เราเปิดหลอด Lava แล้วส่งออกสถานะสุ่มของหลอด Lava ตามจำนวนเต็มห้าระดับ

สำหรับความท้าทายนี้เราจะบอกว่าโคมไฟลาวามีขี้ผึ้งทั้งหมด 1,000 หน่วยและเรามีห้าระดับที่ขี้ผึ้งสามารถอยู่ได้

1) หากnต่ำกว่า 45 โคมไฟลาวายังคงร้อนขึ้นดังนั้นเอาต์พุตจะเป็นสี่บรรทัดว่าง1000ที่ด้านล่าง:





1000

2) หากnอยู่ในช่วง[45, 60)ที่หลอดลาวามีอุณหภูมิสูงขึ้นพอที่ขี้ผึ้งจะเคลื่อนที่ไปรอบ ๆ แต่ยังไม่สูงมาก ขี้ผึ้งสามารถเข้าถึงและรวมถึงระดับที่สาม
3) ถ้าnมี60หรือสูงกว่าขี้ผึ้งสามารถอยู่ในระดับใดก็ได้ในห้าระดับ

ดังนั้นเมื่อได้รับจำนวนเต็มบวกnเป็นอินพุตเราจะแสดงสถานะสุ่มโดยคำนึงถึงกฎสามข้อข้างต้น

นี่คือตัวอย่างผลลัพธ์:

ผลลัพธ์nที่เป็นไปได้สำหรับสิ่งใด ๆที่>= 45:



523
106
371


913

87

ผลลัพธ์nที่เป็นไปได้สำหรับสิ่งใด ๆที่>= 60:

73
113
312
5
497
284
55
637

24

การส่งออกอย่างต่อเนื่องnที่เป็น<= 44(และการส่งออกที่เป็นไปได้สำหรับการใด ๆn):





1000

กฏท้าทาย:

  • อาจมีบรรทัดว่างได้แม้ว่าระดับที่สูงกว่านั้นจะไม่ว่างเปล่า
  • เพียงแค่0ไม่ได้รับอนุญาตบนเส้นใด ๆ ควรว่างเปล่าแทน
  • ผลผลิตค่อนข้างยืดหยุ่น คุณได้รับอนุญาตให้ส่งออกรายการ / อาร์เรย์ของสตริง / วัตถุแทนผลลัพธ์ที่คั่นด้วยบรรทัดใหม่ดังกล่าวข้างต้น เหตุผลที่ฉันพูดสตริง / วัตถุเนื่องจากกฎข้างต้น บรรทัดว่างควรจะ"", null, []ฯลฯ แต่ไม่สามารถ0หรือจำนวนเต็มลบ (หรือมันอาจจะfalse) (IE ["", "", 913, "", 87]สำหรับn >= 45) คุณยังได้รับอนุญาตให้ย้อนกลับเอาต์พุต (เช่น1000\n\n\n\nแทน\n\n\n\n1000หรือ[87, null, 913, null, null]แทน[null, null, 913, null, 87])
  • ตัวเลขควรเป็นจำนวนเต็ม สามารถเป็นทศนิยมที่มี0ค่าทศนิยม แต่ไม่มีตัวเลขใดที่ควรมีตัวเลขทศนิยมใด ๆ และจำนวนเต็มควรรวมกัน1000ทุกประการ
  • เอาท์พุทแบบสุ่มที่เป็นไปได้ทั้งหมดขึ้นอยู่กับว่าnควรมีโอกาสเกิดขึ้นที่ไม่เป็นศูนย์
  • บรรทัดใหม่ที่ต่อท้าย (อนุญาตให้มีเอาต์พุตหกบรรทัด)

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษาที่ใช้รหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ codegolfing พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีการที่มีพารามิเตอร์ที่เหมาะสมและชนิดผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ


อาจแสดงระดับว่างด้วยพื้นที่เดียว?
Arnauld

@Arnauld แน่นอน สามารถเป็นอะไรก็ได้ยกเว้นสำหรับจำนวนลบหรือ0 false
Kevin Cruijssen

เป็นผลลัพธ์เสมอ 5 ระดับแม้เมื่อn < 60?
Emigna

@Emigna ใช่ผลลัพธ์อยู่เสมอ 5 ระดับ สำหรับn < 45เพียง 1 ระดับที่เต็มไปอย่างไร (บนหรือด้านล่างขึ้นอยู่กับคำสั่งที่คุณส่งออกไปใน) 1000ซึ่งเป็น กับ45 <= n < 60สามในห้าและกับn >= 60ทั้งห้า แต่ผลลัพธ์จะมีห้าบรรทัดเสมอ
Kevin Cruijssen

คำตอบ:


5

MathGolf , 21 20 ไบต์

5º*♪{k[K∞╟(]m<Σ∞wΦ}σ

ลองออนไลน์!

นี่คือคำตอบแรกของฉันในภาษาใหม่ของฉัน ฉันใช้โซลูชันของฉันกับโซลูชัน 05AB1E ของ Emigna แต่ใช้คุณสมบัติที่ประณีตของ MathGolf เพื่อทำให้สั้นลงเล็กน้อย

คำอธิบาย

5º*                   push 5, [0], multiply (yielding [0,0,0,0,0]
   ♪                  push 1000
    {                 start block
     k                push input as integer
      K∞              push 22 and double it, yielding 44
        ╟(            push 60 and decrease, yielding 59
          α           wrap last two elements in array, yielding [44,59]
           m<         map is less than, giving [0,0], [1,0] or [1,1]
             Σ        sum array, giving 0, 1 or 2
              ∞       double, giving 0, 2 or 4
               w      push random integer in range
                Φ     increase array element
                 }    execute for loop (loops 1000 times)
                  σ   convert to string and remove leading zeroes (implicit map)

หากคุณสมบัติไม่ได้สร้างขึ้นสำหรับความท้าทายนี้ในตัวเองแท็กที่ไม่แข่งขันจะไม่จำเป็น ตั้งแต่กลางปีที่แล้วการแข่งขันที่ไม่ใช่จะไม่มีอะไรอีกต่อไป เนื่องจากมันใหม่มากฉันคิดว่ายังไม่มีคอมไพเลอร์ออนไลน์สำหรับภาษาของคุณหรือยัง คุณสามารถเพิ่มภาพหน้าจอแทน (หรือเชื่อมโยงไปยังภาพหน้าจอแทนได้หากมันจะทำให้โพสต์ยุ่งเหยิงมากเกินไป) เป็นการยืนยัน? และฉันจะติดต่อ@Dennis 'เพื่อถามว่าสามารถเพิ่มภาษาของคุณในTryItOnlineได้หรือไม่
Kevin Cruijssen

2
@KevinCruijssen ขอบคุณสำหรับความคิดเห็น! ฉันจะเพิ่มภาพหน้าจอบางส่วนและฉันกำลังพยายามทำให้ภาษาเป็น TIO ฉันจะติดต่อเดนนิสเมื่อฉันรู้สึกว่าฉันไม่ได้เพิ่มคุณสมบัติใหม่อยู่เสมอ
maxb

คุณได้พิจารณาสร้างห้องสำหรับภาษาของคุณหรือไม่? ฉันสนใจที่จะเรียนรู้มันมาก!
Jo King

@ โจกิ้งดีใจที่ทราบว่าคุณสนใจ! ฉันจะพยายามสร้างห้องในช่วงสุดสัปดาห์นี้ ฉันเพิ่งได้รับภาษา TIO ขอบคุณ Dennis ฉันกำลังพยายามทำให้ทุกคนสามารถเข้าถึงได้!
maxb

@JoKing ผมสร้างห้องพักสำหรับ MathGolf ฉันจะพยายามตอบคำถามใด ๆ โดยเร็วที่สุดฉันรู้ว่าเอกสารยังไม่เสร็จ
maxb

8

Python 2 , 117 113 108 107 106 105 ไบต์

from random import*
def f(n):a=['']*5;exec"i=randint(0,(n>44)+(n>59)<<1);a[i]=(a[i]or 0)+1;"*1000;print a

ลองออนไลน์!

ส่งคืนรายการที่กลับรายการ (ด้านล่างก่อน)


รุ่นที่ได้รับแรงบันดาลใจจากคำตอบสแต็คโอเวอร์โฟลว์ในความคิดเห็น (มีแนวโน้มมากขึ้น):

Python 2 , 129 ไบต์

from random import*
def f(n):a=sorted([1000]*5+sample(range(1001)*5,(n>44)+(n>59)<<1));print[y-x or''for x,y in zip([0]+a,a)[:5]]

ลองออนไลน์!


ฉันไม่ทราบว่ารหัสของคุณทำงานอย่างไร แต่ทุกรัฐมีโอกาสที่ไม่เกิดขึ้นหรือไม่? ตัวเลขทั้งหมดของคุณลอยอยู่ใกล้กับ333หรือ2003 หรือ 5 ส่วนตามลำดับ ฉันไม่เห็นแหลมใด ๆ / ค่าผิดปกติต่อหรือ0 1000หรือโอกาสสำหรับผู้ที่มีขนาดเล็กเพียงอย่างเดียว (แต่ยังคงไม่เป็นศูนย์) เมื่อเปรียบเทียบกับจำนวนเต็มใกล้333และ200?
Kevin Cruijssen

1
@KevinCruijssen แต่ละลาวา 1,000 หน่วยจะถูกใส่ลงในถังขยะแบบสุ่ม ( 0หรือ0-2หรือ0-4) และนับ โอกาสที่จะไม่มีการเข้าร่วมนั้นจะอยู่ที่นั่น แต่มีขนาดเล็กมาก
TFeld

อาตกลงนั่นเหมาะสมแล้ว ตอนนี้ฉันเข้าใจโค้ดของคุณดีขึ้นแล้ว ขอบคุณ! +1 จากฉัน
Kevin Cruijssen

7

JavaScript (ES6), 78 ไบต์

ส่งคืนอาร์เรย์ที่กลับด้านซึ่งมีระดับว่างเต็มไปด้วยช่องว่าง

t=>(a=[...'     '],g=k=>k?g(k-1,a[Math.random()*(t>59?5:t<45||3)|0]++):a)(1e3)

ลองออนไลน์!

แสดงความคิดเห็น

t => (                      // t = input
  a = [...'     '],         // a[] = output array, initially filled with 5 spaces
  g = k =>                  // g = recursive function taking an iteration counter k
    k ?                     //   if k is not equal to zero:
      g(                    //     do a recursive call:
        k - 1,              //       decrement k
        a[                  //       update a[]:
          Math.random() * ( //         pick a random slot:
            t > 59 ? 5 :    //           among all 5 slots if t > 59
            t < 45          //           force the 1st slot if t < 45
            || 3            //           among the 3 first slots otherwise
          ) | 0             //         round the above result to an integer
        ]++                 //       increment the wax amount on this slot
      )                     //     end of recursive call
    :                       //   else:
      a                     //     stop recursion and return a[]
)(1e3)                      // initial call to g() with k = 1000

ฉันมีคำถามเดียวกันกับความคิดเห็นที่ฉันทำกับคำตอบของ Python : ทุกรัฐมีโอกาสที่ไม่เกิดขึ้นหรือไม่?
Kevin Cruijssen

1
1090

Rofl การเปรียบเทียบที่ดีกับอุกกาบาต ;) ตอนนี้ฉันเห็นแล้วว่าวิธีการของคุณคล้ายกับคำตอบของ Python ซึ่งทำให้ค่าในหนึ่งใน 3 หรือ 5 สปอตของอาเรย์จนถึงจำนวน 1,000 คำตอบที่ดีดังนั้น +1 จากฉัน
Kevin Cruijssen

6

R , 85 84 ไบต์

function(n)write(ifelse(t<-table(cut(runif(1e3,2*(n<60)+3*(n<45),5),0:5)),t,""),1,1)

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

ลองออนไลน์!

คำอธิบาย (ungolfed):

function(n){
      # Generate 1000 random uniform numbers in [5,5] (if n<45),
      # in [2,5] (if 45<=n<60) and in [0,5] (if n>=60).
    x = runif(1e3,2*(n<60)+3*(n<45),5) 
      # Code each by the number of the interval it falls in (0,1],(1,2]...(4,5]
    cx = cut(x,0:5)
      # Tabulate the intervals. Because cut() returns a factor,
      # zero counts are included 
    t = table(cx)
      # Vector-wise replace zero elements with "" and cat out, 1 per line.
    t1 = ifelse(t,t,"")
    write(t1,1,1)
}

หากNAได้รับอนุญาตให้เป็นบรรทัดว่าง / องค์ประกอบนี่คือวิธีแก้ปัญหา 77 ไบต์ ( ลองใช้ออนไลน์! ) หรือวิธีแก้ปัญหา 80 ไบต์ ( ลองออนไลน์! ) หากชื่อองค์ประกอบเป็นปัญหา
duckmayr

6

C (gcc) , 131 , 116 , 90 , 89 , 87 ไบต์

L(l,a,v,A){for(A=5,v=1e3;A--;v-=a)printf("%d\n"+!a*2,a=l>59|A<3&l>44?rand()%-~v:!A*v);}

ลองออนไลน์!

อัปเดต : แก้ไขข้อบกพร่องในต้นฉบับ รวมอยู่ในฟังก์ชั่นตัวช่วยลด 15 ไบต์เพิ่มเติม

อัปเดต 2 : -25 ไบต์ขอบคุณ ErikF

อัปเดต 3 : -1 ไบต์ด้วยจำนวนของ catcat

Degolf

L(l,a,v,A){
    for(A=5,v=1e3;A--;v-=a)
        printf("%d\n"+!a*2, // No clue how this works anymore, but it'll advance the pointer 
                            // to the string constant when a number shouldn't be printed.
        a=l>59|A<3&l>44?rand()%-~v // Random integer to print in [0, v]
        :!A*v); // If bottom layer, return remaining volume
}

คุณสามารถกำจัดสิ่งเหล่านี้ได้puts()ด้วยการรวมการพิมพ์ไว้ในที่เดียวprintf()และนำการลบไปไว้ที่ปลายลูป นอกจากนี้ฉันคิดว่าคุณได้รับอนุญาตให้ใส่srand()ค่าเริ่มต้นลงในผู้โทร ลองออนไลน์!
ErikF

ฉันรู้ว่าฉันพลาดข้อ จำกัด "ไม่มีศูนย์" นี่คือรุ่นที่แน่นอน: ลองออนไลน์!
ErikF

มีการปรับแต่งล่าสุด! ลองออนไลน์!
ErikF

ที่ดี; ฉัน golfed มันลง byte เพิ่มเติม

1
นอกจากนี้เรายังทำมัน! เราเอาชนะ Python ได้แล้ว!

5

05AB1E , 27 26 25 ไบต์

บันทึกขอบคุณไบต์Adnan
ที่บันทึกไว้ขอบคุณไบต์อีกครั้งเพื่อให้เควิน Cruijssen

5Å0₄FD„,;ÇI‹O·ÝΩ©è>®ǝ]ε0Û

ลองออนไลน์!

คำอธิบาย

5Å0                         # initialize with a list of 5 zeroes
   ₄F                       # 1000 times do:
     D                      # duplicate the list
      „,;ÇI‹                # check if the input is larger than 44 and/or 59
            O·              # sum and double, yielding (0,2 or 4)
             ÝΩ             # pick a random number between and 0 and the number above
               ©è           # get the count in that level
                 >          # increment it
                  ®ǝ        # insert it at the same position
                     ]      # end loop
                      ε0Û   # remove leading zeroes on each level

1
คำตอบที่ดี! ฉันชอบวิธีที่คุณใช้5Å0และǝและε0Ûท้ายที่สุด ฉันพยายามคิดอะไรที่สั้นกว่านี้ แต่ฉันทำไม่ได้ ฉันมีความรู้สึกว่ามันยังสามารถตีกอล์ฟได้ แต่ตอนนี้ฉันไม่เห็นมัน (อาจเป็นไปไม่ได้และมันเป็นเพียงความรู้สึกแบบสุ่ม) •A–•60вมีความยาวมากกว่า 1 ไบต์44 59‚แทนที่จะสั้นกว่า และε0Ûเพื่อแทนที่0s ด้วยสตริงว่างก็ดูเหมือนว่าจะสั้นที่สุดเท่าที่จะเป็นไปได้0Kเพียงแค่ลบ 0 รายการทั้งหมดและลบตัวเลขใด ๆ0ในตัวเลขทั้งหมด
Kevin Cruijssen

1
@KevinCruijssen: ใช่ฉันดูแล้วมองหาวิธีที่สั้นกว่าในการทำ44 59‚แต่ฉันไม่สามารถหามันได้ ( •H|•2ôเป็นจำนวนเดียวกัน) วิธีการแก้ปัญหาก่อนหน้านี้ของฉัน (ยัง 27 bytes) ใช้45และ60ซึ่งจะง่ายต่อการสร้างในรูปแบบที่แตกต่างกัน แต่ผมคิดว่าไม่ถูกต้องตามที่มันเอาท์พุท1 , 3หรือ5ระดับขึ้นอยู่กับการป้อนข้อมูลและไม่เสมอ5
Emigna

อา•H|•2ôแน่นอนเป็นวิธีที่ชาญฉลาดเช่นกัน และควรส่งออก 5 บรรทัด ฉันเห็นคำตอบก่อนหน้าของคุณแน่นอนและกำลังจะให้ความเห็นเพียง 1 บรรทัดn < 45แต่คุณลบออกแล้ว ดีใจที่คุณพบโซลูชัน 27 ไบต์อื่น :)
Kevin Cruijssen

2
ฉันคิดŽH|2ôว่าคุณกำลังมองหาอะไร?
Adnan

2
@KevinCruijssen มันทำหน้าที่ตรงนั้น ทำวิจัยโดยใช้คำตอบก่อนหน้านี้โดยใช้ 05AB1E และนี่เป็นหนึ่งในสิ่งที่ฉันเพิ่มในการเขียนใหม่ ไม่มีกรณีการใช้งานอื่นใดในขณะนี้
Adnan

4

JavaScript (Node.js) , 87 86 ไบต์

f=(n,w=1e3,s=5,r=n<45|n<60&s<4|s<2?w:Math.random()*w|0)=>s?`${r||""}
`+f(n,w-r,s-1):""

ลองออนไลน์!

วิธีแก้ปัญหา 83- ไบต์ ( (n/15-2|0)*s<4) สำรองไว้ก่อนเพราะฉันต้องตรวจสอบให้ใหญ่nขึ้น

UPDATE: ใช่(n/15-2|0)*s<4ไม่ทำงานเพราะมีขนาดใหญ่กว่าnเพราะnใหญ่พอที่จะทำให้ยอดรวมไม่ถึง 1,000


4

PHP, 92 ไบต์

$i=5;for($n=1e3;$i--;$n-=$x)echo($x=rand($i?0:$n,$i<($argn<60?$argn<45?:3:5)?$n:0))?:"","
";

ทำงานเป็นท่อที่มี-Rหรือลองออนไลน์


3

ทำความสะอาด , 215 ไบต์

import StdEnv,Math.Random,Text
? ::!Int->Int
?_=code{ccall time "I:I"
}
$n#l=take(max(2*min(n/15-2)2)0+1)(genRandReal(?0))
#l=map toInt[1E3*e/sum l\\e<-l]
|sum l==1000=map(\v|v>0=v<+"\n"="\n")(l++repeat 0)%(0,4)= $n

ลองออนไลน์!

ดังนั้นผมจึงได้พบในที่สุดวิธีที่สั้นกว่าที่จะได้รับเมล็ดพันธุ์แบบสุ่มมากกว่าการนำเข้าSystem._Unsafe, System.Timeและการใช้toInt(accUnsafe time)...
และเด็กเป็นจริงในจิตวิญญาณของ codegolf - การฝังโทรไปที่ C ละเว้นประเภทรัฐโลกที่ใช้ตามปกติเพื่อให้แน่ใจว่าการประเมินผล คำสั่งของสิ่งต่าง ๆ


3

Java (JDK 10) , 121 117 113 111 ไบต์

m->{for(int w=1000,j,i=5;i-->0;w-=j=i>0?j*=Math.random():w,System.out.println(j<1?"":j))j=m>59|m>44&i<3?w+1:0;}

ลองออนไลน์!

มันเอนเอียงไปสู่การวางแว็กซ์ใกล้ด้านบน แต่ในทางทฤษฎีแล้วมันเป็นไปได้ที่การปรากฏตัวของแว็กซ์ตามกฎหมาย

แก้ไข: 4 ไบต์ถูกบันทึกโดย@KevinCruijssen

ใน Java ที่มนุษย์อ่านได้:

(int minutes /* golfed variable m */) -> {
  int waxRemaining = 1000; // golfed variable w

  // golfed version goes from index 4 to 0 in a bit of a roundabout way
  // starting at 5 but decrementing right away
  for (int level = 4 /* golfed variable i */; level <= 0; level--) {
    // golfed variable j
    // the golfed version initializes this to (waxRemaining + 1)
    // in order to juice out some extra bytes during the Math.random() call
    int waxAtLevel = 0;

    // the golfed version does all of these ifs as ternary operations
    // and avoids using 2-character operators wherever possible
    // so e.g. "a == 0" becomes "a<1" and "a && b" becomes "a&b"
    // since here we are certain things can't be negative,
    // and took a good look at the Java operator precedence cheat-sheet
    // to make sure "&" and "|" would work properly to give a truthy value
    if (level == 0) {
      // if we are at the bottom level, just put the rest of the wax there
      waxAtLevel = waxRemaining;
    } else if (minutes >= 60 || (minutes >= 45 && level < 3)) {
      // otherwise if we are at a legal level put a random portion of the remaining wax there
      // note: the random portion can be between 0 and waxRemaining inclusive
      waxAtLevel = (int) (Math.random() * (waxRemaining + 1));
    }

    if (waxAtLevel > 0) {
      // only print the amount of way at this level if its greater than 0
      System.out.print(waxAtLevel);
    }
    System.out.println();

    waxRemaining -= waxAtLevel;
  }
}

2
Math.random()*(w+1)สามารถเป็นMath.random()*-~w2 ไบต์ นี่คือเคล็ดลับที่เกี่ยวข้องเป็นข้อมูลอ้างอิงทำไม . คำตอบที่ดี! +1 จากฉัน แก้ไข: ที่จริงแล้วสามารถบันทึกได้อีก 2 ไบต์โดยใช้jชั่วคราวเป็นตัวแปรสำหรับw+1(เนื่องจากจะถูกเขียนทับหลังจากพิมพ์ต่อไป) และใช้j*=Math.random()แทนดังนั้นคุณไม่จำเป็นต้องส่งถึง(int)( 117 ไบต์ )
Kevin Cruijssen

@KevinCruijssen ดีมาก! นอกจากนี้ฉันเพิ่งสังเกตเห็นว่า&i>2เงื่อนไขไม่จำเป็น
SamYonnou

3

Powershell , 188 162 ไบต์

param($m);$t=0;$a=,0*5;$s=if($m-lt45){4}elseif($m-lt60){2}else{0};$s..4|%{$t+=$a[$_]=if($_-eq4){1e3-$t}elseif($t-ne1e3){Random(1000-$t)}}$a|%{if($_){$_}else{''}}

ลองออนไลน์!

-2 bytes โดย @Kevin Cruijssen
-4 bytes โดยการลบตัวเลือก Get- verb
-20 bytes โดยการวนรอบสั้นและการเว้นวรรค


สวัสดียินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี! ฉันทำการทดสอบเบื้องต้นและดูเหมือนว่าทุกอย่างจะทำงานได้ดี ฉันรู้อะไรเกี่ยวกับ Powershell แทบจะทุกอย่าง แต่มันเป็นไปได้ไหมที่จะเปลี่ยนelse{if($t-ne 1e3){Get-Random(1000-$t)}}เป็นelseif($t-ne 1e3){Get-Random(1000-$t)}? ฉันเห็นว่าคุณเคยใช้elseifรหัสก่อนหน้านี้ดังนั้นสิ่งนี้จะช่วยให้คุณประหยัดได้ 2 ไบต์ นอกจากนี้เคล็ดลับสำหรับการเล่นกอล์ฟใน Powershellหรือเคล็ดลับสำหรับการเล่นกอล์ฟใน <ทุกภาษา>อาจให้แรงบันดาลใจเพิ่มเติมหรือไม่ เพลิดเพลินไปกับการพักผ่อนของคุณ! :)
Kevin Cruijssen

1
ทั้งหมดถูกต้องเกี่ยวกับ ifelse ลบรายการอื่นออกก่อนหน้าในกระบวนการ ลิงก์ให้แรงบันดาลใจเช่นกัน!
Edwin

2

Pascal (FPC) , 192 190 ไบต์

var n,a:word;z:array[0..4]of word;begin read(n);if n>44then a:=a+3;if n>59then a:=a+2;Randomize;for n:=0to 999do inc(z[random(a)]);for n:=0to 4do if z[n]>0then writeln(z[n])else writeln end.

ลองออนไลน์!

ใช้บรรจุลงในถังขยะโดยวิธีการ TFeld พิมพ์แถวล่างก่อนด้วยการขึ้นบรรทัดใหม่

ดูเหมือนว่า FPC ไม่มีปัญหากับrandom(0)ดังนั้นฉันมีบางอย่างผิดปกติเพิ่มที่นั่น


เอกสารต้นฉบับของฉันส่งถึง 209 ไบต์:

var n,i,a,r:int32;begin read(n);if n>44then a:=a-2;if n>59then a:=a-2;r:=1000;Randomize;for i:=-3to-0do begin if i>a then begin n:=random(r+1);if n>0then write(n);r:=r-n;end;writeln;end;if r>0then write(r)end.

ลองออนไลน์!


2

ถ่าน , 37 ไบต์

F²F²⊞υ∧‹³⁺ι÷Iθ¹⁵‽⊕⁻φΣ∨υω⊞υ⁻φΣυEυ⎇ιIιω

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

F²F²

วนซ้ำสองครั้ง อีกทางหนึ่งฉันอาจให้จำนวนเต็มหารดัชนีลูป 2 ด้วยจำนวนไบต์เดียวกัน

‹³⁺ι÷Iθ¹⁵

หากดัชนีด้านนอกบวกสิบห้าของอุณหภูมิมากกว่าสาม ...

⊞υ∧...‽⊕⁻φΣ∨υω

... จากนั้นกดจำนวนเต็มแบบสุ่มจนถึง 1,000 อันรวมกัน น่าเสียดายที่ Charcoal ไม่สามารถคำนวณผลรวมของรายการว่างได้ดังนั้นฉันต้องแทนที่สตริงว่างแทน

⊞υ⁻φΣυ

กดจำนวนเงินที่เหลือไปยังรายการ

Eυ⎇ιIιω

แปลงรายการเป็นสตริง แต่ใช้สตริงว่างแทนที่จะเป็นศูนย์


2

เยลลี่ขนาด 28 ไบต์

>“,;‘SḤ‘µȷŻṗS⁼¥ƇȷX;0ẋ5¤ḣ5Yḟ0

โปรแกรมเต็มรูปแบบการพิมพ์ผลลัพธ์ (กลับหัวตามที่ได้รับอนุญาต)

7ȷn>591015

อย่างไร?

>“,;‘SḤ‘µȷŻṗS⁼¥ƇȷX;0ẋ5¤ḣ5Yḟ0 - Main Link: integer, n
 “,;‘                        - list of code-page indices = [44,59]
>                            - greater than? (vectorises)
     S                       - sum (i.e. 0, 1 or 2)
      Ḥ                      - double (i.e 0, 2 or 4)
       ‘                     - increment (i.e. 1, 3 or 5)
        µ                    - start a new monadic link, call that x (i.e. f(x))
         ȷ                   - literal 1000
          Ż                  - zero-range = [0,1,2,...,1000]
           ṗ                 - Cartesian power (all tuples of length x using those numbers)
               Ƈ             - filter keep if:
              ¥              -   last two links as a dyad:
            S                -     sum
             ⁼  ȷ            -     equals 1000? (i.e. only valid tuples)
                 X           - random choice (get one of these tuples)
                      ¤      - nilad followed by link(s) as a nilad:
                   0         -   zero
                    ẋ5       -   repeat five times = [0,0,0,0,0]
                  ;          - concatenate     (e.g. [354,388,258,0,0,0,0,0])
                       ḣ5    - head to index 5 (e.g. [354,388,258,0,0])
                         Y   - join with newlines
                          ḟ0 - filter out zeros
                             - implicit print

1
" คุณยังได้รับอนุญาตให้กลับเอาท์พุท (IE 1000\n\n\n\nแทน\n\n\n\n1000หรือ[87, null, 913, null, null]แทน[null, null, 913, null, 87]). " ดังนั้นใช่คุณได้รับอนุญาตให้ใช้รุ่น 28 ไบต์โดยไม่ต้อง
Kevin Cruijssen

2

Twig , 126 ไบต์

นี่เป็นความท้าทายที่สนุกจริง ๆ !

รหัสนี้สร้างแมโครที่จะต้องนำเข้า

{%macro a(s,z=1000)%}{%for _ in 4..1%}{%set t=s>59or(s>44and _<3)?random(z):''%}{%set z=z-t%}{{t}}
{%endfor%}{{z}}{%endmacro%}

หากต้องการนำเข้าให้ทำดังนี้

{%- import 'macro.twig' as a -%}
{{- a.a(50) -}}

สิ่งนี้ควรทำเคล็ดลับ

คุณสามารถลองได้ที่https://twigfiddle.com/t4dfgy
ประกาศ : เนื่องจากหน้าถูกลบช่องว่างออกฉันจึงถูกบังคับให้เพิ่ม-ส่วนท้ายของบรรทัดเพื่อพิสูจน์ว่ามีการแสดงจำนวนบรรทัดที่ถูกต้อง

ในการติดตั้งปกติคุณจะเห็นบรรทัดใหม่โดยไม่มีปัญหา


2

Perl 6 , 62 ไบต์

{($!=1e3)||@,|((+$!-($!-=$!.rand+|0)||@)xx($_/15+|0)*2-4)[^4]}

ลองออนไลน์!

บล็อกโค้ดแบบไม่ระบุชื่อที่รับสตริงและส่งคืนรายการจำนวนเต็มด้วยNilหรือรายการว่างเปล่า ( []) แทนที่0s

คำอธิบาย:

{($!=1e3)||@,|((+$!-($!-=$!.rand+|0)||@)xx($_/15+|0)*2-4)[^4]}
{                                                            }  # Anonymous code block
 ($!=1e3)  # Initialise $! to 1000
                +$!-($!-=$!.rand+|0)     # Pick a random value from 0 to $!
                                    ||@  # Or an empty array if it is zero
            ,  (                       )xx  # Repeat this
                                          ($_/15+|0)*2-4  # The given value mapped to 0,2,4
             |(                                         )[^4] # Get the first four values
 ($!    )||@  # Where the first value is the leftover number in $! or an empty array


2

J , 56 55 54 48 43 40 ไบต์

5{.1e3(2<@-/\[,0,~[:\:~?@$~)2*1#.>&44 59

ลองออนไลน์!

-3 ไบต์ขอบคุณ FrownyFrog


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

J , 53 ไบต์

5$!.a:[:<@(+/);._1 0:,(1e3#1)({~#?#)@,0$~2*1#.>&44 59

ลองออนไลน์!


ไม่ได้เป็น$!.a:เพียงแค่{.?
FrownyFrog

@FrownyFrog ขอบคุณ ฉันลืมว่าการรับองค์ประกอบมากกว่าผลลัพธ์ที่มีอยู่ในการกรอก "ศูนย์"
โยนาห์

2

PowerShell , 115 105 98 ไบต์

-17 bytes ขอบคุณที่ mazzy

$a=,0*5
45,60-ge"$args"|%{$i+=2}
$i..4|%{$t+=$a[$_]=random(1001-$t)}
$a[4]+=1e3-$t
$a|%{"$_"*!!$_}

ลองออนไลน์!

กอล์ฟของคำตอบที่น่ารักของเอ็ดวิน ถ้าคุณชอบสิ่งนี้จงโหวตเขา


1
ดี กอล์ฟเพิ่มอีกนิดลองออนไลน์!
mazzy

1
เล่นกอล์ฟอีก98 ไบต์
mazzy

1

Ruby , 62 55 ไบต์

->n{w=1000;[4,4,3,3].map{|r|r*15>n||w-=q=rand(w);q}<<w}

ลองออนไลน์!

การทดสอบนั้น จำกัด อยู่ที่ 0-99 องศาเนื่องจากหลอดลาวาอาจเป็นอันตรายที่อุณหภูมิสูงกว่า:


สวัสดี. ฉันเกรงว่าคำตอบของคุณจะไม่ถูกต้อง ขณะนี้มี0สำหรับบรรทัดว่าง เส้นที่ว่างเปล่าในอาร์เรย์สามารถเป็นอะไรก็ได้ยกเว้น0, falseหรือหมายเลขเชิงลบ เพื่อที่จะสามารถnull, "", []ฯลฯ 0แต่ไม่ได้ ไม่แน่ใจว่า Ruby มี object-arrays / list หรือไม่เพื่อให้คุณสามารถแปลง0s ไปเป็นอย่างอื่นได้ แต่ถ้าไม่ใช่คุณจะต้องพิมพ์มันแทนที่จะส่งกลับ array / list
Kevin Cruijssen

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