ボルト、アンペア、ワット、オーム:2つ与えられた場合、他の2つを計算します


27

オームの法則によれば、電圧(V)が印加されたときにオームの抵抗(R)を流れるアンプの電流(I)は次のように与えられます。

V = I / R

同様に、その抵抗によって消費されるワット単位の電力(P)は次のようになります

P = V * I

再配置と置換により、他の2つのうちのいずれかが与えられたときに、これらの量のうちの2つを計算するための式が導出されます。これらの式は次のように要約されます(この画像はボルトのE代わりに使用していることに注意してくださいV)。

絶対的な力は絶対に壊れます! 抵抗しても無駄だ!

文字列内のこれらの数量のいずれか2つの入力が与えられた場合、他の2つを出力します。

  • 入力数値は、言語に適した形式の小数になります。精度は、少なくとも小数点以下3桁にする必要があります。(IEEE 754-2008 binary32 floatで十分です。)
  • 各入力番号の末尾には単位が付きます。これはV A W R、電圧、アンペア数、電力、抵抗のいずれか(または同等の小文字)です。また、のΩ代わりに使用することもできますR。単位には10進数の接頭辞(キロ、ミリなど)はありません。
  • 2つの入力量は、1つの文字列で任意の順序で与えられ、単一のスペースで区切られます。
  • 入力量は常に0より大きい実数になります。
  • 出力は入力と同じ形式になります。
  • 方程式を解く組み込み関数は許可されていません。

入力例

1W 1A
12V 120R
10A 10V
8R 1800W
230V 13A
1.1W 2.333V

対応する出力

1V 1R
0.1A 1.2W
1R 100W
120V 15A
2990W 17.692R
0.471A 4.948R

この課題に対する解決策は、事実上自己反転であることに注意する必要があります。言い換えると、入力に解を適用し、A B出力を取得しC D、次に入力C Dに解を適用すると、出力はA B再び順調になりますが、FPの丸めにより乱れている可能性があります。そのため、テストの入力と出力は同じ意味で使用できます。


4つの値すべてを出力できますか?
電卓

@CatsAreFluffyいいえ-入力と出力は常に正確に2つの値になります。
デジタル外傷

12
これは、実際に私が今までに挑戦のために見た中で最もすぐに記述的なタイトルかもしれません。
アレックスA.

4
@AlexA。-はい、私は何かのキャッチーかつエキサイティングまで考えるようにしようとしていた通電をあなたがする場合は、。しかし、私は短い思い付いた-キャプテン明白なウォンは一日
デジタルトラウマ

回答:


3

Ruby 171バイト

関数の引数として入力します。後続スペースを含む標準出力への出力(必要に応じて変更可能)

->s{a,b,c,d=s.split.map{|z|[z[-1],z.to_f]}.sort.flatten
%w{EA9.EAAVAA.WVA GS;.A?#WWV.RRR}.map{|w|m=w[n=(a+c+?!).sum%10].ord;print (b**(m%9-4)*d**(m/9-5))**0.5,w[n+7],' '}}

説明

すべての式はb**x*d**y、b&dが2つの入力値であり、x&yがべき乗である形式で表現できます。ゴルフの理由から、(b**x*d**y)**0.5xとyが-4から4の範囲の整数になることを意味するため、この表現が最終的に好まれました。

次の表は、必要な式(入力はアルファベット順にソートされていると想定されます)およびべき乗のエンコードされた値を示しています。xとyが2倍の累乗である場合、それらはとして、(x+4)+(y+4)*9+9または同等にエンコードされ(x+4)+(y+5)*9ます。これにより、すべてのエンコードが印刷可能なASCII範囲になります。簡潔にするため、式からべき乗演算子は省略されています。

n入力ユニットシンボルから作成された一種のチェックサムです。値0、1、2、4、5、6を使用できます(3は使用されません)。

n     formula 1 formula 2      formula 1                formula 2
value                      powers x+4 y+4 encoding   powers x+4 y+4 encoding

0      A*R=V    A2*R=W       1 1    6 6   69 E        2 1     8 6   71 G  
1    R-1*V=A  R-1*V2=W      -1 1    2 6   65 A       -1 2     2 8   83 S
2 R-.5*W.5=A R.5*W.5=V     -.5 .5   3 5   57 9       .5 .5    5 5   59 ;
3          .         .                       .                         .
4      A*V=W   A-1*V=R       1 1    6 6   69 E       -1 1     2 6   65 A
5    A-1*W=V   A-2*W=R      -1 1    2 6   65 A       -2 1     0 6   63 ?
6    V-1*W=A  V2*W-1=R      -1 1    2 6   65 A        2 -1    8 2   35 #

テストプログラムでゴルフをしていない

f=->s{
  a,b,c,d=s.split.map{|z|[z[-1],z.to_f]}.        #split the input into an array [[symbol1,value1],[symbol2,value2]]
  sort.flatten                                   #sort alphabetically by symbol and flatten to assign the 4 objects to different variables
  n=(a+c+?!).sum%10                              #sum the ascii codes of the symbols (plus that of ! for good value distribution) and take mod 10. gives a number 0..6 (3 is not used)
  %w{EA9.EAAVAA.WVA GS;.A?#WWV.RRR}.             #for each of the outputs, there is a 14 character string. 1st 7 characters encode powers, 2nd 7 characters are output symbol
  map{|w|                                        #iterate through the 2 outputs
    m=w[n].ord                                   #select one character according to value of n and convert to a number encoding the powers to raise the two inputs to
    print (b**(m%9-4)*d**(m/9-5))**0.5,w[n+7],' '#decode the powers, evaluate the expression and output, append the unit symbol and a space
  }
}

f["6W 3A"]
puts
f["12V 120R"]
puts
f["10A 10V"]
puts
f["8R 1800W"]
puts
f["6W 2V"]
puts
f["2A 3R"]
puts

出力

2.0V 0.6666666666666666R
0.1A 1.2W
100.0W 1.0R
15.0A 120.0V
3.0A 0.6666666666666666R
6.0V 12.0W

2

Python 3、329 347 343 339 326 305 267 251 249 245 237バイト

これはかなり肥大化しています。まだたくさんのゴルフがあります。

編集: 出力を一時的に修正しました。何らかの理由で、return' '.join(str(eval(z[m][i]))+t[i]for i in range(2))適切に動作することを拒否します。

編集:削除しましたeval

この関数は、Level River Stの回答の一部を借用するようになりました。ops辞書を変更しました。まず、の修正指数の辞書に変更exponent*2+4b**((p-4)/2) * d**((q-4)/2)、それぞれpqが1桁の数字になるようにしました。たとえば、、b*d == b**1*d**1 == b**((6-4)/2)*d**((6-4)/2)および結果は66辞書にあります。

次に、辞書を、z修正された指数と特定の順序で必要な単位を含む文字列に変換しました。まず、ARVWmod 10の各文字のASCII値は5, 2, 6, 7です。これらの値のいずれか2つを追加すると、mod 10の一意の数値が得られます。したがって、2文字の各組み合わせには、で一意の数値を(ord(x[0]) + ord(y[10] + 3) % 10与えることができますAR: 0, AV: 4, AW: 5, RV: 1, RW: 2, VW: 6(Lever River Stのチェックサムに非常に似ています)。この順になるように修正指数を配置する、すなわち[AR] [RV] [RW] [blank] [AV] [AW] [VW]、可能z(バイト単位で)効率的にアクセスします。

編集:の下でリストの理解をゴルフreturn。の定義をゴルフm

コード:

def e(s):x,y=sorted((i[-1],float(i[:-1]))for i in s.split());m=(ord(x[0])+ord(y[0])+3)%10*6;z="6686VW2628AW3555AV0000002666RW0626RV2682AR";return' '.join(str((x[1]**(int(z[m+i*2])-4)*y[1]**(int(z[m+i*2+1])-4))**.5)+z[m+i+4]for i in(0,1))

ゴルフをしていない:

def electric(s):
    x, y = sorted((i[-1],float(i[:-1]))for i in s.split())
    m = (ord(x[0]) + ord(y[0]) + 3) % 10 * 6
    z = "6686VW2628AW3555AV0000002666RW0626RV2682AR"
    h = []
    for i in range(2):
         f = (x[1] ** (int(z[m*6+i*2])-4) * y[1] ** (int(z[m*6+i*2+1])-4)) ** 0.5
         h.append(str(f)+z[m*6+i+4])
    return ' '.join(h)

1

Python 3、193 187バイト

import re
exec(re.sub('(.+?) (.)',r'\2=\1;',input()))
for s,r in zip('AVRW'*3,'V/R W**.5*R V/A V*V/R W/V W/A V*V/W R*A*A W**.5/R A*R W/A**2 V*A'.split()):
 try:print(eval(r),s,)
 except:0

オンラインで試す

フォームの入力<value> <unit> <value> <unit>を割り当てステートメントに変換します。次に、変数が割り当てられていないものからのエラーを無視してeval、すべての式で使用しtry/exceptます。


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