ユニットを派生させる


10

チャレンジ

SI基本単位のリスト、方程式のリスト、およびターゲットを指定すると、基本単位のみを使用してターゲットの単位を導出する必要があります。

派生ユニット

ウィキペディアから:

国際単位系(SI)は、他のすべてのSI測定単位が導出される7つの基本単位のセットを指定します。これらの他の単位(SI派生単位)はそれぞれ無次元であるか、1つ以上の基本単位の累乗の積として表すことができます。

たとえば、SIから派生した面積の単位は平方メートル(m 2)であり、SIから派生した密度の単位は1立方メートルあたりのキログラム(kg / m 3またはkg m -3)です。

7つのSI基本単位は次のとおりです。

  • アンペア、A
  • カンデラ、CD
  • ケルビン、K
  • キログラム、kg
  • メートル、メートル
  • モル、モル
  • 第二に、s

入力

基本単位:

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

方程式:

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

目標:

E

出力

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

入力

基本単位:

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

方程式:

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

目標:

A

出力

A [cd*A*A/m]

ルール

単位は常に次の形式で与えられます

a [b]

どこa単一大文字または小文字のアルファベットになり、b単位(1文字以上)になります。

方程式は次の形式になります

a = c

どこでcしか以前に定義された単位を使用する式と演算子になります*/

力を拡大する必要があります。たとえば、面積の単位は公式m^2にはですが、これはと表す必要がありますm*m。同じことがm*s^-1、除算として表されるべき速度()などの負の累乗にも当てはまりますm/s。同様に、ユニットは、加速のために、m/s^2またはm*s^-2、として表されるべきですm/s/s

キャンセルする必要はありません。たとえば、出力C*s/kg/sはまでキャンセルできますが、有効ですC/kg

:そこ乗算のための特定の順序はありませんkg*s/ms/m*kgs*kg/mすべて有効です(ただし、/m*s*kg無効です)。

注:派生ユニットで除算する必要はありません。

勝利

バイト単位の最短コードが優先されます



入力(出力)必要性を取ることがない、文字列として(与えられる)、または他のタイプ/構造である例えば許容できる、シンボル?
ジュリアンウルフ

@JulianWolfいいえ、I / Oは文字列である必要があります
Beta Decay

回答:


12

Retina50 48バイト

 =

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

オンラインでお試しください!

説明

 =

それらの前のスペースと一緒にすべての等号を削除します。とにかくそれらを必要とする人...

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

これは、既知の量の置換を実行します。数量の定義(数量はスペースの前の任意の文字であり、定義はその後ろの文字列です)と、その数量が使用される定義の後ろの場所に繰り返し一致し、使用法の定義を挿入します。これらの一致からユニットを除外し(一致]後はないことを確認することで)、たとえば、[m]と置き換えない[[kg]]ようにします。この置換は、正規表現が一致しなくなるまで繰り返されます(つまり、残りの数量の使用法がなくなり、すべての行が単位の式に変換されます)。

A-2`

最終行以外をすべて破棄します。

](.).
$1

最後に、無関係な角括弧を削除します。基本的に、最初[と最後を保持し、]他はすべて破棄したいとします。それらの他のものは常に演算子の間に表示されるため、as ]*[またはasのいずれか]/[です。しかし、より重要なのは、aの]後に2つの文字が続く唯一のケースです。したがって、すべての]後に2文字を照合し、3文字の2番目の文字に置き換えて演算子を保持します。


1

JavaScript(ES6)、155 153 152バイト

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

基本単位と方程式を文字列の配列として受け取ります。

説明

// 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])
)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.