Deriva le unità


10

Sfida

Dato un elenco di unità base SI, un elenco di equazioni e un obiettivo, è necessario derivare le unità dell'obiettivo utilizzando solo le unità base.

Unità derivate

Da Wikipedia:

Il Sistema internazionale di unità (SI) specifica un insieme di sette unità di base da cui derivano tutte le altre unità di misura SI. Ognuna di queste altre unità (unità derivate SI) è o senza dimensioni o può essere espressa come un prodotto di potenze di una o più unità di base.

Ad esempio, l'unità di area derivata SI è il metro quadrato (m 2 ) e l'unità di densità derivata SI è il chilogrammo per metro cubo (kg / m 3 o kg m −3 ).

Le sette unità base SI sono:

  • Ampere, A
  • Candela, cd
  • Kelvin, K
  • Chilogrammo, kg
  • Metro, m
  • Talpa, mol
  • Secondo, s

Esempio

Ingresso

Unità base:

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

Le equazioni:

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

Bersaglio:

E

Produzione

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

Ingresso

Unità base:

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

Le equazioni:

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

Bersaglio:

A

Produzione

A [cd*A*A/m]

Regole

Le unità verranno sempre fornite nel modulo

a [b]

Dove asarà una singola lettera alfabetica maiuscola o minuscola e bsarà un'unità (uno o più caratteri).

L'equazione sarà nella forma

a = c

Dove csarà un'espressione che utilizzerà sempre e solo le unità precedentemente definite e gli operatori *e /.

I poteri devono essere espansi. Ad esempio, l'unità di area è ufficialmente m^2, ma dovresti rappresentarla come m*m. Lo stesso vale per potenze negative come velocità ( m*s^-1), che dovrebbe essere rappresentata come una divisione: m/s. Allo stesso modo, le unità per l'accelerazione, m/s^2o m*s^-2, dovrebbero essere rappresentate come m/s/s.

Non è necessario effettuare alcuna cancellazione. Ad esempio, un output C*s/kg/sè valido anche se può essere annullato fino a C/kg.

Non c'è un ordine specifico per la moltiplicazione: kg*s/m, s/m*kg, s*kg/msono tutte valide (ma /m*s*kgnon è valido).

Nota: non dovrai mai dividere per un'unità derivata.

vincente

Vince il codice più breve in byte



L'input (output) deve essere preso (indicato) come una stringa o sono accettabili altri tipi / strutture, ad esempio simboli?
Julian Wolf,

@JulianWolf No, I / O deve essere come stringhe
Decadimento beta

Risposte:


12

Retina , 50 48 byte

 =

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

Provalo online!

Spiegazione

 =

Rimuovi tutti i segni di uguaglianza insieme allo spazio davanti a loro. Chi ha bisogno di quelli comunque ...

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

Ciò esegue le sostituzioni di quantità note. Corrisponde ripetutamente a una definizione di quantità (la quantità è qualsiasi carattere davanti a uno spazio e la definizione alla stringa che lo segue), nonché un punto dopo la definizione in cui tale quantità viene utilizzata e inserire la definizione per l'uso. Escludiamo le unità da quelle partite (assicurandoci che non ci sia ]dopo la partita), in modo da non sostituirle [m]con [[kg]]ad esempio. Questa sostituzione viene ripetuta fino a quando la regex non corrisponde più (il che significa che non ci sono usi di una quantità rimasta e tutte le linee sono state trasformate in espressioni di unità).

A-2`

Scarta tutto tranne l'ultima riga.

](.).
$1

Rimuovere infine le parentesi quadre estranee. Fondamentalmente, vogliamo mantenere il primo [e l'ultimo, ]ma scartare tutti gli altri. Quegli altri appaiono sempre con un operatore in mezzo, quindi come ]*[o come ]/[. Ma soprattutto, questi sono gli unici casi in cui a ]è seguito da altri due personaggi. Quindi abbiniamo tutti ]con due caratteri dopo di loro e lo sostituiamo con il secondo di quei tre caratteri per mantenere l'operatore.


1

JavaScript (ES6), 155 153 152 byte

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

Prende le unità di base e le equazioni come matrici di stringhe.

Spiegazione

// 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])
)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.