Вольт, Ампер, Ватт і Ом: задано два, обчисліть два


27

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

V = I / R

Аналогічно потужність (P) у ватах, розсіяних цим опором, задається:

P = V * I

За допомогою перестановки та заміщення формули можуть бути отримані для обчислення двох цих величин, коли задано будь-яку з двох інших. Ці формули підсумовуються наступним чином (зверніть увагу, що це зображення використовується Eзамість Vвольт):

Абсолютна потужність пошкоджує абсолютно!  Опір даремний!

З огляду на введення будь-яких двох цих величин у рядку, виведіть інші два.

  • Цифри введення будуть десятковими знаками у будь-якому форматі, який відповідає вашій мові. Точність повинна бути, як мінімум, до 3 знаків після коми. ( IEEE 754-2008 binary32 floats достатньо.)
  • Кожне вхідне число буде виставлено з одиницею. Це буде значення 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. так, я намагався придумати щось захоплююче і захоплююче - електризуючи , якщо хочете. Але я підійшов коротко - Капітан Очевидний переміг у день
Digital Trauma

Відповіді:


3

Рубін 171 байт

Введіть як аргумент функції. Вихід у stdout із заднім простором (при необхідності можна переглянути)

->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+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 #

Ungolfed в тестовій програмі

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

Пітон 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. Коли будь-які два з цих значень додаються, вони дають унікальне число мод 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))

Безголівки:

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

Пітон 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ігноруючи помилки з тих, для яких змінні не призначені.


Мені не потрібні кредити
dieter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.