Sıcaklık dönüştürücü


38

Bu, üç birimden (Celsius, Kelvin ve Fahrenheit) bir giriş sıcaklığını diğer ikisine dönüştürmeniz gereken, bayt büyüklüğündeki bir zorluktur.

Giriş

Sayı olarak bir sıcaklık ve ardından bir birim (boşlukla ayrılmış) sağlanacaktır. Sıcaklık bir tam sayı veya kayan nokta sayısı olabilir (23 - 23.0 veya 23.678).

Boşluklu dizgiyi STDIN / ARGV / function argümanından veya en yakın eşdeğerinden okuyan ve çıktıyı STDOUT veya en yakın eşdeğerine basan bir işlev veya tam bir program gönderebilirsiniz.

Çıktı

Çıktınız, diğer iki formata dönüştürülen, yeni bir satırla ayrılmış ve ardından her satırdaki ilgili birim karakteriyle (isteğe bağlı olarak bir boşlukla ayrılmış) sıcaklık olmalıdır. İki birimin sırası önemli değil.

Çıkış hassasiyeti

  • Dönüştürülen sayı, yuvarlama olmadan en az 4 ondalık basamağa kadar doğru olmalıdır.
  • İzleyen sıfırlar veya ondalık basamaklar, ilk 4 ondalık basamak (yuvarlama olmadan) kesin olduğu sürece isteğe bağlıdır. Ayrıca, asıl yanıtın ondalık noktadan sonra 4 sıfır olması durumunda 4 sıfır ve / veya ondalık basamağı atlayabilirsiniz.
  • Önde gelen sıfır olmamalıdır
  • Yukarıdaki üç şartı yerine getirdiği sürece herhangi bir sayı biçimi kabul edilebilir.

Birim gösterimi

Sıcaklık birimi aşağıdakilerden yalnızca biri olabilir:

  • C Santigrat için
  • K Kelvin için
  • F Fahrenheit için

Örnekler

Giriş:

23 C

Çıktı:

73.4 F
296.15 K

Giriş:

86.987 F

Çıktı:

303.6983 K
30.5483 C

Giriş:

56.99999999 K

Çıktı:

-216.1500 C
-357.0700 F

Bu yani bayt cinsinden en kısa giriş kazanır! Mutlu Golf!

Liderler Sıralaması

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


Çıktıların herhangi bir sırada olabileceğini varsayıyorum. Örneğin, bu üç biçimin de çıkması kabul edilebilir 23C\n73.4F\n296.15K mi? veya giriş formatı bastırılmalı mı?
Level River St

@steveverrill, sipariş bölümünde çıktı bölümünde belirtilmiştir. Sadece diğer iki formatın çıktısını almanız gerekir.
Doktor,

Çıktı hassasiyeti hakkında: 2/3=> 0.6666666666664. basamak için doğru mu? (Evet diyebilirim). Yoksa öyle 0.6667mi olmalı ?
edc65

@ edc65 0.666666666666doğru. Yuvarlama işlemine dayalı olmayan bir hassasiyeti zorluyorum. böylece 0.6666bir alternatiftir.
Doktor,

1
@Dennis çıktıda, alanı yazdırmak ya da yazdırmamak için hiçbir kural yoktur. Ancak girdilerde bulunacaktır.
Doktor,

Yanıtlar:


13

CJam, 77 65 60 59 55 54 52 bayt

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

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

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 bayt

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)

Dönüşümleri K -> F -> C -> Kiki kere döner bir sırada gerçekleştirir .


43
Sevmelisin 'FCK'[u].
Alex A.

11
Haha ne halt ediyor beyler. Benim aptal yorumumu değil, soru ve cevapları oylayın. : P
Alex A.

10

JavaScript ( ES6 ), 127 130 132 bayt

Bazı şaşırtıcı esolanguage cevap bekliyorum, burada golf için fazla bir şey bulamadım.

Şablon dizesini kullanarak, 3 yeni satır önemli ve sayılır.

Test etmek için Firefox'ta snippet'i çalıştırın.

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 bayt

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

Komut satırı argümanlarından girdi alır.

Biçimlendirilmiş ve hafifçe 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

Açıklama:

Ünite 1 ve ünite 2 arasındaki genel dönüşüm formülüdür temp2 = (temp1 - offset1) * mult2 / mult1 + offset2. Dengeleme mutlak sıfır veya herhangi bir uygun sıcaklıkta olabilir; 0 ° C kullanalım.

Birim Çoklu Ofset
C5 0     
K 5 273.15
F 9 32    

Hangi değerlerle uğraştığımıza dayanarak bu değerlerin listelerini oluşturacağız ve bunlara endeksleyeceğiz. Pip'in ilişkisel dizileri / karmaları / sözlükleri yoktur, bu yüzden karakterleri tamsayı indekslerine dönüştürmemiz gerekir. Belki ASCII değerleri ile yararlı desenler olacaktır.

Birim Artan A% 2 Mult A% 7 A% 7% 3 Ofset
C 67 1 5 4 1 0
K 75 1 5 5 2 273.15
F 70 0 9 0 0 32

Bu umut verici görünüyor. Daha faydalı bir gerçek: Pip'in etrafındaki endeksler. Bu yüzden aslında %33 uzunluğundaki bir şeye endekslediğimiz sürece ihtiyacımız yok . Tanımlamak o:[32 0 273.15]ve kullanmak (o (Ab)%7)işe yarayacak. ( Abir karakterin ASCII değerini alır. (l i)Sözdizimi, fonksiyon çağrıları kadar yinelemelere indekslemek için kullanılır.)

Çarpanlar için, sadece 9 ve 5 numaralı iki sayıya ihtiyacımız var. Sayılar, Pip'deki dizelerle aynı olduğundan ve bu nedenle endekslenebilir olduğundan, çarpanın elde edilmesi 95@Ab(diğer dizin oluşturma yöntemini kullanarak, @operatör) kadar basittir .

Pip'in dizi programlama özelliklerini kullanarak, naif yöntemde bir karakter kaydedebiliriz:

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

Son olarak, yeni birim için ofseti ekleyin, bir boşluk ile yeni ünitenin sembolünü sonuna yapıştırın ve yazdırın.

Her için bunu tin "CFK" RM bböylelikle orijinal hariç her birime dönüştürerek,.

Örnek çağırma:

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

(Pip hakkında daha fazla bilgi için depoya bakın .)


6

dc, 102 bayt

Bunun daha çok golf oynayabileceğinden eminim, ama işte bir başlangıç:

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 bu konuda notu zorlaştırıyor. Spesifik olarak, dc string kullanımı gerçekten işe yaramaz. Fakat tek yapmamız gereken "C", "F" ve "K" arasında ayrım yapmak. Neyse ki dc, "C" ve "F" yi onaltılık rakamlar 12 ve 15 olarak ayrıştırır. Ve "K" için sadece yığında 0 bırakır.

Çıktı:

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

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

Bu stdin'den okuyor. Hiçbir çıktı hassasiyeti belirtilmez, bu nedenle printf()en fazla 4 basamaktan oluşan baskı gibi hissettiren her şeyi yazdırır .

Ungolfed versiyonu:

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

Bazı açıklamalar / açıklamalar:

  • Bu, arama tablolarına dayanmaktadır fve dSantigrat'ı başka bir birime (özel durumlardan kaçınmak için Celsius dahil) dönüştürmek için çarpım faktörlerini ve ofsetlerini içerir.
  • Eğer ugiriş birimidir, u / 5 - 13haritalar C, 0'a F1'e ve K2'ye.
  • Girdi her zaman Celsius'a dönüştürülür.
  • Döngü, girdi olmayan iki ünite üzerinde yinelenir ve Santigrat değerini o birime dönüştürür.
  • Golf edilen sürüm , girişi almak için bir intdeğişken yerine bir değişken kullanır . Bu, sadece küçük endian makinelerinde doğru sonuçlar üretecek bir tür uyuşmazlığıdır (bu günlerde neredeyse hepsi budur).charscanf()

152: 'ye kısaltıldı 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;}. Daha az değişkenle biraz kod kazandım, kod etrafta dolaştı. Yeni varsayım argc = 1'dir (j = 1). u = u/4 & 3.
domen

4

Python 2, 168 Bayt

Python 3'ün çözümünü tıpkı bunu göndermek üzereyken gördüm, ama her neyse, sadece golf alıyorum.

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

Beni test et .


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

İlk 10'a girebilmek için iki karakter daha atmak iyi olurdu ...


Teknik olarak, kurallara dayanarak, ünite ile çıktıdaki sıcaklığı arasında boşluk olması gerekmez. Benim hesaplamaya göre 3 bayt kaydeder.
Kade

İyi nokta :-) Ayrıca bir değişkeni tekrar kullanmanın bir yolunu buldum, bu da başka bir avuçtan tasarruf sağlıyor.
Stephen

135 bayt uzunluğunda bir çözüm: sandbox.onlinephpfunctions.com/code/… . Temel olarak: kaldırıldı \nve gerçek yeni satırlara dönüştürüldü, tam bir programa dönüştürüldü (verileri GET üzerinden aldı, örneğin:) http://localhost/my_file.php?t=<temperature>ve $u!=Kile $u^Kve $u!=File değiştirin $u^F. Eğer $ubir K, koşu $u^Kbir falsy değerdir boş bir dize döndürür. Ayrıca, bölmenin içindeki alanınız C^c(Sadece serin görünmek için) dönüştürüldü.
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]]`

Bu CodeGolf'taki ilk denemem.


PPCG'ye Hoşgeldiniz. Bu ilk golf için güzel bir girişim! Biçimlendirme ve işleri düzelterek gönderinize biraz şeker ekledim.
Doktor,

2

Pyth, 126 bayt

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"

Bu bana gerçekten çok uzun geliyor ... oh iyi.


8
Bundan daha kısa bir Python çözümü var: P
orlp

Biliyorum @orlp, biliyorum ...
kirbyfan64sos

2

R, 150 144 141 bayt

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

Yeni çizgilerle girintili:

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

Kullanımı:

> 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

@AlexA'ya teşekkürler. & @MickyT. !


İyi iş. Sen kullanarak bir bayt kaydedebilirsiniz as.double()ziyade as.numeric().
Alex A.

Bence switchaçıklama c(x,x-273.15,5*(x-32)/9)[i]4 karakterle yapılabilir
MickyT

Teşekkürler! Aslında, 3.0 sürümünden önce, as.numeric () yerine as.real () ile daha fazla kısaltabilirdim, ancak işlev artık geçersiz.
plannapus

Başka tasarruf yerine olurdu as.double(a[1])ile 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")))

Optimizer ve Ismael Miguel'e biraz daha golf atmama yardım ettiği için teşekkür ederim.


1
Sen dönüştürerek birkaç byte kaydedebilirsiniz if elseiçin?:
Optimizer

1
Eğer birleştirerek bir kaç kurtarabilecek if ... return; return ?:bir karşıreturn ?: ?:
Daniel

1
Sen 1 bayt yerine kaydedebilirsiniz a=prompt().split(" "),e=273.15,f=1.8;alert([...]ile a=prompt(e=273.15,f=1.8).split(" "),alert([...]. Ayrıca, üniteden sonraki boşlukları kaldırabilirsiniz. Ayrıca, işlevin içini çıkartmak returnve hareket ettirmek de büyük alertoranda azaldı! Ayar yapmak yerine a, apply()yöntemi yalnızca split ile kullanın . Ama burada gidin: (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 bayt ( -21 bayt). Şüphen varsa sohbete beni at.
Ismael Miguel,

1
Zaten 162'ye düşürdüm.
SuperJedi224

1
Haklısın, bazı alanları özledim. Bunu gösterdiğin için teşekkürler.
SuperJedi224

2

Mathematica, 66

Umarım bu sefer düzeltin.

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

Örnek

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

310,15 K

98,6 F


OP, “Diğer iki formatın sadece çıktısını almanız gerektiğini” yorumunda bulundu.
lirtosiast

@Tamam Bu ve diğer sorunlar (umarım) düzeltildi. Çok iyi değil ama ilgi kaybediyorum.
Sayın Sihirbaz

1

Excel, 239 bayt

=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 bayt, Değer ve Birimi ayırmak için kullanılır. Daha iyi bir çözüm bilen var mı?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.