Bộ chuyển đổi nhiệt độ


38

Đây là một thách thức có kích thước byte trong đó bạn phải chuyển đổi nhiệt độ đầu vào theo một trong ba đơn vị (Celsius, Kelvin và Fahrenheit) sang hai đơn vị khác.

Đầu vào

Bạn sẽ được cung cấp nhiệt độ dưới dạng một số theo sau là một đơn vị (cách nhau bởi khoảng trắng). Nhiệt độ có thể là số nguyên hoặc số dấu phẩy động (23 so với 23.0 hoặc 23.678).

Bạn có thể gửi một hàm hoặc một chương trình đầy đủ để đọc chuỗi được phân tách bằng dấu cách từ đối số hàm STDIN / ARGV / hoặc tương đương gần nhất và in đầu ra thành STDOUT hoặc tương đương gần nhất.

Đầu ra

Đầu ra của bạn phải là nhiệt độ được chuyển đổi sang hai định dạng khác, được phân tách bằng một dòng mới và theo sau là ký tự đơn vị tương ứng trên mỗi dòng (tùy chọn cách nhau bởi một khoảng trắng). Thứ tự của hai đơn vị không quan trọng.

Độ chính xác đầu ra

  • Số được chuyển đổi phải chính xác đến ít nhất 4 chữ số thập phân mà không làm tròn.
  • Số 0 hoặc vị trí thập phân là tùy chọn miễn là 4 vị trí thập phân đầu tiên (không làm tròn) là chính xác. Bạn cũng có thể bỏ qua 4 số 0 và / hoặc dấu thập phân trong trường hợp câu trả lời thực tế có 4 số 0 sau dấu thập phân.
  • Không nên có bất kỳ số 0 hàng đầu nào
  • Bất kỳ định dạng số nào cũng được chấp nhận miễn là nó đáp ứng ba yêu cầu trên.

Đại diện đơn vị

Đơn vị nhiệt độ chỉ có thể là một trong những điều sau đây:

  • C cho Celsius
  • K cho Kelvin
  • F cho Fahrenheit

Ví dụ

Đầu vào:

23 C

Đầu ra:

73.4 F
296.15 K

Đầu vào:

86.987 F

Đầu ra:

303.6983 K
30.5483 C

Đầu vào:

56.99999999 K

Đầu ra:

-216.1500 C
-357.0700 F

Đây là để mục nhập ngắn nhất trong byte thắng! Chúc bạn chơi golf vui vẻ!

Bảng xếp hạng

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


Tôi giả sử các đầu ra có thể theo thứ tự bất kỳ. Có thể chấp nhận cho cả ba định dạng là đầu ra không, ví dụ 23C\n73.4F\n296.15K ? hoặc phải định dạng đầu vào được nén?
Cấp sông St

@steveverrill bit thứ tự được đề cập trong phần đầu ra. Bạn phải chỉ xuất hai định dạng khác.
Tối ưu hóa

Về độ chính xác đầu ra: 2/3=> 0.666666666666có chính xác đến chữ số thứ 4 không? (Tôi sẽ nói CÓ). Hay là nó nên 0.6667?
edc65

@ edc65 0.666666666666là đúng. Tôi đang thi hành một độ chính xác không làm tròn. vậy 0.6666là thay thế.
Tối ưu hóa

1
@Dennis trong đầu ra, không có quy tắc để in không gian hay không. Nhưng nó sẽ có mặt trong đầu vào.
Tối ưu hóa

Câu trả lời:


13

CJam, 77 65 60 59 55 54 52 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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 byte

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)

Thực hiện các chuyển đổi theo thứ tự quay K -> F -> C -> Khai lần.


43
Phải yêu 'FCK'[u].
Alex A.

11
Haha cái quái gì thế, các bạn. Upvote câu hỏi và câu trả lời, không phải bình luận ngu ngốc của tôi. : P
Alex A.

10

JavaScript ( ES6 ), 127 130 132 byte

Chờ đợi một số câu trả lời tuyệt vời về ngôn ngữ, tôi không tìm thấy nhiều ở đây.

Sử dụng chuỗi mẫu, 3 dòng mới có ý nghĩa và được tính.

Chạy đoạn trích trong Firefox để kiểm tra.

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 byte

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

Lấy đầu vào từ các đối số dòng lệnh.

Định dạng và hơi vô căn cứ:

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

Giải trình:

Công thức chuyển đổi chung giữa đơn vị 1 và đơn vị 2 là temp2 = (temp1 - offset1) * mult2 / mult1 + offset2. Độ lệch có thể bằng 0 tuyệt đối hoặc với bất kỳ nhiệt độ thuận tiện nào khác; hãy sử dụng 0 ° C.

Đơn vị đa bù
C 5 0     
K 5 273,15
F 9 32    

Chúng tôi sẽ xây dựng danh sách các giá trị này và lập chỉ mục cho chúng dựa trên đơn vị chúng tôi đang xử lý. Pip không có mảng / băm / từ điển kết hợp, vì vậy chúng ta cần chuyển đổi các ký tự thành các chỉ số nguyên. Có thể sẽ có các mẫu hữu ích với các giá trị ASCII.

Đơn vị 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

Điều này có vẻ đầy hứa hẹn. Một thực tế hữu ích hơn: các chỉ số trong Pip quấn quanh. Vì vậy, chúng tôi thực sự không cần %3miễn là chúng tôi lập chỉ mục vào thứ gì đó có độ dài 3. Xác định o:[32 0 273.15]và sử dụng (o (Ab)%7)sẽ thực hiện thủ thuật. ( Alấy giá trị ASCII của một ký tự. (l i)Cú pháp được sử dụng để lập chỉ mục thành các lần lặp, cũng như cho các lệnh gọi hàm.)

Đối với các số nhân, chúng ta chỉ cần hai số 9 và 5. Vì các số giống như các chuỗi trong Pip, và do đó có thể lập chỉ mục, nên việc nhân số này đơn giản như 95@Ab(sử dụng phương pháp lập chỉ mục khác, @toán tử).

Sử dụng các tính năng lập trình mảng của Pip, chúng ta có thể lưu một ký tự qua phương thức ngây thơ:

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

Cuối cùng, thêm phần bù cho đơn vị mới, ghép một khoảng trắng và ký hiệu của đơn vị mới vào cuối và in.

Chúng tôi làm điều này cho mỗi ttrong "CFK" RM b, do đó chuyển đổi sang từng đơn vị ngoại trừ bản gốc.

Yêu cầu mẫu:

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

(Để biết thêm về Pip, xem kho lưu trữ .)


6

dc, 102 byte

Tôi khá chắc chắn rằng điều này có thể được chơi gôn nhiều hơn, nhưng đây là một sự khởi đầu:

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 hầu như không làm cho lớp trên này. Cụ thể xử lý chuỗi dc không thực sự phụ thuộc vào công việc. Nhưng tất cả những gì chúng ta cần làm là phân biệt giữa "C", "F" và "K". May mắn thay, dc phân tích "C" và "F" dưới dạng các chữ số hex 12 và 15. Và cho "K", nó chỉ để lại 0 trên ngăn xếp.

Đầu ra:

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

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

Điều này đọc từ stdin. Không có độ chính xác đầu ra được chỉ định, do đó, nó in bất cứ thứ gì printf()cảm thấy như in, mà chủ yếu là hơn 4 chữ số.

Phiên bản bị đánh cắp:

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

Một số giải thích / nhận xét:

  • Điều này dựa trên các bảng tra cứu fdcó chứa các yếu tố nhân và độ lệch để chuyển đổi Celsius sang bất kỳ đơn vị nào khác (bao gồm cả chính Celsius, để tránh các trường hợp đặc biệt).
  • Nếu ulà đơn vị đầu vào, u / 5 - 13ánh xạ Cthành 0, Fđến 1 và K2.
  • Đầu vào luôn được chuyển đổi thành Celsius.
  • Vòng lặp lặp qua hai đơn vị không phải là đầu vào và chuyển đổi giá trị Celsius thành đơn vị đó.
  • Phiên bản golf sử dụng một intbiến thay vì một charbiến để nhận scanf()đầu vào. Đây là một kiểu không phù hợp, sẽ chỉ tạo ra kết quả chính xác trên các máy endian nhỏ (gần như tất cả chúng ngày nay).

Rút ngắn xuống 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;}. Đạt được một chút với ít biến số hơn, di chuyển mã xung quanh. Giả định mới là argc = 1 (j = 1). u = u/4 & 3.
Domen

4

Python 2, 168 byte

Tôi đã thấy giải pháp Python 3 giống như khi tôi chuẩn bị đăng bài này, nhưng dù sao đi nữa, tôi chỉ đang tập 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"]

Ung dung:

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

Kiểm tra tôi .


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

Sẽ rất tuyệt nếu chơi golf thêm hai nhân vật để lọt vào top 10 ...


Về mặt kỹ thuật, dựa trên các quy tắc, không cần phải có khoảng cách giữa thiết bị và nhiệt độ ở đầu ra. Theo tính toán của tôi mà tiết kiệm được 3 byte.
Kade

Điểm hay :-) Tôi cũng tìm thấy một cách để sử dụng lại một biến, giúp tiết kiệm một số ít khác.
Stephen

Giải pháp dài 135 byte: sandbox.onlinephpfifts.com/code/ ,. Về cơ bản: loại bỏ \nvà thay đổi thành dòng mới thực sự, được chuyển đổi thành một chương trình đầy đủ (nhận dữ liệu qua GET, ví dụ http://localhost/my_file.php?t=<temperature>:) và được thay thế $u!=Kbằng $u^K$u!=Fbằng $u^F. Nếu $uK, chạy $u^Ksẽ trả về một chuỗi rỗng, đó là một giá trị giả. Ngoài ra, không gian của bạn bên trong phần tách được chuyển đổi thành C^c(Chỉ để trông thật ngầu).
Ismael Miguel

3

Con tră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]]`

Đây là lần thử đầu tiên của tôi trên CodeGolf.


Chào mừng đến với PPCG. Đây là một nỗ lực tốt đẹp cho golf đầu tiên! Tôi đã thêm một số đường vào bài viết của bạn bằng cách sửa định dạng và công cụ.
Trình tối ưu hóa

2

Bình thường, 126 byte

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"

Điều này cảm thấy thực sự dài đối với tôi ... oh tốt.


8
Có một giải pháp Python ngắn hơn thế này: P
orlp

@orlp Tôi biết, tôi biết ...
kirbyfan64sos

2

R, 150 144 141 byte

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

Được thụt lề, với các dòng mới:

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

Sử dụng:

> 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

Cảm ơn @AlexA. & @MickyT. !


Công việc tốt đẹp. Bạn có thể lưu một byte bằng cách sử dụng as.double()chứ không phải as.numeric().
Alex A.

Tôi nghĩ rằng switchtuyên bố có thể được thực hiện với c(x,x-273.15,5*(x-32)/9)[i]4 ký tự
MickyT

Cảm ơn! Trên thực tế, trước phiên bản 3.0, tôi có thể rút ngắn nó nhiều hơn với as.real () thay vì as.numeric (), nhưng chức năng hiện không còn tồn tại.
plannapus

Một tiết kiệm khác sẽ được thay thế as.double(a[1])bằng 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")))

Cảm ơn đến Trình tối ưu hóa và Ismael Miguel đã giúp tôi chơi gôn thêm một chút.


1
Bạn có thể lưu một vài byte bằng cách chuyển đổi if elsethành?:
Trình tối ưu hóa

1
Bạn có thể tiết kiệm thêm một chút bằng cách kết hợp của bạn if ... return; return ?:vớireturn ?: ?:
Daniel

1
Bạn có thể lưu 1 byte thay thế a=prompt().split(" "),e=273.15,f=1.8;alert([...]bằng a=prompt(e=273.15,f=1.8).split(" "),alert([...]. Ngoài ra, bạn có thể loại bỏ các khoảng trắng sau đơn vị. Ngoài ra, loại bỏ returnvà di chuyển alertbên trong chức năng giảm rất nhiều! Và thay vì thiết lập a, chỉ cần sử dụng apply()phương thức với phần tách. Nhưng ở đây bạn đi : (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 byte ( -21 byte). Ping tôi trong cuộc trò chuyện nếu bạn có nghi ngờ.
Ismael Miguel

1
Tôi chỉ nhận được nó xuống 162 dù sao.
SuperJedi224

1
Bạn nói đúng, tôi đã bỏ lỡ một số không gian. Cảm ơn bạn đã chỉ ra rằng.
SuperJedi224

2

Toán học, 66

Hy vọng chính xác thời gian này.

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

Thí dụ

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

310,15 K

98,6 F


OP nói trong một bình luận rằng "Bạn phải chỉ xuất ra hai định dạng khác."
lirtosiast

@Thomas Điều đó và các vấn đề khác (hy vọng) đã được sửa. Không tốt lắm nhưng tôi đang mất hứng thú.
Mr.Wizard

1

Excel, 239 byte

=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 byte trong số đó được sử dụng để phân tách Giá trị và Đơn vị. Bất cứ ai cũng biết một giải pháp tốt hơn?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.