온도 변환기


38

이것은 입력 온도를 세 단위 중 하나 (섭씨, 켈빈 및 화씨)로 변환해야하는 바이트 크기의 문제입니다.

입력

숫자로 온도가 제공되고 단위가 공간으로 구분됩니다. 온도는 정수 또는 부동 소수점 수일 수 있습니다 (23 대 23.0 또는 23.678).

STDIN / ARGV / function 인수 또는 가장 가까운 해당 항목에서 공백으로 구분 된 문자열을 읽고 STDOUT 또는 가장 가까운 해당 항목으로 출력을 인쇄하는 함수 또는 전체 프로그램을 제출할 수 있습니다.

산출

출력은 다른 두 형식으로 변환 된 온도 여야하며, 줄 바꿈으로 구분되고 각 줄에서 해당하는 단위 문자 (공백으로 구분됨)가 나옵니다. 두 단위의 순서는 중요하지 않습니다.

출력 정밀도

  • 변환 된 숫자는 반올림없이 소수점 이하 4 자리까지 정확해야합니다.
  • 소수점 이하 4 자리 (반올림 없음)가 정확하면 후행 0 또는 소수점 자리는 선택 사항입니다. 실제 답변의 소수점 뒤에 4 개의 0이있는 경우 4 개의 0 및 / 또는 소수점을 건너 뛸 수도 있습니다.
  • 선행 0이 없어야합니다.
  • 위의 세 가지 요구 사항을 충족하는 한 숫자 형식을 사용할 수 있습니다.

단위 표현

온도 단위는 다음 중 하나 일 수 있습니다.

  • C 섭씨
  • K 켈빈
  • F 화씨

입력:

23 C

산출:

73.4 F
296.15 K

입력:

86.987 F

산출:

303.6983 K
30.5483 C

입력:

56.99999999 K

산출:

-216.1500 C
-357.0700 F

이것은 이므로 바이트 단위의 가장 짧은 항목이 이깁니다! 행복한 골프!

리더 보드

<script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 50740</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>


나는 출력이 어떤 순서로든 가능하다고 가정합니다. 예를 들어 세 가지 형식을 모두 출력 할 수 23C\n73.4F\n296.15K 있습니까? 또는 입력 형식을 억제해야합니까?
Level River St

@steveverrill 순서 비트는 출력 섹션에 언급되어 있습니다. 다른 두 가지 형식 만 출력하면됩니다.
Optimizer

출력 정밀도 정보 : 2/3=> 0.666666666666네 번째 자리까지 정확합니까? (예라고하겠습니다). 아니면해야 0.6667합니까?
edc65

@ edc65 0.666666666666가 정확합니다. 나는 반올림 기반의 정밀도를 시행하고 있습니다. 0.6666대안도 마찬가지 입니다.
Optimizer

1
출력에서 @Dennis, 공간을 인쇄하는 규칙이 없습니다. 그러나 입력에 나타납니다.
Optimizer

답변:


13

CJam, 77 65 60 59 55 54 52 바이트

l~2|"459.67+1.8/'K 273.15-'C 1.8*32+'F"S/m<{~N2$}%6<

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

l~    e# Read and evaluate the input: F, K, C -> 15, 20, 12
2|    e# Bitwise OR with 2: F, K, C -> 15, 22, 14 = 0, 1, 2 (mod 3)

"459.67+1.8/'K 273.15-'C 1.8*32+'F"S/

      e# Push ["459.67+1.8/K" "273.15-C" "1.8*32+F"].
      e# These commands convert from F to K, K to C and C to F.

m<    e# Rotate the array of commands by 15, 22 or 14 units to the left.
{     e# For each command:
  ~   e#     Execute it.
  N   e#     Push a linefeed.
  2$  e#     Copy the temperature for the next iteration.
}%    e# Collect all results in an array.
6<    e# Keep only the first 8 elements.

32

파이썬 3, 118116 바이트

I=input()
t=eval(I[:-1])
u=ord(I[-1])%7
exec("u=-~u%3;t=[t*1.8-459.67,(t-32)/1.8,t+273.15][u];print(t,'FCK'[u]);"*2)

회전 순서로 변환을 K -> F -> C -> K두 번 수행합니다 .


43
사랑 해요 'FCK'[u].
Alex A.

11
하하, 도대체. 내 멍청한 의견이 아니라 질문과 답변을 찬성하십시오. : P
Alex A.

10

자바 스크립트 ( ES6 ) 127 130 132 바이트

놀라운 esolanguage 답변을 기다리는 동안 나는 여기 골프를 많이 찾지 못했습니다.

템플릿 문자열을 사용하면 세 줄 바꿈이 중요하고 계산됩니다.

Firefox에서 스 니펫을 실행하여 테스트하십시오.

F=x=>([t,u]=x.split(' '),z=273.15,y=9/5,u<'F'?`${t*y+32} F
${+t+z} K`:u<'K'?`${t=(t-32)/y} C
${t+z} K`:`${t-=z} C
${t*y+32} F`)

// Predefined tests

;['23 C','86.987 F','56.99999999 K']
.forEach(v=>O.innerHTML += v+' ->\n'+F(v)+'\n\n')
<input id=I><button onclick='O.innerHTML=F(I.value)'>-></button><br>
<pre id=O></pre>


7

핍, 58 57 바이트

Ft"CFK"RMbP(a-(o:[32i273.15]Ab%7))*$/95@A[tb]+(oAt%7).s.t

명령 줄 인수에서 입력을받습니다.

서식이 있고 약간 풀리지 않은 경우 :

o:[32 0 273.15]
F t ("CFK" RM b)
  P (a - o@(Ab % 7))
    * "95"@At / "95"@Ab
    + o@(At%7)
    . s . t

설명:

단위 1과 단위 2 사이의 일반적인 변환 공식은 temp2 = (temp1 - offset1) * mult2 / mult1 + offset2입니다. 오프셋은 절대 0 또는 다른 편리한 온도 일 수 있습니다. 0 ° C를 사용합시다.

단위 다중 오프셋
C 5 0     
K 5 273.15
F 9 32    

우리는 이러한 값의 목록을 작성하고 우리가 다루는 단위를 기반으로 값을 색인화합니다. 핍에는 연관 배열 / 해시 / 사전이 없으므로 문자를 정수 인덱스로 변환해야합니다. ASCII 값에 유용한 패턴이있을 수 있습니다.

단위 Asc A % 2 Mult A % 7 A % 7 % 3 오프셋
C 67 15 4 10
K 75 15 5 2 273.15
F 70 9 0 32

이것은 유망 해 보인다. 한 가지 더 유용한 사실 : Pip의 색인이 줄 바꿈됩니다. 따라서 우리는 %3길이 3으로 색인을 작성 하는 한 실제로 필요하지 않습니다. 정의 o:[32 0 273.15]하고 사용 (o (Ab)%7)하면 트릭을 수행합니다. ( A문자의 ASCII 값을 가져옵니다. (l i)구문은 iterables 로의 색인 작성 및 함수 호출에 사용됩니다.)

승수의 경우 숫자 9와 5 만 필요합니다. 숫자는 Pip의 문자열과 동일하므로 색인을 생성 할 수 있으므로 승수를 얻는 것만 큼 간단합니다 95@Ab(다른 인덱싱 방법 인 @연산자 사용).

Pip의 배열 프로그래밍 기능을 사용하여 순진한 방법으로 캐릭터를 저장할 수 있습니다.

95@At/95@Ab
$/95@A[tb]    Make a list of t and b, apply 95@A(...) to each item, and fold on /

마지막으로, 새 장치에 대한 오프셋을 추가하고 공백과 새 장치의 기호를 끝에 연결하고 인쇄하십시오.

우리는 서로에 대해이 작업을 수행 t"CFK" RM b따라서 원래 제외하고 각 단위로 변환.

샘플 호출 :

C:\Golf> pip.py tempConv.pip 86.987 F
30.548333333333332 C
303.6983333333333 K

Pip에 대한 자세한 내용 은 저장소를 참조하십시오 .


6

dc, 102 바이트

나는 이것이 더 골프를 칠 수 있다고 확신하지만 시작은 다음과 같습니다.

4k[9*5/32+dn[ F
]n]sf[459.67+5*9/dn[ K
]n]sk[273.15-1/dn[ C
]n]sc[rlfxlkxq]sC[lkxlcxq]sF?dC=CF=Flcxlfx

dc는 거의 이것에 대한 평가를하지 않습니다. 특히 dc 문자열 처리는 실제로 작동하지 않습니다. 그러나 "C", "F"및 "K"를 구별하기 만하면됩니다. 다행히 dc는 16 진수 12와 15로 "C"와 "F"를 구문 분석합니다. 그리고 "K"의 경우 스택에 0 만 남습니다.

산출:

$ dc -f tempconv.dc <<< "23 C"
73.4000 F
296.1500 K
$ dc -f tempconv.dc <<< "86.987 F"
303.6983 K
30.5483 C
$ dc -f tempconv.dc <<< "56.99999999 K"
-216.1500 C
-357.0700 F
$

5

C, 160 바이트

float v,f[]={1,1.8,1},d[]={0,32,273.15};u,t,j;main(){scanf("%f %c",&v,&u);for(u=u/5-13,v=(v-d[u])/f[u];j<2;)t=(++j+u)%3,printf("%f %c\n",f[t]*v+d[t],"CFK"[t]);}

이것은 stdin에서 읽습니다. 출력 정밀도가 지정되지 않았으므로 인쇄 printf()와 같은 느낌이들 때마다 4 자리를 초과 하여 인쇄합니다 .

언 골프 버전 :

#include <stdio.h>

float v, f[] = {1.0f, 1.8f, 1.0f}, d[] = {0.0f, 32.0f, 273.15f};
char u;
int t, j;

int main() {
    scanf("%f %c", &v, &u);
    u = u / 5 - 13;
    v = (v - d[u]) / f[u];
    for( ; j < 2; ) {
        t = (++j + u) % 3;
        printf("%f %c\n", f[t] * v + d[t], "CFK"[t]);
    }

    return 0;
}

일부 설명 / 비고 :

  • 이는 조회 테이블을 기반으로 f하며 dCelsius를 다른 단위 (특별한 경우를 피하기 위해 Celsius 자체 포함)로 변환하기위한 곱셈 계수 및 오프셋을 포함합니다.
  • u입력 단위 인 경우 0, 1 및 2에 u / 5 - 13매핑 C됩니다 .FK
  • 입력은 항상 섭씨로 변환됩니다.
  • 루프는 입력이 아닌 두 단위를 반복하고 섭씨 값을 해당 단위로 변환합니다.
  • 골프 버전은 int변수 대신 char변수를 사용하여 scanf()입력 을받습니다 . 이것은 유형 불일치로, 리틀 엔디 언 머신에서만 정확한 결과를 생성합니다 (요즘 거의 모든 머신).

152로 단축 : float v,f[]={1,1.8,1,0,32,273.15};u;main(j){scanf("%f %c",&v,&u);for(u=u/4&3,v-=f[u+3],v/=f[u];j++<3;printf("%f %c\n",f[u]*v+f[u+3],"CFK"[u]))u++,u%=3;}. 더 적은 변수로 코드를 이동하면서 조금 얻었습니다. 새로운 가정은 argc = 1 (j = 1)입니다. u = u/4 & 3.
domen

4

파이썬 2, 168 바이트

나는 이것을 게시하려고하는 것처럼 Python 3 솔루션을 보았지만 무엇이든 골프를 연습하고 있습니다.

s=raw_input().split();v=eval(s[0]);c,t=(v-32)/1.8,v-273.15
print[["%fC\n%fF"%(t,t*1.8+32),"%fK\n%fC"%(c+273.15,c)][s[1]=="F"],"%fK\n%fF"%(v+273.15,v*1.8+32)][s[1]=="C"]

언 골프 드 :

def conv(s):
    s = s.split()
    v = float(s[0])
    if s[1]=="C":
        print "%f K\n%f F"%(v+273.15,v*1.8+32)
    elif s[1]=="F":
        v = (v-32)/1.8
        print "%f K\n%f C"%(v+274.15,v)
    else:
        c = v-273.15
        print "%f C\n%f F"%(c,c*1.8+32)


3

PHP, 161 153

function f($i){list($v,$u)=split(" ",$i);$u==C||print($v=$u==K?$v-273.15:($v-32)*5/9)."C\n";$u!=K&&print $v+273.15 ."K\n";$u!=F&&print $v*9/5+32 ."F\n";}

http://3v4l.org/CpvG7

상위 10 위권을 달성하기 위해 2 명의 캐릭터를 더 골라내는 것이 좋을 것입니다 ...


기술적으로 규칙에 따라 장치와 출력 온도 사이에 공간이 필요하지 않습니다. 내 계산에 의해 3 바이트를 절약합니다.
Kade

좋은 지적 :-) 변수를 재사용하는 방법을 찾았습니다.
Stephen

135 바이트 길이 용액 : sandbox.onlinephpfunctions.com/code/... . 기본적으로 다음을 제거 \n하고 실제 뉴 라인으로 변경, (GET을 통해 데이터를 수신, 예 : 전체 프로그램으로 변환 http://localhost/my_file.php?t=<temperature>) 교체 $u!=K와 함께 $u^K$u!=F함께 $u^F. $uis K인 경우 running $u^K은 빈 문자열을 반환하며 이는 잘못된 값입니다. 또한 분할 내부 공간이 C^c(시원하게 보이도록) 로 변환되었습니다 .
Ismael Miguel

3

파이썬 2, 167

s=raw_input();i=eval(s.split()[0]);d={"C":"%f K\n%f F"%(i+273,32+i*1.8),"K":"%f C\n%f F"%(i-273,i*1.8-459.4),"F":"%f C\n%f K"%(i/1.8-17.78,i/1.8+255.2)};print d[s[-1]]`

이것이 CodeGolf에 대한 첫 번째 시도입니다.


PPCG에 오신 것을 환영합니다. 이것은 첫 번째 골프에 대한 좋은 시도입니다! 서식과 내용을 수정하여 게시물에 설탕을 추가했습니다.
Optimizer

2

Pyth, 126 바이트

AYZczdJvY=Y*JK1.8
?%"%f F\n%f K",+32Y+J273.15qZ"C"?%"%f F\n%f C",-Y459.67-J273.15qZ"K"?%"%f C\n%f K",c-J32K*+J459.67c5 9qZ"F"

이것은 나에게 정말로 오래 느낀다.


8
이보다 짧은 Python 솔루션이 있습니다 : P
orlp

@orlp 알아요, 알아요 ...
kirbyfan64sos

2

R, 150 (144) 141 바이트

a=scan(,"");U=c("C","K","F");i=which(U==a[2]);Z=273.15;x=scan(t=a[1]);cat(paste(c(C<-c(x,x-Z,5*(x-32)/9)[i],C+Z,32+C*9/5)[-i],U[-i]),sep="\n")

새로운 줄로 들여 쓰기 :

a=scan(,"")
U=c("C","K","F")
i=which(U==a[2])
Z=273.15
x=as.double(a[1])
cat(paste(c(C<-c(x,x-Z,5*(x-32)/9)[i],C+Z,32+C*9/5)[-i],
            U[-i]),
    sep="\n")

용법:

> a=scan(,"");U=c("C","K","F");i=which(U==a[2]);Z=273.15;x=scan(t=a[1]);cat(paste(c(C<-c(x,x-Z,5*(x-32)/9)[i],C+Z,32+C*9/5)[-i],U[-i]),sep="\n")
1: 23 C
3: 
Read 2 items
Read 1 item
296.15 K
73.4 F
> a=scan(,"");U=c("C","K","F");i=which(U==a[2]);Z=273.15;x=scan(t=a[1]);cat(paste(c(C<-c(x,x-Z,5*(x-32)/9)[i],C+Z,32+C*9/5)[-i],U[-i]),sep="\n")
1: 56.9999999 K
3: 
Read 2 items
Read 1 item
-216.1500001 C
-357.07000018 F
> a=scan(,"");U=c("C","K","F");i=which(U==a[2]);Z=273.15;x=scan(t=a[1]);cat(paste(c(C<-c(x,x-Z,5*(x-32)/9)[i],C+Z,32+C*9/5)[-i],U[-i]),sep="\n")
1: 86.987 F
3: 
Read 2 items
Read 1 item
30.5483333333333 C
303.698333333333 K

@AlexA에게 감사합니다. & @MickyT. !


잘 했어. as.double()대신을 사용하여 바이트를 저장할 수 있습니다 as.numeric().
Alex A.

나는 4 개의 문자로 switch진술을 할 수 있다고 생각한다c(x,x-273.15,5*(x-32)/9)[i]
MickyT

감사! 실제로 버전 3.0 이전에는 as.numeric () 대신 as.real ()을 사용하여 더 짧게 만들 수 있었지만 이제는 기능이 없어졌습니다.
plannapus

또 다른 절약은로 대체 as.double(a[1])됩니다 scan(t=a[1]).
MickyT

2

자바 스크립트, 206 193 187 175 162 159 156

e=273.15,a=prompt(f=1.8).split(" "),b=+a[0],X=b-32,c=a[1];alert(c=="F"&&(X/f+"C\n"+(X/f+e+"K"))||(c=="C"?b*f+32+"‌​F\n"+(b+e+"K"):b*f-459.67+"F\n"+(b-e+"C")))

골프를 조금 더 도와 주신 Optimizer와 Ismael Miguel에게 감사드립니다.


1
당신은 변환하여 몇 바이트를 저장할 수 if else?:
최적화

1
다음과 결합하여 몇 가지를 더 절약 할 수 있습니다 if ... return; return ?:.return ?: ?:
Daniel

1
당신은 1 바이트 교체 절약 할 수 있습니다 a=prompt().split(" "),e=273.15,f=1.8;alert([...]a=prompt(e=273.15,f=1.8).split(" "),alert([...]. 또한 장치 다음의 공백을 제거 할 수 있습니다. 또한, 기능을 제거하고 내부를 return움직이면 alert많이 줄었습니다! 설정 대신에 split과 함께 메소드를 a사용하십시오 apply(). 그러나 여기 있습니다 : (function(b,c){alert(c=="F"&&((b-32)/f+"C\n"+((b-32)/f+e+"K"))||(c=="C"?b*f+32+"F\n"+(b+e+"K"):b*f-459.67+"F\n"+(b-e+"C")))}).apply(e=273.15,prompt(f=1.8).split(" "))! 166 바이트 ( -21 바이트) 의심스러운 점이 있으면 채팅에 나를 핑하십시오.
Ismael Miguel

1
어쨌든 방금 162로 떨어졌습니다.
SuperJedi224

1
네 말이 맞아, 나는 공간 중 일부를 놓쳤다. 지적 해 주셔서 감사합니다.
SuperJedi224

2

매스 매 티카, 66

이번에는 잘 부탁드립니다.

Print[1##]&@@@Reduce[F==1.8K-459.67&&C==K-273.15&&#==#2,,#2];&@@#&

%[37 C]   (* % represents the function above *)

310.15 K

98.6 년


OP는 "다른 두 가지 형식 만 출력하면된다"고 언급했다.
lirtosiast

@ 토마스 그와 다른 문제 (희망적으로) 수정되었습니다. 별로 좋지는 않지만 관심을 잃고 있습니다.
Mr.Wizard

1

엑셀, 239 바이트

=IF(RIGHT(A1,1)="C",LEFT(A1,LEN(A1)-2)+273.15&"K
"&9*LEFT(A1,LEN(A1)-2)/5+32&"F",IF(RIGHT(A1,1)="K",LEFT(A1,LEN(A1)-2)-273.15&"C
"&(LEFT(A1,LEN(A1)-2)*9/5-459.67&"F",(LEFT(A1,LEN(A1)-2)+459.67)*5/9&"K
"&(LEFT(A1,LEN(A1)-2)-32)*5/9&"C"))

112 바이트는 값과 단위를 분리하는 데 사용됩니다. 더 나은 해결책을 아는 사람이 있습니까?

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