Wyprowadź jednostki

10

Wyzwanie

Biorąc pod uwagę listę jednostek podstawowych SI, listę równań i cel, musisz wyprowadzić jednostki celu, używając tylko jednostek podstawowych.

Jednostki pochodne

Z Wikipedii:

Międzynarodowy Układ Jednostek (SI) określa zbiór siedmiu jednostek podstawowych, z których pochodzą wszystkie pozostałe jednostki miary SI. Każda z tych pozostałych jednostek (jednostki pochodne SI) jest albo bezwymiarowa, albo może być wyrażona jako iloczyn mocy jednej lub więcej jednostek podstawowych.

Na przykład, pochodne SI jednostkę powierzchni jest metr kwadratowy (m 2 ), i pochodne SI jednostka gęstości jest kilogram na metr sześcienny (kg / m 3 lub kg m -3 ).

Siedem jednostek podstawowych SI to:

  • Ampere, A.
  • Candela, cd
  • Kelvin, K
  • Kilogram, kg
  • Metr, m
  • Mol, mol
  • Po drugie, s

Przykład

Wejście

Jednostki podstawowe:

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

Równania:

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

Cel:

E

Wynik

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

Wejście

Jednostki podstawowe:

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

Równania:

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

Cel:

A

Wynik

A [cd*A*A/m]

Zasady

Jednostki będą zawsze podawane w formie

a [b]

Gdzie abędzie pojedyncza wielka lub mała litera alfabetu i bbędzie to jednostka (jeden lub więcej znaków).

Równanie będzie miało postać

a = c

Gdzie cbędzie wyrażenie, które będzie zawsze używać tylko wcześniej zdefiniowanych jednostek i operatorów *oraz /.

Moce muszą zostać rozszerzone. Na przykład jednostka obszaru jest oficjalnie m^2, ale należy to przedstawić jako m*m. To samo odnosi się do negatywnych uprawnień, takie jak prędkość ( m*s^-1), które powinny być reprezentowane przez podział: m/s. Podobnie jednostki przyspieszenia m/s^2lub m*s^-2powinny być reprezentowane jako m/s/s.

Nie musisz nic anulować. Na przykład dane wyjściowe C*s/kg/ssą prawidłowe, nawet jeśli można je anulować do C/kg.

Nie ma zamówienie specyficzne dla mnożenia: kg*s/m, s/m*kg, s*kg/mwszystkie są ważne (ale /m*s*kgto nieważne).

Uwaga: Nigdy nie będziesz musiał dzielić przez jednostkę pochodną.

Zwycięski

Najkrótszy kod w bajtach wygrywa

Rozpad beta
źródło
Związane z.
Martin Ender,
Czy dane wejściowe (wyjściowe) należy traktować jako ciąg znaków, czy też akceptowalne są inne typy / struktury, np. Symbole?
Julian Wolf,
@JulianWolf Nie, I / O musi być jak łańcuch
Beta Decay

Odpowiedzi:

12

Siatkówka , 50 48 bajtów

 =

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

Wypróbuj online!

Wyjaśnienie

 =

Usuń wszystkie znaki równości wraz ze spacją przed nimi. Kto i tak potrzebuje ...

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

Dokonuje to zamian znanych ilości. Wielokrotnie dopasowuje definicję ilości (ilość to dowolny znak przed spacją, a po niej ciąg znaków), a także pewne miejsce po definicji, w którym ta ilość jest używana, i wstaw definicję do użycia. Wykluczyć jednostki z tych meczów (poprzez zapewnienie, że nie ma ]po meczu), tak, że nie zastąpi [m]się [[kg]]np. Podstawienie to powtarza się, dopóki wyrażenie regularne nie będzie już zgodne (co oznacza, że ​​nie ma już użycia ilości, a wszystkie wiersze zostały przekształcone w wyrażenia jednostek).

A-2`

Odrzuć wszystkie oprócz ostatniej linii.

](.).
$1

Na koniec usuń zewnętrzne nawiasy kwadratowe. Zasadniczo chcemy zachować pierwszą [i ostatnią, ]ale odrzucić wszystkie pozostałe. Ci inni zawsze pojawiają się z operatorem pomiędzy, więc albo jako ]*[albo jako ]/[. Ale co ważniejsze, są to jedyne przypadki, w których po a ]następują dwa kolejne znaki. Dopasowujemy więc wszystkie ]po dwóch znakach po nich i zastępujemy je drugim z tych trzech znaków, aby zachować operator.

Martin Ender
źródło
1

JavaScript (ES6), 155 153 152 bajtów

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

Bierze jednostki podstawowe i równania jako tablice ciągów.

Wyjaśnienie

// 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
źródło