Konwerter temperatury

38

Jest to bajtowe wyzwanie, w którym musisz przekonwertować temperaturę wejściową w jednej z trzech jednostek (Celsjusza, Kelvina i Fahrenheita) na dwie pozostałe.

Wkład

Otrzymasz temperaturę jako liczbę, a następnie jednostkę (oddzieloną spacją). Temperatura może być liczbą całkowitą lub liczbą zmiennoprzecinkową (23 vs 23,0 lub 23,678).

Możesz przesłać funkcję lub pełny program, który odczytuje ciąg rozdzielony spacjami z argumentu STDIN / ARGV / function lub najbliższego odpowiednika i wypisuje dane wyjściowe do STDOUT lub najbliższego odpowiednika.

Wydajność

Wynikiem powinna być temperatura przekonwertowana na dwa pozostałe formaty, oddzielone znakiem nowej linii, a po nim odpowiedni znak jednostki w każdym wierszu (opcjonalnie oddzielony spacją). Kolejność dwóch jednostek nie ma znaczenia.

Dokładność wyjściowa

  • Przeliczona liczba powinna być dokładna do co najmniej 4 miejsc po przecinku bez zaokrąglania.
  • Końcowe zera lub miejsca dziesiętne są opcjonalne, o ile pierwsze 4 miejsca dziesiętne (bez zaokrąglania) są dokładne. Możesz również pominąć 4 zera i / lub przecinek dziesiętny, na wypadek gdyby rzeczywista odpowiedź zawierała 4 zera po przecinku.
  • Nie powinno być żadnych zer wiodących
  • Dowolny format liczb jest dopuszczalny, o ile spełnia powyższe trzy wymagania.

Reprezentacja jednostki

Jednostką temperatury może być tylko jedno z poniższych:

  • C dla Celsjusza
  • K dla Kelvina
  • F dla Fahrenheita

Przykłady

Wkład:

23 C

Wydajność:

73.4 F
296.15 K

Wkład:

86.987 F

Wydajność:

303.6983 K
30.5483 C

Wkład:

56.99999999 K

Wydajność:

-216.1500 C
-357.0700 F

To jest więc wygrywa najkrótszy wpis w bajtach! Wesołego golfa!

Tabela liderów

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

Optymalizator
źródło
Zakładam, że wyniki mogą być w dowolnej kolejności. Czy na przykład dopuszczalne jest wyświetlanie wszystkich trzech formatów 23C\n73.4F\n296.15K ? czy musi zostać pominięty format wejściowy?
Level River St
@steveverrill bit zamówienia jest wymieniony w sekcji wyjściowej. Musisz wyprowadzić tylko pozostałe dwa formaty.
Optymalizator
Dokładność wyjściowa: 2/3=> 0.666666666666czy dokładność do 4 cyfr? (Powiedziałbym TAK). A może tak powinno być 0.6667?
edc65,
@ edc65 0.666666666666jest poprawny. Egzekwuję precyzję opartą na braku zaokrąglania. taka 0.6666jest alternatywa.
Optymalizator
1
@Dennis na wyjściu, nie ma reguły, aby wydrukować spację, czy nie. Ale będzie obecny na wejściu.
Optymalizator

Odpowiedzi:

13

CJam, 77 65 60 59 55 54 52 bajtów

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

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
źródło
32

Python 3, 118 116 bajtów

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 -> KDwukrotnie wykonuje konwersje w kolejności obrotowej .

Sp3000
źródło
43
Musisz kochać 'FCK'[u].
Alex A.,
11
Haha co do cholery, chłopaki. Głosuj na pytanie i odpowiedzi, a nie na mój głupi komentarz. : P
Alex A.
10

JavaScript ( ES6 ), 127 130 132 bajtów

Czekając na niesamowitą odpowiedź w języku esolanguage, nie znalazłem tu wiele do gry w golfa.

Przy użyciu ciągu szablonu 3 nowe znaki są znaczące i zliczane.

Uruchom snippet w przeglądarce Firefox, aby przetestować.

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
źródło
7

Pip, 58 57 bajtów

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

Pobiera dane wejściowe z argumentów wiersza polecenia.

Sformatowane i lekko nie golfowe:

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

Wyjaśnienie:

Ogólna formuła konwersji między jednostką 1 a jednostką 2 jest temp2 = (temp1 - offset1) * mult2 / mult1 + offset2. Przesunięcia mogą być do zera absolutnego lub do dowolnej innej dogodnej temperatury; użyjmy 0 ° C.

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

Zbudujemy listy tych wartości i zindeksujemy je w oparciu o jednostkę, z którą mamy do czynienia. Pip nie ma tablic asocjacyjnych / skrótów / słowników, dlatego musimy przekonwertować znaki na liczby całkowite. Może będą pomocne wzorce z wartościami ASCII.

Jednostka Asc A% 2 Mult A% 7 A% 7% 3 Przesunięcie
C 67 1 5 4 1 0
K 75 1 5 5 2 273,15
F 70 0 9 0 0 32

To wygląda obiecująco. Jeszcze jeden użyteczny fakt: zawijają się wskaźniki w Pipie. Więc tak naprawdę nie potrzebujemy %3tak długo, jak indeksujemy do czegoś o długości 3. Definiowanie o:[32 0 273.15]i używanie (o (Ab)%7)załatwi sprawę. ( Apobiera wartość ASCII znaku. (l i)Składnia służy do indeksowania w iterabach, a także do wywołań funkcji).

Do mnożników potrzebujemy tylko dwóch liczb 9 i 5. Ponieważ liczby są takie same jak ciągi znaków w Pip, a zatem są indeksowalne, uzyskanie mnożnika jest tak proste jak 95@Ab(przy użyciu innej metody indeksowania, @operatora).

Korzystając z funkcji programowania tablic Pip, możemy zapisać postać nad naiwną metodą:

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

Na koniec dodaj przesunięcie dla nowej jednostki, połącz spację i symbol nowej jednostki na końcu i wydrukuj.

Robimy to dla każdego tw "CFK" RM b, konwertując w ten sposób na każdą jednostkę oprócz oryginału.

Przykładowe wywołanie:

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

(Aby uzyskać więcej informacji na temat Pip, zobacz repozytorium ).

DLosc
źródło
6

dc, 102 bajty

Jestem prawie pewien, że można bardziej zagrać w golfa, ale oto początek:

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 ledwo ocenia tę ocenę. W szczególności obsługa ciągów znaków DC nie jest tak naprawdę wystarczająca. Ale wszystko, co musimy zrobić, to rozróżnić „C”, „F” i „K”. Na szczęście dc analizuje „C” i „F” jako cyfry szesnastkowe 12 i 15. A dla „K” pozostawia po prostu 0 na stosie.

Wydajność:

$ 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
$
Cyfrowa trauma
źródło
5

C, 160 bajtów

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

To czyta ze standardowego. Nie określono precyzji wydruku, więc drukuje wszystko, co printf()wydaje się drukiem, czyli w większości więcej niż 4 cyfry.

Wersja bez golfa:

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

Kilka wyjaśnień / uwag:

  • Opiera się to na tablicach przeglądowych fi dzawiera mnożniki i przesunięcia w celu konwersji Celsjusza na dowolną inną jednostkę (w tym samą Celsjusza, aby uniknąć szczególnych przypadków).
  • Jeśli ujest jednostką wejściową, u / 5 - 13odwzorowuje Cna 0, Fna 1 i Kna 2.
  • Dane wejściowe są zawsze konwertowane na stopnie Celsjusza.
  • Pętla iteruje dwie jednostki, które nie są danymi wejściowymi, i konwertuje wartość Celsjusza na tę jednostkę.
  • Wersja do gry w golfa używa intzmiennej zamiast charzmiennej do odbierania scanf()danych wejściowych. Jest to niedopasowanie typu, które da prawidłowe wyniki tylko na małych komputerach endianowych (co obecnie jest prawie każdym z nich).
Reto Koradi
źródło
Skrócony do 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;}. Zyskałem trochę przy mniejszej liczbie zmiennych, przenosząc kod. Nowym założeniem jest argc = 1 (j = 1). u = u/4 & 3.
domen
4

Python 2, 168 bajtów

Zobaczyłem rozwiązanie Python 3, gdy miałem to opublikować, ale cokolwiek, po prostu ćwiczę golfa.

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

Nie golfowany:

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
źródło
3

Perl, 85 80 76

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

Przetestuj mnie .

nutki
źródło
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

Byłoby miło zagrać w golfa jeszcze dwie postacie, aby dostać się do pierwszej dziesiątki ...

Stephen
źródło
Technicznie, zgodnie z zasadami, między jednostką a temperaturą na wyjściu nie musi być odstępów. Według moich obliczeń, które oszczędzają 3 bajty.
Kade
Dobra uwaga :-) Znalazłem również sposób na ponowne użycie zmiennej, co oszczędza kolejną garść.
Stephen
Rozwiązanie o długości 135 bajtów: sandbox.onlinephpfunctions.com/code/… . Zasadniczo: usunięto \ni zmienił się w prawdziwe nowymi liniami, przekształcony w pełnym programie (odbierającym dane przez GET, np: http://localhost/my_file.php?t=<temperature>) i zastąpiono $u!=Kz $u^Ki $u!=Fz $u^F. Jeśli $ujest K, uruchomienie $u^Kzwróci pusty ciąg znaków, który jest wartością fałszowania. Również twoja przestrzeń wewnątrz podziału została zamieniona na C^c(po prostu wyglądać fajnie).
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]]`

To moja pierwsza próba na CodeGolf.

CL
źródło
Witamy w PPCG. To niezła próba pierwszego golfa! Dodałem trochę cukru do twojego postu, poprawiając formatowanie i takie tam.
Optymalizator
2

Pyth, 126 bajtów

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"

To wydaje mi się bardzo długie ... no cóż.

kirbyfan64sos
źródło
8
Istnieje rozwiązanie Python krótsze niż: P
orlp
@orlp Wiem, wiem ...
kirbyfan64sos
2

R, 150 144 141 bajtów

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

Wcięte, z nowymi liniami:

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

Stosowanie:

> 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

Dzięki @AlexA. & @MickyT. !

plannapus
źródło
Dobra robota. Możesz zapisać bajt za pomocą as.double()zamiast as.numeric().
Alex A.
Myślę, że switchoświadczenie może być wykonane c(x,x-273.15,5*(x-32)/9)[i]dla 4 znaków
MickyT
Dzięki! Właściwie przed wersją 3.0 mogłem go bardziej skrócić za pomocą as.real () zamiast as.numeric (), ale funkcja jest teraz nieczynna.
plannapus
Kolejna oszczędność byłoby zastąpienie as.double(a[1])z 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")))

Dziękuję Optimizer i Ismael Miguel za pomoc w grze w golfa.

SuperJedi224
źródło
1
Można zaoszczędzić kilka bajtów przez konwersję if elsedo?:
Optymalizator
1
Możesz zaoszczędzić jeszcze kilka, łącząc swoją if ... return; return ?:zreturn ?: ?:
Daniel
1
Można zapisać 1 bajt wymianie a=prompt().split(" "),e=273.15,f=1.8;alert([...]z a=prompt(e=273.15,f=1.8).split(" "),alert([...]. Możesz także usunąć spacje za urządzeniem. Również usunięcie returni przesunięcie funkcji alertwewnątrz znacznie zredukowało! I zamiast ustawienia a, po prostu użyj apply()metody z podziałem. Ale tutaj przejść: (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 bajtów ( -21 bajtów). Zadzwoń do mnie na czacie, jeśli masz wątpliwości.
Ismael Miguel
1
I tak właśnie spadłem do 162.
SuperJedi224
1
Masz rację, brakowało mi niektórych miejsc. Dziękuję za zwrócenie na to uwagi.
SuperJedi224
2

Mathematica, 66

Mam nadzieję, że tym razem poprawię.

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

Przykład

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

310,15 K

98,6 F

Mr.Wizard
źródło
OP stwierdził w komentarzu, że „Musisz wyprowadzać tylko dwa pozostałe formaty”.
lirtosiast
@Thomas To i inne problemy (miejmy nadzieję) naprawione. Niezbyt dobrze, ale tracę zainteresowanie.
Mr.Wizard
1

Excel, 239 bajtów

=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 bajtów służy do oddzielenia wartości i jednostki. Czy ktoś zna lepsze rozwiązanie?

Wernisch
źródło