Dérivez les unités

10

Défi

Étant donné une liste d'unités de base SI, une liste d'équations et une cible, vous devez dériver les unités de la cible en utilisant uniquement les unités de base.

Unités dérivées

De Wikipédia:

Le Système international d'unités (SI) spécifie un ensemble de sept unités de base dont dérivent toutes les autres unités de mesure SI. Chacune de ces autres unités (unités dérivées du SI) est soit sans dimension, soit peut être exprimée comme un produit des puissances d'une ou plusieurs des unités de base.

Par exemple, l'unité de surface dérivée du SI est le mètre carré (m 2 ), et l'unité de densité dérivée du SI est le kilogramme par mètre cube (kg / m 3 ou kg m -3 ).

Les sept unités de base SI sont:

  • Ampère, A
  • Candela, cd
  • Kelvin, K
  • Kilogramme, kg
  • Mètre, m
  • Mole, mol
  • Deuxièmement, s

Exemple

Contribution

Unités de base:

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

Équations:

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

Cible:

E

Production

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

Contribution

Unités de base:

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

Équations:

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

Cible:

A

Production

A [cd*A*A/m]

Règles

Les unités seront toujours données sous la forme

a [b]

asera une seule lettre alphabétique majuscule ou minuscule et bsera une unité (un ou plusieurs caractères).

L'équation sera sous la forme

a = c

csera une expression qui n'utilisera que les unités précédemment définies et les opérateurs *et /.

Les pouvoirs doivent être étendus. Par exemple, l'unité de surface est officiellement m^2, mais vous devez la représenter comme m*m. De même pour les puissances négatives telles que la vitesse ( m*s^-1) qui doit être représentée comme une division: m/s. De même, les unités d'accélération, m/s^2ou m*s^-2, doivent être représentées comme m/s/s.

Vous n'avez aucune annulation à effectuer. Par exemple, une sortie C*s/kg/sest valide même si elle peut être annulée jusqu'à C/kg.

Il n'y a pas d' ordre spécifique pour la multiplication: kg*s/m, s/m*kg, s*kg/msont tous valides (mais /m*s*kgest invalide).

Remarque: vous n'aurez jamais à diviser par une unité dérivée.

Gagnant

Le code le plus court en octets gagne

Beta Decay
la source
En relation.
Martin Ender
L'entrée (sortie) doit-elle être prise (donnée) comme une chaîne, ou d'autres types / structures, par exemple des symboles, sont-ils acceptables?
Julian Wolf
@JulianWolf Non, les E / S doivent être des chaînes
Beta Decay

Réponses:

12

Rétine , 50 48 octets

 =

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

Essayez-le en ligne!

Explication

 =

Retirez tous les signes égaux ainsi que l'espace devant eux. Qui en a besoin de toute façon ...

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

Ceci effectue les substitutions de quantités connues. Il correspond à plusieurs reprises à une définition de quantité (la quantité est n'importe quel caractère devant un espace et la définition la chaîne après), ainsi qu'à un endroit après la définition où cette quantité est utilisée et insère la définition de l'utilisation. Nous excluons les unités de ces correspondances (en veillant à ce qu'il n'y en ait pas ]après la correspondance), afin de ne pas les remplacer [m]par [[kg]]exemple. Cette substitution est répétée jusqu'à ce que l'expression régulière ne corresponde plus (ce qui signifie qu'il ne reste plus d'utilisation d'une quantité et que toutes les lignes ont été transformées en expressions d'unités).

A-2`

Jetez tout sauf la dernière ligne.

](.).
$1

Enfin, supprimez les crochets superflus. Fondamentalement, nous voulons conserver le premier [et le dernier ]mais rejeter tous les autres. Ces autres apparaissent toujours avec un opérateur entre les deux, donc soit comme, ]*[soit comme ]/[. Mais plus important encore, ce sont les seuls cas où a ]est suivi de deux autres caractères. Nous faisons donc correspondre tous les éléments ]avec deux caractères après eux, et les remplaçons par le deuxième de ces trois caractères pour conserver l'opérateur.

Martin Ender
la source
1

JavaScript (ES6), 155 153 152 octets

(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]))

Prend les unités de base et les équations comme des tableaux de chaînes.

Explication

// 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])
)
darrylyeo
la source