Bir güneş sistemi oluşturun


39

giriş

Bu, son zamanlarda bir bilgisayar oyunu yaparken karşılaştığım gerçek bir soruna dayanıyor ve bunun güzel bir turu olacağını düşünmüştüm .

Değişken miktarlarda ısı veren yedi ana spektral yıldız sınıfı vardır . Yıldızların etrafındaki gezegenlerin jeolojisi, yıldızdan alınan ısı miktarından büyük ölçüde etkilenir; bu, spektral sınıf ve yıldızdan uzaklık faktörüdür. Bu nedenle Merkür pratik olarak eritilir, Neptün donmuş.

Oyunumdaki galaksi usule göre üretildi ve verilen yıldızlar için gezegen tiplerini rastgele seçerek gerçek bir 'cehennem if' ifadesi ortaya çıktı!

Meydan okuma

Metodunuz, minimum ısı eşiğine, maksimum ısı eşiğine ve rastgele bir sayıya dayanarak yıldız sınıfına uygun gezegen tipleri listesinden bir gezegen seçmelidir. Basit olması için bu meydan okuma, güneşimiz gibi, sadece G sınıfı bir yıldız kullanır.

Girdiler

heatGezegenin yıldızdan aldığı ısı miktarını temsil eden 4 ila 11 aralığında bir tam sayı .

Değişkenler

Bu tablo dayalı olası gezegenleri gösterir heat. Metodunuz ilk önce ısı min ve ısı max bazında mevcut seçenekleri daraltmalı heat, ikisi arasına veya arasına düşmelidir. Örneğin, 10 sıcağa sahip tek seçenek, Çöl, Demir ve Lav olabilir.

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

Daha sonra, bir gezegenin (kalan seçeneklerde) seçilme olasılığı, tüm seçimlerin rastgele şanslarının toplamına bölünmesiyle elde edilen rastgele şanslarıdır.

Yukarıdaki örnekte, Demir'in seçilme olasılığı vardır 14/(25+14+6).

Çıktı

Gezegen türünü bir dize olarak döndür.

Mantık ok uçlarını önlemek için elinizden geleni yapın. En kısa kod kazanır, yaratıcılık için her yönüyle işaret eder. Mutlu golf!


"Gaia sınıfı" nın "sınıfı" her şey gibi büyük harfle yazılmalı mı?
Jonathan Allan

@JonathanAllan uygun bir isim olmadığı için küçük harf
Absinthe

1
@Absinthe Öyleyse neden Yoğun Bir atmosfer büyük harf?
Outgolfer Erik,

17
... kimse bunu söyledi mi? | PPCG'ye hoş geldiniz ve güzel bir meydan okuma!
user202729

3
@EricDuminil aka bir ok ucu anti-desen, aka iç içe-if-cümle-cehennem! wiki.c2.com/?ArrowAntiPattern
Absinthe

Yanıtlar:


12

Jöle , 78 bayt

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

Karakter listesini döndüren bir tamsayıyı kabul eden ( [4,11] ) bir monadik bağlantı .

Çevrimiçi deneyin!

Nasıl?

Bir gezegen listesi olarak gezegenlerin sıcaklık aralıklarını oluşturur ve bu listelerdeki giriş ısısının oluşumlarını sıfırlar ve hangi gezegen türlerinin mümkün olduğunu temsil edenlerin bir listesini almak için sayar, ardından sekiz gezegen türünün olabilirlik sayılarıyla çarpar. dağıtımı al. Dağıtım gezegen tipi adlarını tekrarlamak için kullanılır ve son olarak tek tip rastgele bir seçim yapılır.

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

Çılgın! Aferin.
Absinthe

@Absinthe Basitçe oy verebilirsiniz. Yan not: Code Golf'ta genellikle cevapları kabul etmiyoruz.
user202729

2
@ user202729 Bir veya iki günde oy ekleyeceğim. Jelly'in bu kodu çözmeye çalıştığı için GitHub sayfasını inceliyordum. Ben çılgına inanıyorum! en uygun :)
Absinthe

2
@Abinthe, bence tanımlayıcı bir bölüm ezoterik olmayan dilde gönderimler için bile iyi bir şey olduğuna inanıyorum :)
Jonathan Allan

3
Siz insanlar gerçekten delisiniz.
Selvek

7

R , 225 223 183 bayt

Zeki refactoring'in 188 byte'a indirmesi için Giuseppe'e teşekkürler; Geri kalan beş daha az gereksiz sayı gösterimi kullanılarak traş edildi.

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

Çevrimiçi deneyin!


Bu güzel bir yaklaşım, eğer C # :) lehinde if if labirentimi çıkarmayı düşünmek zorunda kalabilirim
Absinthe

Ben mantıksal indeksi tasarrufu yerine kullanarak şüpheli with, data.frameve subsetdaha kısa olacaktır.
Giuseppe,


@Giuseppe, püf noktalarımdan bazılarını gezegen verileriyle kullanarak muhtemelen birkaç bayt daha kazanabilirsin , ancak olasılıkları vektörünü verilerin geri kalanından ayırma fikrini kullanarak benimkini de geliştireceğim.
Kirill L.

4

JavaScript 212

Düzenle 6 byte tasarruf Jonathan Jonathan

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

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

Ölçek

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>


16 numaranızdan 1 tanesi kapalıdır (olması gerekir [3913, 2630, 2630, 2647, 2681, 6522, 3706, 1707])
Jonathan Allan

Bence (ancak% 100 değilim) (z/16&15)ile değiştirerek 2 tasarruf edebilirsiniz z/16&15. Ne olursa olsun, üç ve altı ... Kullanım uzaklıklar ile bir taban 8 sıkıştırma kullanarak 6 bayt kaydedebilirsiniz [971,648,648,657,675,1636,932,445]ile z/8&7+3, z%8+6ve z>>6:)
Jonathan Allan

@ JonathanAllan ofsetler! Harika bir fikir, thx
edc65

@ JonathanAllan için parantez ihtiyacım var (z/8&7)+4çünkü &düşük önceliğe sahip - öyle7/8&(7+4)
edc65

1
@Shaggy, sizinkinin üzerindeki yorumu gördünüz mü? (uzun lafın kısası: hayır)
edc65

4

Hindistan Cevizi , 214 195 bayt

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)

Çevrimiçi deneyin!

Bir Python bağlantı noktası 203 200 bayt uzunluğunda olacaktır:

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*

Çevrimiçi deneyin!


1
İlginçtir ki, yazarken, Python portunuz diğer Python çözümlerini yener!
Kirill L.

4

Kömür , 115 111 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Düzenleme: Yalnızca @ ASCII-sayesinde 4 bayt kaydedildi. Açıklama:

≔I⁻N³θ

Tek basamaklarla karşılaştırılabilmesi için girişten 3 çıkartın.

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

Dizgiyi 0715 0410 0410 1510 3710 3825 3814 696boşluklara bölün (boşluklar virgüllerden daha iyi sıkıştırılmış gibi görünüyor, ancak başka karakterler denemedim) ve her bölümün üzerine döngü.

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

Girdiyi birinci ve ikinci basamaklarla karşılaştırın ve bunlar arasındaysa döngü indeksini belirtilen sayıda önceden tanımlanmış boş listeye itin, böylece doldurun.

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

Gezegenlerin listesini yeni satırlarda böl (yine, nedense virgülten daha iyi) ve listeden rastgele seçilen bir dizine karşılık gelen elemanı seç.


Güzel. Rastgele (u) her gezegen için farklı olasılıklardaki faktör nasıldır? (Kömür hakkında hiçbir şey bilmiyorum).
Absinthe

"Döngü indeksini önceden tanımlanmış boş listeye verilen sayıda itin, böylece onu doldurun" nedeniyle, planetType endekslerinin doğru dağılımını gösteren bir listeden bir indeks seçiyor. ardından planetType adını almak için seçilen dizini kullanın.
Jonathan Allan

@JonathanAllan Anladım, teşekkürler
Absinthe

111 bayt sanırım? Genel olarak, karakter sınıfının başındaki karakterleri kullanmayı deneyin, bkz. Sıkıştırma # 11. Varsayılan sipariş başka bir bayttan tasarruf sağlar, ancak temelde yalnızca sembolleriniz varsa
yalnızca ASCII

@ ASCII-sadece Çamur olarak temizle ... neden yeni çizgiler daha iyi dize için boşluklar var?
Neil

3

R , 196 193 190 175 171 bayt

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

Çevrimiçi deneyin!

Başlangıçta bu çözümden esinlenerek @turturbull, ancak her iki gönderi de önemli ölçüde geliştiği için, bu esasen orijinal yazar, yorumlarda ve benim için çok yardımcı olan @Giuseppe'nin fikirlerinin bir karışımı. İşte bayt geri sayım getirmek için yardımcı olan önemli noktaların bir özeti:

  • Gezegen verilerini CSV olarak kodlamareadLines Dizelerin çevresinde çok fazla sayıda tırnak işareti karakterinden kaçınmak için adları topluyor.

  • Kullandığımız böylece ısı params verdiği <ve >yerine belirtileri <=ve >=.

  • Isı veri biçimini değiştirme Heat min, Heat maxiçin Heat min, Heat Deltaçift haneli sayılar kurtulmak için.
    Tüm sayıları -3 ile değiştirerek değiştirilir

  • Tüm gezegen olasılıklarını 5'e bölmek ki birkaç basamak daha az olur.

  • Uygun olmayan gezegenlerin olasılıklarını geçersiz kılmak için gezegen olasılıkları vektörünün Boole'lerin vektörüyle çarpılması (girdilerimizin ısı gereksinimlerini karşılayıp karşılamadığını gösteren).

Muhtemelen, bir çeşit veri sıkıştırması uygulayarak birkaç bayt daha kazanılabilir.
Sanırım artık değil.


1
t=bunun yerine text=3 bayt da tasarruf edecek.
Giuseppe


Sağlam bir cevap olsa da, kesin olarak ayarlamanız read.csvreadLinesn
Giuseppe

@Giuseppe, 171 byte'dı, çünkü operatör önceliğini korumak için gerekli parantezleri kaldırdınız ve versiyonunuz yanlış olasılıklar veriyor. Yine de, parlak bir öneri!
Kirill L.

Oh, parantezlerin nereden geldiğini merak ettim ....
Giuseppe,

3

Python, 282 Bayt , 261 Bayt:

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)

Oldukça basit - daha çok golf oynayabileceğinden oldukça emin - Hala gezegen aralığını ve olasılık verilerini temsil etmenin daha iyi bir yolunu arıyorum. Eğer i gezegen türünün kapsama alanındaysa, olasılığa göre listeye ekler, ardından rasgele birini yazdırır.

EDIT: Jonathan Frech'in kredisiyle - for döngüsünü bir kaç byte atmak için yeniden düzenledi. Listeye öğe eklemenin daha iyi yolu


3
PPCG'ye Hoşgeldiniz! Baytları nasıl saydığınızdan emin değilim, ancak yalnızca 283'ü alıyorum. Bu girintinin değeri 4 bayt yerine bir sekme ise daha az.
Martin Ender

1
i in range(x[1], x[2])Spesifikasyondakilerin aksine, ısı üst kenarını dışlamaz mı ?
Graipher


1
Bu herhangi bir yardım olabilir mi? 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)]
MoustacheMeses

1
@Chromane Yorumların bazı karakterleri çıkardığı anlaşılıyor.
MoustacheMoses

2

İstatistik Paketi ile birlikte Octave , 178 176 174 158 bayt

@(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}

Kod, bir sayı giren ve bir dizge çıkaran isimsiz bir işlevi tanımlar.

Çevrimiçi deneyin!

açıklama

Kod

@(h)

Girişli adsız bir işlevi tanımlar h.

Dize

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

virgülle ayrılır

strsplit(...,',')

Sonuç, her dizenin bir gezegen sınıfı olduğu bir hücre dizesi dizisidir.

Kod

'IIIJLLLO'-70

Gösterilen dizgiyi tanımlar 70ve karakterlerinin kod noktalarından çıkarır . Bu, eksi 1 olan minimum ısı değerleri dizisini verir , yani [3 3 3 4 6 6 6 9].

Benzer şekilde,

'PMMNPQQR'-70

maksimum ısı değeri dizisini artı 1 , yani üretir [10 7 7 8 10 11 11 12].

Karşılaştırmalar

h>...&h<...

Hangi gezegen sınıflarının mümkün olduğunu gösteren trueveya falsebelirten bir dizi verin .

Diğer yandan,

'UPPPP_TL'-70

rastgele şans değerleri dizisini tanımlar [15 10 10 10 10 25 14 6].

Operasyon

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

bu son iki dizinin element şeklinde çarpımıdır ( ve sırasıyla trueve benzer şekilde falsedavranır ). Bu, her bir gezegen sınıfının rastgele şansına sahip olduğu veya girdiye dayanarak o sınıfın mümkün olmadığı bir dizi verir . Bu dizi rastgele örneklemede ağırlık olarak kullanılacak010

İşlev çağrısı

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

hesaplanan ağırlık dizisini (dördüncü girdi değişkeni) kullanarak, hücre dizgileri dizisinden (birinci giriş bağımsız değişkeni) hücrelerden birini seçer. Spesifik olarak, fonksiyon randsample, olasılıkları ağırlıkları otomatik olarak normalleştirir ve ardından bu olasılıklarla rasgele seçimi yapar. Sonuç, bir dize içeren bir hücre dizisidir. Kod

{1}

işlev çıktısını oluşturan dizgeyi çıkarmak için kullanılır.


2
Harika bir açıklama, teşekkürler. Çok iyi skor.
Absinthe

2

Python 3 , 263 bayt

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

Çevrimiçi deneyin!


1

Perl 5 ( -p), 230 bayt

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

Çevrimiçi deneyin!


Birini en az ısıtmaya kaldırır ve en fazla ısıtmaya bir eklerseniz (bunun [Ice,4,5,11]yerine [Ice,4,6,10], vb. Verir) o zaman <yerine <=ve >yerine kullanabilirsiniz >=, böylece 2 bayt tasarruf edersiniz . (evet, bu çok değil ...)
Dada

1

Nim , 314 298 294 bayt

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

Şimdi bir satırdaki döngü için, geri dönüş yok, örtük türden daha az bayt

4 boşluk kaldırıldı (teşekkürler Kevin )

Çevrimiçi deneyin!


Daha önce hiç program yapmadım Nim, ama bence dört alanda golf oynayabilirsiniz: biri for n in[(; ve üçte if h>=n[1]and h<=n[2].
Kevin Cruijssen

1

05AB1E , 78 76 bayt

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

Çevrimiçi deneyin!

açıklama

”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”
dizeyi iter 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 bayt

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

Bölme hayrı bit maskeleri ve rastgele olasılık değerlerinin (açıklamaya bakın) bir atama ortadan kaldırarak birkaç byte kaydeder içine hve basitleştirilmesi range()liste anlama.

Önceki çözüm

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

Bir int alan ve gezegen türünü döndüren adsız bir işlev tanımlar.

Her gezegen türü için 13 bitlik bir değer hesaplandı. İlk 8 bit, o gezegen tipi için geçerli ısı değerleri bit maskesini tanımlar. Alttaki 5 bit, bu gezegen türü için rastgele bir şanstır. Örneğin, "Gaia sınıfı", 4 ila 7 arasındaki ısı değerleri için geçerli bir türdür, bu nedenle bir maskesi vardır 0b00001111. 10 veya rastgele bir şansı var 0b01010. Bunları birleştirmek 0b0000111101010"Gaia sınıfı" türü için 13 bitlik değere yol açar. Her bir gezegen tipi için 13 bitlik değerler, h(en düşük 13 bit "Buz" gezegen tipi içindir) değerini almak için birleştirilir . (Yeni cevap bu değerleri birleştirmez).

Liste kavrama, 13-bitlik değerlerin üzerinde yinelenerek ağırlık listesi yaratır; burada gezegen tipi verilen ısı değeri için geçerli bir seçim ise ağırlığın rastlantısal şans olduğu, aksi takdirde sıfırdır. Her gezegen türü (h>>i&31)için, o gezegen türü için rastgele şansı çıkarır. (h>>i+n+1&1)gezegen tipi, ısı değeri için geçerli bir seçenek olup nolmadığını 1 olarak, aksi takdirde 0 olarak değerlendirir.

Kütüphane işlevi random.choices(choices, weights), ağırlık listesine göre seçenekler listesinden bir öğe seçer.


i+n+1olabilir i-~n. TIO
ovs

1

Ruby , 214 193 189 bayt

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

Çevrimiçi deneyin!


Maalesef çıktıyı alamadım, listedeki ilk öğe olur mu?
Absinthe

@Abinthe bazı başlıklar ekledim, tekrar kontrol edin. Her şey için
4-11 arası

Ah, teşekkür ederim, ideal olarak sadece bir string çıktısı olmasına rağmen
Absinthe

@Absinthe Haklısın, bu sadece kendi test kodumdu, şimdi istediğiniz ısı değerini girebilir ve 1 sonuç döndürür
Asone Tuhid

1

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

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)

(Daha güzel çıktılar için çizgi ekledim). Görev, "yazdırmak" değil, "geri dönmek" fdemek , yani rastgele seçilen gezegen ismini IOmonata geri döndüren bir işlevdir f :: Int -> IO String.

mainOlduğu main = do {f 10 >>= print}( Haskell ipuçları golf o sayılmaz diyor). Baskılar

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

(düzenlemeler: uzaklaştırıldı &'in temel durum, hareket mainüzerinden, katına ve değiştirildi unzipve desen korumaları için açık ve >>=aşağıdaki önerileri arasından Laikoni , sayesinde !; gelen bir yaklaşım uygulamaya jöle çözeltisi adları tekrar yerine, açık tür artık gerekli değildir Laikoni'nin bir başka tavsiyesi de 3 bayttan fazla tasarruf etmesini sağladı, onu bir IOişlev haline getirdi , sohbet odasından tavsiye aldı).

Çevrimiçi deneyin!


Güzel! Yorumları su basmasını önlemek için, cevabınızı daha da tartışmak üzere Monads ve Men Of Haskell sohbet odasına katılabilirsiniz .
Laikoni

0

Java 8, 398 384 bayt

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

Kesinlikle biraz daha golf oynayabilir, ancak dizelerle birleşme olasılığı Java'da çok kolay değil.

Açıklama:

Çevrimiçi deneyin.

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 bayt

: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

Yığında ısı ile başlar, yığında bir ip bırakır. Python 2'nin cevabıyla aynı genel süreç.

açıklama

Min'in birleştirici olduğunu unutmayın.

: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 (CSV dosyası) + 1 (dosya adı) = 192 bayt

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

Çevrimiçi deneyin! (Bu, aşağıda açıklanan geçici CSV dosyasını oluşturan hafifçe değiştirilmiş bir versiyondur)

Aşağıdakileri içeren yerel dizinde ipcsv(short for Import-CSV) adında bir CSV dosyası içe aktarır a:

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

Bu otomatik olarak aşağıdakine benzer şeylerden yinelenebilir bir karmaşa oluşturur:

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

Sonra kullanmak Where-Object( ?) bizim giriş tamsayı bu girdileri dışarı çekmek için $zolan -inaralık $_.miçin $_.x(yani, bu ısı aralığında var). Daha sonra , bunları, bu isimlerin rastgele şansına dayanarak bir dizi isimler dizisi yaratan bir Foreach-Objectdöngüye pompalarız %. Örneğin, 15 "Gas Giant"eğer ısı eşleşirse , bu bir dizi dizisi yaratacaktır . Daha sonra Get-Randomuygun teli çekecek olanları uygun ağırlık ile koyarız .


-1

PHP , 1236 bayt

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

Çevrimiçi deneyin!


5
Kod-golf sorusuna verilen cevaplar, golf oynamak için çaba göstermelidir. Sadece boşlukları kaldırarak bunu daha da kısaltabilirsiniz . Bir sonraki adım değişken isimlerini tek karakter isimlerine kısaltmak olacaktır.
ovs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.