Leiten Sie die Einheiten ab


10

Herausforderung

Bei einer Liste von SI-Basiseinheiten, einer Liste von Gleichungen und einem Ziel müssen Sie die Einheiten des Ziels nur unter Verwendung der Basiseinheiten ableiten.

Abgeleitete Einheiten

Aus Wikipedia:

Das Internationale Einheitensystem (SI) legt einen Satz von sieben Basiseinheiten fest, von denen alle anderen SI-Maßeinheiten abgeleitet werden. Jede dieser anderen Einheiten (SI-abgeleitete Einheiten) ist entweder dimensionslos oder kann als Produkt der Potenzen einer oder mehrerer Basiseinheiten ausgedrückt werden.

Beispielsweise ist die vom SI abgeleitete Flächeneinheit der Quadratmeter (m 2 ) und die vom SI abgeleitete Dichteeinheit das Kilogramm pro Kubikmeter (kg / m 3 oder kg m –3 ).

Die sieben SI-Basiseinheiten sind:

  • Ampere, A.
  • Candela, cd
  • Kelvin, K.
  • Kilogramm, kg
  • Meter, m
  • Mol , Mol
  • Zweitens s

Beispiel

Eingang

Basiseinheiten:

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

Gleichungen:

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

Ziel:

E

Ausgabe

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

Eingang

Basiseinheiten:

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

Gleichungen:

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

Ziel:

A

Ausgabe

A [cd*A*A/m]

Regeln

Die Einheiten werden immer in der Form angegeben

a [b]

Wo awird ein einzelner alphabetischer Groß- oder Kleinbuchstabe sein undb eine Einheit (ein oder mehrere Zeichen).

Die Gleichung wird in der Form sein

a = c

Wo cwird ein Ausdruck sein, der immer nur zuvor definierte Einheiten und die Operatoren *und verwendet/ .

Befugnisse müssen erweitert werden. Zum Beispiel ist die Flächeneinheit offiziell m^2, aber Sie sollten dies als darstellen m*m. Gleiches gilt für negative Potenzen wie speed ( m*s^-1), die als Division dargestellt werden sollen : m/s. Ebenso sollten die Einheiten für die Beschleunigung m/s^2oder m*s^-2dargestellt werden als m/s/s.

Sie müssen nicht stornieren. Beispielsweise ist eine Ausgabe C*s/kg/sgültig, obwohl sie bis auf abgebrochen werden kann C/kg.

Es gibt keine spezifische Reihenfolge für die Multiplikation: kg*s/m, s/m*kg, s*kg/msind alle gültig (aber /m*s*kgist ungültig).

Hinweis: Sie müssen niemals durch eine abgeleitete Einheit dividieren.

Gewinnen

Der kürzeste Code in Bytes gewinnt



Muss Eingabe (Ausgabe) als Zeichenfolge verwendet werden (gegeben), oder sind andere Typen / Strukturen, z. B. Symbole, akzeptabel?
Julian Wolf

@ JulianWolf Nein, I / O muss als Zeichenfolge sein
Beta Decay

Antworten:


12

Netzhaut , 50 48 Bytes

 =

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

Probieren Sie es online aus!

Erläuterung

 =

Entfernen Sie alle Gleichheitszeichen zusammen mit dem Leerzeichen vor ihnen. Wer braucht die schon ...

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

Dies führt die Substitution bekannter Größen durch. Es wird wiederholt mit einer Mengendefinition (die Menge ist ein beliebiges Zeichen vor einem Leerzeichen und der Definition der Zeichenfolge danach) sowie einer Stelle nach der Definition, an der diese Menge verwendet wird, abgeglichen und die Definition für die Verwendung eingefügt. Wir schließen Einheiten aus diesen Spielen (indem sichergestellt wird, dass es keine ]nach dem Spiel), so dass wir nicht ersetzen [m]mit [[kg]]zum Beispiel. Diese Ersetzung wird wiederholt, bis der reguläre Ausdruck nicht mehr übereinstimmt (was bedeutet, dass keine Verwendung einer Menge mehr vorhanden ist und alle Zeilen in Ausdrücke von Einheiten umgewandelt wurden).

A-2`

Verwerfen Sie alle bis auf die letzte Zeile.

](.).
$1

Entfernen Sie zum Schluss überflüssige eckige Klammern. Grundsätzlich wollen wir das Erste [und das Letzte behalten, ]aber alle anderen verwerfen. Diese anderen werden immer mit einem Operator dazwischen angezeigt, also entweder als ]*[oder als ]/[. Noch wichtiger ist jedoch, dass dies die einzigen Fälle sind, in denen auf a ]zwei weitere Zeichen folgen. Wir stimmen also alle ]mit zwei Zeichen nach ihnen ab und ersetzen diese durch das zweite dieser drei Zeichen, um den Operator beizubehalten.


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

Nimmt Basiseinheiten und Gleichungen als Arrays von Strings.

Erläuterung

// 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])
)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.