Xuất phát từ các đơn vị


10

Thử thách

Đưa ra một danh sách các đơn vị cơ sở SI, một danh sách các phương trình và mục tiêu, bạn phải lấy được các đơn vị của mục tiêu chỉ sử dụng các đơn vị cơ sở.

Đơn vị phái sinh

Từ Wikipedia:

Hệ thống đơn vị quốc tế (SI) chỉ định một bộ bảy đơn vị cơ sở mà từ đó tất cả các đơn vị đo lường SI khác được lấy. Mỗi đơn vị khác (đơn vị dẫn xuất SI) là không thứ nguyên hoặc có thể được biểu thị dưới dạng sản phẩm quyền hạn của một hoặc nhiều đơn vị cơ sở.

Ví dụ, đơn vị diện tích dẫn xuất SI là mét vuông (m 2 ) và đơn vị mật độ dẫn xuất SI là kilôgam trên mét khối (kg / m 3 hoặc kg m 3 ).

Bảy đơn vị cơ sở SI là:

  • Ampe, A
  • Candela, cd
  • Kelvin, K
  • Kilôgam, kg
  • Đồng hồ đo, m
  • Mole, mol
  • Thứ hai, s

Thí dụ

Đầu vào

Đơn vị cơ sở:

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

Phương trình:

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

Mục tiêu:

E

Đầu ra

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

Đầu vào

Đơn vị cơ sở:

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

Phương trình:

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

Mục tiêu:

A

Đầu ra

A [cd*A*A/m]

Quy tắc

Các đơn vị sẽ luôn luôn được đưa ra trong mẫu

a [b]

Trường hợp asẽ là một chữ cái in hoa hoặc chữ cái thường và bsẽ là một đơn vị (một hoặc nhiều ký tự).

Phương trình sẽ có dạng

a = c

Trường hợp csẽ là một biểu thức sẽ chỉ sử dụng các đơn vị được xác định trước đó và các toán tử */.

Quyền hạn phải được mở rộng. Ví dụ: đơn vị diện tích là chính thức m^2, nhưng bạn nên đại diện cho điều này là m*m. Điều tương tự cũng áp dụng cho các sức mạnh tiêu cực như tốc độ ( m*s^-1) nên được biểu diễn dưới dạng phân chia : m/s. Tương tự, các đơn vị để tăng tốc, m/s^2hoặc m*s^-2, nên được biểu diễn dưới dạng m/s/s.

Bạn không phải thực hiện bất kỳ hủy bỏ. Ví dụ, một đầu ra C*s/kg/slà hợp lệ mặc dù nó có thể bị hủy xuống C/kg.

Không có thứ tự cụ thể cho phép nhân: kg*s/m, s/m*kg, s*kg/mtất cả đều hợp lệ (nhưng /m*s*kgkhông hợp lệ).

Lưu ý: Bạn sẽ không bao giờ phải chia cho một đơn vị dẫn xuất.

Chiến thắng

Mã ngắn nhất tính bằng byte thắng



Có phải đầu vào (đầu ra) cần được lấy (cho) dưới dạng một chuỗi, hoặc các loại / cấu trúc khác, ví dụ như các ký hiệu, có thể chấp nhận được không?
Julian Wolf

@JulianWolf Không, I / O phải là chuỗi
Beta Decay

Câu trả lời:


12

Võng mạc , 50 48 byte

 =

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

Hãy thử trực tuyến!

Giải trình

 =

Loại bỏ tất cả các dấu bằng bằng với khoảng trắng ở phía trước chúng. Ai cần những thứ đó chứ ...

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

Điều này thực hiện thay thế số lượng đã biết. Nó liên tục khớp với định nghĩa số lượng (đại lượng là bất kỳ ký tự nào trước dấu cách và định nghĩa chuỗi sau nó), cũng như một số vị trí sau định nghĩa được sử dụng đại lượng đó và chèn định nghĩa cho việc sử dụng. Chúng tôi loại trừ các đơn vị khỏi các trận đấu đó (bằng cách đảm bảo rằng không có ]trận đấu nào sau trận đấu), do đó chúng tôi không thay thế [m]bằng [[kg]]ví dụ. Sự thay thế này được lặp lại cho đến khi regex không còn khớp nữa (điều đó có nghĩa là không còn sử dụng số lượng còn lại và tất cả các dòng đã được chuyển thành biểu thức của các đơn vị).

A-2`

Hủy tất cả trừ dòng cuối cùng.

](.).
$1

Cuối cùng, loại bỏ dấu ngoặc vuông không liên quan. Về cơ bản, chúng tôi muốn giữ đầu tiên [và cuối cùng ]nhưng loại bỏ tất cả những người khác. Những cái khác luôn xuất hiện với một toán tử ở giữa, vì vậy hoặc là ]*[hoặc ]/[. Nhưng quan trọng hơn, đó là những trường hợp duy nhất mà a ]được theo sau bởi hai nhân vật nữa. Vì vậy, chúng tôi khớp tất cả ]với hai ký tự sau chúng và thay thế bằng ký tự thứ hai trong số ba ký tự đó để giữ lại toán tử.


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

Lấy các đơn vị cơ sở và phương trình là mảng của chuỗi.

Giải trình

// 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])
)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.