Convertidor de temperatura

38

Este es un desafío de tamaño de byte en el que debe convertir una temperatura de entrada en una de las tres unidades (Celsius, Kelvin y Fahrenheit) a las otras dos.

Entrada

Se le proporcionará una temperatura como un número seguido de una unidad (separada por espacio). La temperatura puede ser un número entero o un número de coma flotante (23 frente a 23.0 o 23.678).

Puede enviar una función o un programa completo que lea la cadena separada por espacios del argumento STDIN / ARGV / function o el equivalente más cercano e imprima la salida en STDOUT o el equivalente más cercano.

Salida

Su salida debe ser la temperatura convertida a los otros dos formatos, separados por una nueva línea y seguidos del carácter de unidad correspondiente en cada línea (opcionalmente separados por un espacio). El orden de las dos unidades no importa.

Precisión de salida

  • El número convertido debe tener una precisión de al menos 4 decimales sin redondear.
  • Los ceros finales o los decimales son opcionales siempre que los primeros 4 decimales (sin redondeo) sean precisos. También puede omitir los 4 ceros y / o el punto decimal en caso de que la respuesta real tenga 4 ceros después del punto decimal.
  • No debería haber ceros a la izquierda
  • Cualquier formato de número es aceptable siempre que cumpla con los tres requisitos anteriores.

Representación de la unidad

La unidad de temperatura solo puede ser una de las siguientes:

  • C para Celsius
  • K para Kelvin
  • F para Fahrenheit

Ejemplos

Entrada:

23 C

Salida:

73.4 F
296.15 K

Entrada:

86.987 F

Salida:

303.6983 K
30.5483 C

Entrada:

56.99999999 K

Salida:

-216.1500 C
-357.0700 F

Este es el por lo que la entrada más corta en bytes gana. ¡Feliz golf!

Tabla de clasificación

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

Optimizador
fuente
Supongo que las salidas pueden estar en cualquier orden. ¿Es aceptable que se emitan los tres formatos, por ejemplo 23C\n73.4F\n296.15K ? ¿o debe suprimirse el formato de entrada?
Level River St
@steveverrill el bit de orden se menciona en la sección de salida. Solo debe generar los otros dos formatos.
Optimizador
Acerca de la precisión de salida: 2/3=> ¿ 0.666666666666es precisa para los 4 dígitos? (Yo diría que sí). ¿O debería ser 0.6667?
edc65
@ edc65 0.666666666666es correcto. Estoy aplicando una precisión basada en no redondeo. Así 0.6666es la alternativa.
Optimizador
1
@Dennis en la salida, no hay una regla para imprimir el espacio o no. Pero estará presente en la entrada.
Optimizador

Respuestas:

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<

Pruébelo en línea en el intérprete de CJam .

Cómo funciona

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

Python 3, 118116 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)

Realiza las conversiones en un orden rotativo K -> F -> C -> Kdos veces.

Sp3000
fuente
43
Tengo amor 'FCK'[u].
Alex A.
11
Jaja qué diablos, chicos. Vota la pregunta y las respuestas, no mi comentario tonto. : P
Alex A.
10

JavaScript ( ES6 ), 127 130 132 bytes

A la espera de una sorprendente respuesta de ese idioma, no encontré mucho para jugar golf aquí.

Usando una cadena de plantilla, las 3 nuevas líneas son significativas y contadas.

Ejecute el fragmento en Firefox para probar.

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

Pip, 58 57 bytes

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

Toma información de los argumentos de la línea de comandos.

Formateado y ligeramente sin 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

Explicación:

La fórmula general de conversión entre la unidad 1 y la unidad 2 es temp2 = (temp1 - offset1) * mult2 / mult1 + offset2. Las compensaciones pueden ser cero absoluto o cualquier otra temperatura conveniente; usemos 0 ° C.

Unidad de desplazamiento múltiple
C 5 0     
K 5 273.15
F 9 32    

Construiremos listas de estos valores y los indexaremos en función de la unidad con la que estamos tratando. Pip no tiene matrices / hashes / diccionarios asociativos, por lo que debemos convertir los caracteres en índices enteros. Tal vez habrá patrones útiles con los valores ASCII.

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

Esto parece prometedor. Un hecho más útil: los índices en Pip se envuelven. Por lo tanto, en realidad no necesitamos el %3tiempo que estamos indexando en algo de longitud 3. Definir o:[32 0 273.15]y usar (o (Ab)%7)hará el truco. ( Aobtiene el valor ASCII de un carácter. La (l i)sintaxis se usa para indexar en iterables, así como para llamadas a funciones).

Para los multiplicadores, solo necesitamos los dos números 9 y 5. Dado que los números son lo mismo que las cadenas en Pip, y por lo tanto son indexables, obtener el multiplicador es tan simple como 95@Ab(usando el otro método de indexación, el @operador).

Usando las características de programación de matriz de Pip, podemos guardar un personaje sobre el método ingenuo:

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

Finalmente, agregue el desplazamiento para la nueva unidad, concatene un espacio y el símbolo de la nueva unidad en el extremo e imprima.

Hacemos esto para cada uno tde "CFK" RM b, convirtiendo así a cada unidad, excepto el original.

Invocación de muestra:

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

(Para más información sobre Pip, consulte el repositorio ).

DLosc
fuente
6

cc, 102 bytes

Estoy bastante seguro de que esto se puede jugar más, pero aquí hay un comienzo:

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 apenas califica en este caso. Específicamente, el manejo de cadenas de CC no está realmente a la altura del trabajo. Pero todo lo que necesitamos hacer es diferenciar entre "C", "F" y "K". Afortunadamente, dc analiza "C" y "F" como números hexadecimales 12 y 15. Y para "K" simplemente deja 0 en la pila.

Salida:

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

Esto se lee de stdin. No se especifica la precisión de salida, por lo que imprime lo que se printf()siente como impresión, que en su mayoría tiene más de 4 dígitos.

Versión sin golf:

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

Algunas explicaciones / comentarios:

  • Esto se basa en tablas de búsqueda fy dcontiene los factores de multiplicación y las compensaciones para convertir Celsius a cualquier otra unidad (incluido el propio Celsius, para evitar casos especiales).
  • Si ues la unidad de entrada, se u / 5 - 13asigna Ca 0, Fa 1 y Ka 2.
  • La entrada siempre se convierte a Celsius.
  • El bucle itera sobre las dos unidades que no son la entrada y convierte el valor Celsius en esa unidad.
  • La versión de golf utiliza una intvariable en lugar de una charvariable para recibir la scanf()entrada. Este es un desajuste de tipo, que solo producirá resultados correctos en pequeñas máquinas endian (que es casi todas en estos días).
Reto Koradi
fuente
Acortado a 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;}. Ganó un poco con menos variables, moviendo el código. Nueva suposición es argc = 1 (j = 1). u = u/4 & 3.
Domingo
4

Python 2, 168 bytes

Vi la solución Python 3 justo cuando estaba a punto de publicar esto, pero lo que sea, solo estoy practicando 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"]

Sin golf:

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

Perl, 85 80 76

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

Ponme a prueba .

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

Sería bueno jugar dos personajes más para estar entre los diez primeros ...

Stephen
fuente
Bueno, técnicamente, según las reglas, no es necesario que haya espacios entre la unidad y su temperatura en la salida. Según mis cálculos, eso ahorra 3 bytes.
Kade
Buen punto :-) También encontré una forma de reutilizar una variable, lo que ahorra otro puñado.
Stephen
Solución de 135 bytes de longitud: sandbox.onlinephpfunctions.com/code/… . Básicamente: eliminó \ny cambió a líneas nuevas reales, se convirtió en un programa completo (recibiendo los datos a través de GET, por ejemplo:) http://localhost/my_file.php?t=<temperature>y reemplazado $u!=Kcon $u^Ky $u!=Fcon $u^F. Si $ues así K, la ejecución $u^Kdevolverá una cadena vacía, que es un valor falso. Además, su espacio dentro de la división se convirtió en C^c(Solo para verse genial).
Ismael Miguel
3

Pitón 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]]`

Este es mi primer intento en CodeGolf.

CL
fuente
Bienvenido a PPCG. ¡Este es un buen intento para el primer golf! He agregado algo de azúcar a tu publicación corrigiendo el formato y otras cosas.
Optimizador
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"

Esto me parece muy largo ... oh bueno.

kirbyfan64sos
fuente
8
Hay una solución de Python más corta que esta: P
orlp
@orlp Lo sé, lo sé ...
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")

Sangrado, con nuevas líneas:

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

Uso:

> 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

Gracias a @AlexA. & @MickyT. !

plannapus
fuente
Buen trabajo. Puede guardar un byte usando en as.double()lugar de as.numeric().
Alex A.
Creo que la switchdeclaración se puede hacer con c(x,x-273.15,5*(x-32)/9)[i]4 caracteres
MickyT
¡Gracias! En realidad, antes de la versión 3.0, podría haberlo acortado más con as.real () en lugar de as.numeric (), pero la función está desactivada ahora.
plannapus
Otro ahorro sería reemplazar as.double(a[1])con 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")))

Gracias a Optimizer e Ismael Miguel por ayudarme a jugar golf un poco más.

SuperJedi224
fuente
1
Usted puede ahorrar unos pocos bytes mediante la conversión de la if elsea?:
Optimizador de
1
Podrías ahorrar un poco más combinando tu if ... return; return ?:a unreturn ?: ?:
Daniel
1
Puede guardar 1 byte reemplazando a=prompt().split(" "),e=273.15,f=1.8;alert([...]por a=prompt(e=273.15,f=1.8).split(" "),alert([...]. Además, puede eliminar los espacios después de la unidad. ¡Además, al quitar returny mover el alertinterior de la función se redujo mucho! Y en lugar de configurar a, simplemente use el apply()método con la división. Pero aquí van: (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). Hazme ping en el chat si tienes dudas.
Ismael Miguel
1
Lo acabo de bajar a 162 de todos modos.
SuperJedi224
1
Tienes razón, me perdí algunos de los espacios. Gracias por señalar eso.
SuperJedi224
2

Mathematica, 66

Esperemos corregir esta vez.

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

Ejemplo

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

310,15 K

98,6 F

Señor mago
fuente
El OP dijo en un comentario que "solo debe generar los otros dos formatos".
lirtosiast
@Thomas Eso y otros problemas (con suerte) solucionados. No muy bueno pero estoy perdiendo interés.
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 de los cuales se utilizan para separar el valor y la unidad. Alguien sabe una mejor solución?

Wernisch
fuente