Birimleri Türetme


10

Meydan okuma

SI temel birimlerinin bir listesi, bir denklemler listesi ve bir hedef verildiğinde, hedef birimleri yalnızca temel birimleri kullanarak türetmelisiniz.

Türetilmiş birimler

Wikipedia'dan:

Uluslararası Birimler Sistemi (SI), diğer tüm SI ölçü birimlerinin türetildiği yedi temel birim kümesini belirtir. Bu diğer birimlerin (SI türevi birimler) her biri boyutsuzdur veya bir veya daha fazla temel birimin güçlerinin bir ürünü olarak ifade edilebilir.

Örneğin, SI birim alan metrekare (m, türetilmiş 2 ) ve SI yoğunluğu birim metre küp başına kilogram (kg / m türetilmiş 3 ya kg m -3 ).

Yedi SI ana birimi:

  • Amper, A
  • Candela, cd
  • Kelvin, K
  • Kilogram, kg
  • Metre, m
  • Köstebek, mol
  • İkincisi, s

Misal

Giriş

Ana birimler:

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

Denklemler:

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

Hedef:

E

Çıktı

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

Giriş

Ana birimler:

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

Denklemler:

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

Hedef:

A

Çıktı

A [cd*A*A/m]

kurallar

Birimler her zaman formda verilecektir

a [b]

Burada atek bir büyük veya küçük harf alfabetik harf bolacak ve bir birim (bir veya daha fazla karakter) olacaktır.

Denklem şu şekilde olacaktır:

a = c

Nerede csadece hiç daha önce tanımlanmış birimleri ve operatörleri kullanacak bir ifade olacak *ve /.

Güçler genişletilmelidir. Örneğin, alan birimi resmi olarak m^2, ancak bunu şu şekilde temsil etmelisiniz m*m. Aynı hız gibi negatif güçler (geçerli olduğu m*s^-1bir bölümü olarak temsil edilmesi): m/s. Benzer şekilde, ivme birimleri m/s^2veya m*s^-2olarak temsil edilmelidir m/s/s.

Herhangi bir iptal işlemi yapmak zorunda değilsiniz. Örneğin, çıktı C*s/kg/siptal edilebilse bile geçerlidir C/kg.

: Orada çoğalması için özel bir emirdir kg*s/m, s/m*kg, s*kg/mtüm geçerli (ama /m*s*kggeçersiz).

Not: Asla türetilmiş bir birime bölmek zorunda kalmayacaksınız.

Kazanan

Bayttaki en kısa kod kazanır



Girdi (çıktı) bir dize olarak alınmalı mı (verilmeli) mi yoksa diğer türler / yapılar, örneğin semboller, kabul edilebilir mi?
Julian Wolf

@JulianWolf Hayır, G / Ç dizeler gibi olmalı
Beta Çürüğü

Yanıtlar:


12

Retina , 50 48 bayt

 =

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

Çevrimiçi deneyin!

açıklama

 =

Önündeki boşlukla birlikte tüm eşit işaretleri kaldırın. Bunlara kimin ihtiyacı var ki ...

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

Bu, bilinen miktarlardaki ikameleri gerçekleştirir. Bir miktar tanımıyla (miktar, bir boşluğun önündeki herhangi bir karakter ve arkasından gelen dizedir) ve bu miktarın kullanıldığı tanımdan sonra bir yerle eşleşir ve kullanım için tanımı ekleyin. Biz (hayır yoktur sağlayarak bu maçlardan birimlerini hariç ]biz yerine kalmamak olduğunu, maçtan sonra) [m]ile [[kg]]örneğin. Bu ikame, normal ifade artık eşleşmeyene kadar tekrarlanır (yani, bir miktarın kullanımı kalmaz ve tüm satırlar birim ifadelerine dönüştürülür).

A-2`

Son satır hariç tümünü atın.

](.).
$1

Son olarak, yabancı köşeli parantezleri çıkarın. Temel olarak, ilkini [ve sonunu tutmak istiyoruz, ]ancak diğerlerini atıyoruz . Diğerleri her zaman arada bir operatörle görünür, bu şekilde ya ]*[da olarak ]/[. Ama daha da önemlisi, a'nın ]iki karakter daha izlediği tek durumlar bunlar . Bu yüzden hepsini ]peşinden iki karakterle eşleştiriyoruz ve operatörü korumak için bunu bu üç karakterin ikincisiyle değiştiriyoruz.


1

JavaScript (ES6), 155 153 152 bayt

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

Temel birimleri ve denklemleri dizgiler dizisi olarak alır.

açıklama

// 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])
)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.