Turunkan Unit

10

Tantangan

Diberikan daftar unit dasar SI, daftar persamaan dan target, Anda harus menurunkan unit target hanya menggunakan unit dasar.

Unit yang diturunkan

Dari Wikipedia:

Sistem Satuan Internasional (SI) menetapkan satu set tujuh unit dasar dari mana semua unit pengukuran SI lainnya diturunkan. Masing-masing unit lainnya (unit turunan SI) tidak berdimensi atau dapat dinyatakan sebagai produk kekuatan satu atau lebih dari unit dasar.

Sebagai contoh, satuan luas turunan SI adalah meter persegi (m 2 ), dan satuan kepadatan turunan SI adalah kilogram per meter kubik (kg / m 3 atau kg m −3 ).

Tujuh unit dasar SI adalah:

  • Ampere, A
  • Candela, cd
  • Kelvin, K
  • Kilogram, kg
  • Meter, m
  • Mol, mol
  • Kedua, s

Contoh

Memasukkan

Unit dasar:

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

Persamaan:

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

Target:

E

Keluaran

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

Memasukkan

Unit dasar:

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

Persamaan:

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

Target:

A

Keluaran

A [cd*A*A/m]

Aturan

Unit akan selalu diberikan dalam bentuk

a [b]

Di mana aakan menjadi huruf abjad huruf besar atau kecil dan bakan menjadi unit (satu atau lebih karakter).

Persamaannya akan dalam bentuk

a = c

Di mana cakan ada ekspresi yang hanya akan menggunakan unit yang telah ditentukan sebelumnya dan operator *dan /.

Kekuatan harus diperluas. Misalnya, unit area secara resmi m^2, tetapi Anda harus mewakili ini sebagai m*m. Hal yang sama berlaku untuk kekuatan negatif seperti kecepatan ( m*s^-1) yang harus direpresentasikan sebagai divisi: m/s. Demikian pula, unit untuk akselerasi, m/s^2atau m*s^-2, harus direpresentasikan sebagai m/s/s.

Anda tidak harus melakukan pembatalan. Misalnya, output C*s/kg/svalid meskipun dapat dibatalkan hingga C/kg.

Tidak ada urutan tertentu untuk perkalian: kg*s/m, s/m*kg, s*kg/msemuanya valid (tapi /m*s*kgtidak valid).

Catatan: Anda tidak akan pernah harus membagi dengan unit yang diturunkan.

Kemenangan

Kode terpendek dalam byte menang

Peluruhan Beta
sumber
Terkait
Martin Ender
Apakah input (output) perlu diambil (diberikan) sebagai string, atau apakah tipe / struktur lain, misalnya simbol, dapat diterima?
Julian Wolf
@JulianWolf Tidak, I / O harus seperti string
Beta Decay

Jawaban:

12

Retina , 50 48 byte

 =

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

Cobalah online!

Penjelasan

 =

Hapus semua tanda sama dengan ruang di depannya. Lagi pula siapa yang butuh itu ...

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

Ini melakukan pergantian jumlah yang dikenal. Berulang kali cocok dengan definisi kuantitas (kuantitas adalah karakter apa pun di depan spasi dan definisi string setelahnya), serta beberapa tempat setelah definisi di mana kuantitas itu digunakan, dan masukkan definisi untuk penggunaan. Kami mengecualikan unit dari pertandingan tersebut (dengan memastikan bahwa tidak ada ]setelah pertandingan), sehingga kami tidak mengganti [m]dengan [[kg]]misalnya. Substitusi ini diulang sampai regex tidak lagi cocok (yang berarti bahwa tidak ada penggunaan kuantitas yang tersisa, dan semua lini telah diubah menjadi ekspresi unit).

A-2`

Buang semua kecuali baris terakhir.

](.).
$1

Akhirnya, lepaskan kurung kotak asing. Pada dasarnya, kami ingin menyimpan yang pertama [dan yang terakhir ]tetapi membuang yang lainnya. Yang lain selalu muncul dengan operator di antaranya, baik sebagai ]*[atau sebagai ]/[. Tetapi yang lebih penting, itu adalah satu-satunya kasus di mana a ]diikuti oleh dua karakter lagi. Jadi kami mencocokkan semua ]dengan dua karakter setelahnya, dan menggantinya dengan yang kedua dari tiga karakter untuk mempertahankan operator.

Martin Ender
sumber
1

JavaScript (ES6), 155 153 152 byte

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

Mengambil satuan dasar dan persamaan sebagai array string.

Penjelasan

// 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
sumber