Se le dará el nombre de uno de los 20 objetos más grandes del Sistema Solar. Su tarea es devolver una aproximación de su radio, expresada en kilómetros.
Este es un desafío de código donde su puntaje consiste en la longitud de su código (en bytes) multiplicado por una relación de penalización , según su peor aproximación. Por lo tanto, gana el puntaje más bajo .
"A medida que viajamos por el universo" es la última línea de la canción Planet Caravan de Black Sabbath , también más tarde cubierta por Pantera .
Los objetos del sistema solar
Fuente: Wikipedia
NB: El rango se otorga solo para información. La entrada es el nombre del objeto.
n | Object | Radius (km)
----+----------+-------------
1 | Sun | 696342
2 | Jupiter | 69911
3 | Saturn | 58232
4 | Uranus | 25362
5 | Neptune | 24622
6 | Earth | 6371
7 | Venus | 6052
8 | Mars | 3390
9 | Ganymede | 2634
10 | Titan | 2575
11 | Mercury | 2440
12 | Callisto | 2410
13 | Io | 1822
14 | Moon | 1737
15 | Europa | 1561
16 | Triton | 1353
17 | Pluto | 1186
18 | Eris | 1163
19 | Haumea | 816
20 | Titania | 788
O como listas amigables para copiar y pegar:
'Sun', 'Jupiter', 'Saturn', 'Uranus', 'Neptune', 'Earth', 'Venus', 'Mars', 'Ganymede', 'Titan', 'Mercury', 'Callisto', 'Io', 'Moon', 'Europa', 'Triton', 'Pluto', 'Eris', 'Haumea', 'Titania'
696342, 69911, 58232, 25362, 24622, 6371, 6052, 3390, 2634, 2575, 2440, 2410, 1822, 1737, 1561, 1353, 1186, 1163, 816, 788
Tu puntuación
Deje que sea el radio esperado del objeto y deje que sea la respuesta de su programa para este objeto.
Entonces su puntaje se define como:
donde es la longitud de su código en bytes.
Ejemplo:
Si el tamaño de su código es de bytes y su peor aproximación está en la Luna con un radio estimado de km en lugar de km, entonces su puntaje sería:
Cuanto más bajo, mejor.
Encabezado recomendado para su respuesta:
Language, 100 bytes, score = 302
Puede usar este script para calcular su puntaje (primera línea = longitud del código, siguientes 20 líneas = sus salidas, desde Sun hasta Titania).
Reglas
- Puede tomar el nombre del objeto en minúsculas, mayúsculas o exactamente como se describe anteriormente (título del caso). No se permiten otros casos mixtos.
- La entrada está garantizada como uno de los 20 nombres posibles.
- Puede devolver enteros o flotantes. En ambos casos, la penalización debe calcularse directamente con estos valores (no valores redondeados en caso de flotadores).
- Debes devolver valores positivos.
- Los programas vacíos no están permitidos.
fuente
7512
todos los casos de prueba. Veré si me lanzo a crear una solución MathGolf en el corto plazo, pero será difícil vencer a 05AB1E.Respuestas:
PowerShell , 3 bytes, puntaje 3637
Pruébalo en línea!
Muy ingenuo, aburrido, implementación; solo regresa
20000
sin importar la entrada. La experimentación con cosas como la protección especial del sol o el uso de valores de punto flotante en lugar de2
todos dio como resultado puntajes peores porque la longitud del código aumentó lo suficiente como para compensar cualquier ganancia de comparación de tamaños.fuente
Gelatina , 34 bytes, puntaje = 37
La entrada está en mayúscula, la salida es la potencia de 1.1 con el menor error.
Pruébalo en línea!
Cómo funciona
fuente
Java (JDK) , 90 bytes, puntaje = 97
Pruébalo en línea!
Créditos
String
lugar de codificarlos en unaint
matriz explícita .fuente
(...-7)
: El carácter no imprimible(char)0
está vacío, así que tuve que agregar algo. I primero intentado9
y8
siendo de un solo dígito, pero9
di de lengüetas curso, lo que requiere múltiples\t
(2 bytes cada uno), y8
dio un error acerca de un carácter sin escape utilizado.*100-700
y jugando con los valores como cadena y esos dos números, pero esos son los mejores, de hecho, algunos valores pueden disminuir el byte cuenta, pero luego la puntuación se mantiene igual. Así que la localización aleatoria hizo (uno de) el mejor caso;)Wolfram Language
114103 97 88 8682 bytes. puntaje =114103 97 89 8783 puntosAl menos 6 puntos guardados gracias a
Dennis
, varios más gracias alirtosiast
, y 6 más gracias auser202729
.Aunque Mathematica puede obtener datos del sistema solar (así como muchos datos astronómicos adicionales), se necesitan algunos ajustes menores, como se explica a continuación.
Interpreter[#,"AstronomicalObject"]&
devolverá la entidad (es decir, el objeto computable de la máquina) asociada con el término representado por#
.EntityValue[AstronomicalObject[],"Radius"]
devuelve el radio, en millas, de la entidad. En el caso de "Haumea", se devuelve el valor 816.27 (es decir, 507 * 1.61).Multiplicación del radio por
1.61
conversiones de millas a km. Los valores decimales, en lugar de los enteros, representan mucho menos del 1% de error, incluso en el caso más extremo.[[1]]
devuelve la magnitud sin la unidad, km. Esto luego se cambió a#&@@
, dando el mismo resultado.fuente
Python 3 , puntaje 95, 95 bytes
Pruébalo en línea!
Python 3 , puntaje 133, 133 bytes
Pruébalo en línea!
fuente
Powershell,
150141 bytes, la puntuación de163153Pruébalo en línea!
Script de prueba:
Salida:
Explicación:
end of line mode
es solo LF.Ejemplo:
Powershell, 178 bytes, puntaje 178
fuente
05AB1E , puntaje
1006660 (1006156 bytes )Puerto de la respuesta Java de @ OlivierGrégoire , así que si te gusta esta primera respuesta, ¡asegúrate de votarlo también!
Entrada en titlecase.
Verifique todos los casos de prueba.
05AB1E , puntaje 100 (100 bytes )
Entrada en minúscula completa. Emite el radio exacto, por lo que no se agrega penalización.
Verifique todos los casos de prueba.
Explicación:
Vea esta sugerencia mía 05AB1E (secciones ¿Cómo comprimir enteros grandes? Y ¿Cómo comprimir cadenas que no forman parte del diccionario? ) Para comprender cómo funciona la compresión utilizada.
Creé una alternativa de 70 bytes que mapearía sun600,000
; [Júpiter, Saturno] a60,000
; [Urano, Neptuno] a30,000
; [tierra, venus] a6,000
; [Marte, Ganímedes, Titán, Mercurio, Calisto] a3,000
; [io, luna, europa, tritón, plutón, eris] a1,500
; y [haumea; titania] a750
. Desafortunadamente eso obtuvo un puntaje de 117. Veré si puedo llegar a menos de 100 con un enfoque alternativo más adelante.fuente
Mathematica, 57 bytes, puntaje =
6258-4 bytes / puntuación gracias a lirtosiast !
Simplemente realiza una búsqueda Wolfram Alpha para el radio medio.
fuente
WolframAlpha
función se ha utilizado al menos cuatro veces ...Gelatina , 28 bytes, puntaje = 31
Esto utiliza un hashing configurable incorporado que agregué a Jelly por sugerencia de @ lirtosiast.
La entrada está en el título, la salida es la potencia de 1.1 con el menor error.
Pruébalo en línea!
Cómo funciona
Esta respuesta consta simplemente de dos partes.
“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘ḥ
usa el nuevo incorporado para mapear cada una de las 20 entradas posibles a 15 enteros diferentes.1.1*
eleva 1.1 a la potencia calculada.“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘
es un literal; cada carácter sin comillas se reemplaza por su índice basado en 0 en la página de códigos de Jelly, dando .El hash incorporado[95,95,169,55,242] 1 376510639244
ḥ
primero asigna a un número entero incrementando cada número, luego trata el resultado como el número entero de 250 dígitos de base biyectiva y suma . Esto produce .Al dividir en dos este número entero hasta obtener el resultado , obtenemos la secuencia , que tiene las diferencias hacia adelante .0 [376510639244,188255319622,94127659811,47063829905,…,5,2,1,0] [188255319622,94127659811,47063829906,…,3,1,1]
A continuación, generamos 64 enteros de 64 bits aplicando SHAKE256-4096 a la representación de cadena de la representación interna del
ḥ
argumento correcto de '' '', luego cortamos los 4096 bits resultantes en 64 fragmentos de 64 bits.ḥ
ahora calcula el producto punto de las 39 diferencias y los primeros 39 enteros de 64 bits generados, módulo . Esto produce un número entero en .La lista tiene una longitud de 15, por lo que multiplicamos el entero generado por 15 y tomamos el 64 más alto bits del resultado. Esto produce un número entero en , que usamos para indexar en la lista.[82,85,117,141,78,77,92,115,79,83,74,106,91,70,76] [0,15)
Para encontrar la configuración de hash adecuada, he usado un forzador de brutas en C que forma parte del repositorio de Jelly .
fuente
Python 2 , 155 bytes, puntaje = 155
Pruébalo en línea!
Sorprendentemente bien para esta solución perezosa ... buscará mejorar también. ;-)
fuente
Japt , 86 bytes, puntaje = 94
Pruébelo para todas las entradas , calcule la puntuación o compruebe el error más alto
Muy similar a la respuesta original de Olivier. La entrada es todo en minúsculas.
Después de varias mejoras en los valores de salida, el error más alto actual es Venus con un poco más del 4%.
Explicación ahora que las cosas son un poco más estables:
La cadena de los nombres se
sujusaurneeavemagatimecaiomoeutrplerha
comprime utilizando la compresión integrada de Japt. Los números que representan los radios se calculan así:fuente
Japt,
777675 bytes, puntaje = 75Primer paso en esto; Quería probar una solución de penalización 0 para darme una línea de base para trabajar. Regresaremos mañana para ver qué mejoras se pueden hacer, con suerte aún para 0 penalizaciones.
La entrada no distingue entre mayúsculas y minúsculas.
Pruébalo o prueba todas las entradas
El
"..."
representa una cadena que contiene muchos no imprimibles. Los puntos de código son:Para ofrecer una explicación rápida: la cadena se divide en trozos de 2 caracteres. Luego indexamos en esa matriz usando parte de la fórmula de ovs más un ajuste de índice y luego asignamos los 2 caracteres a sus puntos de código.
54 bytes, puntuación = 58
Un puerto de la solución de Olivier .
Probar todas las entradas
fuente
%24
:-)Ruby , 105 bytes, puntaje 109
Pruébalo en línea!
Si dividimos 700000 por los radios, obtenemos una secuencia que aumenta de manera razonablemente lineal (aunque bastante errática). Los incrementos en la tabla a continuación pueden ser aproximados por los valores ASCII de los caracteres. El problema con este enfoque es que requiere que la entrada se decodifique a un valor que ordene los diferentes nombres por tamaño.
Un problema menor es que la diferencia entre Eris y Haumea es bastante grande. Se
~~d
requieren tres caracteres para codificar este incremento en formato ASCII solamente. La cadena de planeta a índice tiene dos espacios de "planeta fantasma" para rellenar el índice.fuente
T-SQL,
203 202 201196 bytes, puntaje =217 216 212208Los saltos de línea son solo para legibilidad.
La entrada se toma a través de la tabla i existente con la columna varchar v , según nuestros estándares IO .
Une la tabla de entrada a una tabla en memoria en los dos primeros caracteres y devuelve los dígitos restantes x100.
Trata a "Titán" como un caso especial usando
IIF
.EDITAR : guardado 1 byte (y 1 punto) al usar
STUFF
para borrar los dos primeros caracteres en lugar deSUBSTRING
. Gracias, t-clausen.dk!EDIT 2 : ¡Quería ver qué pasaría si intentara guardar otro byte multiplicando cada valor de búsqueda por 99 en lugar de 100, y descubrí para mi sorpresa que en realidad aumentó la precisión (¡la estimación menos precisa!).
Esto me llevó a algunas pruebas de prueba y error, y a algunas tablas de datos de Excel que sucedieron, donde encontré una solución óptima usando un multiplicador de 89 (que por supuesto cambió todos mis valores almacenados).
Entonces, aunque esto me ahorra solo un byte, en realidad mejora mi puntaje en 4.6 de mi solución anterior.
EDITAR 3 : busqué más alto en lugar de más bajo, y encontré un factor de multiplicación aún mejor , 198 . Los valores se mantienen razonablemente precisos mientras acortan mi cadena almacenada en bastantes caracteres, lo que mejora mi puntaje.
fuente
PowerShell , 203 bytes, puntaje 203
Pruébalo en línea!
Muy similar a la respuesta de Olivier, ahora que lo veo, pero se desarrolló de forma independiente.
fuente
Carbón , 101 bytes, puntaje = 101
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Tome el primer y undécimo carácter (cíclicamente) de la cadena de entrada y concatenelos.
Búscalos en la cadena
SuJiSrUuNtEEVVMrGnTTMcClIIMoEpToPPEiHeTa
dividida en pares de caracteres.Divide la cadena
m.w'fv&J|\"l|\"e1 c& _c Ca ;e ;* 9a 9C 31 2; 0I .7 ,N ,7 (X (<
en grupos de tres caracteres y toma el grupo correspondiente.Decodifique el resultado como un número base-95 utilizando el juego de caracteres ASCII imprimible como dígitos. Ejemplo:
Io
el undécimo carácter esI
, así que miramos hacia arribaII
y encontramos que es el decimotercer objeto más grande y su tamaño es el31
que se asigna19 * 95 + 17 = 1822
.fuente
Swift 4 , 225 bytes, puntaje = 241
Probablemente golfa un montón más (¿tal vez en el área "Ga-Me-Ca"?), Pero Swift no se usa a menudo (por alguna razón, tal vez).
y sin golf
¡Pruébelo en línea!
Intenté diferentes "tamaños de clave" para el mapa, pero, por supuesto, 1 tiene muchos enfrentamientos y el uso de tres caracteres no me da
i=="Titan" ?2575:
los 17 caracteres, ya que hay "Io" para administrar (y tomará más de 3 caracteres, Yo creo que).fuente
JavaScript (ES6), 152 bytes, puntuación = 163
Bueno, es una solución bastante estándar, ¡pero disfruté el desafío de todos modos!
Mi puntaje:
Pruébalo en línea!
fuente
FALSO , 152 bytes, Puntuación = 563
Respuesta perezosa usando palabras largas y primeras letras, pero mi excusa es que estoy usando un lenguaje extraño
Pruébalo en línea! (copie y pegue el código, presione mostrar y luego ejecute)
Mis resultados:
fuente
C (gcc) , 118 bytes, puntaje = 135
Pruébalo en línea!
Puntuación
Atropellar
El nombre del objeto se convierte en un hash de un solo carácter a través del proceso engorroso
cuya hinchazón apunta a "Titán" / "Titania" como los principales delincuentes. Se consideró incluir el último carácter en el hash, pero eso todavía requiere una
strlen()
en C. La primera aparición del carácter de hash se busca en la cadena de hash / datos. Cuando se encuentra, se toma el siguiente carácter y se usa para aproximar el radio del objeto en cuestión.El carácter de datos contiene el logaritmo natural desplazado y escalado del radio. Generado así:
La escala se eligió mediante prueba y error altamente científica, y el cambio para poner el valor dentro del rango ASCII imprimible y evitar las barras diagonales inversas. Fue necesario reorganizar los objetos en la cadena debido a algunas colisiones de hash / datos.
fuente
Python 2 , 89 bytes, Puntuación = 234
Pruébalo en línea!
La mayoría de las respuestas publicadas parecen haber utilizado una estrategia de "codificación / decodificación". Me preguntaba qué tan bien podría hacerlo estimando el diámetro de los cuerpos celestes usando una ecuación simple. Ha sido un ejercicio divertido, pero el ahorro moderado de bytes está más que compensado por la penalización de precisión.
El núcleo de esta solución es la ecuación de estimación:
donde x es dos veces el orden de rango del radio del cuerpo.
Genero el valor de x basado en la cadena de entrada usando una modificación de @Erik la solución Python 2 de Outgolfer. Ahorré algunos bytes en su código al cambiar mis ecuaciones para trabajar con [2..40] en lugar de [1..20].
El código para generar órdenes de rango ocupa más de 2/3 de los bytes de la solución completa. Si alguien tiene una forma más compacta de generar rangos, esta solución podría acortarse aún más. Debido a la penalización de precisión (alrededor de 2.6), la puntuación mejoraría bastante.
Generando la ecuación
Utilicé métodos estadísticos para buscar ecuaciones simples para estimar el tamaño de cada cuerpo en función de su rango. En parte, siguiendo las ideas de la solución Ruby de @Level River St y generalizando, me decidí por ecuaciones de la forma:
Trabajando en R, utilicé modelos lineales en el registro de los radios para desarrollar estimaciones iniciales, y luego utilicé la optimización no lineal, sembrando la optimización con los resultados de los modelos lineales, para buscar soluciones que minimizaran la función de penalización especificada en el problema.
El valor estimado de A en la ecuación anterior es de siete dígitos, por lo que busqué una expresión simple para guardar un par de bytes. Busqué expresiones de la forma
para dos dígitos xy 1 dígito y (para un total de cinco bytes, ahorrando dos bytes, o aproximadamente cinco puntos, dada la penalización) que no fue muy diferente del valor óptimo de A y no infló mucho la penalización, y terminó con el (de lo contrario inexplicable):
fuente
TI-BASIC (TI-84), 285 bytes, Puntuación = 285
Un programa simple de "índice en cadena para listar". Se puede jugar más al golf.
La entrada está en
Ans
y es uno de los nombres de los objetos en mayúscula completa.La salida está en
Ans
y se imprime automáticamente.Ejemplo:
Explicación:
(La lista de radios y la cadena de nombre se han acortado por brevedad.
...
Se utiliza para indicar el resto de la lista / cadena).Modelo visual:
fuente