Convertisseur de température

38

Il s'agit d'un défi de la taille d'un octet dans lequel vous devez convertir une température d'entrée dans l'une des trois unités (Celsius, Kelvin et Fahrenheit) en deux autres.

Contribution

Vous serait fourni avec une température sous forme de nombre suivi d'une unité (séparés par un espace). La température peut être un nombre entier ou un nombre à virgule flottante (23 vs 23,0 ou 23,678).

Vous pouvez soumettre une fonction ou un programme complet qui lit la chaîne séparée par des espaces de l'argument STDIN / ARGV / function ou de son équivalent le plus proche et imprime la sortie vers STDOUT ou son équivalent le plus proche.

Sortie

Votre sortie doit correspondre à la température convertie dans les deux autres formats, séparés par une nouvelle ligne et suivis du caractère de l'unité correspondante sur chaque ligne (éventuellement séparés par un espace). L'ordre des deux unités n'a pas d'importance.

Précision de sortie

  • Le nombre converti doit être précis à au moins 4 décimales, sans arrondi.
  • Les zéros ou les décimales suivants sont facultatifs, à condition que les 4 premières décimales (sans les arrondis) soient précises. Vous pouvez également ignorer les 4 zéros et / ou le point décimal au cas où la réponse aurait 4 zéros après le point décimal.
  • Il ne devrait pas y avoir de zéros au début
  • Tous les formats de nombres sont acceptables dans la mesure où ils répondent aux trois exigences ci-dessus.

Représentation de l'unité

L'unité de température ne peut être que l'une des suivantes:

  • C pour Celsius
  • K pour Kelvin
  • F pour Fahrenheit

Exemples

Contribution:

23 C

Sortie:

73.4 F
296.15 K

Contribution:

86.987 F

Sortie:

303.6983 K
30.5483 C

Contribution:

56.99999999 K

Sortie:

-216.1500 C
-357.0700 F

C’est le donc l’entrée la plus courte en octets est gagnante! Bon golf!

Classement

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

Optimiseur
la source
Je suppose que les sorties peuvent être dans n'importe quel ordre. Est-il acceptable que les trois formats soient sortis, par exemple 23C\n73.4F\n296.15K ? ou le format d'entrée doit-il être supprimé?
Level River St
@steveverrill le bit de commande est mentionné dans la section sortie. Vous devez seulement sortir les deux autres formats.
Optimiseur
À propos de la précision de la sortie: 2/3=> 0.666666666666est-il précis au 4ème chiffre? (Je dirais oui). Ou devrait-il être 0.6667?
edc65
@ edc65 0.666666666666est correct. J'impose une précision sans arrondis. il en 0.6666va de même pour l'alternative.
Optimiseur
1
@Dennis dans la sortie, il n'y a pas de règle pour imprimer l'espace ou non. Mais ce sera présent dans l'entrée.
Optimiseur

Réponses:

13

CJam, 77 65 60 59 55 54 52 octets

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

Essayez-le en ligne dans l' interprète CJam .

Comment ça marche

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.
Dennis
la source
32

Python 3, 118 116 octets

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)

Effectue les conversions K -> F -> C -> Kdeux fois dans un ordre de rotation .

Sp3000
la source
43
Je dois aimer 'FCK'[u].
Alex A.
11
Haha quoi diable, les gars. Upvote la question et les réponses, pas mon commentaire stupide. : P
Alex A.
10

JavaScript ( ES6 ), 127 130 132 octets

Dans l’attente d’une réponse étonnante en esolanguage, je n’ai pas trouvé grand-chose au golf ici.

En utilisant la chaîne de modèle, les 3 nouvelles lignes sont significatives et comptées.

Exécutez le fragment de code dans Firefox pour tester.

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>

edc65
la source
7

Pip, 58 57 octets

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

Prend une entrée à partir d'arguments de ligne de commande.

Formaté et légèrement non-golfé:

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

Explication:

La formule de conversion générale entre les unités 1 et 2 est la suivante temp2 = (temp1 - offset1) * mult2 / mult1 + offset2. Les décalages peuvent être au zéro absolu ou à toute autre température appropriée; utilisons 0 ° C.

Unité Multi Offset
C 5 0     
K 5 273,15
F 9 32    

Nous allons construire des listes de ces valeurs et les indexer en fonction de l'unité avec laquelle nous traitons. Pip n'a pas de tableaux / hachages / dictionnaires associatifs, nous devons donc convertir les caractères en index entiers. Peut-être y aura-t-il des modèles utiles avec les valeurs ASCII.

Unité Asc A% 2 Mult A% 7 A% 7% 3 Décalage
C 67 1 5 4 1 0
K 75 1 5 5 2 273.15
F 70 0 9 0 0 32

Cela semble prometteur. Encore un fait utile: les indices dans Pip s’enveloppent. Donc, nous n’avons pas réellement besoin de %3tant que nous indexons dans quelque chose de longueur 3. Définir o:[32 0 273.15]et utiliser (o (Ab)%7)fera l’essentiel. ( AObtient la valeur ASCII d'un caractère. La (l i)syntaxe est utilisée pour l'indexation en iterables, ainsi que pour les appels de fonction.)

Pour les multiplicateurs, nous n'avons besoin que des deux nombres 9 et 5. Comme les nombres sont identiques aux chaînes dans Pip et sont donc indexables, obtenir le multiplicateur est aussi simple que 95@Ab(en utilisant l'autre méthode d'indexation, l' @opérateur).

En utilisant les fonctionnalités de programmation de tableaux de Pip, nous pouvons enregistrer un caractère sur la méthode naïve:

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

Enfin, ajoutez le décalage pour la nouvelle unité, concaténez un espace et le symbole de la nouvelle unité à la fin, puis imprimez.

Nous faisons cela pour chaque tentrée "CFK" RM b, convertissant ainsi en chaque unité sauf l'original.

Exemple d'invocation:

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

(Pour plus d'informations sur Pip, voir le référentiel .)

DLosc
la source
6

dc, 102 octets

Je suis sûr que cela peut être joué plus souvent, mais voici un début:

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 fait à peine la note sur celui-ci. Plus précisément, la gestion des chaînes en continu n'est pas vraiment à la hauteur. Mais tout ce que nous avons à faire est de faire la différence entre "C", "F" et "K". Heureusement, dse analyse "C" et "F" en tant que nombres hexadécimaux 12 et 15. Et pour "K", il ne reste que 0 sur la pile.

Sortie:

$ 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
$
Trauma numérique
la source
5

C, 160 octets

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

Cela lit stdin. Aucune précision de sortie n'étant spécifiée, elle imprime ce que vous printf()ressentez, qui est généralement plus de 4 chiffres.

Version non-golfée:

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

Quelques explications / remarques:

  • Ceci est basé sur des tables de consultation fet dcontient les facteurs de multiplication et les compensations pour convertir Celsius en toute autre unité (y compris Celsius, pour éviter les cas particuliers).
  • Si uest l'unité d'entrée, u / 5 - 13mappe Cà 0, Fà 1 et Kà 2.
  • L'entrée est toujours convertie en degrés Celsius.
  • La boucle effectue une itération sur les deux unités qui ne sont pas l’entrée et convertit la valeur Celsius en cette unité.
  • La version golfée utilise une intvariable au lieu d’une charvariable pour recevoir l’ scanf()entrée. Ceci est une incompatibilité de type, qui ne produira que des résultats corrects sur les petites machines Endian (ce qui est presque toutes ces machines).
Reto Koradi
la source
Raccourcies à 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;}. Gagné un peu avec moins de variables, déplacer le code. La nouvelle hypothèse est argc = 1 (j = 1). u = u/4 & 3.
dimanche
4

Python 2, 168 octets

J'ai vu la solution Python 3 juste au moment de publier ceci, mais peu importe, je pratique simplement le 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)
Kade
la source
3

Perl, 85 80 76

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

Testez - moi .

nutki
la source
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

Serait bien de jouer au golf deux autres personnages pour entrer dans le top dix ...

Stephen
la source
Techniquement, selon les règles, il n’est pas nécessaire de laisser d’espace entre l’unité et la température à la sortie. Par mon calcul, cela économise 3 octets.
Kade
Bon point :-) J'ai aussi trouvé un moyen de réutiliser une variable, ce qui en épargne une poignée.
Stephen
Solution longue de 135 octets: sandbox.onlinephpfunctions.com/code/… . Fondamentalement: supprimé \net modifié en nouvelles lignes réelles, converti en programme complet (réception des données via GET, par exemple:) http://localhost/my_file.php?t=<temperature>et remplacé $u!=Kpar $u^Ket $u!=Favec $u^F. Si $uest Ken cours d'exécution$u^K retournera une chaîne vide, qui est une valeur de fausseté. En outre, votre espace à l'intérieur de la scission a été converti en C^c(Juste pour avoir l'air cool).
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]]`

Ceci est mon premier essai sur CodeGolf.

CL
la source
Bienvenue chez PPCG. C'est une belle tentative pour le tout premier golf! J'ai ajouté du sucre à votre message en corrigeant le formatage, etc.
Optimiseur
2

Pyth, 126 octets

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"

Cela me semble vraiment long ... ah bon.

kirbyfan64sos
la source
8
Il existe une solution Python plus courte que celle-ci: P
orlp
@ orlp je sais, je sais ...
kirbyfan64sos
2

R, 150 144 141 octets

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

En retrait, avec de nouvelles lignes:

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

Usage:

> 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

Merci à @AlexA. & @MickyT. !

planificateur
la source
Bon travail. Vous pouvez enregistrer un octet en utilisant as.double()plutôt que as.numeric().
Alex A.
Je pense que la switchdéclaration peut être faite avec c(x,x-273.15,5*(x-32)/9)[i]4 personnages
MickyT
Merci! En fait, avant la version 3.0, j'aurais pu le raccourcir davantage avec as.real () au lieu de as.numeric (), mais la fonction est maintenant obsolète.
Plannapus
Une autre économie serait remplacer as.double(a[1])par 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")))

Merci à Optimizer et Ismael Miguel de m'avoir aidé à jouer au golf un peu plus loin.

SuperJedi224
la source
1
Vous pouvez enregistrer quelques octets en convertissant le if elseà?:
Optimizer
1
Vous pourriez sauver quelques autres en combinant votre if ... return; return ?:àreturn ?: ?:
Daniel
1
Vous pouvez enregistrer 1 octet en le remplaçant a=prompt().split(" "),e=273.15,f=1.8;alert([...]par a=prompt(e=273.15,f=1.8).split(" "),alert([...]. En outre, vous pouvez supprimer les espaces après l'unité. En outre, supprimer returnet déplacer l' alertintérieur de la fonction réduisait beaucoup! Et au lieu de définir a, utilisez simplement la apply()méthode avec la scission. Mais voila (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 octets ( -21 octets). Ping moi dans le chat si vous avez des doutes.
Ismael Miguel
1
Je viens de l'avoir à 162 de toute façon.
SuperJedi224
1
Vous avez raison, j'ai raté certains espaces. Merci d'avoir fait remarquer cela.
SuperJedi224
2

Mathematica, 66

Espérons corriger cette fois.

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

Exemple

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

310,15 K

98,6 F

Mr.Wizard
la source
L'OP a déclaré dans un commentaire que "Vous ne devez sortir que les deux autres formats."
lirtosiast
@Thomas Cela et d'autres problèmes (espérons-le) résolus. Pas très bon mais je perds de l'intérêt.
Mr.Wizard
1

Excel, 239 octets

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

Dont 112 octets sont utilisés pour séparer valeur et unité. Quelqu'un connaît une meilleure solution?

Wernisch
la source