Introducción
Esto se basa en un problema real que enfrenté recientemente al hacer un juego de computadora y pensé que sería una buena ronda de golf de código .
Hay siete clases espectrales principales de estrellas que emiten cantidades variables de calor. La geología de los planetas alrededor de una estrella está muy influenciada por la cantidad de calor recibido de la estrella, que es un factor de la clase espectral y la distancia de la estrella. Por lo tanto, Mercurio está prácticamente fundido, Neptuno congelado.
¡La galaxia en mi juego se genera de manera procesal y la selección aleatoria de tipos de planetas para estrellas dadas resultó ser un verdadero 'infierno de afirmación'!
El reto
Su método debe seleccionar un planeta de una lista de tipos de planetas apropiados para la clase de estrella, en función de un umbral de calor mínimo, un umbral de calor máximo y un número aleatorio. Para simplificar, este desafío solo utilizará una estrella de clase G, al igual que nuestro sol.
Entradas
Un número entero heat
en el rango de 4 a 11 que representa la cantidad de calor recibido por el planeta desde la estrella.
Variables
Esta tabla muestra los posibles planetas basados en heat
. Su método primero debe reducir las opciones disponibles basadas en el calor mínimo y el calor máximo, heat
debe caer en o entre los dos. Por ejemplo, con un calor de 10 en las únicas opciones, sería Desierto, Hierro y 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
Luego, la probabilidad de que se elija un planeta (en las opciones restantes) es sus posibilidades aleatorias divididas por la suma de las posibilidades aleatorias de todas las opciones.
En el ejemplo anterior, la probabilidad de que se elija Hierro es 14/(25+14+6)
.
Salida
Devuelve el tipo de planeta como una cadena.
Haz lo mejor que puedas para evitar las puntas de flecha lógicas. El código más corto gana, apunta a la creatividad. ¡Feliz golf!
Respuestas:
Gelatina , 78 bytes
Un enlace monádico que acepta un número entero (en [4,11] ) que devuelve una lista de caracteres.
Pruébalo en línea!
¿Cómo?
Crea los rangos de calor de los planetas como una lista de listas y cuenta las ocurrencias del calor de entrada en esas listas para obtener una lista de ceros y unos que representan qué tipos de planetas son posibles, luego se multiplica por los números de probabilidad de los ocho tipos de planetas para Obtenga la distribución. La distribución se utiliza para repetir los nombres de tipo de planeta, y finalmente se realiza una elección aleatoria uniforme.
fuente
R ,
225223183 bytesGracias a Giuseppe por su ingeniosa refactorización para reducirlo a 188 bytes; los cinco restantes se afeitaron usando representaciones numéricas menos redundantes.
Pruébalo en línea!
fuente
with
,data.frame
ysubset
será más corto.JavaScript 212
Editar 6 bytes guardar gracias Jonathan Allan
menos golf
Prueba
fuente
[3913, 2630, 2630, 2647, 2681, 6522, 3706, 1707]
)(z/16&15)
conz/16&15
. De todos modos, puede guardar 6 bytes usando una compresión de base 8 con compensaciones de tres y seis ... usar[971,648,648,657,675,1636,932,445]
conz/8&7+3
,z%8+6
yz>>6
:)(z/8&7)+4
porque&
tiene menor prioridad, sería7/8&(7+4)
Coco ,
214195bytesPruébalo en línea!
Un puerto de Python tendría
203200 bytes de longitud:Pruébalo en línea!
fuente
De carbón ,
115111 bytesPruébalo en línea! El enlace es a la versión detallada del código. Editar: Guardado 4 bytes gracias a @ ASCII-only. Explicación:
Resta 3 de la entrada para que pueda compararse con un solo dígito.
Divida la cadena
0715 0410 0410 1510 3710 3825 3814 696
en espacios (los espacios parecen comprimirse mejor que las comas pero no probé ningún otro carácter) y repita cada porción.Compare la entrada con el primer y el segundo dígito y, si está entre ellos, empuje el índice del bucle el número de veces dado a la lista vacía predefinida, llenándolo así.
Divida la lista de planetas en líneas nuevas (de nuevo, mejor que las comas por alguna razón) y seleccione el elemento correspondiente a un índice elegido al azar de la lista.
fuente
R ,
196193190175171 bytesPruébalo en línea!
Inicialmente inspirado en esta solución por @rturnbull, sin embargo, dado que ambas presentaciones han evolucionado significativamente, ahora se trata esencialmente de una mezcla de ideas del autor original, @Giuseppe, que ha sido muy útil en los comentarios, y el mío. Aquí hay un resumen de los puntos clave que ayudaron a reducir la cuenta de bytes:
Codificación de datos del planeta como CSVRecopilación de nombresreadLines
para evitar la gran cantidad de caracteres de comillas alrededor de las cadenas.Ajustar los parámetros de calor para que podamos usar signos
<
y en>
lugar de<=
y>=
.Cambiar el formato de datos de calor deHeat min, Heat max
aHeat min, Heat Delta
para deshacerse de los números de dos dígitos.Reemplazado cambiando todos los números por -3
Dividiendo todas las probabilidades del planeta por 5, lo que también resulta en unos pocos dígitos menos.
Multiplicar el vector de probabilidades del planeta con el vector de booleanos (que indica si nuestra entrada satisface los requisitos de calor) para anular las probabilidades de planetas inadecuados.
Probablemente, se podrían obtener algunos bytes más aplicando algún tipo de compresión de datos.Creo que ya no.
fuente
t=
en lugar detext=
guardará 3 bytes también.read.csv
para una sola columna, sugierereadLines
eliminar las citas por completo, aunque debe establecer explícitamenten
Python,
282 bytes, 261 bytes:Bastante simple, bastante seguro de que se podría jugar más al golf. Todavía estoy buscando una mejor manera de representar el rango del planeta y los datos de probabilidad. Si estoy dentro del rango del tipo de planeta, lo agrega a la lista de acuerdo con la probabilidad, luego imprime uno al azar.
EDITAR: Con crédito a Jonathan Frech, rehice el bucle for para eliminar algunos bytes. Mejor forma de agregar elementos a la lista
fuente
i in range(x[1], x[2])
excluye el borde superior del calor, a diferencia de lo especificado en la especificación?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)]
Octava con estadísticas El Paquete,
178176174158 bytesEl código define una función anónima que ingresa un número y genera una cadena.
Pruébalo en línea!
Explicación
El código
define una función anónima con entrada
h
.La cuerda
se divide en comas usando
El resultado es una matriz de celdas de cadenas, donde cada cadena es una clase de planeta.
El código
define la cadena que se muestra y resta
70
de los puntos de código de sus caracteres. Esto proporciona la matriz de valores mínimos de calor menos 1 , es decir,[3 3 3 4 6 6 6 9]
.Similar,
produce la matriz de valores máximos de calor más 1 , es decir,
[10 7 7 8 10 11 11 12]
.Las comparaciones
dar una matriz que contiene
true
ofalse
indique qué clases de planetas son posibles.Por otra parte,
define la matriz de valores de azar,
[15 10 10 10 10 25 14 6]
.La operacion
es la multiplicación por elementos de las dos últimas matrices (
true
y sefalse
comportan como0
y1
respectivamente). Esto proporciona una matriz donde cada clase de planeta tiene su oportunidad aleatoria o0
si esa clase no es posible en función de la entrada. Esta matriz se utilizará como ponderaciones en el muestreo aleatorio.La llamada a la función
selecciona una de las celdas de la matriz de cadenas de celdas (primer argumento de entrada), utilizando la matriz computada de pesos (cuarto argumento de entrada). Específicamente, la función
randsample
normaliza automáticamente los pesos de las probabilidades y luego realiza la selección aleatoria con esas probabilidades. El resultado es una matriz de celdas que contiene una cadena. El códigose utiliza para extraer esa cadena, que constituye la salida de la función.
fuente
Python 3 , 263 bytes
Pruébalo en línea!
fuente
Perl 5 (
-p
), 230 bytesPruébalo en línea!
fuente
[Ice,4,5,11]
lugar de[Ice,4,6,10]
, etc.), podrá usarlos en<
lugar de<=
y en>
lugar de>=
, ahorrando así 2 bytes. (sí, eso no es mucho ...)Nim ,
294 bytes314298Para el bucle ahora en una línea, sin retorno, menos bytes al tipo implícito
4 espacios eliminados (gracias Kevin )
Pruébalo en línea!
fuente
Nim
, pero creo que puedes jugar golf en cuatro espacios: uno enfor n in[(
; y tres a lasif h>=n[1]and h<=n[2]
.05AB1E ,
7876 bytesPruébalo en línea!
Explicación
”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”
empuja la cuerda
Gas Giant Ice Giant Gaia class Dense Atmosphere Ice Desert Iron Lava
fuente
Python 3,
199194 bytesLa división
h
en máscaras de bits separadas y valores de probabilidad aleatorios (ver explicación) ahorra algunos bytes al eliminar una asignaciónh
y simplificar elrange()
comprensión en la lista.Solución previa
Define una función anónima que toma un int y devuelve el tipo de planeta.
Para cada tipo de planeta, se calculó un valor de 13 bits. Los 8 bits superiores definen una máscara de bits de valores de calor válidos para ese tipo de planeta. Los 5 bits inferiores son la posibilidad aleatoria de ese tipo de planeta. Por ejemplo, "clase Gaia" es un tipo válido para valores de calor de 4 a 7, por lo que tiene una máscara de
0b00001111
. Tiene una probabilidad aleatoria de 10, o0b01010
. Combinándolos resulta el valor de 13 bits0b0000111101010
para el tipo "clase Gaia". Los valores de 13 bits para cada tipo de planeta se concatenan para obtener el valorh
(los 13 bits más bajos son para el tipo de planeta "Hielo"). (La respuesta más reciente no combina estos valores).La comprensión de la lista itera sobre los valores de 13 bits para crear una lista de pesos, donde el peso es la posibilidad aleatoria si el tipo de planeta es una opción válida para el valor de calor dado, y cero en caso contrario. Para cada tipo de planeta,
(h>>i&31)
extrae la posibilidad aleatoria de ese tipo de planeta.(h>>i+n+1&1)
evalúa a 1 si el tipo de planeta es una opción válida para el valor de calorn
y evalúa a 0 de lo contrario.La función de biblioteca
random.choices(choices, weights)
selecciona un elemento de la lista de opciones en función de la lista de pesos.fuente
i+n+1
puede seri-~n
. TIORubí ,
214 193189 bytesPruébalo en línea!
fuente
Haskell ,
377364358318312270265262256251 bytes(He agregado saltos de línea para una mejor impresión). La tarea dice "regresar", no "imprimir", por lo que
f
es una función que devuelve el nombre del planeta seleccionado al azar a laIO
mónada,f :: Int -> IO String
.El
main
esmain = do {f 10 >>= print}
(los consejos de golf de Haskell dicen que no cuenta). Huellas dactilares(ediciones: se eliminó
&
el caso base; se mudómain
; se cambió a cuádruples yunzip
, y se cambió a guardias de patrones y>>=
siguiendo las sugerencias de Laikoni , ¡gracias !; implementó el enfoque de la solución Jelly en su lugar, repitiendo los nombres; el tipo explícito ya no es necesario ; otro consejo de Laikoni ahorra 3 bytes más; lo convirtió en unaIO
función; implementó el consejo de la sala de chat).Pruébalo en línea!
fuente
Java 8,
398384 bytesDefinitivamente se puede jugar un poco más, pero la probabilidad en combinación con las cadenas no es muy fácil en Java.
Explicación:
Pruébalo en línea.
fuente
Mín. ,
280277 bytesComienza con calor en la pila, deja una cuerda en la pila. El mismo proceso general que la respuesta de Python 2.
Explicación
Tenga en cuenta que min es concatenativo
fuente
PowerShell, 56 + 135 (archivo CSV) + 1 (nombre de archivo) = 192 bytes
Pruébalo en línea! (esta es una versión ligeramente modificada que crea el archivo CSV temporal que se describe a continuación)
Importa un archivo CSV usando
ipcsv
(abreviaturaImport-CSV
) nombradoa
en el directorio local que contiene lo siguiente:Eso crea automáticamente una tabla hash iterable de cosas como las siguientes:
A continuación, utilizamos
Where-Object
(?
) para sacar las entradas en nuestro entero de entrada$z
es-in
el rango$_.m
de$_.x
(es decir, está en el rango de calor). Luego los bombeamos a unForeach-Object
bucle (%
) que crea una serie de cadenas de nombres basadas en la posibilidad aleatoria de esos nombres. Por ejemplo, esto creará una serie de15
"Gas Giant"
cadenas si ese calor coincide. Luego colocamos losGet-Random
que extraerán la cadena apropiada con la ponderación adecuada.fuente
PHP , 1236 bytes
Pruébalo en línea!
fuente