Tạo ra một hệ mặt trời


39

Giới thiệu

Điều này dựa trên một vấn đề thực tế mà tôi đã gặp phải gần đây khi làm một trò chơi trên máy tính và tôi nghĩ rằng nó sẽ tạo ra một vòng .

Có bảy loại quang phổ chính của ngôi sao tỏa ra lượng nhiệt khác nhau. Địa chất của các hành tinh xung quanh một ngôi sao chịu ảnh hưởng rất lớn bởi lượng nhiệt nhận được từ ngôi sao, đây là một yếu tố của lớp phổ và khoảng cách từ ngôi sao. Do đó sao Thủy thực sự nóng chảy, sao Hải Vương đóng băng.

Thiên hà trong trò chơi của tôi được tạo theo thủ tục và chọn ngẫu nhiên các loại hành tinh cho các ngôi sao nhất định hóa ra là 'địa ngục tuyên bố' thực sự!

Các thách thức

Phương pháp của bạn nên chọn một hành tinh từ danh sách các loại hành tinh phù hợp với loại sao, dựa trên ngưỡng nhiệt tối thiểu, ngưỡng nhiệt tối đa và số ngẫu nhiên. Để đơn giản, thử thách này sẽ chỉ sử dụng một ngôi sao hạng G, giống như mặt trời của chúng ta.

Đầu vào

Một số nguyên heattrong phạm vi 4 đến 11 đại diện cho lượng nhiệt mà hành tinh nhận được từ ngôi sao.

Biến

Bảng này cho thấy các hành tinh có thể dựa trên heat. Phương pháp của bạn trước tiên nên thu hẹp các lựa chọn có sẵn dựa trên nhiệt độ tối thiểu và nhiệt độ tối đa, heatnên rơi vào hoặc giữa hai. Ví dụ, với sức nóng 10 được thông qua trong các lựa chọn duy nhất sẽ là Sa mạc, Sắt và Lava.

Planet type    Heat min   Heat max   Random Chance
Gas Giant         4          9            15
Ice               4          6            10
Ice Giant         4          6            10
Gaia class        5          7            10
Dense Atmosphere  7          9            10
Desert            7          10           25
Iron              7          10           14
Lava             10          11           6

Tiếp theo, xác suất của một hành tinh (trong các lựa chọn còn lại) được chọn là cơ hội ngẫu nhiên của nó chia cho tổng cơ hội ngẫu nhiên của tất cả các lựa chọn.

Trong ví dụ trên, xác suất Sắt được chọn là 14/(25+14+6).

Đầu ra

Trả về loại hành tinh dưới dạng một chuỗi.

Làm tốt nhất có thể để tránh đầu mũi tên logic. Mã ngắn nhất sẽ thắng, điểm tất cả các vòng cho sự sáng tạo. Chúc bạn chơi golf vui vẻ!


"Lớp" của "lớp Gaia" có nên được viết hoa như mọi thứ khác không?
Jonathan Allan

@Jonathan ALLan là chữ thường vì nó không phải là danh từ riêng
absinthe

1
@Absinthe Vậy tại sao Dense Một chữ hoa không khí?
Erik the Outgolfer 24/2/18

17
... có ai nói vậy không? | Chào mừng bạn đến với PPCG, và thử thách đầu tiên tốt đẹp!
dùng202729

3
@EricDuminil aka một mô hình chống mũi tên, hay còn gọi là lồng-if-statement-hell! wiki.c2.com/?ArrowAntiPattern
Absinthe

Câu trả lời:


12

Thạch , 78 byte

“'ĖøÆḳƙ’ḃ7ṣ6+\+3r/ċ€×“½½½½©ÐÇı‘
“ŀỊẋ8ƒ³ẈRɼƈñqẋẏȧɱḌ<ṄỴḳ⁾ÆʋeẒĊ'@ƬØƓƝ}ḟ¬»ỴW€ẋ"ÇẎX

Một liên kết đơn âm chấp nhận một số nguyên (trong [4,11] ) sẽ trả về một danh sách các ký tự.

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

Làm sao?

Tạo các phạm vi nhiệt của các hành tinh như một danh sách các danh sách và đếm số lần xuất hiện của nhiệt lượng đầu vào trong các danh sách đó để có được danh sách các số 0 và các đại diện cho loại hành tinh nào có thể, sau đó nhân với số khả năng của tám loại hành tinh này nhận phân phối. Phân phối được sử dụng để lặp lại tên loại hành tinh và cuối cùng là lựa chọn ngẫu nhiên thống nhất được thực hiện.

“'ĖøÆḳƙ’ḃ7ṣ6+\+3r/ċ€×“½½½½©ÐÇı‘ - Link 1, getDistribution: integer
“'ĖøÆḳƙ’                        - base 250 integer = 39824688429662
        ḃ7                      - to bijective-base 7 = [1,1,2,4,7,1,4,4,6,2,2,2,2,1,5,3,3]
          ṣ6                    - split at sixes = [[1,1,2,4,7,1,4,4][2,2,2,2,1,5,3,3]]
             \                  - cumulative reduce with:
            +                   -   addition = [[1,1,2,4,7,1,4,4][3,3,4,6,8,6,7,7]]
              +3                - add three = [[4,4,5,7,10,4,7,7],[6,6,7,9,11,9,10,10]]
                 /              - reduce with:
                r               -   inclusive range = [[4,5,6],[4,5,6],[5,6,7],[7,8,9],[10,11],[4,5,6,7,8,9],[7,8,9,10],[7,8,9,10]]
                  ċ€            - count (input) in €ach e.g. for 5: [1, 1, 1, 0,0, 1, 0, 0]
                     “½½½½©ÐÇı‘ - list of code-page indices        [10,10,10,10,6,15,14,25]
                    ×           - multiply                         [10,10,10, 0,0,15, 0, 0]

“ ... »ỴW€ẋ"ÇẎX - Main link: integer
“ ... »         - compressed string = "Ice\nIce Giant\nGaia class\nDense Atmosphere\nLava\nGas Giant\nIron\nDesert"
       Ỵ        - split at new lines = ["Ice","Ice Giant","Gaia class","Dense Atmosphere","Lava","Gas Giant","Iron","Desert"]
        W€      - wrap €ach in a list
            Ç   - call last link (1) as a monad e.g. for 5: [10,10,10,0,0,15,0,0]
           "    - zip with:
          ẋ     -   repeat e.g. for 5:  [["Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice"],["Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant"],["Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class"],["Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant"]]
             Ẏ  - tighten               ["Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant"]
              X - a random choice from that list

Khùng! Làm tốt.
absinthe

@Absinthe Bạn chỉ cần upvote. Lưu ý bên lề: Trên Code Golf, chúng tôi thường không chấp nhận câu trả lời.
dùng202729

2
@ user202729 Tôi sẽ thêm phiếu trong một hoặc hai ngày. Tôi đã xem qua trang GitHub cho Jelly đang cố gắng làm sáng tỏ mã này. Tôi tin Điên! là thích hợp nhất :)
absinthe

2
@Absinthe vâng, tôi tin rằng một phần mô tả thường là một điều tốt để có ngay cả đối với các bài nộp ngôn ngữ không bí truyền :)
Jonathan Allan

3
Bạn là người thực sự điên rồ.
Selvek

7

R , 225 223 183 byte

Cảm ơn Giuseppe đã tái cấu trúc thông minh để đưa nó xuống còn 188 byte; năm phần còn lại được loại bỏ bằng cách sử dụng các biểu diễn số ít dư thừa.

i=scan()-4
sample(c("Gas Giant","Ice","Ice Giant","Gaia class","Dense Atmosphere","Desert","Iron","Lava")[l<-c(0,0,0,1,3,3,3,6)<=i&c(5,2,2,3,5,6,6,7)>=i],1,,c(3,2,2,2,2,5,2.8,1.2)[l])

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


Đó là một cách tiếp cận hay, tôi có thể phải suy nghĩ về việc loại bỏ mê cung câu lệnh if của mình nếu ủng hộ điều này trong C # :)
absinthe

Tôi nghi ngờ tiết kiệm chỉ số logic hơn là sử dụng with, data.framesubsetsẽ ngắn hơn.
Giuseppe


@Giuseppe, bạn có thể có thêm một vài byte bằng cách sử dụng một số thủ thuật của tôi với dữ liệu hành tinh , nhưng tôi nghĩ tôi cũng sẽ cải thiện tôi bằng cách sử dụng ý tưởng tách vectơ xác suất khỏi phần còn lại của dữ liệu.
Kirill L.

4

JavaScript 212

Chỉnh sửa 6 byte lưu thx Jonathan Allan

h=>[963,640,640,649,667,1628,924,437].map((z,i)=>(z/8&7)+4>h|z%8+6<h?0:t=r.push(...Array(z>>6).fill(i)),r=[])&&"Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava".split`,`[r[t*Math.random()|0]]

ít chơi gôn

h=>( 
   r = [],
   // heat min,max and chance encoded in base 8 with offsets
   // min range 4 to 10, with offset 4, 0 to 6
   // max range 6 to 11, with offset 6, 0 to 5
   [(4-4)*8 + 9-6 + 15*64,
    (4-4)*8 + 6-6 + 10*64,
    (4-4)*8 + 6-6 + 10*64,
    (5-4)*8 + 7-6 + 10*64,
    (7-4)*8 + 9-6 + 10*64,
    (7-4)*8 + 10-6+ 25*64,
    (7-4)*8 + 10-6+ 14*64,
    (10-4)*8+ 11-6+  6*64]
   .forEach( (z,i) => (
      min = (z / 8 & 7) + 4, 
      max = z % 8 + 6,
      chance = z >> 6,
      min > h || max < h 
      ? 0 // out of range
      // add current position i repeated 'chance' times
      // array size in t
      : t = r.push(...Array(chance).fill(i))
   ),
   pos = r[t * Math.random() | 0],
   ["Gas Giant", "Ice", "Ice Giant", "Gaia class", "Dense Atmosphere", "Desert", "Iron", "Lava"][pos]
)

Kiểm tra

var F=
h=>[963,640,640,649,667,1628,924,437].map((z,i)=>(z/8&7)+4>h|z%8+6<h?0:t=r.push(...Array(z>>6).fill(i)),r=[])&&"Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava".split`,`[r[t*Math.random()|0]]

function test()
{
   var heat=+H.value
   var i,result,hashtable={},rep=1e5
   for (i=0;i<rep;i++)
     result = F(heat),
     hashtable[result] = -~hashtable[result]
 
   console.log('Input',heat)
   for (i in hashtable)
   {
     console.log(i,(hashtable[i]/rep*100).toFixed(2),'%')
   }
}
<input id=H type=number min=1 max =15 value=10>
<button onclick='test()'>Test</button>


Một vài trong số 16 số cơ sở của bạn là 1 số (nên là [3913, 2630, 2630, 2647, 2681, 6522, 3706, 1707])
Jonathan Allan

Tôi nghĩ (nhưng không phải 100%) bạn có thể tiết kiệm 2 bằng cách thay thế (z/16&15)bằng z/16&15. Bất kể, bạn có thể tiết kiệm 6 byte sử dụng một nén cơ sở 8 với hiệu số của ba và sáu ... sử dụng [971,648,648,657,675,1636,932,445]với z/8&7+3, z%8+6z>>6:)
Jonathan Allan

@Jonathan Allan bù đắp! Ý tưởng tuyệt vời, thx
edc65

(z/8&7)+4&7/8&(7+4)
@Jonathan ALLan

1
@Shaggy bạn có thấy bình luận ngay phía trên của bạn không? (truyện ngắn: không)
edc65

4

Dừa , 214 195 byte

t->choice..sum([[n]*g(p)*(g(a)<t<g(b))for*n,a,b,p in'Gas Giant3AF_Ice37A_Ice Giant37A_Gaia class48A_Dense Atmosphere6AA_Desert6BP_Iron6BE_Lava9C6'.split('_')],[])
from random import*
g=int$(?,36)

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

Một cổng Python sẽ dài 203 200 byte:

lambda t:choice(sum([[n]*int(p,36)*(int(a)<t<int(b,36))for*n,a,b,p in'Gas Giant3AF_Ice37A_Ice Giant37A_Gaia class48A_Dense Atmosphere6AA_Desert6BP_Iron6BE_Lava9C6'.split('_')],[]))
from random import*

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


1
Thật thú vị, tại thời điểm viết bài, cổng Python của bạn đánh bại tất cả các giải pháp Python khác!
Kirill L.

4

Than , 115 111 byte

≔I⁻N³θF⁸«≔§⪪”↷&∧⬤.YLφκ¦(⁼;σ≕]✂↙ζC” ιη¿›θη¿‹θ§η¹FI✂η²⊞υ黧⪪”↓(″1↨▷]U,&ζ^iI″RSY≡´⍘'#﹪υVw5Vu>D<U5r6⁰Q▷Z◨⌕⁸ΣεCZ”¶‽υ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉnh sửa: Đã lưu 4 byte chỉ nhờ @ ASCII. Giải trình:

≔I⁻N³θ

Trừ 3 từ đầu vào để có thể so sánh với các chữ số đơn.

F⁸«≔§⪪”↷&∧⬤.YLφκ¦(⁼;σ≕]✂↙ζC” ιη

Chia chuỗi 0715 0410 0410 1510 3710 3825 3814 696trên các khoảng trắng (khoảng trắng dường như nén tốt hơn dấu phẩy nhưng tôi đã không thử bất kỳ ký tự nào khác) và lặp qua từng phần.

¿›θη¿‹θ§η¹FI✂η²⊞υι»

So sánh đầu vào với các chữ số thứ nhất và thứ hai và nếu nó ở giữa thì đẩy chỉ số vòng lặp số lần đã cho vào danh sách trống được xác định trước, do đó sẽ điền vào đó.

§⪪”↓(″1↨▷]U,&ζ^iI″RSY≡´⍘'#﹪υVw5Vu>D<U5r6⁰Q▷Z◨⌕⁸ΣεCZ”¶‽υ

Tách danh sách các hành tinh trên dòng mới (một lần nữa, tốt hơn dấu phẩy vì một số lý do) và chọn thành phần tương ứng với chỉ mục được chọn ngẫu nhiên từ danh sách.


Đẹp một. Làm thế nào để yếu tố Ngẫu nhiên (u) trong các xác suất khác nhau cho mỗi hành tinh? (Tôi không biết gì về Than).
absinthe

Nó đang chọn một chỉ mục từ một danh sách có phân phối chính xác các chỉ số hành tinh do "đẩy chỉ số vòng lặp số lần đã cho vào danh sách trống được xác định trước, do đó điền vào nó." sau đó sử dụng chỉ mục được chọn để lấy tên hành tinh.
Jonathan Allan

@Jonathan ALLan Hiểu rồi, cảm ơn
absinthe

111 byte , tôi nghĩ sao? Nói chung, chỉ cần thử sử dụng các ký tự trước đó trong lớp ký tự, xem nén # 11. Thứ tự mặc định lưu một byte khác, nhưng về cơ bản chỉ khi bạn chỉ có các ký hiệu
ASCII - chỉ

@ ASCII-Chỉ rõ ràng như bùn ... tại sao các dòng mới tốt hơn ở đó nhưng không gian cho chuỗi khác?
Neil

3

R , 196 193 190 175 171 byte

sample(readLines(,8),1,,c(3,2,2,2,2,5,2.8,1.2)*((x=scan()-3)>c(0,0,0,1,3,3,3,6)&x<c(7,4,4,5,7,8,8,9)))
Gas Giant
Ice
Ice Giant
Gaia class
Dense Atmosphere
Desert
Iron
Lava

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

Ban đầu lấy cảm hứng từ giải pháp này của @rturnbull, tuy nhiên vì cả hai bài nộp đã phát triển đáng kể, nên về cơ bản đây là sự pha trộn ý tưởng của tác giả ban đầu, @Giuseppe, người rất hữu ích trong các bình luận và của tôi. Dưới đây là tóm tắt các điểm chính giúp giảm số lượng byte:

  • Mã hóa dữ liệu hành tinh dưới dạng CSV Thu thập tên readLinesđể tránh số lượng lớn các ký tự trích dẫn xung quanh chuỗi.

  • Tinh chỉnh các thông số nhiệt để chúng ta có thể sử dụng <>ký thay vì <=>=.

  • Thay đổi định dạng dữ liệu nhiệt từ Heat min, Heat maxđể Heat min, Heat Deltaloại bỏ các số có hai chữ số.
    Thay thế bằng cách dịch chuyển tất cả các số bằng -3

  • Chia tất cả các xác suất của hành tinh cho 5 cũng dẫn đến một vài chữ số nhỏ hơn.

  • Nhân vectơ xác suất hành tinh với vectơ Booleans (cho biết liệu đầu vào của chúng ta có thỏa mãn yêu cầu nhiệt hay không) để vô hiệu hóa xác suất của các hành tinh không phù hợp.

Có lẽ, một vài byte có thể đạt được bằng cách áp dụng một số loại nén dữ liệu.
Tôi nghĩ, không còn nữa.


1
t=thay vì text=sẽ tiết kiệm 3 byte là tốt.
Giuseppe


Tuy nhiên, câu trả lời chắc chắn sử dụng read.csvcho một cột duy nhất được đề xuất readLinesđể loại bỏ hoàn toàn các trích dẫn, mặc dù bạn phải đặt rõ ràngn
Giuseppe

@Giuseppe, tuy nhiên, nó là 171 byte, vì bạn cũng đã loại bỏ các dấu ngoặc đơn cần thiết để duy trì quyền ưu tiên của toán tử và phiên bản của bạn đưa ra xác suất sai. Tuy nhiên, một gợi ý tuyệt vời!
Kirill L.

Ồ tôi tự hỏi những dấu ngoặc đơn đó đến từ đâu ....
Giuseppe

3

Python, 282 byte , 261 byte:

from random import*
i,p,l=input(),[('Gas Giant',3,11,15),("Ice",3,7,10),("Ice Giant",3,7,10),("Gaia Class",4,8,10),("Dense Atmosphere",6,10,10),("Desert",6,11,25),("Iron",6,11,14),("Lava",9,12,6)],[]
for x in p:exec"l+=x[0],;"*(x[1]<i<x[2])*x[3]
print choice(l)

Khá đơn giản - khá chắc chắn rằng nó có thể được chơi gôn nhiều hơn - Vẫn đang tìm kiếm một cách tốt hơn để thể hiện phạm vi hành tinh và dữ liệu xác suất. Nếu tôi ở trong phạm vi của loại hành tinh, hãy thêm nó vào danh sách theo xác suất, sau đó in ngẫu nhiên một loại.

EDIT: Với khoản tín dụng cho Jonathan Frech - làm lại vòng lặp for để loại bỏ một vài byte. Cách tốt hơn để thêm các mục vào danh sách


3
Chào mừng đến với PPCG! Không chắc chắn cách bạn đếm byte, nhưng tôi chỉ nhận được 283. Ít hơn nếu thụt lề đó là một tab thay vì 4 byte.
Martin Ender

1
Không i in range(x[1], x[2])loại trừ các cạnh trên của nhiệt, không giống như trong đặc điểm kỹ thuật?
Graodes


1
Điều này có thể giúp được gì không? p,d="Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava".split(","),[ord(i)-10 for i in"#"] d=[[p[x//3]]+d[x:x+3]for x in range(0,len(d),3)]
MustacheMoses

1
@Chromane Xin lỗi có vẻ như các bình luận đã tước đi một số ký tự.
MustacheMoses

2

Octave với Gói thống kê, 178 176 174 158 byte

@(h)randsample(strsplit('Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava',','),1,1,('UPPPP_TL'-70).*(h>'IIIJLLLO'-70&h<'PMMNPQQR'-70)){1}

Mã xác định một hàm ẩn danh nhập một số và xuất ra một chuỗi.

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

Giải trình

Mật mã

@(h)

định nghĩa một hàm ẩn danh với đầu vào h.

Chuỗi

'Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava'

được phân chia tại dấu phẩy bằng cách sử dụng

strsplit(...,',')

Kết quả là một mảng ô của các chuỗi, trong đó mỗi chuỗi là một lớp hành tinh.

Mật mã

'IIIJLLLO'-70

định nghĩa chuỗi được hiển thị và trừ 70từ các điểm mã của ký tự của nó. Điều này cho mảng các giá trị nhiệt tối thiểu trừ đi 1 , nghĩa là [3 3 3 4 6 6 6 9].

Tương tự như vậy,

'PMMNPQQR'-70

tạo ra các mảng giá trị nhiệt tối đa cộng với 1 , nghĩa là [10 7 7 8 10 11 11 12].

Sự so sánh

h>...&h<...

đưa ra một mảng chứa truehoặc falsechỉ ra các lớp hành tinh nào là có thể.

Mặt khác,

'UPPPP_TL'-70

định nghĩa mảng các giá trị cơ hội ngẫu nhiên , [15 10 10 10 10 25 14 6].

Các hoạt động

(...).*(...)

là nhân tố khôn ngoan của hai mảng sau ( truefalsecư xử như 01tương ứng). Điều này đưa ra một mảng trong đó mỗi lớp hành tinh có cơ hội ngẫu nhiên hoặc 0nếu lớp đó không thể dựa trên đầu vào. Mảng này sẽ được sử dụng làm trọng số trong lấy mẫu ngẫu nhiên

Chức năng gọi

randsample(...,1,1,...)

chọn một trong các ô từ mảng ô của chuỗi (đối số đầu vào đầu tiên), sử dụng mảng trọng số được tính toán (đối số đầu vào thứ tư). Cụ thể, hàm randsampletự động bình thường hóa các trọng số theo xác suất và sau đó thực hiện lựa chọn ngẫu nhiên với các xác suất đó. Kết quả là một mảng ô chứa một chuỗi. Mật mã

{1}

được sử dụng để trích xuất chuỗi đó, tạo thành đầu ra hàm.


2
Giải thích tuyệt vời, cảm ơn. Điểm số tuyệt vời quá.
absinthe

2

Python 3 , 263 byte

from random import*
P=lambda h:"Gas Giant|Ice|Ice Giant|Gaia class|Dense Atmosphere|Desert|Iron|Lava".split("|")[choices(*list(zip(*filter(lambda x:h in range(*x[2:]),zip(*[[int(x,32)for x in"0f4a1a472a473a584a7a5p7b6e7b76ac"][a::4]for a in(0,1,2,3)]))))[:2])[0]]

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


1

Perl 5 ( -p), 230 byte

@a=(['Gas Giant',4,9,15],[Ice,4,6,10],['Ice Giant',4,6,10],['Gaia class',5,7,10],['Dense Atmosphere',7,9,10],[Desert,7,10,25],[Iron,7,10,14],[Lava,10,11,6]);//;map{push@b,($$_[0])x($$_[3]*($$_[1]<=$'&&$'<=$$_[2]))}@a;$_=$b[rand@b]

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


Nếu bạn loại bỏ một đến các mức nhiệt tối thiểu và thêm một mức nhiệt độ tối đa (sẽ [Ice,4,5,11]thay thế [Ice,4,6,10], v.v.) thì bạn sẽ có thể sử dụng <thay vì <=>thay vì >=, do đó tiết kiệm được 2 byte. (vâng, đó không phải là nhiều ...)
Dada

1

Nim , 314 298 294 byte

import random,sequtils
proc c(h:int)=
 var a= @[""]
 a.del 0
 for n in[("Gas Giant",4,9,15),("Ice",4,6,10),("Ice Giant",4,6,10),("Gaia Class",5,7,10),("Dense Atmosphere",7,9,10),("Desert",7,10,25),("Iron",7,10,14),("Lava",10,11,6)]:(if h>=n[1]and h<=n[2]:a.add repeat(n[0],n[3]))
 echo random a

Đối với vòng lặp bây giờ trong một dòng, không trả về, ít byte hơn cho kiểu ẩn

Xóa 4 khoảng trắng (cảm ơn Kevin )

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


Tôi chưa bao giờ lập trình Nim, nhưng tôi nghĩ bạn có thể chơi gôn bốn chỗ: một tại for n in[(; và ba tại if h>=n[1]and h<=n[2].
Kevin Cruijssen

1

05AB1E , 78 76 byte

”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”#8äðýā<•ŒEŽuS,•2ôו9èÁnÇ∞Λ•SÌ2ôεŸIå}ÏSΩè

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

Giải trình

”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”
đẩy chuỗi Gas Giant Ice Giant Gaia class Dense Atmosphere Ice Desert Iron Lava

#                                          # split on spaces
 8ä                                        # divide into 8 parts
   ðý                                      # join each by spaces
     ā<                                    # push the range [0 ... 7]
       •ŒEŽuS,•                            # push 151010101025146
               2ô                          # split into pieces of 2
                                           # results in [15, 10, 10, 10, 10, 25, 14, 6]
                 ×                         # repeat each number in the range by these amounts
                                           # results in ['000000000000000', '1111111111', '2222222222', '3333333333', '4444444444', '5555555555555555555555555', '66666666666666', '777777']
                  •9èÁnÇ∞Λ•                # push 2724355724585889
                           S               # split to list of digits
                            Ì              # decrement each twice
                                           # results in [4,9,4,6,5,7,7,9,4,6,7,10,7,10,10,11]
                             2ô            # split into pieces of 2
                                           # results in [[4, 9], [4, 6], [5, 7], [7, 9], [4, 6], [7, 10], [7, 10], [10, 11]]
                               εŸIå}       # apply to each pair
                                Ÿ          # range [a ... b]
                                 Iå        # check if input is contained in the range
                                           # ex, for input 10: [0, 0, 0, 0, 0, 1, 1, 1]
                                    Ï      # keep only the indices which are true
                                           # ex, for input 10: ['5555555555555555555555555', '66666666666666', '777777']
                                     S     # split to list of digits
                                      Ω    # pick one at random
                                       è   # index into the list of strings with this

1

Python 3, 199 194 byte

from random import*
lambda n:choices("Ice|Ice Giant|Gas Giant|Gaia class|Dense Atmosphere|Desert|Iron|Lava".split('|'),[(0x33b2a53d4a>>5*i&31)*(0xc07878380e3f0707>>8*i+n-4&1)for i in range(8)])

Việc tách hthành các mặt nạ bit riêng biệt và các giá trị cơ hội ngẫu nhiên (xem giải thích) sẽ tiết kiệm một vài byte bằng cách loại bỏ một phép gán hvà đơn giản hóa việc range()hiểu danh sách.

Giải pháp trước

from random import*
h=0xc033c39e3270a0e51fbc1d40ea
lambda n:choices("Ice|Ice Giant|Gas Giant|Gaia class|Dense Atmosphere|Desert|Iron|Lava".split('|'),[(h>>i&31)*(h>>i+n+1&1)for i in range(0,104,13)])

Xác định một hàm ẩn danh nhận một int và trả về loại hành tinh.

Đối với mỗi loại hành tinh, giá trị 13 bit đã được tính toán. 8 bit trên cùng xác định mặt nạ bit của các giá trị nhiệt hợp lệ cho loại hành tinh đó. 5 bit dưới cùng là cơ hội ngẫu nhiên cho loại hành tinh đó. Ví dụ: "lớp Gaia" là loại hợp lệ cho các giá trị nhiệt 4 đến 7, do đó, nó có mặt nạ 0b00001111. Nó có cơ hội ngẫu nhiên là 10, hoặc 0b01010. Kết hợp chúng sẽ tạo ra giá trị 13 bit 0b0000111101010cho loại "lớp Gaia". Các giá trị 13 bit cho mỗi loại hành tinh được nối với nhau để lấy giá trị cho h(13 bit thấp nhất dành cho loại hành tinh "Băng"). (Câu trả lời mới hơn không kết hợp các giá trị này).

Việc hiểu danh sách lặp lại qua các giá trị 13 bit để tạo danh sách các trọng số, trong đó trọng số là cơ hội ngẫu nhiên nếu loại hành tinh là lựa chọn hợp lệ cho giá trị nhiệt đã cho và bằng không. Đối với mỗi loại hành tinh, (h>>i&31)trích xuất cơ hội ngẫu nhiên cho loại hành tinh đó. (h>>i+n+1&1)ước tính thành 1 nếu loại hành tinh là lựa chọn hợp lệ cho giá trị nhiệt nvà ước tính bằng 0 nếu không.

Hàm thư viện random.choices(choices, weights)chọn một mục từ danh sách các lựa chọn dựa trên danh sách các trọng số.


i+n+1có thể i-~n. TIO
OVS

1

Ruby , 214 193 189 byte

->h{'Gas Giant,Desert,Iron,Lava,Ice,Ice Giant,Gaia class,Dense Atmosphere'.split(?,).zip(31006330.digits,75449887.digits,[15,25,14,6]).flat_map{|n,m,x,r|m<h-3&&x>h-3?[n]*(r||10):[]}.sample}

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


Xin lỗi, tôi không nhận được đầu ra, nó có phải là mục đầu tiên trong danh sách không?
absinthe

@Absinthe Tôi đã thêm một số tiêu đề, kiểm tra lại. Đó là tất cả các mức nhiệt từ 4 đến 11 và một hành tinh được tạo ngẫu nhiên cho mỗi hành tinh
Asone Tuhid

À tôi hiểu rồi, mặc dù lý tưởng chỉ nên có một đầu ra chuỗi
absinthe

@Absinthe Bạn nói đúng, đó chỉ là mã kiểm tra của riêng tôi, bây giờ bạn có thể nhập giá trị nhiệt bạn muốn và nó trả về 1 kết quả
Asone Tuhid

1

Haskell , 377 364 358 318 312 270 265 262 256 251 byte

import System.Random
f h|x<-[n|(n,(a,b,c))<-zip(lines"Gas Giant\nIce\nIce Giant\nGaia class\nDense Atmosphere\n
Desert\nIron\nLava")$zip3[4,4,4,5,7,7,7,10][9,6,6,7,9,10,10,11][15,10,10,10,10,25,14,6],h<=
b,h>=a,_<-[1..c]]=(x!!)<$>randomRIO(0,length x-1)

(Tôi đã thêm ngắt dòng cho bản in đẹp hơn). Tác vụ nói "return", không phải "print", do đó, flà một hàm trả về tên hành tinh được chọn ngẫu nhiên vào IOđơn nguyên , f :: Int -> IO String.

Các mainđược main = do {f 10 >>= print}( Haskell chơi golf lời khuyên nói nó không đếm). Bản in

"Iron"     -- or "Desert", or "Lava"

(chỉnh sửa: &trường hợp cơ sở đã loại bỏ ; chuyển mainra; thay đổi thành bốn và unzip, và chuyển sang bảo vệ mẫu và làm >>=theo đề xuất từ Laikoni , cảm ơn!; thực hiện cách tiếp cận từ giải pháp Jelly thay vào đó, lặp lại tên; loại rõ ràng không còn cần thiết ; một lời khuyên khác của Laikoni tiết kiệm thêm 3 byte, biến nó thành một IOchức năng; thực hiện lời khuyên từ phòng trò chuyện).

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


Tốt đẹp! Để tránh tràn ngập các bình luận, bạn có thể tham gia phòng trò chuyện Haskell Of Monads and Men để thảo luận thêm về câu trả lời của bạn.
Laikoni

0

Java 8, 398 384 byte

n->{String r="",a[];for(String x:"456789~Gas Giant~15;456~Ice~10;456~Ice Giant~10;567~Gaia class~10;789~Dense Atmosphere~10;78910~Desert~25;78910~Iron~14;1011~Lava~6".split(";"))if(x.split("~")[0].contains(n))r+=x+";";long t=0,u=0;for(String x:(a=r.split(";")))t+=new Long(x.split("~")[2]);t*=Math.random();for(String x:a)if((u+=new Long((a=x.split("~"))[2]))>t)return a[1];return"";}

Nó chắc chắn có thể được đánh gôn thêm, nhưng xác suất kết hợp với Chuỗi không phải là rất dễ dàng trong Java.

Giải trình:

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

n->{                // Method with String as both parameter and return-type
  String r="",      //  Temp-String, starting empty
         a[];       //  Temp String-array
  for(String x:"456789~Gas Giant~15;456~Ice~10;456~Ice Giant~10;567~Gaia class~10;789~Dense Atmosphere~10;78910~Desert~25;78910~Iron~14;1011~Lava~6".split(";"))
                    //  Loop over the String-parts in the format "heats~type~probability"
    if(x.split("~")[0].contains(n))
                    //   If the heats contains the input
      r+=x+";";     //    Append this entire String-part to the temp-String `r`
  long t=0,u=0;     //  Temp numbers, both starting empty
  for(String x:(a=r.split(";")))
                    //  Loop over the temp-String parts:
    t+=new Long(x.split("~")[2]);
                    //   Sum their probabilities
  t*=Math.random(); //  Get a random number in the range [0,sum_of_probabilities)
  for(String x:a)   //  Loop over the temp-String parts again
    if((u+=new Long((a=x.split("~"))[2]))>t)
                    //   The moment the current probability-sum is > the random number
      return a[1];  //    Return the Type of planet
  return"";}        //  Mandatory return we won't encounter (which returns nothing)

0

Tối thiểu , 280 277 byte

:a ' =b (("Gas Giant" 4 9 15) ("Ice" 4 6 10) ("Ice Giant" 4 6 10) ("Gaia Class" 5 7 10) ("Dense Atmosphere" 7 9 10) ("Desert" 7 10 25) ("Iron" 7 10 14) ("Lava" 10 11 6)) (=n (a n 1 get >= a n 2 get <= and) ((n 0 get b append #b) n 3 get times) when) foreach b b size random get

Bắt đầu với nhiệt trên ngăn xếp, để lại một chuỗi trên ngăn xếp. Quá trình chung giống như câu trả lời Python 2.

Giải trình

Lưu ý rằng min là nối

:a ' =b                               ;Set the value on the stack (heat) to a, set empty quot to b
(("Gas Giant" 4 9 15) ("Ice" 4 6 10) ("Ice Giant" 4 6 10) ("Gaia Class" 5 7 10) ("Dense Atmosphere" 7 9 10) ("Desert" 7 10 25) ("Iron" 7 10 14) ("Lava" 10 11 6)) ;Data to be iterated over
(=n                                   ;  set n to current item
 (a n 1 get >= a n 2 get <= and)      ;    check if n is between the min (2nd elment of n) and max (3rd element of n) heat
 (
  (n 0 get b append #b) n 3 get times ;      insert the name(1st element of n) into the quot of names (b) a number of times corresponding to the 4th element of n
 ) when                               ;    when the previous check is true
) foreach                             ;  for every quot in previous data
b b size random get                   ;choose a random element from the list of names

0

PowerShell, 56 + 135 (tệp CSV) + 1 (tên tệp) = 192 byte

param($z)ipcsv a|?{$z-in$_.m..$_.x}|%{,$_.p*$_.r}|Random

Hãy thử trực tuyến! (đây là phiên bản sửa đổi một chút, tạo tệp CSV tạm thời được mô tả bên dưới)

Nhập tệp CSV bằng cách sử dụng ipcsv(viết tắt Import-CSV) có tên atrong thư mục cục bộ có chứa thông tin sau:

P,m,x,r
Gas Giant,4,9,15
Ice,4,6,10
Ice Giant,4,6,10
Gaia class,5,7,10
Dense Atmosphere,7,9,10
Desert,7,10,25
Iron,7,10,14
Lava,10,11,6

Điều đó tự động tạo ra một hashtable lặp đi lặp lại của những thứ như sau:

@{P=Gas Giant; m=4; x=9; r=15}
@{P=Ice; m=4; x=6; r=10}
...

Sau đó chúng tôi sử dụng Where-Object( ?) để kéo ra những mục nơi số nguyên đầu vào của chúng tôi $z-inphạm vi $_.mđến $_.x(ví dụ, đó là trong phạm vi nhiệt). Sau đó, chúng tôi bơm chúng vào một Foreach-Objectvòng lặp ( %) tạo ra một chuỗi các chuỗi tên dựa trên cơ hội ngẫu nhiên của các tên đó. Ví dụ, điều này sẽ tạo ra một 15 "Gas Giant"chuỗi các chuỗi nếu nhiệt đó phù hợp. Sau đó, chúng tôi đặt những cái vào Get-Randomđó sẽ kéo ra chuỗi thích hợp với trọng số phù hợp.


-1

PHP , 1236 byte

<?php
$heat = (int)fgets(STDIN);
$planets =
    [
        'Gas Giant' =>        ['heat_min' => 4, 'heat_max' => 9, 'selection_chance' => 15],
        'Ice' =>              ['heat_min' => 4, 'heat_max' => 6, 'selection_chance' => 10],
        'Ice Giant' =>        ['heat_min' => 4, 'heat_max' => 6, 'selection_chance' => 10],
        'Gaia class' =>       ['heat_min' => 5, 'heat_max' => 7, 'selection_chance' => 10],
        'Dense Atmosphere' => ['heat_min' => 7, 'heat_max' => 9, 'selection_chance' => 10],
        'Desert' =>           ['heat_min' => 7, 'heat_max' => 10, 'selection_chance' => 25],
        'Iron' =>             ['heat_min' => 7, 'heat_max' => 10, 'selection_chance' => 14],
        'Lava' =>             ['heat_min' => 10, 'heat_max' => 11, 'selection_chance' => 6],
    ];
foreach ($planets as $planet) {
    $chance_sum += ($heat >= $planet['heat_min'] && $heat <= $planet['heat_max']) * $planet['selection_chance'];
}
while (true) {
    foreach ($planets as $name => $planet) {
        $prob = 100 * ($heat >= $planet['heat_min'] && $heat <= $planet['heat_max']) * $planet['selection_chance'] / $chance_sum;
        if (rand(0, 100) < $prob) {
            echo $name."\n";
            exit;
        }
    }
}
?>

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


5
Các câu trả lời cho câu hỏi code-golf cần thể hiện nỗ lực trong việc chơi golf chúng. Bạn có thể có được điều này ngắn hơn rất nhiều chỉ bằng cách loại bỏ khoảng trắng . Bước tiếp theo sẽ là rút ngắn tên biến thành tên ký tự đơn.
trứng
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.