Đèn dung nham đơn giản


18

Giới thiệu:

Tôi nghĩ mọi người đều biết Đèn Lava là gì, nhưng trong trường hợp họ không:

nhập mô tả hình ảnh ở đây
(Nguồn hình ảnh)

Về cơ bản, chúng là những ống thủy tinh chứa sáp trong chất lỏng trong mờ. Phần dưới cùng được làm nóng khi bật đèn, gây ra sự thay đổi mật độ và do đó sáp nổi lên trên cùng. Khi nó nguội đi, nó lại rơi xuống, gây ra hiệu ứng mà chúng ta thấy ở trên.

Thường mất khoảng 45-60 phút để đế của đèn tăng nhiệt độ đủ cao để thay đổi sáp rắn thành sáp lỏng (nếu đèn nằm ở khu vực có nhiệt độ phòng).

Thông tin thêm về Wikipedia, cũng được sử dụng làm nguồn cho một số văn bản ở trên.

Thử thách:

Cho một số nguyên dương ncho biết số phút đã trôi qua kể từ khi chúng tôi bật Đèn Lava, tạo ra trạng thái ngẫu nhiên của Đèn Lava dựa trên số nguyên trên năm cấp độ.

Đối với thử thách này, chúng tôi sẽ nói Đèn Lava chứa tổng cộng 1000 đơn vị sáp và chúng tôi có năm cấp độ mà sáp có thể ở đó.

1) Nếu ndưới 45, Đèn Lava vẫn nóng lên, do đó đầu ra sẽ là bốn dòng trống 1000ở phía dưới:





1000

2) Nếu nở trong phạm vi [45, 60), Đèn Lava đã tăng nhiệt độ đủ để sáp di chuyển xung quanh, nhưng chưa cao lắm. Sáp có thể đạt đến và bao gồm cấp độ thứ ba.
3) Nếu n60hoặc cao hơn, sáp có thể ở bất kỳ trong năm cấp độ.

Vì vậy, với số nguyên dương nlà đầu vào, chúng tôi sẽ đưa ra một trạng thái ngẫu nhiên với ba quy tắc ở trên.

Dưới đây là một số ví dụ đầu ra:

Đầu ra có thể cho bất kỳ nđó là >= 45:



523
106
371


913

87

Đầu ra có thể cho bất kỳ nđó là >= 60:

73
113
312
5
497
284
55
637

24

Đầu ra không đổi cho nđó là <= 44(và đầu ra có thể cho bất kỳ n):





1000

Quy tắc thử thách:

  • Có thể có các dòng trống, mặc dù mức trên nó không trống.
  • Chỉ cần 0không được phép trên bất kỳ dòng. Nên để trống thay thế.
  • Đầu ra có phần linh hoạt. Bạn được phép xuất danh sách / mảng chuỗi / đối tượng thay vì kết quả được phân tách bằng dòng mới như trên. Lý do tôi nói chuỗi / đối tượng là do quy tắc trên. Một dòng trống nên "", null, [], vv, nhưng không thể 0hoặc một số nguyên âm (và cũng không nó có thể được false) (Tức là ["", "", 913, "", 87]cho n >= 45). Bạn cũng được phép đảo ngược đầu ra (Tức là 1000\n\n\n\nthay vì \n\n\n\n1000hoặc [87, null, 913, null, null]thay vì [null, null, 913, null, 87]).
  • Các số phải là số nguyên. Số có thể là số thập phân có 0giá trị thập phân, nhưng không có số nào có bất kỳ chữ số thập phân nào và số nguyên phải luôn luôn chính xác 1000.
  • Tất cả các kết quả đầu ra ngẫu nhiên có thể dựa trên nnên có cơ hội xảy ra khác không.
  • Một dòng mới trailing (vì vậy có sáu dòng đầu ra) được cho phép.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.


Một mức độ trống có thể được đại diện với một không gian duy nhất?
Arnauld

@Arnauld Chắc chắn rồi. Có thể là bất cứ điều gì ngoại trừ 0, một số âm, hoặc false.
Kevin Cruijssen

Là đầu ra luôn luôn 5 cấp, ngay cả khi n < 60?
Emigna

@Emigna Có, đầu ra luôn là 5 cấp độ. Đối với n < 45chỉ 1 cấp được điền tuy nhiên (trên hoặc dưới tùy thuộc vào thứ tự bạn ra nó trong), đó là 1000. Với 45 <= n < 60ba trong số năm, và với n >= 60tất cả năm. Nhưng đầu ra sẽ luôn chứa năm 'dòng'.
Kevin Cruijssen

Câu trả lời:


5

MathGolf , 21 20 byte

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

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

Đây là câu trả lời đầu tiên của tôi trong ngôn ngữ mới của tôi. Tôi đã dựa vào giải pháp của mình dựa trên giải pháp 05AB1E của Emigna, nhưng đã sử dụng một số tính năng gọn gàng của MathGolf để làm cho nó ngắn hơn một chút.

Giải trình

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)

Nếu bản thân các tính năng không có nội dung cho thử thách này, thẻ không cạnh tranh sẽ không cần thiết. Vì giữa năm ngoái không thi đấu không còn là một điều. Vì nó rất mới nên tôi cho rằng chưa có trình biên dịch trực tuyến cho ngôn ngữ của bạn? Thay vào đó, bạn có thể thêm một số ảnh chụp màn hình (hoặc liên kết đến ảnh chụp màn hình nếu nó làm lộn xộn bài đăng quá nhiều) như là xác minh? Và tôi sẽ liên hệ với @Dennis 'để hỏi liệu ngôn ngữ của bạn có thể được thêm vào TryItOnline không .
Kevin Cruijssen

2
@KevinCruijssen Cảm ơn bạn đã phản hồi! Tôi sẽ thêm một số ảnh chụp màn hình và tôi đang làm việc để đưa ngôn ngữ vào TIO. Tôi sẽ liên lạc với Dennis khi tôi cảm thấy rằng tôi không liên tục thêm các tính năng mới.
maxb

Bạn đã xem xét việc tạo một phòng cho ngôn ngữ của bạn? Tôi rất thích học nó!
Jo King

@JoKing rất vui khi biết bạn quan tâm! Tôi sẽ cố gắng tạo một căn phòng vào cuối tuần này. Tôi chỉ có ngôn ngữ trên TIO nhờ Dennis, tôi đang làm việc để mọi người có thể truy cập nó!
maxb

@JoKing Tôi đã tạo một phòng cho MathGolf . Tôi sẽ cố gắng trả lời bất kỳ câu hỏi nào ngay khi tôi có thể, tôi biết tài liệu này còn hơi dang dở.
maxb

8

Python 2 , 117 113 108 107 106 105 byte

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

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

Trả về một danh sách đảo ngược (dưới cùng trước)


Phiên bản lấy cảm hứng từ câu trả lời stackoverflow trong các bình luận (edgecase có nhiều khả năng):

Python 2 , 129 byte

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]]

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


Tôi không biết chính xác làm thế nào mã của bạn hoạt động, nhưng mọi tiểu bang có cơ hội xảy ra khác không? Tất cả các số của bạn đang lơ lửng gần 333hoặc 200cho 3 hoặc 5 phần tương ứng. Tôi không thấy bất kỳ gai / ngoại lệ nào đối với 0hoặc 1000. Hay là những cơ hội cho những người chỉ nhỏ bé về mặt thiên văn (nhưng vẫn khác không) so với các số nguyên gần 333200?
Kevin Cruijssen

1
@KevinCruijssen Mỗi 1000 đơn vị dung nham được đưa vào một thùng ngẫu nhiên ( 0hoặc 0-2hoặc 0-4) và được tính. Cơ hội không ai trong số đó đi vào một trong hai, nhưng rất nhỏ.
TFeld

Ah ok, điều đó có ý nghĩa. Bây giờ tôi cũng hiểu mã của bạn tốt hơn rồi. Cảm ơn! +1 từ tôi.
Kevin Cruijssen

7

JavaScript (ES6), 78 byte

Trả về một mảng đảo ngược trong đó các mức trống được lấp đầy bằng một khoảng trắng.

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

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

Đã bình luận

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

Tôi thực sự có cùng một câu hỏi như nhận xét tôi đã đưa ra cho câu trả lời của Python : Có phải mọi trạng thái đều có cơ hội khác không?
Kevin Cruijssen

1
1090

Rofl, tương tự tốt đẹp với thiên thạch. ;) Bây giờ tôi thực sự thấy rằng phương thức của bạn tương tự như câu trả lời của Python ở chỗ nó đặt các giá trị ở một trong 3 hoặc 5 điểm trong mảng, lên tới 1000. Câu trả lời hay, do đó +1 từ tôi.
Kevin Cruijssen

6

R , 85 84 byte

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

-1 byte nhờ @Giuseppe

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

Giải thích (vô danh):

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)
}

Nếu NAđược phép dưới dạng dòng / phần tử trống, đây là giải pháp 77 byte ( Dùng thử trực tuyến! ) Hoặc giải pháp 80 byte ( Dùng thử trực tuyến! ) Nếu tên phần tử là một vấn đề
duckmayr

6

C (gcc) , 131 , 116 , 90 , 89 , 87 byte

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);}

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

Cập nhật : Đã sửa lỗi trong bản gốc. Hợp nhất trong hàm trợ giúp, giảm thêm 15 byte.

Cập nhật 2 : -25 byte nhờ ErikF.

Cập nhật 3 : -1 byte nhờ vào trần.

Thuốc khử trùng

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
}

Bạn có thể loại bỏ puts()bằng cách kết hợp in thành một printf()và đặt phép trừ vào cuối vòng lặp. Ngoài ra, tôi nghĩ rằng bạn được phép đưa phần srand()khởi tạo vào người gọi. Hãy thử trực tuyến!
ErikF

Tôi nhận ra rằng tôi đã bỏ lỡ hạn chế "không số không". Đây là phiên bản cố định: Dùng thử trực tuyến!
ErikF

Một số điều chỉnh cuối cùng! Hãy thử trực tuyến!
ErikF

Tuyệt quá; Tôi đánh gôn nó xuống bằng một byte bổ sung.

1
Ngoài ra, chúng tôi đã làm điều đó! Chúng tôi đã đánh bại Python!

5

05AB1E , 27 26 25 byte

Đã lưu một byte nhờ Adnan .
Đã lưu một byte khác nhờ Kevin Cruijssen .

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

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

Giải trình

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
Câu trả lời tốt đẹp! Tôi thích cách bạn đã sử dụng 5Å0ǝ, và ε0Ûcuối cùng. Tôi đã cố gắng đưa ra một cái gì đó ngắn hơn, nhưng tôi không thể. Tôi có cảm giác nó bằng cách nào đó vẫn có thể được chơi gôn, nhưng hiện tại tôi không thấy nó (có lẽ nó không thể và nó chỉ là một cảm giác ngẫu nhiên). •A–•60вdài hơn 1 byte 44 59‚thay vì ngắn hơn. Và ε0Ûđể thay thế 0s bằng các chuỗi rỗng dường như là ngắn nhất có thể, vì 0Kchỉ cần loại bỏ hoàn toàn các mục 0 và loại bỏ bất kỳ chữ số nào 0trong tất cả các số.
Kevin Cruijssen

1
@KevinCruijssen: Vâng, tôi đã nhìn và tìm cách để làm một cách ngắn hơn 44 59‚, nhưng tôi không thể tìm thấy nó ( •H|•2ôlà cùng một số). Giải pháp trước đây của tôi (cũng là 27 byte) được sử dụng 4560dễ tạo ra theo nhiều cách khác nhau, nhưng tôi nghĩ rằng điều đó không hợp lệ vì nó tạo ra các mức 1 , 3 hoặc 5 tùy thuộc vào đầu vào và không phải luôn luôn là 5 .
Emigna

Ah, •H|•2ôthực sự cũng là một cách thông minh, đã không nghĩ về điều đó. Và nó thực sự sẽ xuất 5 dòng. Tôi đã thấy câu trả lời trước đó của bạn thực sự và sắp bình luận nó chỉ xuất ra 1 dòng cho n < 45, nhưng sau đó bạn đã xóa nó. Rất vui vì bạn đã tìm thấy một giải pháp 27 byte khác. :)
Kevin Cruijssen

2
Tôi nghĩ ŽH|2ôlà những gì bạn đang tìm kiếm?
Ad Nam

2
@KevinCruijssen Nó hoạt động chính xác như thế. Đã thực hiện một số nghiên cứu sử dụng các câu trả lời trước đó bằng cách sử dụng 05AB1E và đây là một trong những điều tôi đã thêm vào trong phần viết lại. Nó không có bất kỳ trường hợp sử dụng khác ngay bây giờ.
Ad Nam

4

JavaScript (Node.js) , 87 86 byte

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):""

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

Giải pháp 83 byte ( (n/15-2|0)*s<4) được dành riêng trước tiên vì tôi cần kiểm tra dung lượng lớn hơn n.

CẬP NHẬT: Vâng, (n/15-2|0)*s<4không hoạt động vì lớn hơn nnđủ lớn khiến tổng số không đạt 1000.


4

PHP, 92 byte

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

Chạy như ống với -R hoặc thử trực tuyến .


3

Sạch sẽ , 215 byte

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

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

Vì vậy, cuối cùng tôi đã tìm ra một cách ngắn hơn để có được một hạt giống ngẫu nhiên hơn nhập khẩu System._Unsafe, System.Timevà sử dụng toInt(accUnsafe time)...
Và cậu bé là nó thực sự trên tinh thần codegolf - nhúng một cuộc gọi đến C, bỏ qua những kiểu nhà nước trên thế giới thường được sử dụng để đảm bảo việc đánh giá thứ tự của những điều đó.


3

Java (JDK 10) , 121 117 113 111 byte

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;}

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

Nó thiên về việc đặt nhiều sáp ở gần đỉnh, nhưng về mặt lý thuyết thì có thể xuất hiện bất kỳ sự sắp xếp hợp pháp nào của sáp.

chỉnh sửa: 4 byte đã được lưu bởi @KevinCruijssen

Trong Java có thể đọc được:

(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)có thể Math.random()*-~wcho -2 byte. Ở đây các mẹo có liên quan như tham khảo tại sao. . Câu trả lời tốt đẹp! +1 từ tôi. EDIT: Trên thực tế, có thể lưu thêm 2 byte bằng cách sử dụng jbiến tạm thời cho w+1(vì nó sẽ được ghi đè ngay sau khi in) và sử dụng j*=Math.random()thay vào đó vì vậy bạn sẽ không cần truyền tới (int)( 117 byte ).
Kevin Cruijssen

@KevinCruijssen tốt đẹp! Ngoài ra tôi chỉ nhận thấy rằng &i>2điều kiện này là không cần thiết
SamYonnou

3

Powershell , 188 162 byte

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{''}}

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

-2 byte bởi @Kevin Cruijssen
-4 byte bằng cách xóa tùy chọn Get-verb
-20 byte bằng cách rút ngắn vòng lặp và xóa khoảng trắng


Xin chào, chào mừng đến với PPCG! Câu trả lời tuyệt vời đầu tiên! Tôi đã làm một số thử nghiệm cơ bản, và mọi thứ dường như hoạt động tuyệt vời. Tôi hầu như không biết gì về Powershell, nhưng liệu có thể đổi else{if($t-ne 1e3){Get-Random(1000-$t)}}thành elseif($t-ne 1e3){Get-Random(1000-$t)}? Tôi thấy bạn đã sử dụng một elseifmã sớm hơn trong mã của mình, vì vậy điều này sẽ giúp bạn tiết kiệm 2 byte. Ngoài ra, có thể Mẹo để chơi gôn trong Powershell hoặc Mẹo để chơi gôn bằng <tất cả các ngôn ngữ> có thể mang lại cảm hứng nào đó hơn không? Tận hưởng kì nghỉ của bạn! :)
Kevin Cruijssen

1
hoàn toàn chính xác về ifelse. Loại bỏ đối tác khác của nó trước đó trong quá trình. Liên kết đã cho một số cảm hứng quá!
Edwin

2

Pascal (FPC) , 192 190 byte

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.

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

Sử dụng phương pháp đóng gói vào thùng bằng TFeld . In hàng dưới cùng đầu tiên với một dòng mới.

Có vẻ như FPC không có vấn đề gì random(0), vì vậy tôi có một số bổ sung khác thường ở đó.


Trình ban đầu của tôi, đã giảm xuống còn 209 byte:

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.

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


2

Than , 37 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

F²F²

Lặp lại hai lần, hai lần. Ngoài ra, tôi có thể có số nguyên chia chỉ số vòng lặp cho 2 cho cùng một số byte.

‹³⁺ι÷Iθ¹⁵

Nếu chỉ số bên ngoài cộng với một phần mười của nhiệt độ lớn hơn ba ...

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

... Sau đó đẩy một số nguyên ngẫu nhiên lên đến và bao gồm 1000 - tổng cho đến nay. Thật không may, Char than không thể tính tổng của một danh sách trống nên tôi phải thay thế chuỗi trống thay thế.

⊞υ⁻φΣυ

Đẩy số tiền còn lại vào danh sách.

Eυ⎇ιIιω

Chuyển đổi danh sách thành chuỗi, nhưng sử dụng chuỗi trống thay vì không.


2

Thạch , 28 byte

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

Một chương trình đầy đủ in kết quả (lộn ngược, như đã được cho phép).

7ȷn>591015 5 tuple được tạo và sau đó được lọc, từ đó chọn)

Làm sao?

>“,;‘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
" Bạn cũng được phép đảo ngược đầu ra (Tức là 1000\n\n\n\nthay vì \n\n\n\n1000hoặc [87, null, 913, null, null]thay vì [null, null, 913, null, 87]). " Vì vậy, bạn được phép sử dụng phiên bản 28 byte mà không cần .
Kevin Cruijssen

2

Cành , 126 byte

Đây thực sự là một thử thách thú vị!

Mã này tạo ra một macro phải được nhập.

{%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%}

Để nhập nó, chỉ cần làm điều này:

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

Cái này cần phải dùng mẹo.

Bạn có thể dùng thử trên https://twigfiddle.com/t4dfgy
Thông báo : Do trang xóa các khoảng trắng, tôi buộc phải thêm một- ở cuối dòng, để chứng minh rằng nó đang xuất ra số dòng chính xác.

Trên một cài đặt thông thường, bạn sẽ chỉ nhìn thấy các dòng mới mà không có vấn đề.


2

Perl 6 , 62 byte

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

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

Một khối mã ẩn danh nhận một chuỗi và trả về một danh sách các số nguyên, với Nilhoặc một danh sách trống ( []) thay cho 0s.

Giải trình:

{($!=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

PHP ,113 108 99 97 93 byte

<?php $i=$argv[1];while($a++<1e3){${r.rand(1,$i<60?$i<45?:3:5)}++;}echo"$r5
$r4
$r3
$r2
$r1";

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

-11 byte nhờ @titus
-9 byte vì mọi thứ đều là một chuỗi


2

J , 56 55 54 48 43 40 byte

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

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

-3 byte nhờ FrownyFrog


Một phương pháp hay về mặt khái niệm khác dài hơn một chút nhưng đảm bảo phân phối đồng đều hoàn hảo trên tất cả các khả năng, theo phương pháp ở đây :

J , 53 byte

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

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


Không phải là $!.a:chỉ {.?
FrownyFrog

@FrownyFrog Cảm ơn. Tôi đã quên rằng lấy nhiều yếu tố hơn kết quả có sẵn trong phần điền "không".
Giô-na


1

Ruby , 62 55 byte

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

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

Các thử nghiệm được giới hạn ở 0-99 độ, vì đèn dung nham có thể nguy hiểm ở nhiệt độ cao hơn:


Chào bạn Tôi sợ câu trả lời của bạn không hợp lệ. Nó hiện có 0cho các dòng trống. Các dòng sản phẩm nào trong mảng có thể được bất cứ điều gì ngoại trừ 0, falsehoặc một số âm. Vì vậy, nó có thể được null, "", [], vv, nhưng không 0. Không chắc chắn nếu Ruby có mảng / danh sách đối tượng để bạn có thể chuyển đổi 0s thành thứ khác, nhưng nếu không, bạn sẽ phải in chúng thay vì trả về một mảng / danh sách.
Kevin Cruijssen

Đã sửa, nhưng tôi nghĩ nó hơi quá tùy tiện.
GB
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.