温度转换器


38

这是一个字节大小的挑战,您必须将三个单位(摄氏,开氏和华氏度)之一的输入温度转换为另外两个单位。

输入值

系统会为您提供温度数字,后跟一个单位(以空格分隔)。温度可以是整数或浮点数(23对23.0或23.678)。

您可以提交一个函数或完整程序,该函数或程序从STDIN / ARGV / function参数或最接近的等效项读取以空格分隔的字符串,然后将输出打印到STDOUT或最接近的等效项。

输出量

您的输出应该是将温度转换为其他两种格式,用换行符分隔,然后在每行后跟相应的单位字符(可选用空格分隔)。两个单元的顺序无关紧要。

输出精度

  • 转换后的数字应精确到至少四位小数而不四舍五入。
  • 只要精确到前4个小数位(不舍入),则尾随零或小数位是可选的。如果实际答案在小数点后有4个零,则还可以跳过4个零和/或小数点。
  • 不应有任何前导零
  • 只要满足上述三个要求,任何数字格式都是可以接受的。

单位代表

温度单位只能是以下之一:

  • 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 ?还是必须禁止输入格式?
水平河圣

@steveverrill命令位在输出部分中提到。您只需要输出其他两种格式。
优化器

关于输出精度:2/3=> 0.666666666666精确到第4位数字吗?(我会说是)。还是应该0.6667
edc65 2015年

@ edc65 0.666666666666是正确的。我正在强制采用不取整的精度。0.6666替代方案也是如此。
优化器

1
@Dennis在输出中,没有规则打印或不打印空格。但是它将出现在输入中。
Optimizer

Answers:


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

Python 3,118 116字节

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

的JavaScript(ES6),127个130 132字节

在等待一些惊人的解决方案答案之前,我在这里没有发现太多高尔夫运动。

使用模板字符串,这3个换行符很重要并已计数。

在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°C。

单位倍数偏移
C 5 0     
K 5 273.15
F 9 32    

我们将构建这些值的列表,并根据我们要处理的单位将它们编入索引。Pip没有关联数组/哈希/字典,因此我们需要将字符转换为整数索引。也许会有一些有用的ASCII值模式。

单位升序A%2倍数A%7 A%7%3偏移
C 67 1 5 4 1 0
K 75 1 5 5 2 273.15
F 70 0 9 0 0 32

这看起来很有希望。一个更有用的事实:Pip中的索引会回绕。因此%3,只要我们索引到长度为3的东西,我们实际上就不需要。定义o:[32 0 273.15]和使用(o (Ab)%7)就可以了。(A获取字符的ASCII值。该(l i)语法用于索引可迭代对象以及函数调用。)

对于乘数,我们只需要两个数字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 /

最后,添加新单位的偏移量,在其末尾连接一个空格和新单位的符号,然后打印。

我们对tin "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

直流勉强达到这一标准。具体来说,直流字符串处理并不是真正的工作。但是我们要做的只是区分“ C”,“ F”和“ K”。幸运的是,dc将“ C”和“ F”解析为十六进制数字12和15。对于fo“ 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;
}

一些说明/备注:

  • 这基于查找表fd其中包含将摄氏度转换为任何其他单位(包括摄氏度本身,以避免特殊情况)的乘数和偏移量。
  • 如果u是输入单位,则分别u / 5 - 13映射C到0、1 FK2。
  • 输入总是转换为摄氏温度。
  • 循环遍历不是输入的两个单位,并将摄氏度值转换为该单位。
  • 高尔夫版本使用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
2015年

4

Python 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

Perl,85 80 76

#!perl -nl
print$_=/C/?$_+273.15." K":/K/?$_*9/5-459.67." F":5/9*($_-32)." C"for$_,$_

测试


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

最好再打出两个角色进入前十名...


从技术上讲,根据规则,单元与输出温度之间无需存在空格。根据我的计算,可以节省3个字节。
卡德2015年

好点:-)我还找到了一种重用变量的方法,这节省了另外一些。
斯蒂芬

135字节长的解决方案:sandbox.onlinephpfunctions.com/code/…。基本上:除去\n而变成真实换行符,转换成一个完整的程序(在接收GET的数据,例如:http://localhost/my_file.php?t=<temperature>)和替换$u!=K$u^K$u!=F$u^F。如果$uK,则运行$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 2015年

@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.

我认为switch声明可以用c(x,x-273.15,5*(x-32)/9)[i]4个字符完成
MickyT 2015年

谢谢!实际上,在3.0版之前,我可以使用as.real()而不是as.numeric()来缩短它的长度,但是该函数现已失效。
plannapus 2015年

另一个节省将是替换as.double(a[1])scan(t=a[1])
MickyT,2015年

2

的Javascript,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内部功能也减少了很多!而不是设置a,只需将apply()方法与split一起使用。但是你去了:(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个字节)。如果您有疑问,请在聊天中给我Ping。
Ismael Miguel

1
我还是把它降到了162。
SuperJedi224

1
没错,我错过了一些地方。感谢您指出这一点。
SuperJedi224

2

Mathematica,66岁

希望这次更正。

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

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

310.15千

98.6楼


OP在评论中说:“您只需输出其他两种格式。”
lirtosiast,2015年

@Thomas那和其他问题(希望)已解决。不太好,但我正在失去兴趣。
威兹德先生2015年

1

Excel,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个字节用于分隔值和单位。有人知道更好的解决方案吗?

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.