温度変換器


38

これは、3つのユニット(摂氏、ケルビン、華氏)のいずれかの入力温度を他の2つのユニットに変換する必要があるバイトサイズのチャレンジです。

入力

温度が数値として提供され、その後に単位が続きます(スペースで区切られます)。温度は整数または浮動小数点数(23対23.0または23.678)です。

STDIN / ARGV / function引数または最も近い同等物からスペースで区切られた文字列を読み取り、STDOUTまたは最も近い同等物に出力を出力する関数または完全なプログラムを送信できます。

出力

出力は、他の2つの形式に変換された温度であり、改行で区切られ、各行に対応するユニット文字が続きます(オプションでスペースで区切られます)。2つのユニットの順序は関係ありません。

出力精度

  • 変換された数値は、小数点以下4桁まで丸められずに正確でなければなりません。
  • 最初の4桁(丸めなし)が正確である限り、末尾のゼロまたは小数点は省略可能です。また、実際の回答の小数点の後に4つのゼロがある場合、4つのゼロや小数点をスキップできます。
  • 先行ゼロはないはずです
  • 上記の3つの要件を満たす限り、任意の数値形式を使用できます。

ユニット表現

温度の単位は、次のいずれかです。

  • 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>


出力はどのような順序でも構いません。たとえば、3つの形式すべてを出力することは可能23C\n73.4F\n296.15K ですか?または入力形式を抑制する必要がありますか?
レベルリバーセント

@steveverrill順序ビットは、出力セクションに記載されています。他の2つの形式のみを出力する必要があります。
オプティマイザー

出力精度について:2/3=> 0.6666666666664桁まで正確ですか?(私はイエスと言います)。それともそう0.6667でしょうか?
edc65

@ edc65 0.666666666666は正しいです。丸めなしの精度を強制しています。その0.6666代替です。
オプティマイザー

1
出力の@Dennisには、スペースを印刷するかどうかのルールはありません。ただし、入力には存在します。
オプティマイザー

回答:


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 -> K2回実行します。


43
お奨めの愛'FCK'[u]
アレックスA.

11
なんてこった、みんな。私の愚かなコメントではなく、質問と回答に投票してください。:P
アレックスA.

10

JavaScriptの(ES6)、127の130 132バイト

いくつかの驚くべきesolanguageの答えを待って、私はここでゴルフに多くを見つけませんでした。

テンプレート文字列を使用すると、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値に役立つパターンがあるでしょう。

単位Asc A%2 Mult 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

これは有望に見えます。もう1つの有用な事実:Pipのインデックスはラップアラウンドします。したがって%3、長さ3の何かにインデックスを作成している限り、実際には必要ありません。定義o:[32 0 273.15]して使用(o (Ab)%7)するとうまくいきます。(A文字のASCII値を取得し(l i)ます。この構文は、関数呼び出しと同様に、イテラブルへのインデックス付けに使用されます。)

乗数の場合、必要なのは2つの数字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]);}

これは標準入力から読み取ります。出力精度は指定されていないため、印刷のように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が入力ユニットの場合、0、1 、および2 にu / 5 - 13マッピングさCれます。FK
  • 入力は常に摂氏に変換されます。
  • ループは、入力ではない2つのユニットを反復処理し、摂氏値をそのユニットに変換します。
  • ゴルフバージョンでは、int変数の代わりに変数を使用しcharscanf()入力を受け取ります。これは型の不一致であり、リトルエンディアンマシン(最近ではほとんどすべて)でのみ正しい結果が生成されます。

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

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

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バイトを節約する私の計算では。
ケード

良い点:-)また、変数を再利用する方法を見つけました。
スティーブン

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(見た目だけで)に変換されました。
イスマエルミゲル

3

Python 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へようこそ。これは非常に最初のゴルフのための素晴らしい試みです!書式設定などを修正して、投稿に砂糖を追加しました。
オプティマイザー

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()
アレックスA.

switchステートメントはc(x,x-273.15,5*(x-32)/9)[i]4文字で実行できると思います
-MickyT

ありがとう!実際、バージョン3.0より前のバージョンでは、as.numeric()ではなくas.real()を使用して短縮することもできましたが、現在は機能していません。
プランナパス

別の節約はに置き換えas.double(a[1])られscan(t=a[1])ます。
MickyT

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")))

オプティマイザーとイスマエルミゲルに感謝します。


1
に変換するif elseことにより、数バイトを節約できます?:
オプティマイザー

1
あなたは、あなたを組み合わせることにより、いくつかの多くを救うことができるif ... return; return ?:return ?: ?:
ダニエル・

1
あなたは、1つのバイトを交換し保存することができますa=prompt().split(" "),e=273.15,f=1.8;alert([...]a=prompt(e=273.15,f=1.8).split(" "),alert([...]。また、ユニットの後ろのスペースを削除できます。また、関数を削除しreturnalert内部を移動すると、大幅に削減されました!また、を設定する代わりに、スプリットを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バイト)。疑問がある場合は、チャットでPingしてください。
イスマエルミゲル

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 K

98.6 F


OPはコメントで、「他の2つの形式のみを出力すればよい」と述べました。
リルトシアスト

@Thomasそれと他の問題は(うまくいけば)修正されました。あまり良くありませんが、私は興味を失っています。
ミスターウィザード

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バイトは値と単位を分離するために使用されます。誰もがより良い解決策を知っていますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.