伏特,安培,瓦特和欧姆:给定两个,计算另外两个


27

欧姆定律告诉我们,当在两端施加电压(V)时,流经以欧姆为单位的电阻(R)的电流(I)如下:

V = I / R

类似地,该电阻耗散的功率(P)以瓦特为单位:

P = V * I

通过重新排列和替换,当给出其他两个中的任何一个时,可以推导用于计算这些中的两个的公式。这些公式总结如下(请注意,此图像使用的E不是V伏特):

绝对权力绝对腐败! 抵抗是徒劳的!

给定一个字符串中任意两个数量的输入,输出其他两个。

  • 输入数字将是十进制的形式,适合您的语言。精度应至少为小数点后三位。(IEEE 754-2008 binary32浮点数就足够了。)
  • 每个输入数字都将带有一个单位后缀。这将是V A W R电压,电流,功率和电阻(或等效的小写字母)之一。此外,您可以使用Ω代替R。单位将没有任何十进制前缀(千位,千位等)。
  • 两个输入量将以任何顺序以字符串形式给出,并用单个空格分隔。
  • 输入数量始终是大于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个值吗?
CalculatorFeline

@CatsAreFluffy否-输入和输出将始终都是两个值。
Digital Trauma

12
这实际上可能是我遇到过的最直接描述性的标题。
Alex A.

4
@AlexA。是的,如果您愿意,我想尝试一些有趣而令人兴奋的事情- 带电。但是我很短-Obvious上尉赢得了比赛的胜利
Digital Trauma

Answers:


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是两个输入值,x&y是幂。出于打高尔夫球的原因,该表达式(b**x*d**y)**0.5最终成为首选,因为它意味着x和y变为介于-4到4之间的整数。

下表显示了所需的表达式(假定输入按字母顺序排序)和幂的编码值。其中x和y是双倍幂,它们被编码为(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将是一个一位数。例如,,b*d == b**1*d**1 == b**((6-4)/2)*d**((6-4)/2)结果将66在字典中。

然后,我将字典转换为z带有修改的指数和一行并按特定顺序所需的单位的字符串。首先,ARVWmod 10 中每个字符的ASCII值为5, 2, 6, 7。当这些值中的任何两个相加时,它们将给出一个唯一的数字mod10。因此,每个两个字符的组合都可以使用给出一个唯一的数字(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忽略未为其分配变量的错误。


我不需要学分
节食者
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.