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 Code-Golf führen .
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 heat
im 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, heat
sollte 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!
Antworten:
Jelly , 78 Bytes
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.
quelle
R ,
225223183 BytesVielen 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.
Probieren Sie es online!
quelle
with
, zu verwendendata.frame
, undsubset
werde kürzer sein.JavaScript 212
Bearbeiten Sie 6 Bytes und speichern Sie Jonathan Allan
weniger golfen
Prüfung
quelle
[3913, 2630, 2630, 2647, 2681, 6522, 3706, 1707]
)(z/16&15)
mitz/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]
mitz/8&7+3
,z%8+6
undz>>6
:)(z/8&7)+4
weil&
hat niedrigere Priorität - es wäre7/8&(7+4)
Kokosnuss ,
214195 BytesProbieren Sie es online!
Ein Python-Port wäre
203200 Byte lang:Probieren Sie es online!
quelle
Kohle ,
115111 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: 4 Bytes dank nur @ ASCII gespeichert. Erläuterung:
Subtrahieren Sie 3 von der Eingabe, damit sie mit einzelnen Ziffern verglichen werden kann.
Teilen Sie die Zeichenfolge
0715 0410 0410 1510 3710 3825 3814 696
in Leerzeichen auf (Leerzeichen scheinen besser zu komprimieren als Kommas, aber ich habe keine anderen Zeichen ausprobiert) und durchlaufen Sie die einzelnen Abschnitte.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.
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.
quelle
R ,
196193190175171 BytesProbieren 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 CSVSammeln von Namen mitreadLines
, 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 vonHeat min, Heat max
aufHeat 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.
quelle
t=
Stattdessentext=
werden auch 3 Bytes gespart.read.csv
für eine einzelne Spalte vorgeschlagenreadLines
, die Anführungszeichen vollständig loszuwerden, obwohl Sie explizit festlegen müssenn
Python,
282 Bytes, 261 Bytes: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
quelle
i in range(x[1], x[2])
, anders als in der Spezifikation, die Oberkante der Hitze aus?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)]
Oktave mit Statistikpaket,
178176174158 BytesDer Code definiert eine anonyme Funktion, die eine Zahl eingibt und eine Zeichenfolge ausgibt.
Probieren Sie es online!
Erläuterung
Der Code
Definiert eine anonyme Funktion mit Eingabe
h
.Die Saite
wird durch Kommas getrennt
Das Ergebnis ist ein Zellenarray von Zeichenfolgen, wobei jede Zeichenfolge eine Planetenklasse ist.
Der Code
definiert den angezeigten String und subtrahiert
70
von 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,
erzeugt das Array der maximalen Heizwerte plus 1 , das heißt
[10 7 7 8 10 11 11 12]
.Die Vergleiche
Geben Sie ein Array an, das die möglichen Planetenklassen enthält
true
oderfalse
angibt.Auf der anderen Seite,
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 (
true
undfalse
verhalten sich wie0
und1
jeweils). Dies ergibt ein Array, in dem jede Planetenklasse entweder eine zufällige Chance hat oder0
wenn diese Klasse aufgrund der Eingabe nicht möglich ist. Dieses Array wird als Gewichtung in der Zufallsstichprobe verwendetDer Funktionsaufruf
Wählt eine der Zellen aus dem Zellenarray von Zeichenfolgen (erstes Eingabeargument) unter Verwendung des berechneten Arrays von Gewichten (viertes Eingabeargument) aus. Insbesondere
randsample
normalisiert 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 Codewird verwendet, um den String zu extrahieren, der die Funktionsausgabe darstellt.
quelle
Python 3 , 263 Bytes
Probieren Sie es online!
quelle
Perl 5 (
-p
), 230 BytesProbieren Sie es online!
quelle
[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 ...)Nim ,
294 Bytes314298Für Schleife jetzt in einer Zeile, keine Rückgabe, weniger Bytes für impliziten Typ
4 Leerzeichen entfernt (danke Kevin )
Probieren Sie es online!
quelle
Nim
, aber ich denke, Sie können vier Plätze Golf spielen: einen beifor n in[(
; und drei umif h>=n[1]and h<=n[2]
.05AB1E ,
7876 BytesProbieren Sie es online!
Erläuterung
”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”
drückt die Saite
Gas Giant Ice Giant Gaia class Dense Atmosphere Ice Desert Iron Lava
quelle
Python 3,
199194 BytesDurch die Aufteilung
h
in separate Bitmasken und Zufallswerte (siehe Erläuterung) werden einige Bytes eingespart, indem eine Zuordnung zu beseitigth
undrange()
das Listenverständnis vereinfacht wird .Vorherige Lösung
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 oder0b01010
. Die Kombination ergibt den 13-Bit-Wert0b0000111101010
für den Typ "Gaia-Klasse". Die 13-Bit-Werte für jeden Planetentyp werden verkettet, um den Wert für zu erhaltenh
(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,n
und wird ansonsten mit 0 bewertet.Die Bibliotheksfunktion
random.choices(choices, weights)
wählt ein Element aus der Auswahlliste basierend auf der Gewichtsliste aus.quelle
i+n+1
kann seini-~n
. TIORuby ,
214 193189 BytesProbieren Sie es online!
quelle
Haskell ,
377364358318312270265262256251 Bytes(Ich habe Zeilenumbrüche für einen schöneren Ausdruck hinzugefügt). Die Aufgabe lautet "return", nicht "print", also
f
eine Funktion, die den zufällig ausgewählten Planetennamen in dieIO
Monade zurückgibtf :: Int -> IO String
.Das
main
istmain = do {f 10 >>= print}
( Haskell Golftipps sagen, dass es nicht zählt). Druckt(Änderungen: entferntes Basisgehäuse
&
;main
ausgezogen; geändert in Vierfach undunzip
, 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 einerIO
Funktion; implementierte Ratschläge aus dem Chatroom).Probieren Sie es online!
quelle
Java 8,
398384 BytesEs 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.
quelle
Min .
280277 BytesBeginnt 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
quelle
PowerShell, 56 + 135 (CSV-Datei) + 1 (Dateiname) = 192 Byte
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ürImport-CSV
)a
im lokalen Verzeichnis, die Folgendes enthält:Dadurch wird automatisch eine iterierbare Hashtabelle mit folgenden Elementen erstellt:
Wir verwenden dann
Where-Object
(?
) , um diese Einträge herausziehen , wo unser Eingang integer$z
ist-in
der Bereich$_.m
an$_.x
(dh es ist im Wärmebereich). Wir pumpen diese dann in eineForeach-Object
loop (%
), die ein Array von Namensketten basierend auf der zufälligen Wahrscheinlichkeit dieser Namen erzeugt. Dadurch wird beispielsweise ein Array von15
"Gas Giant"
Zeichenfolgen erstellt, wenn diese Wärme übereinstimmt. Wir setzen dann diejenigen ein, inGet-Random
die der entsprechende String mit der entsprechenden Gewichtung gezogen wird.quelle
PHP , 1236 Bytes
Probieren Sie es online!
quelle