Derive las unidades


10

Desafío

Dada una lista de unidades base SI, una lista de ecuaciones y un objetivo, debe derivar las unidades del objetivo utilizando solo las unidades base.

Unidades derivadas

De Wikipedia:

El Sistema Internacional de Unidades (SI) especifica un conjunto de siete unidades base de las cuales se derivan todas las demás unidades de medida del SI. Cada una de estas otras unidades (unidades derivadas del SI) es adimensional o puede expresarse como un producto de potencias de una o más de las unidades base.

Por ejemplo, la unidad de área derivada del SI es el metro cuadrado (m 2 ), y la unidad de densidad derivada del SI es el kilogramo por metro cúbico (kg / m 3 o kg m −3 ).

Las siete unidades base del SI son:

  • Amperio, A
  • Candela, cd
  • Kelvin, K
  • Kilogramo, kg
  • Metro, m
  • Topo, mol
  • Segundo, s

Ejemplo

Entrada

Unidades base:

d [m]
m [kg]
t [s]

Ecuaciones:

v = d/t
a = v/t
F = m*a
E = F*d

Objetivo:

E

Salida

E [kg*m*m/s/s]

Entrada

Unidades base:

G [cd]
L [m]
y [A]
a [K]

Ecuaciones:

T = y*y/L
A = T*G

Objetivo:

A

Salida

A [cd*A*A/m]

Reglas

Las unidades siempre se entregarán en la forma

a [b]

Donde ahabrá una sola letra alfabética en mayúscula o minúscula y bserá una unidad (uno o más caracteres).

La ecuación tendrá la forma

a = c

Donde chabrá una expresión que solo usará unidades previamente definidas y los operadores *y /.

Los poderes deben ser ampliados. Por ejemplo, la unidad de área es oficialmente m^2, pero debe representar esto como m*m. Lo mismo se aplica a potencias negativas tales como la velocidad ( m*s^-1), que deben ser representados como una división: m/s. Del mismo modo, las unidades de aceleración, m/s^2o m*s^-2, deben representarse como m/s/s.

No tiene que cancelar nada. Por ejemplo, una salida C*s/kg/ses válida aunque puede cancelarse a C/kg.

No hay un orden específico para la multiplicación: kg*s/m, s/m*kg, s*kg/mson todos válidos (pero /m*s*kgno es válido).

Nota: nunca tendrá que dividir por una unidad derivada.

Victorioso

El código más corto en bytes gana



¿La entrada (salida) necesita ser tomada (dada) como una cadena, o son otros tipos / estructuras, por ejemplo , símbolos, aceptables?
Julian Wolf

@JulianWolf No, la E / S tiene que ser como cadenas
Beta Decay

Respuestas:


12

Retina , 50 48 bytes

 =

+`((.) (.+)\D*)\2(?!\w*])
$1$3
A-2`
](.).
$1

Pruébalo en línea!

Explicación

 =

Elimine todos los signos iguales junto con el espacio en frente de ellos. ¿Quién los necesita de todos modos ...

+`((.) (.+)\D*)\2(?!\w*])
$1$3

Esto realiza las sustituciones de cantidades conocidas. Coincide repetidamente con una definición de cantidad (la cantidad es cualquier carácter delante de un espacio y la definición de la cadena después de él), así como en algún lugar después de la definición donde se usa esa cantidad e inserte la definición para el uso. Excluimos unidades de esas coincidencias (asegurando que no haya ninguna ]después de la coincidencia), por lo que no reemplazamos [m]con, [[kg]]por ejemplo. Esta sustitución se repite hasta que la expresión regular ya no coincida (lo que significa que no quedan usos de una cantidad y que todas las líneas se han convertido en expresiones de unidades).

A-2`

Descarte todos menos la última línea.

](.).
$1

Finalmente, elimine los corchetes extraños. Básicamente, queremos mantener el primero [y el último ]pero descartar todos los demás. Esos otros siempre aparecen con un operador en el medio, ya sea como ]*[o como ]/[. Pero lo que es más importante, esos son los únicos casos en los que a ]sigue dos caracteres más. Así que combinamos todos ]con dos caracteres después de ellos y los reemplazamos con el segundo de esos tres caracteres para retener al operador.


1

JavaScript (ES6), 155 153 152 bytes

(U,E,T)=>(u={},U.map(x=>u[x[0]]=x.slice(3,-1)),e={},E.map(x=>e[x[0]]=x.slice(4)).map(_=>s=s.replace(r=/[A-z]/g,m=>e[m]||m),s=e[T]),s.replace(r,m=>u[m]))

Toma unidades base y ecuaciones como matrices de cadenas.

Explicación

// Base Units, Equations, Target
(U,E,T)=>(
    // Map variable names to SI units
    u={},
    U.map(x=>u[x[0]]=x.slice(3,-1)), // x[0] is the variable name,
                                     // x.slice(3,-1) is the unit

    // Map variable names to equations
    e={},
    E.map(x=>e[x[0]]=x.slice(4)) // x[0] is the variable name,
                                 // x.slice(4) is the unit

    // (Initialize return string to the target variable's equation
    // using the (useless) second argument to .map() below)
    // s=e[T]

    // For as many times as there are equations (chained from above),
    .map(_=>
        // Substitute each variable with its equivalent expression
        // if there is one.
        s=s.replace(
            r=/[A-z]/g, // Save this regex for final step.
            m=>e[m]||m
        ),

        // The working string variable is initialized here.
        s=e[T]
    ),

    // Substitute remaining variables with SI units and return. 
    s.replace(r,m=>u[m])
)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.