Erschaffe ein Sonnensystem


39

Intro

Dies basiert auf einem tatsächlichen Problem, mit dem ich vor kurzem bei der Erstellung eines Computerspiels konfrontiert war, und ich dachte, es würde zu einer schönen Runde .

Es gibt sieben spektrale Hauptklassen von Sternen, die unterschiedliche Wärmemengen abgeben. Die Geologie der Planeten um einen Stern wird in hohem Maße von der vom Stern empfangenen Wärmemenge beeinflusst, die ein Faktor für die Spektralklasse und die Entfernung zum Stern ist. Daher ist Quecksilber praktisch geschmolzen, Neptun gefroren.

Die Galaxie in meinem Spiel wird prozedural generiert und die zufällige Auswahl von Planetentypen für bestimmte Sterne hat sich als echte "Wenn-Aussage-Hölle" herausgestellt!

Die Herausforderung

Ihre Methode sollte einen Planeten aus einer Liste von Planetentypen auswählen, die für die Klasse der Sterne geeignet sind, basierend auf einer minimalen Wärmeschwelle, einer maximalen Wärmeschwelle und einer Zufallszahl. Der Einfachheit halber wird für diese Herausforderung nur ein Stern der Klasse G verwendet, genau wie unsere Sonne.

Eingänge

Eine ganze Zahl heatim Bereich von 4 bis 11, die die Wärmemenge darstellt, die der Planet vom Stern empfängt.

Variablen

Diese Tabelle zeigt die möglichen Planeten basierend auf heat. Ihre Methode sollte zuerst die verfügbaren Auswahlmöglichkeiten auf der Grundlage der Wärme min und Wärme max einschränken, heatsollte auf oder zwischen den beiden liegen. ZB mit einem Durchgang von 10 wären Wüste, Eisen und Lava die einzigen Möglichkeiten.

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

Als nächstes ist die Wahrscheinlichkeit, dass ein Planet (in den verbleibenden Auswahlmöglichkeiten) ausgewählt wird, seine zufälligen Chancen, geteilt durch die Summe der zufälligen Chancen aller Auswahlmöglichkeiten.

Im obigen Beispiel ist die Wahrscheinlichkeit, dass Eisen gewählt wird 14/(25+14+6),.

Ausgabe

Geben Sie den Planetentyp als String zurück.

Geben Sie Ihr Bestes, um logische Pfeilspitzen zu vermeiden. Kürzester Code gewinnt, rundum Punkte für Kreativität. Viel Spaß beim Golfen!


Soll die "Klasse" der "Gaia-Klasse" wie alles andere groß geschrieben werden?
Jonathan Allan

@ JonathanAllan Es ist Kleinbuchstaben, da es kein Eigenname ist
Absinth

1
@Absinthe Warum wird Dense A tmosphere dann in Großbuchstaben geschrieben?
Erik der Outgolfer

17
... hat das jemand gesagt? | Willkommen bei PPCG und schöne erste Herausforderung!
user202729

3
@EricDuminil aka ein Pfeilspitzen-Anti-Muster, aka verschachtelte-wenn-Aussage-Hölle! wiki.c2.com/?ArrowAntiPattern
Absinth

Antworten:


12

Jelly , 78 Bytes

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

Eine monadische Verknüpfung, die eine Ganzzahl (in [4,11] ) akzeptiert und eine Liste von Zeichen zurückgibt.

Probieren Sie es online!

Wie?

Erstellt die Wärmebereiche der Planeten als eine Liste von Listen und zählt die Vorkommen der eingegebenen Wärme in diesen Listen, um eine Liste von Nullen und Einsen zu erhalten, die darstellen, welche Planetentypen möglich sind, und multipliziert dann mit den Wahrscheinlichkeitszahlen der acht Planetentypen zu Holen Sie sich die Verteilung. Die Verteilung wird verwendet, um die Planetentypnamen zu wiederholen, und schließlich wird eine einheitliche zufällige Auswahl getroffen.

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

Verrückt! Gut gemacht.
Absinth

@Absinthe Du kannst einfach upvoten. Randnotiz: Bei Code Golf akzeptieren wir normalerweise keine Antworten.
user202729

2
@ user202729 Ich werde in ein oder zwei Tagen Stimmen hinzufügen. Ich habe auf der GitHub-Seite nach Jelly gesucht, um diesen Code zu entschlüsseln. Ich glaube verrückt! ist am besten geeignet :)
Absinth

2
@Absinthe Ja, ich glaube, ein beschreibender Abschnitt ist oft eine gute Sache, auch für nicht-esoterische Sprache Einreichungen :)
Jonathan Allan

3
Ihr Leute seid wirklich verrückt.
Selvek

7

R , 225 223 183 Bytes

Vielen Dank an Giuseppe für das clevere Refactoring, das es auf 188 Bytes reduziert hat. Die restlichen fünf wurden mit weniger redundanten Zahlenrepräsentationen abgeschnitten.

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

Probieren Sie es online!


Das ist ein netter Ansatz, ich muss vielleicht darüber nachdenken, mein if-Statement-Labyrinth zu entfernen, wenn dies in C # gewünscht wird :)
Absinth

Ich vermute, den logischen Index zu speichern, anstatt with, zu verwenden data.frame, und subsetwerde kürzer sein.
Giuseppe


@ Giuseppe, Sie können wahrscheinlich ein paar Bytes mehr gewinnen, indem Sie einige meiner Tricks mit Planetendaten anwenden, aber ich denke, ich werde auch meine verbessern, indem Sie Ihre Idee verwenden, den Wahrscheinlichkeitsvektor vom Rest der Daten zu trennen.
Kirill L.

4

JavaScript 212

Bearbeiten Sie 6 Bytes und speichern Sie 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]]

weniger golfen

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

Prüfung

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>


Ein paar Ihrer Basis 16 Zahlen sind 1 aus (sollte sein [3913, 2630, 2630, 2647, 2681, 6522, 3706, 1707])
Jonathan Allan

Ich denke (aber ich bin nicht 100%) Sie 2 durch Ersatz sparen (z/16&15)mit z/16&15. Unabhängig davon können Sie 6 Bytes mit einer Basis 8-Komprimierung mit Offsets von drei und sechs sparen ... verwenden Sie [971,648,648,657,675,1636,932,445]mit z/8&7+3, z%8+6und z>>6:)
Jonathan Allan

@ JonathanAllan Offsets! Tolle Idee, thx
edc65

@ JonathanAllan Ich brauche Klammern für (z/8&7)+4weil &hat niedrigere Priorität - es wäre7/8&(7+4)
edc65

1
@Shaggy hast du den Kommentar direkt über deinem gesehen? (lange
Rede,

4

Kokosnuss , 214 195 Bytes

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)

Probieren Sie es online!

Ein Python-Port wäre 203 200 Byte lang:

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*

Probieren Sie es online!


1
Interessanterweise übertrifft Ihr Python-Port zum Zeitpunkt des Schreibens alle anderen Python-Lösungen!
Kirill L.

4

Kohle , 115 111 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: 4 Bytes dank nur @ ASCII gespeichert. Erläuterung:

≔I⁻N³θ

Subtrahieren Sie 3 von der Eingabe, damit sie mit einzelnen Ziffern verglichen werden kann.

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

Teilen Sie die Zeichenfolge 0715 0410 0410 1510 3710 3825 3814 696in Leerzeichen auf (Leerzeichen scheinen besser zu komprimieren als Kommas, aber ich habe keine anderen Zeichen ausprobiert) und durchlaufen Sie die einzelnen Abschnitte.

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

Vergleichen Sie die Eingabe mit der ersten und der zweiten Ziffer. Wenn sie dazwischen liegt, verschieben Sie den Schleifenindex so oft wie möglich in die vordefinierte leere Liste und füllen Sie sie auf.

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

Teilen Sie die Liste der Planeten in Zeilenumbrüche (aus irgendeinem Grund auch besser als Kommas) und wählen Sie das Element aus, das einem zufällig aus der Liste ausgewählten Index entspricht.


Schön. Wie berücksichtigt der Zufallsfaktor (u) die unterschiedlichen Wahrscheinlichkeiten für jeden Planeten? (Ich weiß nichts über Holzkohle).
Absinth

Es wählt einen Index aus einer Liste mit der korrekten Verteilung der planetType-Indizes aus, weil "der Schleifenindex die angegebene Anzahl von Malen in die vordefinierte leere Liste verschoben und damit gefüllt wird". Verwenden Sie dann den ausgewählten Index, um den planetType-Namen abzurufen.
Jonathan Allan

@ JonathanAllan Verstanden, danke
Absinth

111 Bytes , denke ich? Versuchen Sie im Allgemeinen, Zeichen zu verwenden, die zuvor in der Zeichenklasse angegeben wurden, siehe Komprimierung Nr. 11. Die Standardreihenfolge speichert ein weiteres Byte, aber das ist im Grunde nur, wenn Sie nur Symbole haben
ASCII

@ Nur ASCII Klar wie Matsch ... warum sind Zeilenumbrüche dort besser als Leerzeichen für den anderen String?
Neil

3

R , 196 193 190 175 171 Bytes

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

Probieren Sie es online!

Ursprünglich inspiriert von dieser Lösung von @rturnbull, aber da sich beide Beiträge erheblich weiterentwickelt haben, ist dies nun im Wesentlichen eine Mischung aus Ideen des ursprünglichen Autors, @Giuseppe, der in Kommentaren sehr hilfreich war, und meiner. Hier ist eine Zusammenfassung der wichtigsten Punkte, die dazu beigetragen haben, den Byte-Countdown zu senken:

  • Kodieren von Planetendaten als CSV Sammeln von Namen mit readLines, um die große Anzahl von Anführungszeichen um Zeichenfolgen herum zu vermeiden.

  • Die Hitzeparameter so anpassen, dass wir <und >Zeichen anstelle von <=und verwenden können >=.

  • Ändern des Wärmedatenformats von Heat min, Heat maxauf Heat min, Heat Delta, um zweistellige Zahlen zu entfernen.
    Ersetzt durch Verschieben aller Zahlen um -3

  • Teilen Sie alle Planetenwahrscheinlichkeiten durch 5, was ebenfalls zu ein paar Stellen weniger führt.

  • Multiplikation des Vektors der Planetenwahrscheinlichkeiten mit dem Vektor der Booleschen Werte (Angabe, ob unsere Eingabe die Wärmeanforderungen erfüllt), um die Wahrscheinlichkeiten ungeeigneter Planeten zu annullieren.

Wahrscheinlich könnten durch eine Art Datenkomprimierung ein paar Bytes mehr gewonnen werden.
Ich denke nicht mehr.


1
t=Stattdessen text=werden auch 3 Bytes gespart.
Giuseppe


solide Antwort, mit read.csvfür eine einzelne Spalte vorgeschlagen readLines, die Anführungszeichen vollständig loszuwerden, obwohl Sie explizit festlegen müssenn
Giuseppe

@ Giuseppe, es sind jedoch 171 Bytes, da Sie auch die Klammern entfernt haben, die zur Aufrechterhaltung der Operatorpräzision erforderlich waren, und Ihre Version falsche Wahrscheinlichkeiten angibt. Trotzdem ein genialer Vorschlag!
Kirill L.

Oh, ich habe mich gefragt, wo diese Klammern herkommen ...
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)

Ziemlich einfach - ziemlich sicher, dass man mehr Golf spielen kann - immer noch auf der Suche nach einer besseren Darstellung der Planetenreichweite und der Wahrscheinlichkeitsdaten. Befindet sich i in Reichweite des Planetentyps, wird er gemäß der Wahrscheinlichkeit an die Liste angehängt und nach dem Zufallsprinzip gedruckt.

BEARBEITEN: Mit freundlicher Genehmigung von Jonathan Frech - die for-Schleife wurde überarbeitet, um ein paar Bytes zu sparen. Besseres Anhängen von Elementen an die Liste


3
Willkommen bei PPCG! Nicht sicher, wie Sie die Bytes gezählt haben, aber ich erhalte nur 283. Weniger, wenn dieser Einzug ein Tabulator anstelle von 4 Bytes ist.
Martin Ender

1
Schließt das nicht i in range(x[1], x[2]), anders als in der Spezifikation, die Oberkante der Hitze aus?
Graipher


1
Könnte dies eine Hilfe sein? 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 Entschuldigung, es scheint, dass die Kommentare einige Zeichen entfernt haben.
MoustacheMoses

2

Oktave mit Statistikpaket, 178 176 174 158 Bytes

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

Der Code definiert eine anonyme Funktion, die eine Zahl eingibt und eine Zeichenfolge ausgibt.

Probieren Sie es online!

Erläuterung

Der Code

@(h)

Definiert eine anonyme Funktion mit Eingabe h.

Die Saite

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

wird durch Kommas getrennt

strsplit(...,',')

Das Ergebnis ist ein Zellenarray von Zeichenfolgen, wobei jede Zeichenfolge eine Planetenklasse ist.

Der Code

'IIIJLLLO'-70

definiert den angezeigten String und subtrahiert 70von den Codepunkten seiner Zeichen. Dies ergibt die Reihe der minimalen Heizwerte minus 1 , das heißt [3 3 3 4 6 6 6 9].

Ähnlich,

'PMMNPQQR'-70

erzeugt das Array der maximalen Heizwerte plus 1 , das heißt [10 7 7 8 10 11 11 12].

Die Vergleiche

h>...&h<...

Geben Sie ein Array an, das die möglichen Planetenklassen enthält trueoder falseangibt.

Auf der anderen Seite,

'UPPPP_TL'-70

definiert die Anordnung von Zufälligkeit Werten [15 10 10 10 10 25 14 6].

Die Operation

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

ist die elementweise Multiplikation der beiden zuletzt genannten Anordnungen ( trueund falseverhalten sich wie 0und 1jeweils). Dies ergibt ein Array, in dem jede Planetenklasse entweder eine zufällige Chance hat oder 0wenn diese Klasse aufgrund der Eingabe nicht möglich ist. Dieses Array wird als Gewichtung in der Zufallsstichprobe verwendet

Der Funktionsaufruf

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

Wählt eine der Zellen aus dem Zellenarray von Zeichenfolgen (erstes Eingabeargument) unter Verwendung des berechneten Arrays von Gewichten (viertes Eingabeargument) aus. Insbesondere randsamplenormalisiert die Funktion die Gewichte automatisch auf Wahrscheinlichkeiten und führt dann die Zufallsauswahl mit diesen Wahrscheinlichkeiten durch. Das Ergebnis ist ein Zellenarray, das eine Zeichenfolge enthält. Der Code

{1}

wird verwendet, um den String zu extrahieren, der die Funktionsausgabe darstellt.


2
Tolle Erklärung, danke. Tolles Ergebnis auch.
Absinth

2

Python 3 , 263 Bytes

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

Probieren Sie es online!


1

Perl 5 ( -p), 230 Bytes

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

Probieren Sie es online!


Wenn Sie einen zu den minimalen Läufen entfernen und einen zu den maximalen Läufen hinzufügen (das würde [Ice,4,5,11]anstelle von [Ice,4,6,10]usw. geben), können Sie <anstelle von <=und >anstelle von >=2 Bytes sparen. (Ja, das ist nicht viel ...)
Dada

1

Nim , 314 298 294 Bytes

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

Für Schleife jetzt in einer Zeile, keine Rückgabe, weniger Bytes für impliziten Typ

4 Leerzeichen entfernt (danke Kevin )

Probieren Sie es online!


Ich habe noch nie programmiert Nim, aber ich denke, Sie können vier Plätze Golf spielen: einen bei for n in[(; und drei um if h>=n[1]and h<=n[2].
Kevin Cruijssen

1

05AB1E , 78 76 Bytes

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

Probieren Sie es online!

Erläuterung

”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”
drückt die Saite 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 Bytes

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

Durch die Aufteilung hin separate Bitmasken und Zufallswerte (siehe Erläuterung) werden einige Bytes eingespart, indem eine Zuordnung zu beseitigt hund range()das Listenverständnis vereinfacht wird .

Vorherige Lösung

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

Definiert eine anonyme Funktion, die eine Ganzzahl annimmt und den Planetentyp zurückgibt.

Für jeden Planetentyp wurde ein 13-Bit-Wert berechnet. Die oberen 8 Bits definieren eine Bitmaske mit gültigen Heizwerten für diesen Planetentyp. Die unteren 5 Bits sind die zufällige Chance für diesen Planetentyp. Beispielsweise ist "Gaia-Klasse" ein gültiger Typ für die Heizwerte 4 bis 7, daher hat er eine Maske von 0b00001111. Es hat eine zufällige Chance von 10 oder 0b01010. Die Kombination ergibt den 13-Bit-Wert 0b0000111101010für den Typ "Gaia-Klasse". Die 13-Bit-Werte für jeden Planetentyp werden verkettet, um den Wert für zu erhalten h(die niedrigsten 13 Bit sind für den Planetentyp "Eis"). (Die neuere Antwort kombiniert diese Werte nicht).

Das Listenverständnis iteriert über die 13-Bit-Werte, um eine Liste von Gewichten zu erstellen, wobei das Gewicht die zufällige Wahrscheinlichkeit ist, wenn der Planetentyp eine gültige Wahl für den angegebenen Heizwert ist, und ansonsten Null. Extrahiert für jeden Planetentyp (h>>i&31)die zufällige Chance für diesen Planetentyp. (h>>i+n+1&1)wird mit 1 bewertet, wenn der Planetentyp eine gültige Wahl für den Heizwert ist, nund wird ansonsten mit 0 bewertet.

Die Bibliotheksfunktion random.choices(choices, weights)wählt ein Element aus der Auswahlliste basierend auf der Gewichtsliste aus.


i+n+1kann sein i-~n. TIO
ovs

1

Ruby , 214 193 189 Bytes

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

Probieren Sie es online!


Entschuldigung, ich bekomme keine Ausgabe. Wäre es das erste Element in der Liste?
Absinth

@Absinthe ich einige Überschriften hinzugefügt habe, überprüfen Sie noch einmal. Es sind alle
Hitzepegel

Ah, ich verstehe, danke, obwohl es im Idealfall nur eine String-Ausgabe geben sollte
Absinth

@Absinthe Du hast recht, das war nur mein eigener Testcode, jetzt kannst du den gewünschten
Heizwert eingeben

1

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

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)

(Ich habe Zeilenumbrüche für einen schöneren Ausdruck hinzugefügt). Die Aufgabe lautet "return", nicht "print", also feine Funktion, die den zufällig ausgewählten Planetennamen in die IOMonade zurückgibt f :: Int -> IO String.

Das mainist main = do {f 10 >>= print}( Haskell Golftipps sagen, dass es nicht zählt). Druckt

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

(Änderungen: entferntes Basisgehäuse& ; mainausgezogen; geändert in Vierfach und unzip, und gewechselt in Pattern Guards und >>=folgenden Vorschlägen von Laikoni , danke !; implementiert stattdessen den Ansatz der Jelly-Lösung und wiederholt die Namen; expliziter Typ ist nicht mehr erforderlich ; ein weiterer Rat von Laikoni spart 3 weitere Bytes; machte es zu einer IOFunktion; implementierte Ratschläge aus dem Chatroom).

Probieren Sie es online!


Nett! Um zu vermeiden, dass die Kommentare überflutet werden, können Sie sich im Haskell-Chatroom " Von Monaden und Männern" anmelden , um Ihre Antwort weiter zu diskutieren.
Laikoni

0

Java 8, 398 384 Bytes

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

Es kann definitiv noch etwas mehr Golf gespielt werden, aber die Wahrscheinlichkeit in Kombination mit den Strings ist in Java nicht sehr einfach.

Erläuterung:

Probieren Sie es online aus.

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 Bytes

: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

Beginnt mit Hitze auf dem Stapel, hinterlässt eine Schnur auf dem Stapel. Gleicher allgemeiner Vorgang wie bei Python 2.

Erläuterung

Beachten Sie, dass min verkettet ist

: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-Datei) + 1 (Dateiname) = 192 Byte

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

Probieren Sie es online! (Dies ist eine leicht geänderte Version, mit der die unten beschriebene temporäre CSV-Datei erstellt wird.)

Importiert eine CSV-Datei mit ipcsv(Kurzform für Import-CSV) aim lokalen Verzeichnis, die Folgendes enthält:

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

Dadurch wird automatisch eine iterierbare Hashtabelle mit folgenden Elementen erstellt:

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

Wir verwenden dann Where-Object( ?) , um diese Einträge herausziehen , wo unser Eingang integer $zist -inder Bereich $_.man $_.x(dh es ist im Wärmebereich). Wir pumpen diese dann in eine Foreach-Objectloop ( %), die ein Array von Namensketten basierend auf der zufälligen Wahrscheinlichkeit dieser Namen erzeugt. Dadurch wird beispielsweise ein Array von 15 "Gas Giant"Zeichenfolgen erstellt, wenn diese Wärme übereinstimmt. Wir setzen dann diejenigen ein, in Get-Randomdie der entsprechende String mit der entsprechenden Gewichtung gezogen wird.


-1

PHP , 1236 Bytes

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

Probieren Sie es online!


5
Die Antworten auf die Code-Golf-Frage müssen zeigen, wie mühsam sie sind. Sie können dies viel kürzer machen, indem Sie Leerzeichen entfernen . Der nächste Schritt wäre, Variablennamen auf Einzelzeichennamen zu kürzen.
Ovs
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.