Temperaturkonverter


38

Dies ist eine Herausforderung in Byte-Größe, bei der Sie eine Eingangstemperatur in einer der drei Einheiten (Celsius, Kelvin und Fahrenheit) in die anderen beiden Einheiten umrechnen müssen.

Eingang

Sie erhalten eine Temperatur als Zahl, gefolgt von einer Einheit (durch ein Leerzeichen getrennt). Die Temperatur kann eine Ganzzahl oder eine Gleitkommazahl sein (23 vs 23.0 oder 23.678).

Sie können eine Funktion oder ein vollständiges Programm übergeben, das die durch Leerzeichen getrennte Zeichenfolge aus dem Argument STDIN / ARGV / function oder dem nächstgelegenen Äquivalent liest und die Ausgabe an STDOUT oder das nächstgelegene Äquivalent ausgibt.

Ausgabe

Ihre Ausgabe sollte die Temperatur sein, die in die anderen beiden Formate konvertiert wurde, getrennt durch eine neue Zeile und gefolgt vom entsprechenden Einheitenzeichen in jeder Zeile (optional durch ein Leerzeichen getrennt). Die Reihenfolge der beiden Einheiten spielt keine Rolle.

Ausgabegenauigkeit

  • Die umgerechnete Zahl sollte auf mindestens 4 Dezimalstellen genau sein, ohne zu runden.
  • Nachgestellte Nullen oder Dezimalstellen sind optional, solange die ersten 4 Dezimalstellen (ohne Rundung) präzise sind. Sie können auch die 4 Nullen und / oder den Dezimalpunkt überspringen, falls die tatsächliche Antwort 4 Nullen nach dem Dezimalpunkt enthält.
  • Es sollten keine führenden Nullen vorhanden sein
  • Jedes Zahlenformat ist zulässig, solange es die oben genannten drei Anforderungen erfüllt.

Einheitendarstellung

Die Temperatureinheit kann nur eine der folgenden sein:

  • C für Celsius
  • K für Kelvin
  • F für Fahrenheit

Beispiele

Eingang:

23 C

Ausgabe:

73.4 F
296.15 K

Eingang:

86.987 F

Ausgabe:

303.6983 K
30.5483 C

Eingang:

56.99999999 K

Ausgabe:

-216.1500 C
-357.0700 F

Dies ist also gewinnt der kürzeste Eintrag in Bytes! Viel Spaß beim Golfen!

Bestenliste

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


Ich gehe davon aus, dass die Ausgänge in beliebiger Reihenfolge sein können. Ist es zum Beispiel akzeptabel, dass alle drei Formate ausgegeben werden 23C\n73.4F\n296.15K ? oder muss das eingabeformat unterdrückt werden?
Level River St

@steveverrill Das Auftragsbit wird im Ausgabeabschnitt erwähnt. Sie müssen nur die beiden anderen Formate ausgeben.
Optimierer

Über die Ausgabegenauigkeit: 2/3=> 0.666666666666ist auf die 4. Stelle genau? (Ich würde JA sagen). Oder soll es sein 0.6667?
edc65

@ edc65 0.666666666666ist richtig. Ich erzwinge eine rundungsfreie Genauigkeit. So 0.6666ist die Alternative.
Optimierer

1
@ Tennis in der Ausgabe gibt es keine Regel, um das Leerzeichen zu drucken oder nicht. Aber es wird in der Eingabe vorhanden sein.
Optimierer

Antworten:


13

CJam, 77 65 60 59 55 54 52 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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 Bytes

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)

Führt die Konvertierungen K -> F -> C -> Kzweimal in einer rotierenden Reihenfolge durch .


43
Muss ich lieben 'FCK'[u].
Alex A.

11
Haha, was zum Teufel, Leute. Stimmen Sie die Frage und die Antworten hoch, nicht meinen blöden Kommentar. : P
Alex A.

10

JavaScript ( ES6 ), 127 130 132 Bytes

In Erwartung einer erstaunlichen Antwort auf diese Frage fand ich hier nicht viel zum Golfen.

Unter Verwendung der Schablonenzeichenfolge sind die 3 Zeilenvorschübe signifikant und werden gezählt.

Führen Sie zum Testen das Snippet in Firefox aus.

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

Pip, 58 57 Bytes

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

Übernimmt Eingaben von Befehlszeilenargumenten.

Formatiert und leicht ungolfed:

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

Erläuterung:

Die allgemeine Umrechnungsformel zwischen Einheit 1 und Einheit 2 lautet temp2 = (temp1 - offset1) * mult2 / mult1 + offset2. Die Offsets können auf den absoluten Nullpunkt oder eine andere geeignete Temperatur eingestellt werden. Verwenden wir 0 ° C.

Einheit Mult. Offset
C 5 0     
K 5 273,15
F 9 32    

Wir erstellen Listen dieser Werte und indizieren sie basierend auf der Einheit, mit der wir es zu tun haben. Pip hat keine assoziativen Arrays / Hashes / Wörterbücher, daher müssen wir die Zeichen in Integer-Indizes konvertieren. Möglicherweise gibt es hilfreiche Muster für die ASCII-Werte.

Einheit Auf A% 2 Mult A% 7 A% 7% 3 Offset
C 67 1 5 4 1 0
K 75 1 5 5 2 273,15
F 70 0 9 0 0 32

Das sieht vielversprechend aus. Eine weitere nützliche Tatsache: Indizes in Pip werden umbrochen. Also brauchen wir das eigentlich nicht, %3solange wir uns in etwas der Länge 3 indizieren. Das Definieren o:[32 0 273.15]und Verwenden (o (Ab)%7)macht den Trick. ( ARuft den ASCII-Wert eines Zeichens ab. Die (l i)Syntax wird für die Indizierung in Iterables sowie für Funktionsaufrufe verwendet.)

Für die Multiplikatoren benötigen wir nur die beiden Zahlen 9 und 5. Da die Zahlen mit den Zeichenfolgen in Pip identisch und daher indexierbar sind, ist das Abrufen des Multiplikators so einfach wie 95@Ab(mit der anderen Methode der Indexierung, dem @Operator).

Mit den Array-Programmierfunktionen von Pip können wir ein Zeichen über die naive Methode speichern:

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

Fügen Sie abschließend den Versatz für die neue Einheit hinzu, verknüpfen Sie ein Leerzeichen und das Symbol der neuen Einheit mit dem Ende und drucken Sie.

Wir tun dies für jeden tin "CFK" RM b, also außer dem Original zu jeder Einheit umzuwandeln.

Beispielaufruf:

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

(Weitere Informationen zu Pip finden Sie im Repository .)


6

Gleichstrom, 102 Bytes

Ich bin mir ziemlich sicher, dass man mehr Golf spielen kann, aber hier ist ein Anfang:

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 macht hier kaum die Note. Insbesondere die Bearbeitung von DC-Strings ist nicht wirklich der Aufgabe gewachsen. Wir müssen aber nur zwischen "C", "F" und "K" unterscheiden. Zum Glück analysiert dc "C" und "F" als Hexadezimalzahlen 12 und 15. Und für "K" bleibt nur 0 auf dem Stapel.

Ausgabe:

$ 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 Bytes

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]);}

Das liest sich aus stdin. Da keine Ausgabegenauigkeit angegeben ist, wird printf()gedruckt, was auch immer sich anfühlt, meistens mehr als 4 Stellen.

Ungolfed-Version:

#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;
}

Einige Erklärungen / Bemerkungen:

  • Dies basiert auf Nachschlagetabellen fund denthält die Multiplikationsfaktoren und Offsets zur Umrechnung von Celsius in eine andere Einheit (einschließlich Celsius selbst, um Sonderfälle zu vermeiden).
  • Wenn ues sich um die Eingabeeinheit handelt, u / 5 - 13wird sie Cauf 0, F1 und K2 abgebildet.
  • Die Eingabe wird immer in Celsius umgerechnet.
  • Die Schleife durchläuft die beiden Einheiten, bei denen es sich nicht um die Eingabe handelt, und konvertiert den Celsius-Wert in diese Einheit.
  • Die Golf-Version verwendet eine intVariable anstelle einer charVariablen, um die scanf()Eingabe zu empfangen . Dies ist eine Typinkongruenz, die nur auf Little-Endian-Maschinen (die heutzutage fast alle sind) zu korrekten Ergebnissen führt.

Verkürzte bis 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;}. Ein bisschen mit weniger Variablen gewonnen, Code verschoben. Neue Annahme ist argc = 1 (j = 1). u = u/4 & 3.
Domen

4

Python 2, 168 Bytes

Ich habe die Python 3-Lösung gerade gesehen, als ich das posten wollte, aber was auch immer, ich übe nur Golf.

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

Ungolfed:

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$_,$_

Teste mich .


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

Wäre schön, wenn Sie zwei weitere Charaktere unter die Top Ten bringen würden ...


Nun, technisch gesehen müssen nach den Regeln keine Abstände zwischen dem Gerät und seiner Temperatur im Ausgang vorhanden sein. Nach meiner Berechnung spart das 3 Bytes.
Kade

Guter Punkt :-) Ich habe auch eine Möglichkeit gefunden, eine Variable wiederzuverwenden, wodurch eine weitere Handvoll gespart wird.
Stephen

135 Byte lange Lösung: sandbox.onlinephpfunctions.com/code/… . Grundsätzlich gilt: entfernt die \nund änderte in reale Zeilenumbrüche, umgewandelt in ein volles Programm (die Daten über GET empfangen, zB: http://localhost/my_file.php?t=<temperature>) und ersetzt $u!=Kmit $u^Kund $u!=Fmit $u^F. Wenn dies der Fall $uist K, gibt running $u^Keine leere Zeichenfolge zurück, bei der es sich um einen falschen Wert handelt. Außerdem wurde Ihr Platz im Split in C^c(Nur um cool auszusehen) umgewandelt.
Ismael Miguel

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]]`

Dies ist mein erster Versuch mit CodeGolf.


Willkommen bei PPCG. Dies ist ein schöner Versuch für das allererste Golf! Ich habe Ihrem Post etwas Zucker hinzugefügt, indem ich Formatierungen und andere Dinge korrigiert habe.
Optimierer

2

Pyth, 126 Bytes

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"

Das fühlt sich sehr lang für mich an ... na ja.


8
Es gibt eine Python-Lösung, die kürzer ist als diese: P
Orlp

@orlp Ich weiß, ich weiß ...
kirbyfan64sos

2

R, 150 144 141 Bytes

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

Mit neuen Zeilen eingerückt:

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

Verwendung:

> 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

Vielen Dank an @AlexA. & @MickyT. !


Gute Arbeit. Sie können ein Byte mit as.double()anstatt mit speichern as.numeric().
Alex A.

Ich denke, die switchAussage kann mit c(x,x-273.15,5*(x-32)/9)[i]4 Zeichen gemacht werden
MickyT

Vielen Dank! Eigentlich hätte ich es vor Version 3.0 mit as.real () anstelle von as.numeric () kürzen können, aber die Funktion ist jetzt nicht mehr funktionsfähig.
Plannapus

Eine weitere Ersparnis wäre das Ersetzen as.double(a[1])durch 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")))

Vielen Dank an Optimizer und Ismael Miguel, die mir geholfen haben, ein bisschen mehr Golf zu spielen.


1
Sie können durch die Umwandlung der ein paar Bytes speichern if elsezu?:
Optimizer

1
Sie könnten ein paar mehr sparen, indem Sie Ihre if ... return; return ?:zu a kombinierenreturn ?: ?:
Daniel

1
Sie können 1 Byte ersetzt sparen a=prompt().split(" "),e=273.15,f=1.8;alert([...]mit a=prompt(e=273.15,f=1.8).split(" "),alert([...]. Sie können auch die Leerzeichen nach dem Gerät entfernen. Auch das Entfernen returnund Bewegen des alertInneren der Funktion hat sich stark verringert! Und anstatt zu setzen a, verwende einfach die apply()Methode mit dem Split. Aber los geht's (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 Bytes ( -21 Bytes). Pingen Sie mich im Chat an, wenn Sie Zweifel haben.
Ismael Miguel

1
Ich habe es trotzdem auf 162 gebracht.
SuperJedi224

1
Du hast recht, ich habe einige der Räume verpasst. Vielen Dank, dass Sie darauf hingewiesen haben.
SuperJedi224

2

Mathematica, 66

Hoffentlich korrigiere diesmal.

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

Beispiel

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

310,15 K

98,6 F


Das OP sagte in einem Kommentar, dass "Sie nur die anderen beiden Formate ausgeben müssen."
Lirtosiast

@Thomas Das und andere Probleme (hoffentlich) behoben. Nicht sehr gut, aber ich verliere das Interesse.
Mr.Wizard

1

Excel, 239 Bytes

=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 Bytes davon werden zur Trennung von Wert und Einheit verwendet. Kennt jemand eine bessere Lösung?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.