派生单位


10

挑战

给定一个SI基本单位列表,一个方程式列表和一个目标,您必须仅使用基本单位导出目标的单位。

衍生单位

从维基百科:

国际单位制(SI)指定一组七个基本单位,所有其他SI度量单位均从该基本单位中得出。这些其他单位(SI得出的单位)中的每一个都是无量纲的,或者可以表示为一个或多个基本单位的幂的乘积。

例如,SI导出的面积单位是平方米(m 2),SI导出的密度单位是公斤/立方米(kg / m 3或kg m -3)。

七个SI基本单位是:

  • 安培,A
  • 坎德拉,CD
  • 开尔文,ķ
  • 千克公斤
  • 米,
  • 摩尔,摩尔
  • 其次,小号

输入值

基本单位:

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将是一个单位(一个或多个字符)。

等式的形式为

a = c

c将只使用先前定义的单位和运算符*and 的表达式在哪里/

权力必须扩大。例如,面积单位正式为m^2,但是您应将其表示为m*m。同样适用于负功率,例如速度(m*s^-1),应将其表示为除法:m/s。同样,用于加速的单位m/s^2m*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

Answers:


12

视网膜50 48字节

 =

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

在线尝试!

说明

 =

删除所有等号以及前面的空格。谁仍然需要那些...

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

这将执行已知数量的替换。它反复匹配数量定义(数量是空格前的任何字符,定义之后是字符串),以及使用该数量的定义后的某个位置,并插入用法定义。我们排除那些比赛单元(通过确保没有]比赛结束后),这样我们就不用更换[m][[kg]]的例子。重复此替换,直到正则表达式不再匹配为止(这意味着不再使用任何数量的量,并且所有行都已转换为单位的表达式)。

A-2`

丢弃除最后一行以外的所有内容。

](.).
$1

最后,卸下多余的方括号。基本上,我们希望保留第一个[和最后一个,]但丢弃所有其他。其他那些总是在中间有一个运算符的情况下出现,例如]*[]/[。但更重要的是,只有在这些情况下,a ]后面再加上两个字符。因此,我们将所有]字符与它们后面的两个字符匹配,并用这三个字符中的第二个替换以保留运算符。


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])
)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.