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 CelsiusK
für KelvinF
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 Code-Golf, 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>
quelle
23C\n73.4F\n296.15K
? oder muss das eingabeformat unterdrückt werden?2/3
=>0.666666666666
ist auf die 4. Stelle genau? (Ich würde JA sagen). Oder soll es sein0.6667
?0.666666666666
ist richtig. Ich erzwinge eine rundungsfreie Genauigkeit. So0.6666
ist die Alternative.Antworten:
CJam,
77656059555452 BytesProbieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
Python 3,
118116 BytesFührt die Konvertierungen
K -> F -> C -> K
zweimal in einer rotierenden Reihenfolge durch .quelle
'FCK'[u]
.JavaScript ( ES6 ), 127
130 132BytesIn 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.
quelle
Pip,
5857 BytesÜbernimmt Eingaben von Befehlszeilenargumenten.
Formatiert und leicht ungolfed:
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.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.
Das sieht vielversprechend aus. Eine weitere nützliche Tatsache: Indizes in Pip werden umbrochen. Also brauchen wir das eigentlich nicht,
%3
solange wir uns in etwas der Länge 3 indizieren. Das Definiereno:[32 0 273.15]
und Verwenden(o (Ab)%7)
macht den Trick. (A
Ruft 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:
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
t
in"CFK" RM b
, also außer dem Original zu jeder Einheit umzuwandeln.Beispielaufruf:
(Weitere Informationen zu Pip finden Sie im Repository .)
quelle
Gleichstrom, 102 Bytes
Ich bin mir ziemlich sicher, dass man mehr Golf spielen kann, aber hier ist ein Anfang:
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:
quelle
C 160 Bytes
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:
Einige Erklärungen / Bemerkungen:
f
undd
enthält die Multiplikationsfaktoren und Offsets zur Umrechnung von Celsius in eine andere Einheit (einschließlich Celsius selbst, um Sonderfälle zu vermeiden).u
es sich um die Eingabeeinheit handelt,u / 5 - 13
wird sieC
auf 0,F
1 undK
2 abgebildet.int
Variable anstelle einerchar
Variablen, um diescanf()
Eingabe zu empfangen . Dies ist eine Typinkongruenz, die nur auf Little-Endian-Maschinen (die heutzutage fast alle sind) zu korrekten Ergebnissen führt.quelle
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
.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.
Ungolfed:
quelle
Perl,
85, 80,76Teste mich .
quelle
PHP
161153http://3v4l.org/CpvG7
Wäre schön, wenn Sie zwei weitere Charaktere unter die Top Ten bringen würden ...quelle
\n
und ä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!=K
mit$u^K
und$u!=F
mit$u^F
. Wenn dies der Fall$u
istK
, gibt running$u^K
eine leere Zeichenfolge zurück, bei der es sich um einen falschen Wert handelt. Außerdem wurde Ihr Platz im Split inC^c
(Nur um cool auszusehen) umgewandelt.Python 2, 167
Dies ist mein erster Versuch mit CodeGolf.
quelle
Pyth, 126 Bytes
Das fühlt sich sehr lang für mich an ... na ja.
quelle
R,
150144141 BytesMit neuen Zeilen eingerückt:
Verwendung:
Vielen Dank an @AlexA. & @MickyT. !
quelle
as.double()
anstatt mit speichernas.numeric()
.switch
Aussage kann mitc(x,x-273.15,5*(x-32)/9)[i]
4 Zeichen gemacht werdenas.double(a[1])
durchscan(t=a[1])
.Javascript,
206193187175162159156Vielen Dank an Optimizer und Ismael Miguel, die mir geholfen haben, ein bisschen mehr Golf zu spielen.
quelle
if
else
zu?:
if ... return; return ?:
zu a kombinierenreturn ?: ?:
a=prompt().split(" "),e=273.15,f=1.8;alert([...]
mita=prompt(e=273.15,f=1.8).split(" "),alert([...]
. Sie können auch die Leerzeichen nach dem Gerät entfernen. Auch das Entfernenreturn
und Bewegen desalert
Inneren der Funktion hat sich stark verringert! Und anstatt zu setzena
, verwende einfach dieapply()
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.Mathematica, 66
Hoffentlich korrigiere diesmal.
Beispiel
quelle
Excel, 239 Bytes
112 Bytes davon werden zur Trennung von Wert und Einheit verwendet. Kennt jemand eine bessere Lösung?
quelle