Intro
Ini didasarkan pada masalah aktual yang baru-baru ini saya hadapi saat membuat permainan komputer dan saya pikir itu akan membuat putaran kode-golf yang bagus .
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 heat
dalam 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, heat
harus 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!
Jawaban:
Jelly , 78 byte
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.
sumber
R ,
225223183 byteTerima kasih kepada Giuseppe untuk refactoring yang cerdik untuk menurunkannya menjadi 188 byte; lima yang tersisa dicukur dengan menggunakan representasi angka yang tidak terlalu banyak.
Cobalah online!
sumber
with
,data.frame
dansubset
akan lebih pendek.JavaScript 212
Edit 6 byte simpan thx Jonathan Allan
kurang golf
Uji
sumber
[3913, 2630, 2630, 2647, 2681, 6522, 3706, 1707]
)(z/16&15)
denganz/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]
denganz/8&7+3
,z%8+6
danz>>6
:)(z/8&7)+4
karena&
memiliki prioritas yang lebih rendah - itu akan7/8&(7+4)
Kelapa ,
214195 byteCobalah online!
Panjang port Python adalah
203200 byte:Cobalah online!
sumber
Arang ,
115111 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 4 byte berkat hanya @ ASCII. Penjelasan:
Kurangi 3 dari input sehingga dapat dibandingkan dengan satu digit.
Pisahkan string
0715 0410 0410 1510 3710 3825 3814 696
pada spasi (spasi tampaknya lebih baik dikompresi daripada koma tapi saya tidak mencoba karakter lain) dan lewati setiap bagian.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.
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.
sumber
R ,
196193190175171 byteCobalah 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 CSVMengumpulkan namareadLines
untuk menghindari sejumlah besar karakter kutipan di sekitar string.Tweak panas params sehingga kita bisa menggunakan
<
dan>
tanda bukan<=
dan>=
.Mengubah format data panas dariHeat min, Heat max
menjadiHeat min, Heat Delta
untuk 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.
sumber
t=
bukannyatext=
akan menghemat 3 byte juga.read.csv
untuk satu kolom disarankanreadLines
untuk menyingkirkan tanda kutip sepenuhnya, meskipun Anda harus menetapkan secara eksplisitn
Python,
282 Bytes, 261 Bytes: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
sumber
i in range(x[1], x[2])
mengecualikan tepi atas panas, tidak seperti dalam spesifikasi?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)]
Paket Oktaf dengan Statistik,
178176174158 byteKode mendefinisikan fungsi anonim yang memasukkan angka dan menghasilkan string.
Cobalah online!
Penjelasan
Kode
mendefinisikan fungsi anonim dengan input
h
.String
dipisah pada koma menggunakan
Hasilnya adalah array sel string, di mana setiap string adalah kelas planet.
Kode
mendefinisikan string yang ditampilkan dan mengurangi
70
dari titik kode karakternya. Ini memberikan array nilai panas minimum minus 1 , yaitu[3 3 3 4 6 6 6 9]
,.Demikian pula,
menghasilkan array nilai panas maksimum plus 1 , yaitu
[10 7 7 8 10 11 11 12]
,.Perbandingan
berikan array yang berisi
true
ataufalse
menunjukkan kelas planet mana yang memungkinkan.Di samping itu,
mendefinisikan array nilai peluang acak
[15 10 10 10 10 25 14 6]
,.Operasi
adalah perkalian elemen-bijaksana dari dua array terakhir (
true
danfalse
berperilaku seperti0
dan1
masing - 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 acakPanggilan fungsi
memilih salah satu sel dari array sel string (argumen input pertama), menggunakan array bobot yang dihitung (argumen input keempat). Secara khusus, fungsi
randsample
secara otomatis menormalkan bobot ke probabilitas, dan kemudian melakukan pemilihan acak dengan probabilitas tersebut. Hasilnya adalah array sel yang berisi string. Kodedigunakan untuk mengekstrak string itu, yang merupakan output fungsi.
sumber
Python 3 , 263 byte
Cobalah online!
sumber
Perl 5 (
-p
), 230 byteCobalah online!
sumber
[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 ...)Nim ,
294 byte314298Untuk loop sekarang dalam satu baris, tidak ada pengembalian, lebih sedikit byte ke tipe implisit
4 spasi dihapus (terima kasih Kevin )
Cobalah online!
sumber
Nim
, tapi saya pikir Anda bisa bermain golf empat ruang: satu difor n in[(
; dan tiga diif h>=n[1]and h<=n[2]
.05AB1E ,
7876 byteCobalah online!
Penjelasan
”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”
mendorong tali
Gas Giant Ice Giant Gaia class Dense Atmosphere Ice Desert Iron Lava
sumber
Python 3,
199194 bytePemisahan
h
menjadi topeng bit yang terpisah dan nilai peluang acak (lihat penjelasan) menyimpan beberapa byte dengan menghilangkan tugash
dan menyederhanakanrange()
pemahaman daftar.Solusi sebelumnya
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, atau0b01010
. Menggabungkannya menghasilkan nilai 13-bit0b0000111101010
untuk 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.sumber
i+n+1
bisai-~n
. TIORuby ,
214 193189 byteCobalah online!
sumber
Haskell ,
377364358318312270265262256251 byte(Saya telah menambahkan linebreak untuk hasil cetakan yang lebih bagus). Tugas mengatakan "kembali", bukan "cetak", jadi
f
adalah fungsi yang mengembalikan nama planet yang dipilih secara acak ke dalamIO
monad,f :: Int -> IO String
,.Itu
main
adalahmain = do {f 10 >>= print}
( Haskell golf kiat mengatakan tidak masuk hitungan). Cetakan(suntingan:
&
casing dasar dilepas ; dipindahkanmain
; diubah menjadi empat kali lipat danunzip
, 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, membuatnyaIO
berfungsi; saran diterapkan dari ruang obrolan).Cobalah online!
sumber
Java 8,
398384 byteIni pasti bisa bermain golf lagi, tetapi kemungkinan dalam kombinasi dengan String tidak mudah di Jawa.
Penjelasan:
Cobalah online.
sumber
Min ,
280277 byteMulai dengan panas di tumpukan, meninggalkan tali di tumpukan. Proses umum yang sama dengan jawaban Python 2.
Penjelasan
Perhatikan bahwa min adalah concatenative
sumber
PowerShell, 56 + 135 (file CSV) + 1 (nama file) = 192 byte
Cobalah online! (ini adalah versi yang sedikit dimodifikasi yang membuat file CSV sementara yang dijelaskan di bawah)
Mengimpor file CSV menggunakan
ipcsv
(kependekanImport-CSV
) yang bernamaa
di direktori lokal yang berisi yang berikut ini:Itu secara otomatis membuat hashtable yang dapat diubah dari hal-hal seperti berikut ini:
Kami kemudian menggunakan
Where-Object
(?
) untuk menarik entri-entri tersebut di mana bilangan bulat input kami$z
adalah-in
rentang$_.m
ke$_.x
(yaitu, itu ada dalam rentang panas). Kami kemudian memompanya ke dalamForeach-Object
loop (%
) yang menciptakan array string nama berdasarkan peluang acak dari nama-nama itu. Misalnya, ini akan membuat array15
"Gas Giant"
string jika panas itu cocok. Kami kemudian menempatkan mereka diGet-Random
mana akan menarik tali yang sesuai dengan bobot yang sesuai.sumber
PHP , 1236 byte
Cobalah online!
sumber