Intro
Ceci est basé sur un problème auquel j'ai récemment fait face lors de la création d'un jeu d'ordinateur et je pensais que cela ferait une belle partie de code-golf .
Il y a sept classes spectrales principales d'étoiles qui émettent des quantités variables de chaleur. La géologie des planètes autour d'une étoile est grandement influencée par la quantité de chaleur reçue par l'étoile, qui est un facteur de classe spectrale et de distance par rapport à l'étoile. Par conséquent, le mercure est pratiquement fondu, Neptune est gelé.
La galaxie dans mon jeu est générée procéduralement et la sélection aléatoire de types de planètes pour des étoiles données s’est avérée être un véritable "énoncé si l’enfer"!
Le défi
Votre méthode doit sélectionner une planète dans une liste de types de planète correspondant à la classe d'étoiles, en fonction d'un seuil de chaleur minimum, d'un seuil de chaleur maximum et d'un nombre aléatoire. Pour des raisons de simplicité, ce défi n’utilisera qu’une étoile de classe G, tout comme notre soleil.
Contributions
Un entier heat
compris entre 4 et 11 représentant la quantité de chaleur reçue par la planète par l'étoile.
Variables
Ce tableau montre les planètes possibles basées sur heat
. Votre méthode doit d’abord limiter les choix disponibles en fonction de la chaleur min et de la chaleur max heat
. Par exemple, avec une chaleur de 10, les seuls choix possibles sont Desert, Iron et 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
Ensuite, la probabilité qu'une planète (dans les choix restants) soit choisie est ses chances aléatoires divisées par la somme des chances aléatoires de tous les choix.
Dans l'exemple ci-dessus, la probabilité que le fer soit choisi est 14/(25+14+6)
.
Sortie
Renvoie le type de planète sous forme de chaîne.
Faites de votre mieux pour éviter les pointes de flèche logiques. Le code le plus court gagne, tout en points pour la créativité. Bon golf!
Réponses:
Gelée , 78 octets
Un lien monadique acceptant un entier (en [4,11] ) qui renvoie une liste de caractères.
Essayez-le en ligne!
Comment?
Crée les plages de chaleur des planètes sous forme de liste de listes et compte les occurrences de la chaleur en entrée dans ces listes pour obtenir une liste de zéros et de noms représentant les types de planète possibles, puis multiplie par les nombres de vraisemblance des huit types de planète. obtenir la distribution. La distribution est utilisée pour répéter les noms de type de planète, et finalement un choix aléatoire uniforme est effectué.
la source
R ,
225223183 octetsMerci à Giuseppe pour son refactoring astucieux pour le réduire à 188 octets; les cinq autres ont été rasés en utilisant des représentations de nombre moins redondantes.
Essayez-le en ligne!
la source
with
,data.frame
etsubset
sera plus courte.JavaScript 212
Éditer 6 octets sauver Jonathan Allan
moins golfé
Tester
la source
[3913, 2630, 2630, 2647, 2681, 6522, 3706, 1707]
)(z/16&15)
parz/16&15
. Quoi qu'il en soit, vous pouvez économiser 6 octets en utilisant une compression en base 8 avec des décalages de trois et six ... utilisez[971,648,648,657,675,1636,932,445]
avecz/8&7+3
,z%8+6
etz>>6
:)(z/8&7)+4
car&
sa priorité est moindre - ce serait7/8&(7+4)
Noix de coco ,
214195 octetsEssayez-le en ligne!
Un port Python aurait une longueur de
203200 octets:Essayez-le en ligne!
la source
Charbon de bois ,
115111 octetsEssayez-le en ligne! Le lien est vers la version verbeuse du code. Edit: 4 octets enregistrés grâce à @ ASCII uniquement. Explication:
Soustrayez 3 de l'entrée pour pouvoir la comparer à un chiffre.
Fractionnez la chaîne
0715 0410 0410 1510 3710 3825 3814 696
sur les espaces (les espaces semblent se compresser mieux que les virgules mais je n'ai pas essayé d'autres caractères) et passez en boucle sur chaque partie.Comparez l'entrée avec les premier et deuxième chiffres et si c'est entre, poussez l'index de la boucle le nombre de fois donné dans la liste vide prédéfinie, remplissant ainsi celle-ci.
Fractionner la liste des planètes sur les nouvelles lignes (encore une fois, mieux que des virgules pour une raison quelconque) et sélectionner l'élément correspondant à un index choisi aléatoirement dans la liste.
la source
R ,
196193190175171 octetsEssayez-le en ligne!
Initialement inspirée par cette solution de @rturnbull, cependant, les deux soumissions ayant considérablement évolué, il s’agit maintenant essentiellement d’un mélange d’idées de l’auteur original, @Giuseppe, qui a été très utile dans les commentaires, et du mien. Voici un résumé des points clés qui ont contribué à réduire le compte d'octets:
Codage des données de la planète au format CSVCollecte de noms avecreadLines
pour éviter le grand nombre de caractères de citation autour des chaînes.Ajuster les paramètres de chaleur afin que nous puissions utiliser
<
et>
signes à la place de<=
et>=
.Changer le format de données de chaleur deHeat min, Heat max
àHeat min, Heat Delta
pour supprimer les nombres à deux chiffres.Remplacé en décalant tous les nombres de -3
Diviser toutes les probabilités de planète par 5, ce qui donne également quelques chiffres en moins.
Multiplier le vecteur de probabilités de planète par le vecteur de Booléens (indiquant si notre entrée satisfait aux exigences de chaleur) pour annuler les probabilités de planètes inappropriées.
Il serait probablement possible d’obtenir quelques octets supplémentaires en appliquant une sorte de compression de données.Je pense, pas plus.
la source
t=
au lieu detext=
sauver 3 octets ainsi.read.csv
pour une seule colonne suggéréreadLines
de se débarrasser des guillemets entièrement, même si vous devez définir explicitementn
Python,
282 octets, 261 octets:Assez simple - assez sûr que cela pourrait être plus joué - Toujours à la recherche d'un meilleur moyen de représenter la plage de la planète et les données de probabilité. Si i est à portée du type de planète, l'ajoute à la liste en fonction de la probabilité, puis en affiche une au hasard.
EDIT: Avec le crédit à Jonathan Frech - a refait la boucle pour supprimer quelques octets. Meilleure façon d’ajouter des éléments à la liste
la source
i in range(x[1], x[2])
n’exclut- il pas le bord supérieur de la chaleur, contrairement à ce que spécifie le cahier des charges?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)]
Octave avec paquet statistique,
178176174158 octetsLe code définit une fonction anonyme qui entre un nombre et génère une chaîne.
Essayez-le en ligne!
Explication
Le code
définit une fonction anonyme avec entrée
h
.La ficelle
est divisé en virgules avec
Le résultat est un tableau de cellules de chaînes, chaque chaîne étant une classe planète.
Le code
définit la chaîne montrée et soustrait
70
des points de code de ses caractères. Cela donne l’ensemble des valeurs de chaleur minimales moins 1 , c’est-à-dire[3 3 3 4 6 6 6 9]
.De même,
produit la matrice de valeurs de chaleur maximales plus 1 , c'est-à-dire
[10 7 7 8 10 11 11 12]
.Les comparaisons
donner un tableau contenant
true
oufalse
indiquant quelles classes de planètes sont possibles.D'autre part,
définit le tableau de valeurs de probabilité aléatoire
[15 10 10 10 10 25 14 6]
.L'opération
est la multiplication élément par élément des deux derniers tableaux (
true
etfalse
se comporte comme0
et1
respectivement). Cela donne un tableau dans lequel chaque classe de planète a sa chance aléatoire ou0
si cette classe n'est pas possible sur la base de l'entrée. Ce tableau sera utilisé comme poids dans l'échantillonnage aléatoireL'appel de fonction
sélectionne l'une des cellules du tableau de cellules de la cellule (premier argument d'entrée), en utilisant le tableau de poids calculé (quatrième argument d'entrée). Plus précisément, la fonction
randsample
normalise automatiquement les poids en fonction des probabilités, puis effectue la sélection aléatoire avec ces probabilités. Le résultat est un tableau de cellules contenant une chaîne. Le codeest utilisé pour extraire cette chaîne, qui constitue la sortie de la fonction.
la source
Python 3 , 263 octets
Essayez-le en ligne!
la source
Perl 5 (
-p
), 230 octetsEssayez-le en ligne!
la source
[Ice,4,5,11]
place de[Ice,4,6,10]
, etc.), vous pourrez alors utiliser<
au lieu de<=
et>
au lieu de>=
, économisant ainsi 2 octets. (oui, ce n'est pas beaucoup ...)Nim ,
294 octets314298Pour la boucle maintenant dans une ligne, pas de retour, moins d'octets pour le type implicite
4 espaces supprimés (merci Kevin )
Essayez-le en ligne!
la source
Nim
, mais je pense que vous pouvez jouer au golf quatre espaces: un àfor n in[(
; et trois àif h>=n[1]and h<=n[2]
.05AB1E ,
78octets 76Essayez-le en ligne!
Explication
”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”
pousse la ficelle
Gas Giant Ice Giant Gaia class Dense Atmosphere Ice Desert Iron Lava
la source
Python 3,
199194 octetsLe fractionnement
h
en masques de bits séparés et en valeurs aléatoires (voir explication) économise quelques octets en éliminant une affectation àh
et en simplifiant larange()
compréhension dans la liste.Solution précédente
Définit une fonction anonyme qui prend un int et renvoie le type de planète.
Pour chaque type de planète, une valeur de 13 bits a été calculée. Les 8 bits supérieurs définissent un masque de bits des valeurs de chaleur valides pour ce type de planète. Les 5 derniers bits représentent le hasard pour ce type de planète. Par exemple, "Classe Gaia" est un type valide pour les valeurs de chaleur 4 à 7, de sorte qu'il possède un masque de
0b00001111
. Il a une chance aléatoire de 10, ou0b01010
. En les combinant, on obtient la valeur 13 bits0b0000111101010
du type "classe Gaia". Les valeurs de 13 bits pour chaque type de planète sont concaténées pour obtenir la valeurh
(les 13 bits les plus bas correspondent au type de planète "Ice"). (La réponse la plus récente ne combine pas ces valeurs).La compréhension de la liste itère sur les valeurs 13 bits pour créer une liste de poids, poids étant le hasard si le type de planète est un choix valide pour la valeur de chaleur donnée et zéro dans le cas contraire. Pour chaque type de planète,
(h>>i&31)
extrait le hasard de ce type de planète.(h>>i+n+1&1)
évalue à 1 si le type de planète est un choix valide pour la valeur de chaleurn
et évalue à 0 sinon.La fonction de bibliothèque
random.choices(choices, weights)
sélectionne un élément dans la liste de choix en fonction de la liste des poids.la source
i+n+1
peut êtrei-~n
. TIORuby ,
214 193189 octetsEssayez-le en ligne!
la source
Haskell ,
377364358318312270265262256251 octets(J'ai ajouté des sauts de ligne pour une meilleure impression). La tâche dit "return", pas "print", donc
f
c'est une fonction qui renvoie le nom de planète sélectionné au hasard dans laIO
monade,f :: Int -> IO String
.Le
main
estmain = do {f 10 >>= print}
( conseils de golf Haskell dit qu'il ne compte pas). Impressions(modifications: enlevé
&
le cas de base de », déplacémain
sur, changé en quadruplets etunzip
, et sont passés à des gardes de motifs et>>=
suivant les suggestions de Laikoni , grâce !; a mis en œuvre l'approche de la solution gelée au lieu, répéter les noms, le type explicite n'est plus nécessaire , un autre conseil par Laikoni enregistre 3 octets de plus, fait uneIO
fonction, mis en œuvre des conseils de la salle de chat).Essayez-le en ligne!
la source
Java 8,
398384 octetsOn peut certainement jouer un peu plus, mais la probabilité en combinaison avec Strings n’est pas très facile en Java.
Explication:
Essayez-le en ligne.
la source
Min ,
280277 octetsCommence avec de la chaleur sur la pile, laisse une chaîne sur la pile. Même processus général que la réponse Python 2.
Explication
Notez que min est concaténatif
la source
PowerShell, 56 + 135 (fichier CSV) + 1 (nom du fichier) = 192 octets
Essayez-le en ligne! (Il s'agit d'une version légèrement modifiée qui crée le fichier CSV temporaire décrit ci-dessous.)
Importe un fichier CSV en utilisant
ipcsv
(en abrégéImport-CSV
) nomméa
dans le répertoire local qui contient les éléments suivants:Cela crée automatiquement une hashtable itérable de choses comme:
Nous utilisons ensuite
Where-Object
(?
) pour extraire les entrées où notre entier d’entrée$z
est-in
la plage$_.m
de$_.x
(c’est- à -dire qu’il se situe dans la plage de chaleur). Nous pompons ensuite ces éléments dans uneForeach-Object
boucle (%
) qui crée un tableau de chaînes de noms basé sur la chance aléatoire de ces noms. Par exemple, cela créera un tableau de15
"Gas Giant"
chaînes si cette chaleur correspond. Nous mettons ensuite ceux dansGet-Random
lesquels tirera la chaîne appropriée avec la pondération appropriée.la source
PHP , 1236 octets
Essayez-le en ligne!
la source