Buat tata surya


39

Intro

Ini didasarkan pada masalah aktual yang baru-baru ini saya hadapi saat membuat permainan komputer dan saya pikir itu akan membuat putaran .

Ada tujuh kelas spektral utama bintang yang mengeluarkan berbagai jumlah panas. Geologi planet di sekitar bintang sangat dipengaruhi oleh jumlah panas yang diterima dari bintang tersebut, yang merupakan faktor kelas spektral dan jarak dari bintang. Karenanya Merkurius praktis cair, beku di Neptunus.

Galaksi dalam gim saya secara prosedural dihasilkan dan secara acak memilih jenis planet untuk bintang yang diberikan ternyata benar-benar 'jika pernyataan neraka'!

Tantangan

Metode Anda harus memilih satu planet dari daftar jenis planet yang sesuai untuk kelas bintang, berdasarkan ambang panas minimum, ambang panas maksimum, dan angka acak. Untuk kesederhanaan, tantangan ini hanya akan menggunakan bintang kelas G, sama seperti matahari kita.

Input

Bilangan bulat heatdalam rentang 4 hingga 11 mewakili jumlah panas yang diterima planet dari bintang.

Variabel

Tabel ini menunjukkan kemungkinan planet berdasarkan heat. Metode Anda harus terlebih dahulu mempersempit pilihan yang tersedia berdasarkan heat min dan heat max, heatharus jatuh pada atau di antara keduanya. Misalnya dengan 10 panas berlalu dalam satu-satunya pilihan akan Gurun, Besi dan 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

Selanjutnya, probabilitas sebuah planet (dalam pilihan yang tersisa) dipilih adalah peluang acaknya dibagi dengan jumlah peluang acak semua pilihan.

Dalam contoh di atas, probabilitas Besi dipilih 14/(25+14+6).

Keluaran

Kembalikan tipe planet sebagai string.

Lakukan yang terbaik untuk menghindari panah logis. Kode menang paling pendek, poin semua untuk kreativitas. Selamat bermain golf!


Haruskah "kelas" dari "kelas Gaia" dikapitalisasi seperti yang lainnya?
Jonathan Allan

@JonathanAllan huruf kecil karena ini bukan kata benda yang tepat
Absinthe

1
@Absinthe Lalu mengapa Dense A tmosphere huruf besar?
Erik the Outgolfer

17
... adakah yang mengatakan itu? | Selamat datang di PPCG, dan tantangan pertama yang menyenangkan!
user202729

3
@EricDuminil alias anti-pola panah, alias bersarang-jika-pernyataan-neraka! wiki.c2.com/?ArrowAntiPattern
Absinthe

Jawaban:


12

Jelly , 78 byte

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

Tautan monadik yang menerima bilangan bulat (dalam [4,11] ) yang mengembalikan daftar karakter.

Cobalah online!

Bagaimana?

Menciptakan rentang panas planet-planet sebagai daftar daftar dan menghitung kemunculan panas input dalam daftar tersebut untuk mendapatkan daftar nol dan yang mewakili jenis planet mana yang mungkin, kemudian dikalikan dengan jumlah kemungkinan dari delapan jenis planet untuk dikerjakan. dapatkan distribusinya. Distribusi ini digunakan untuk mengulang nama-nama jenis planet, dan akhirnya pilihan acak yang seragam dibuat.

“'ĖøÆḳƙ’ḃ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

Gila! Sudah selesai dilakukan dengan baik.
Absinthe

@ Amsinthe Anda dapat dengan mudah menaikkan suara. Catatan: Pada Golf Kode kami biasanya tidak menerima jawaban.
user202729

2
@ user202729 Saya akan menambahkan suara dalam satu atau dua hari. Saya mencari di halaman GitHub untuk Jelly mencoba mengungkap kode ini. Saya percaya gila! paling tepat :)
Absinthe

2
@Abukannya, saya percaya bagian deskriptif sering merupakan hal yang baik untuk dimiliki bahkan untuk pengiriman bahasa non-esoterik :)
Jonathan Allan

3
Kalian benar-benar gila.
Selvek

7

R , 225 223 183 byte

Terima kasih kepada Giuseppe untuk refactoring yang cerdik untuk menurunkannya menjadi 188 byte; lima yang tersisa dicukur dengan menggunakan representasi angka yang tidak terlalu banyak.

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

Cobalah online!


Itu pendekatan yang bagus, saya mungkin harus berpikir untuk menghapus pernyataan labirin if saya jika mendukung ini di C # :)
Absinthe

Saya menduga menyimpan indeks logis daripada menggunakan with, data.framedan subsetakan lebih pendek.
Giuseppe


@ Giuseppe, Anda mungkin bisa mendapatkan beberapa byte lagi dengan menggunakan beberapa trik saya dengan data planet , tapi saya pikir saya juga akan meningkatkan saya menggunakan ide Anda untuk memisahkan vektor probabilitas dari sisa data.
Kirill L.

4

JavaScript 212

Edit 6 byte simpan 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]]

kurang golf

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

Uji

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>


Beberapa nomor 16 basis Anda adalah 1 off (seharusnya [3913, 2630, 2630, 2647, 2681, 6522, 3706, 1707])
Jonathan Allan

Saya pikir (tapi saya tidak 100%), Anda dapat menyimpan 2 dengan mengganti (z/16&15)dengan z/16&15. Apapun, Anda dapat menyimpan 6 byte menggunakan kompresi basis 8 dengan offset tiga dan enam ... gunakan [971,648,648,657,675,1636,932,445]dengan z/8&7+3, z%8+6dan z>>6:)
Jonathan Allan

@Jonathan Allan offset! Ide bagus, thx
edc65

@JonathanAllan saya perlu tanda kurung (z/8&7)+4karena &memiliki prioritas yang lebih rendah - itu akan7/8&(7+4)
edc65

1
@ Shaggy apakah Anda melihat komentar tepat di atas Anda? (cerita pendek: tidak ada)
edc65

4

Kelapa , 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)

Cobalah online!

Panjang port Python adalah 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*

Cobalah online!


1
Menariknya, pada saat penulisan, port Python Anda mengalahkan semua solusi Python lainnya!
Kirill L.

4

Arang , 115 111 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 4 byte berkat hanya @ ASCII. Penjelasan:

≔I⁻N³θ

Kurangi 3 dari input sehingga dapat dibandingkan dengan satu digit.

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

Pisahkan string 0715 0410 0410 1510 3710 3825 3814 696pada spasi (spasi tampaknya lebih baik dikompresi daripada koma tapi saya tidak mencoba karakter lain) dan lewati setiap bagian.

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

Bandingkan input dengan digit pertama dan kedua dan jika ada di antara keduanya, dorong indeks loop jumlah yang diberikan kali ke daftar kosong yang telah ditentukan, sehingga mengisi itu.

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

Pisahkan daftar planet pada baris baru (sekali lagi, lebih baik daripada koma karena beberapa alasan) dan pilih elemen yang sesuai dengan indeks yang dipilih secara acak dari daftar.


Bagus Bagaimana faktor Random (u) dalam probabilitas yang berbeda untuk setiap planet? (Saya tidak tahu apa-apa tentang Arang).
Absinthe

Ia memilih indeks dari daftar dengan distribusi yang benar dari indeks planetType karena "dorong indeks loop jumlah yang diberikan kali ke daftar kosong yang telah ditentukan, sehingga mengisi itu." kemudian menggunakan indeks yang dipilih untuk mendapatkan nama planetType.
Jonathan Allan

@ JonathanAllan Mengerti, terima kasih
Absinthe

111 byte , saya pikir? Secara umum coba gunakan karakter sebelumnya di kelas karakter, lihat kompresi # 11. Pesanan default menyimpan byte lain, tetapi itu pada dasarnya hanya jika Anda hanya memiliki simbol
ASCII-only

@ ASCII-only Clear as mud ... mengapa newlines lebih baik di sana tetapi ruang untuk string lainnya?
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

Cobalah online!

Awalnya terinspirasi oleh solusi ini oleh @rturnbull, namun karena kedua kiriman telah berevolusi secara signifikan, ini sekarang pada dasarnya adalah campuran ide dari penulis asli, @Giuseppe yang telah sangat membantu dalam komentar, dan saya. Berikut ini adalah ringkasan poin-poin penting yang membantu menurunkan hitungan byte:

  • Mengkodekan data planet sebagai CSV Mengumpulkan nama readLinesuntuk menghindari sejumlah besar karakter kutipan di sekitar string.

  • Tweak panas params sehingga kita bisa menggunakan <dan >tanda bukan <=dan >=.

  • Mengubah format data panas dari Heat min, Heat maxmenjadi Heat min, Heat Deltauntuk menyingkirkan angka dua digit.
    Digantikan dengan menggeser semua angka dengan -3

  • Membagi semua probabilitas planet dengan 5 yang juga menghasilkan beberapa digit lebih sedikit.

  • Mengalikan vektor probabilitas planet dengan vektor Boolean (menunjukkan apakah input kami memenuhi persyaratan panas) untuk membatalkan probabilitas planet yang tidak sesuai.

Mungkin, beberapa byte lagi dapat diperoleh dengan menerapkan semacam kompresi data.
Saya pikir, tidak lagi.


1
t=bukannya text=akan menghemat 3 byte juga.
Giuseppe


jawaban yang solid, meskipun, menggunakan read.csvuntuk satu kolom disarankan readLinesuntuk menyingkirkan tanda kutip sepenuhnya, meskipun Anda harus menetapkan secara eksplisitn
Giuseppe

@ Giuseppe, ini 171 byte, karena Anda juga menghapus tanda kurung yang diperlukan untuk mempertahankan prioritas operator, dan versi Anda memberikan probabilitas yang salah. Tetap saja, saran yang brilian!
Kirill L.

Oh, saya bertanya-tanya dari mana asal kurung itu ....
Giuseppe

3

Python, 282 Bytes , 261 Bytes:

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)

Cukup sederhana - cukup yakin bisa bermain golf lebih banyak - Masih mencari cara yang lebih baik untuk mewakili rentang planet dan data probabilitas. Jika saya berada dalam kisaran jenis planet, tambahkan ke daftar sesuai dengan probabilitas, kemudian cetak secara acak.

EDIT: Dengan kredit kepada Jonathan Frech - redid the for loop untuk menjatuhkan beberapa byte. Cara yang lebih baik untuk menambahkan item ke daftar


3
Selamat datang di PPCG! Tidak yakin bagaimana Anda menghitung byte, tapi saya hanya mendapatkan 283. Lebih sedikit jika indentasi itu adalah tab alih-alih 4 byte.
Martin Ender

1
Tidakkah i in range(x[1], x[2])mengecualikan tepi atas panas, tidak seperti dalam spesifikasi?
Graipher


1
Mungkinkah ini membantu? 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)]
MoustacheMoses

1
@Chromane Minta Maaf sepertinya komentarnya menelanjangi beberapa karakter.
MoustacheMoses

2

Paket Oktaf dengan Statistik, 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}

Kode mendefinisikan fungsi anonim yang memasukkan angka dan menghasilkan string.

Cobalah online!

Penjelasan

Kode

@(h)

mendefinisikan fungsi anonim dengan input h.

String

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

dipisah pada koma menggunakan

strsplit(...,',')

Hasilnya adalah array sel string, di mana setiap string adalah kelas planet.

Kode

'IIIJLLLO'-70

mendefinisikan string yang ditampilkan dan mengurangi 70dari titik kode karakternya. Ini memberikan array nilai panas minimum minus 1 , yaitu [3 3 3 4 6 6 6 9],.

Demikian pula,

'PMMNPQQR'-70

menghasilkan array nilai panas maksimum plus 1 , yaitu [10 7 7 8 10 11 11 12],.

Perbandingan

h>...&h<...

berikan array yang berisi trueatau falsemenunjukkan kelas planet mana yang memungkinkan.

Di samping itu,

'UPPPP_TL'-70

mendefinisikan array nilai peluang acak [15 10 10 10 10 25 14 6],.

Operasi

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

adalah perkalian elemen-bijaksana dari dua array terakhir ( truedan falseberperilaku seperti 0dan 1masing - masing). Ini memberikan array di mana setiap kelas planet memiliki peluang acak, atau0 jika kelas itu tidak mungkin berdasarkan input. Array ini akan digunakan sebagai bobot dalam pengambilan sampel acak

Panggilan fungsi

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

memilih salah satu sel dari array sel string (argumen input pertama), menggunakan array bobot yang dihitung (argumen input keempat). Secara khusus, fungsi randsamplesecara otomatis menormalkan bobot ke probabilitas, dan kemudian melakukan pemilihan acak dengan probabilitas tersebut. Hasilnya adalah array sel yang berisi string. Kode

{1}

digunakan untuk mengekstrak string itu, yang merupakan output fungsi.


2
Penjelasan yang bagus, terima kasih. Skor bagus juga.
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]]

Cobalah online!


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]

Cobalah online!


Jika Anda menghapus satu ke min heats dan menambahkan satu ke max heats (yang akan memberi [Ice,4,5,11]bukannya [Ice,4,6,10], dll) maka Anda akan dapat menggunakan <alih- alih <=dan >bukannya >=, sehingga menghemat 2 byte. (ya, itu tidak banyak ...)
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

Untuk loop sekarang dalam satu baris, tidak ada pengembalian, lebih sedikit byte ke tipe implisit

4 spasi dihapus (terima kasih Kevin )

Cobalah online!


Saya belum pernah memprogram Nim, tapi saya pikir Anda bisa bermain golf empat ruang: satu di for n in[(; dan tiga di 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Ωè

Cobalah online!

Penjelasan

”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”
mendorong tali 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)])

Pemisahan h menjadi topeng bit yang terpisah dan nilai peluang acak (lihat penjelasan) menyimpan beberapa byte dengan menghilangkan tugas hdan menyederhanakan range()pemahaman daftar.

Solusi sebelumnya

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

Menentukan fungsi anonim yang mengambil int dan mengembalikan jenis planet.

Untuk setiap jenis planet, nilai 13-bit dihitung. 8 bit teratas menentukan topeng bit dari nilai panas yang valid untuk jenis planet itu. 5 bit terbawah adalah kesempatan acak untuk jenis planet itu. Misalnya, "kelas Gaia" adalah tipe yang valid untuk nilai panas 4 hingga 7, sehingga memiliki topeng 0b00001111. Ini memiliki peluang acak 10, atau 0b01010. Menggabungkannya menghasilkan nilai 13-bit 0b0000111101010untuk tipe "kelas Gaia". Nilai 13-bit untuk setiap jenis planet disatukan untuk mendapatkan nilaih (13 bit terendah untuk jenis planet "Es"). (Jawaban yang lebih baru tidak menggabungkan nilai-nilai ini).

Pemahaman daftar beralih pada nilai 13-bit untuk membuat daftar bobot, di mana bobot adalah peluang acak jika jenis planet merupakan pilihan yang valid untuk nilai panas yang diberikan, dan nol sebaliknya. Untuk setiap jenis planet,(h>>i&31) ekstrak peluang acak untuk jenis planet itu.(h>>i+n+1&1)mengevaluasi ke 1 jika jenis planet adalah pilihan yang valid untuk nilai kalorn dan mengevaluasi ke 0 sebaliknya.

Fungsi perpustakaan random.choices(choices, weights)memilih item dari daftar pilihan berdasarkan daftar bobot.


i+n+1bisa 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}

Cobalah online!


Maaf, saya tidak mendapatkan output, apakah itu item pertama dalam daftar?
Absinthe

@Abelum saya menambahkan beberapa judul, periksa lagi. Ini semua tingkat panas dari 4 hingga 11 dan sebuah planet yang dihasilkan secara acak untuk masing
Asone Tuhid

Ah saya mengerti terima kasih, meskipun idealnya hanya ada satu output string
Absinthe

@Absinthe Anda benar, itu hanya kode pengujian saya sendiri, sekarang Anda dapat memasukkan nilai panas yang Anda inginkan dan mengembalikan 1 hasil
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)

(Saya telah menambahkan linebreak untuk hasil cetakan yang lebih bagus). Tugas mengatakan "kembali", bukan "cetak", jadi fadalah fungsi yang mengembalikan nama planet yang dipilih secara acak ke dalam IOmonad,f :: Int -> IO String ,.

Itu main adalah main = do {f 10 >>= print}( Haskell golf kiat mengatakan tidak masuk hitungan). Cetakan

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

(suntingan: &casing dasar dilepas ; dipindahkan main; diubah menjadi empat kali lipat dan unzip, dan beralih ke pelindung pola dan>>= mengikuti saran dari Laikoni , terima kasih!; sebaliknya menerapkan pendekatan dari solusi Jelly , mengulangi nama; jenis eksplisit tidak lagi diperlukan) ; saran lain oleh Laikoni menghemat 3 byte lebih, membuatnya IOberfungsi; saran diterapkan dari ruang obrolan).

Cobalah online!


Bagus! Untuk menghindari membanjiri komentar, Anda dapat bergabung dengan ruang obrolan Haskell Of Monads and Men untuk membahas jawaban Anda lebih lanjut.
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"";}

Ini pasti bisa bermain golf lagi, tetapi kemungkinan dalam kombinasi dengan String tidak mudah di Jawa.

Penjelasan:

Cobalah online.

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

Min , 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

Mulai dengan panas di tumpukan, meninggalkan tali di tumpukan. Proses umum yang sama dengan jawaban Python 2.

Penjelasan

Perhatikan bahwa min adalah concatenative

: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 (file CSV) + 1 (nama file) = 192 byte

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

Cobalah online! (ini adalah versi yang sedikit dimodifikasi yang membuat file CSV sementara yang dijelaskan di bawah)

Mengimpor file CSV menggunakan ipcsv(kependekan Import-CSV) yang bernama adi direktori lokal yang berisi yang berikut ini:

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

Itu secara otomatis membuat hashtable yang dapat diubah dari hal-hal seperti berikut ini:

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

Kami kemudian menggunakan Where-Object( ?) untuk menarik entri-entri tersebut di mana bilangan bulat input kami $zadalah -inrentang $_.mke $_.x(yaitu, itu ada dalam rentang panas). Kami kemudian memompanya ke dalam Foreach-Objectloop ( %) yang menciptakan array string nama berdasarkan peluang acak dari nama-nama itu. Misalnya, ini akan membuat array 15 "Gas Giant"string jika panas itu cocok. Kami kemudian menempatkan mereka di Get-Randommana akan menarik tali yang sesuai dengan bobot yang sesuai.


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

Cobalah online!


5
Jawaban untuk pertanyaan kode-golf perlu menunjukkan upaya dalam golf mereka. Anda bisa mendapatkan ini jauh lebih singkat hanya dengan menghapus spasi . Langkah selanjutnya adalah mempersingkat nama variabel menjadi nama karakter tunggal.
Ovs
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.