볼트, 앰프, 와트 및 옴 : 2 개를 주면 나머지 2 개를 계산


27

옴의 법칙에 따르면 전압 (V)이인가 될 때 저항 (R)을 통해 저항 (R)을 통해 흐르는 암페어의 전류 (I)는 다음과 같습니다.

V = I / R

마찬가지로 해당 저항에 의해 소비되는 와트 단위전력 (P) 은 다음과 같습니다.

P = V * I

재 배열 및 치환에 의해, 다른 두 개 중 하나가 주어지면 이들 양 중 두 개를 계산하기위한 공식이 도출 될 수있다. 이러한 공식은 다음과 같이 요약됩니다 (이 이미지는 볼트 E대신 V사용됨).

절대 전력이 절대적으로 타락합니다!  저항은 무의미하다!

문자열에 이러한 양 중 두 개가 입력되면 다른 두 개를 출력하십시오.

  • 입력 숫자는 사용자 언어에 적합한 형식으로 소수입니다. 정밀도는 소수점 이하 3 자리 이상이어야합니다. ( IEEE 754-2008 binary32 float 는 충분합니다.)
  • 각 입력 번호에는 장치가 붙습니다. V A W R전압, 전류, 전력 및 저항 (또는 동등한 소문자) 중 하나입니다 . 또한 Ω대신에 사용할 수 있습니다 R. 단위에는 10 진수 접두사 (킬로, 밀리 등)가 없습니다.
  • 두 개의 입력 수량은 단일 문자열로 분리되어 하나의 문자열로 임의의 순서로 제공됩니다.
  • 입력 수량은 항상 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 개의 값입니다.
Digital Trauma

12
이것은 실제로 내가 챌린지에서 본 가장 기술적 인 제목 일 수 있습니다.
Alex A.

4
@AlexA. - 그래, 난 뭔가 멋질 흥미로운까지 생각하려고했다 전율을 당신이 경우,. 그러나 나는 짧게 나왔다 – 당연한 주장
Digital Trauma 1

답변:


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**yb & d가 두 입력 값이고 x & y가 거듭 제곱 인 형식으로 표현할 수 있습니다 . 골프의 이유 때문에 (b**x*d**y)**0.5x와 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

파이썬 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의 답변 중 일부를 차용 합니다. I 변경된 ops제 1 변형 지수의 사전에, 사전 exponent*2+4에 대한 b**((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. 이 값 중 두 개가 추가되면 고유 한 숫자 mod 10을 제공합니다. 따라서 각 두 문자 조합에는 (Lever River St의 체크섬과 매우 유사한)을 (ord(x[0]) + ord(y[10] + 3) % 10제공 하는 고유 한 숫자를 지정할 수 있습니다 AR: 0, AV: 4, AW: 5, RV: 1, RW: 2, VW: 6. 수정 된 지수들을 정리하면,이 순서로, 즉 [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.


난 크레딧이 필요하지 않습니다
Dieter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.