Вивести одиниці


10

Виклик

Враховуючи перелік базових одиниць СІ, список рівнянь та цілі, ви повинні отримати одиниці цілі, використовуючи лише базові одиниці.

Отримані одиниці

З Вікіпедії:

Міжнародна система одиниць (СІ) визначає набір із семи базових одиниць, з яких отримані всі інші одиниці вимірювання СІ. Кожна з цих інших одиниць (одиниць, похідних від SI) або безрозмірна, або може бути виражена як добуток потужностей однієї або декількох базових одиниць.

Наприклад, одиниця площі похідного СІ - це квадратний метр (м 2 ), а одиниця щільності, отримана в SI, - кілограм на кубічний метр (кг / м 3 або кг м- 3 ).

Сім базових одиниць СІ:

  • Ампер, А
  • Кандела, кд
  • Кельвін, К
  • Кілограм, кг
  • Метр, м
  • Крот, моль
  • По-друге, с

Приклад

Вхідні дані

Базові одиниці:

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

Нарешті, зніміть сторонні квадратні дужки. В основному ми хочемо зберегти перше [і останнє, ]але відкинути всі інші. Ті інші завжди з'являються з оператором посередині, так як ]*[або як ]/[. Але що ще важливіше, це єдині випадки, коли за а ]також слідують ще два символи. Таким чином, ми узгоджуємо всіх ]з двома символами після них і замінюємо його другим із цих трьох символів, щоб зберегти оператора.


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])
)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.