Получите Единицы

10

Вызов

Учитывая список базовых единиц СИ, список уравнений и цель, вы должны получить единицы цели, используя только базовые единицы.

Производные единицы

Из Википедии:

Международная система единиц (СИ) определяет набор из семи базовых единиц, из которых получены все остальные единицы измерения СИ. Каждая из этих других единиц (производных единиц СИ) либо безразмерна, либо может быть выражена как произведение степеней одной или нескольких базовых единиц.

Например, единица площади, полученная из СИ, представляет собой квадратный метр (м 2 ), а единица плотности, полученная из СИ, - это килограмм на кубический метр (кг / м 3 или кг м -3 ).

Семь базовых единиц СИ:

  • Ампер, А
  • Кандела, 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будет выражение, которое будет когда-либо использовать только ранее определенные единицы и операторы *и /.

Полномочия должны быть расширены. Например, единица площади официально 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недействителен).

Примечание: вам никогда не придется делить на производную единицу.

выигрыш

Самый короткий код в байтах выигрывает

Бета распад
источник
Связанные с.
Мартин Эндер
Нужно ли вводить (выводить) в виде строки или приемлемы другие типы / структуры, например символы?
Джулиан Вольф
@JulianWolf Нет, ввод / вывод должен быть в виде строк
Beta Decay

Ответы:

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])
)
darrylyeo
источник