단위 도출


10

도전

SI 기본 단위, 방정식 및 목표 목록이 제공되면 기본 단위 만 사용하여 대상의 단위를 도출해야합니다.

파생 단위

Wikipedia에서 :

국제 단위계 (SI)는 다른 모든 SI 측정 단위가 도출되는 7 개의 기본 단위 세트를 지정합니다. 이들 다른 유닛들 (SI 유도 유닛들) 각각은 무 차원이거나 하나 이상의 기본 유닛의 파워의 곱으로 표현 될 수있다.

예를 들어, SI 유래 면적 단위는 제곱 미터 (m 2 )이고, SI 유래 밀도 단위는 입방 미터 당 킬로그램 (kg / m 3 또는 kg m -3 )이다.

7 개의 SI 기본 장치는 다음과 같습니다.

  • 암페어, A
  • 칸델라, CD
  • 켈빈, K
  • 킬로그램, kg
  • 미터, m
  • 몰,
  • 둘째, 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단위 (하나 개 이상의 문자)입니다.

방정식은 다음과 같은 형태입니다.

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/m, s/m*kg, s*kg/m모든 유효합니다 (그러나 /m*s*kg유효하지 않습니다).

참고 : 파생 단위로 나눌 필요는 없습니다.

승리

바이트 단위의 가장 짧은 코드가 이깁니다.



입력 (출력)을 문자열로 가져와야합니까 ( 예 : 기호) 다른 유형 / 구조가 허용됩니까?
Julian Wolf

@JulianWolf 아니요, I / O는 문자열이어야합니다
Beta Decay

답변:


12

망막 , 50 48 바이트

 =

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

온라인으로 사용해보십시오!

설명

 =

앞에있는 공백과 함께 모든 등호를 제거하십시오. 어쨌든 누가 필요합니까?

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

알려진 수량을 대체합니다. 수량 정의가 반복적으로 일치합니다 (수량은 공백 앞에있는 문자이고 그 뒤에 문자열이 정의 됨). 해당 수량이 사용 된 정의 뒤의 위치와 사용법에 대한 정의를 삽입합니다. 우리는 (어떤이 있음을 보장하지 않습니다에 의해 그 경기에서 단위를 제외 ]우리가 대체하지 않습니다 그래서, 경기 후) [m][[kg]], 예를 들어. 이 대체는 정규식이 더 이상 일치하지 않을 때까지 반복됩니다 (즉, 수량의 사용량이없고 모든 행이 단위 표현으로 바 turned).

A-2`

마지막 줄을 제외한 모든 것을 버리십시오.

](.).
$1

마지막으로 불필요한 대괄호를 제거하십시오. 기본적으로 우리는 첫 번째 [와 마지막 을 유지하고 ]나머지는 모두 버리고 싶습니다 . 다른 것들은 항상 ]*[또는 사이에 연산자를 사용하여 나타납니다 ]/[. 그러나 더 중요한 것은 a ]뒤에 두 문자가 더 있는 유일한 경우 입니다. 따라서 우리는 ]그 뒤에 두 문자를 모두 일치 시키고 연산자를 유지하기 위해 두 문자 중 두 문자로 바꿉니다.


1

자바 스크립트 (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.