Вольт, Ампер, Ватт и Ом: учитывая два, рассчитайте два других

27

Закон Ома говорит нам, что ток (I) в амперах, протекающих через сопротивление (R) в Ом, когда на него подается напряжение (V), определяется следующим образом:

V = I / R

Аналогично мощность (P) в ваттах, рассеиваемых этим сопротивлением, определяется как:

P = V * I

Путем перестановки и подстановки могут быть получены формулы для расчета двух из этих величин, когда дана любая из двух других. Эти формулы обобщены следующим образом (обратите внимание, что это изображение используется Eвместо Vвольт):

Абсолютная власть портит абсолютно!  Сопротивление бесполезно!

Учитывая ввод любых двух из этих величин в строку, выведите две другие.

  • Входные числа будут десятичными в любом формате, подходящем для вашего языка. Точность должна быть не менее 3 знаков после запятой. ( IEEE 754-2008 бинарные32 поплавки достаточны.)
  • К каждому входному номеру будет добавлена ​​единица. Это будет одно из значений 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 Нет - вход и выход всегда будут точно равны 2 значениям.
Цифровая травма
12
На самом деле это может быть самый описательный заголовок, который я когда-либо видел для вызова.
Алекс А.
4
@AlexA. да, я пытался придумать что-то запоминающееся и захватывающее - электрифицировать , если хотите. Но я потерпел неудачу - капитан Очевидность выиграл день
Цифровая травма

Ответы:

3

Рубин 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
Уровень реки St
источник
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.

Эта функция в настоящее время заимствует части ответа уровня реки С.Т. . Я изменил opsсловарь, сначала в словарь измененных показателей exponent*2+4для b**((p-4)/2) * d**((q-4)/2), так что каждый pи qбудет однозначным числом. Например, b*d == b**1*d**1 == b**((6-4)/2)*d**((6-4)/2)и результат будет 66в словаре.

Затем я превратил словарь в строку zс теми модифицированными показателями и единицами измерения, которые необходимы в строке и в определенном порядке. Во-первых, значение ASCII каждого символа в ARVWмоде 10 5, 2, 6, 7. Когда любые два из этих значений добавляются, они дают уникальное число mod 10. Таким образом, каждой двухсимвольной комбинации может быть присвоен уникальный номер с (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))

Ungolfed:

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)
Sherlock9
источник
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игнорируя ошибки тех, для которых переменные не были назначены.

mbomb007
источник
Мне не нужны кредиты
Дитер