SIプレフィックス間の変換


8

前書き

国際単位系は、米国を含むいくつかの国除いて、世界中で測定するシステムです。SIシステム(またはメートル法)は、10の累乗に基づいており、以下にリストされています(これは不完全なテーブルであることに注意してください)。

femto(f) pico(p) nano(n) micro(μ) milli(m) centi(c) (base unit) hecto(h) kilo(k) mega(M) giga(G) tera(T) peta(P)
10^-15   10^-12  10^-9   10^-6    10^-3    10^-2    10^0        10^2     10^3    10^6    10^9    10^12   10^15

あなたの仕事は、これらの手段の1つを取り入れて、それを別のものに変えることです。

入力

入力は、10進数10^-16 < x < 2^31 - 1、SIプレフィックス、数量を表す文字、変換する別のSIプレフィックス、および同じ数量の文字です。入力はフォーマット1234.56 mC to TCであり、常に正規表現と一致し^\d+(\.\d+)? [fpnμmchkMGTP](?'letter'[a-zA-Z]) to [fpnμmchkMGTP](?P=letter)$ます。ベースユニットとの間で変換を行う必要はありません(10^0

出力

出力は入力と同じ番号で、新しいSI接頭辞に変換されます。具体的には、プログラムは入力から数値をSI prefix 1に変換する必要SI prefix 2があります。例:

Input: 1 nm to μm
Output: 0.001

Input: 82 kC to cC
Output: 8200000

Input: 6.54 MK to hK
Output: 65400

Input: 2000 MB to GB
Output: 2

これはなので、バイト単位の最短コードが優先されます。


1
もう1つ、この方法で大きな/小さな数を生成する場合、出力はどうあるべきですか?例1 PB to fB
FryAmTheEggman

@FryAmTheEggmanあなたの入力があなたの言語がネイティブに扱える桁数の範囲よりも大きい/小さい出力を決して生成しないと仮定するかもしれません(私はあなたが求めているものだと思います)。
GamrCorps 2015

使うべきU+00B5 MICRO SIGNU+03BC GREEK SMALL LETTER MU?1つを選択できますか、それとも1つまたは両方をサポートする必要がありますか?
PurkkaKoodari

@ Pietu1998どちらでもかまいません。
GamrCorps

結果が整数であっても浮動小数点数を出力できますか?
PurkkaKoodari

回答:


1

Pyth、46 44バイト

プログラムでは、文字µU+00B5 MICRO SIGN)がマイクロ記号に使用されていると想定しています。Windowsでは、これはAlt Gr+ を押すことで得られるものですM

ソースコードには印刷できないものが含まれているので、これは可逆xxd16進ダンプです。

0000000: 2a76 684a 637a 645e 542d 466d 406a 4322  *vhJczd^T-Fm@jC"
0000010: 5c72 575d d623 8b9e 53bb 4c09 b275 2233  \rW].#..S.L..u"3
0000020: 3125 7443 6864 3137 2532 744a            1%tChd17%2tJ

これはコピーフレンドリーなバージョンです:

*vhJczd^T-Fm@j1057004749883241517573776978549 31%tChd17%2tJ

デモ試すか、テストスイートを使用できます。これらのリンクが失敗した場合は、コピーに適したバージョン(demotest suite)を使用してください。


4

JavaScriptの(ES7)、113の 109バイト

s=>(p=s.split` `)[m={f:-9,p:-6,n:-3,µ:0,m:3,c:4,h:8,k:9,M:12,G:15,T:18,P:21},0]/(10**(m[p[3][0]]-m[p[1][0]]))

編集:どうやら今はマイクロ記号にµU+00B5 MICRO SIGN)を使用できるので、これをに置き換えるとバイトが節約されます。

ES6の互換性(10**(m[p[3][0]]-m[p[1][0]]))Math.pow(10,m[p[3][0]]-m[p[1][0]])114バイトに置き換えることができます。

説明

s=>                                  // s = input string
  (p=s.split` `)                     // p = input parts

    // m = dictionary of SI prefix digit powers of 10
    //     the exact values don't matter as long as they are relative to each other
    [m={f:-9,p:-6,n:-3,µ:0,m:3,c:4,h:8,k:9,M:12,G:15,T:18,P:21},

    0]                               // get the number
      /(10**(m[p[3][0]]-m[p[1][0]])) // get the factor to divide by from the difference
                                     //     between the SI prefix powers of 10

テスト

このテストでは、Math.pow代わりにを使用し**て、一般的なブラウザでテストできるようにします。


3

Ruby(2.2.1)、126 123バイト

r={f:-9,p:-6,n:-3,µ:0,m:3,c:4,h:8,k:9,M:12,G:15,T:18,P:21};p ($*[0].to_r/10**(r[$*[3][0].to_sym]-r[$*[1][0].to_sym])).to_f

user81655のおかげで3バイト節約

説明

# Hash of prefixes to relative powers
r={f:-9,p:-6,n:-3,µ:0,m:3,c:4,h:8,k:9,M:12,G:15,T:18,P:21};
p (                      # print (inspect)
  $*[0].to_r             # input value
  / 10 ** (              # divided by 10^...
    r[$*[3][0].to_sym]   # first prefix symbol
    -
    r[$*[1][0].to_sym]   # second prefix symbol
  )
).to_f                   # convert to float for proper format on output

コマンドラインから入力を受け取ります。 ruby si.rb 1 nm to μm

初めてのゴルフです!


1
{f:-9,p:-6,n:-3,µ:0,m:3,c:4,h:8,k:9,M:12,G:15,T:18,P:21}ハッシュテーブルの値を使用すると、3バイト節約できます。また、交換μしてµU+00B5許可されている)と、別のバイトを保存します。
user81655

@ user81655良いアドバイス、ありがとう!2つのmu / microシンボルは、ファイルをwc -cしたときに同じバイト数を与えるようですが、それがなぜかはわかりませんか?
Chris

問題ない。ファイルはおそらく、127を超える文字を2バイトに分割するUTF-8のようなものを使用してエンコードされています。ANSIのような1バイトエンコーディングに切り替えると、ファイルから余分なバイトが削除されます。
user81655

2

Haskell、143バイト

を呼び出しsます。

import Data.List
s=i.words
i(n:f:_:[t])=read n*10**(x f-x t)
x=j.flip elemIndex"f  p  n  µ  mc   hk  M  G  T  P".head
j(Just n)=fromIntegral n

私はあなたの"f p n µ mc hk M G T P"トリックがとても好きです。+1
リン

私もこのトリックが好きです。ヒント:パターンガードxと組み合わせることができます。jx y|Just n<-elemIndex(y!!0)"f p n µ mc hk M G T P"=fromIntegral n
nimi 2015

2

CJam、67バイト

lS%:I0=dA"fpnµmchkMGTP"[-7 -4WY5 6ABEHK23]+:AAI3=c#C+=AAI1=c#C+=-#/

オンラインでお試しください!

マイクロ記号にはµU+00B5)を使用しているため、質問ではμU+03BC)の代わりにこれを使用してください。

CJamを使用する私の最初の試み。たくさんあると思いますので、お気軽に改善提案をしてください!

説明

JavaScriptの回答と同じ方法。

lS%:P                    e# P = input parts separated by space
0=d                      e# get number as double
  A
  "fpnµmchkMGTP"
    [-7 -4WY5 6ABEHK23]+
      :A                 e# A = array of SI prefixes followed by their (relative) values
   AP3=c                 e# desired SI prefix
     #C+=                e# get SI value of prefix
   AAP1=c                e# current SI prefix
     #C+=-               e# subtract value of prefix
   #                     e# get power of SI prefix difference
/                        e# divide value by 10 ^ SI prefix difference

1

Haskell、121バイト

(e:l:i)!d|e==d=fromEnum l|0<1=i!d
b#i="f`pcnfµimlcmhqkrMuGxT{P~"!(b!!i)
g[(a,b)]=10**fromIntegral(b#1-b#7)*read a
f=g.lex

関数を定義しますf :: String -> Double。例えば:

*Main> f "6.54 MK to hK"
65400.0

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.