Ini adalah tantangan berukuran byte di mana Anda harus mengubah suhu input di salah satu dari tiga unit (Celcius, Kelvin, dan Fahrenheit) ke dua lainnya.
Memasukkan
Anda akan diberikan suhu sebagai angka diikuti oleh unit (dipisahkan oleh ruang). Suhu dapat berupa bilangan bulat atau angka titik apung (23 vs 23.0 atau 23.678).
Anda dapat mengirimkan fungsi atau program lengkap yang membaca string yang dipisahkan spasi dari argumen STDIN / ARGV / function atau yang setara terdekat dan mencetak output ke STDOUT atau setara terdekat.
Keluaran
Output Anda harus menjadi suhu yang dikonversi ke dua format lainnya, dipisahkan oleh baris baru dan diikuti oleh karakter unit yang sesuai pada setiap baris (secara opsional dipisahkan oleh spasi). Urutan kedua unit tidak masalah.
Keluaran presisi
- Angka yang dikonversi harus akurat ke setidaknya 4 tempat desimal tanpa pembulatan.
- Membuntuti nol atau tempat desimal adalah opsional selama 4 tempat desimal pertama (tanpa pembulatan) akurat. Anda juga dapat melewati 4 nol dan / atau titik desimal jika jawaban sebenarnya memiliki 4 nol setelah titik desimal.
- Seharusnya tidak ada nol terkemuka
- Format angka apa pun dapat diterima selama memenuhi tiga persyaratan di atas.
Representasi unit
Unit suhu hanya dapat menjadi salah satu dari yang berikut:
C
untuk CelciusK
untuk KelvinF
untuk Fahrenheit
Contohnya
Memasukkan:
23 C
Keluaran:
73.4 F
296.15 K
Memasukkan:
86.987 F
Keluaran:
303.6983 K
30.5483 C
Memasukkan:
56.99999999 K
Keluaran:
-216.1500 C
-357.0700 F
Ini adalah kode-golf sehingga entri terpendek dalam byte menang! Selamat Golf!
Papan peringkat
<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>
sumber
23C\n73.4F\n296.15K
? atau haruskah format input ditekan?2/3
=>0.666666666666
apakah akurat untuk digit ke-4? (Aku akan mengatakan YA). Atau haruskah demikian0.6667
?0.666666666666
benar. Saya menegakkan presisi berbasis pembulatan. begitu0.6666
juga alternatifnya.Jawaban:
CJam,
77656059555452 byteCobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
Python 3,
118116 byteMelakukan konversi dalam urutan putar
K -> F -> C -> K
dua kali.sumber
'FCK'[u]
.JavaScript ( ES6 ), 127
130 132byteMenunggu jawaban bahasa Spanyol yang menakjubkan, saya tidak menemukan banyak hal untuk bermain golf di sini.
Menggunakan string template, 3 baris baru signifikan dan dihitung.
Jalankan cuplikan di Firefox untuk menguji.
sumber
Pip,
5857 byteMengambil input dari argumen baris perintah.
Diformat dan sedikit tidak diserap:
Penjelasan:
Rumus konversi umum antara unit 1 dan unit 2 adalah
temp2 = (temp1 - offset1) * mult2 / mult1 + offset2
. Offset bisa menjadi nol mutlak atau ke suhu nyaman lainnya; mari gunakan 0 ° C.Kami akan membuat daftar nilai-nilai ini dan mengindeksnya berdasarkan unit mana yang kami hadapi. Pip tidak memiliki array / hash / kamus asosiatif, jadi kita perlu mengubah karakter menjadi indeks integer. Mungkin akan ada pola yang membantu dengan nilai-nilai ASCII.
Ini terlihat menjanjikan. Satu fakta yang lebih berguna: indeks di Pip membungkus. Jadi kita tidak benar-benar membutuhkan
%3
selama kita mengindeks menjadi sesuatu yang panjang 3. Mendefinisikano:[32 0 273.15]
dan menggunakan(o (Ab)%7)
akan melakukan trik. (A
mendapatkan nilai ASCII karakter.(l i)
Sintaks digunakan untuk mengindeks ke iterables, serta untuk panggilan fungsi.)Untuk pengganda, kita hanya perlu dua angka 9 dan 5. Karena angka sama dengan string dalam Pip, dan dengan demikian dapat diindeks, mendapatkan pengganda itu sesederhana
95@Ab
(menggunakan metode pengindeksan lainnya,@
operator).Menggunakan fitur-fitur pemrograman array Pip, kita dapat menyimpan karakter melalui metode naif:
Akhirnya, tambahkan offset untuk unit baru, gabungkan spasi dan simbol unit baru di ujungnya, dan cetak.
Kami melakukan ini untuk setiap
t
di"CFK" RM b
, sehingga mengkonversi ke setiap unit kecuali aslinya.Doa contoh:
(Untuk lebih lanjut tentang Pip, lihat repositori .)
sumber
dc, 102 byte
Saya cukup yakin ini bisa bermain golf lebih banyak, tapi ini awal:
dc nyaris tidak membuat nilai yang satu ini. Khususnya penanganan string dc tidak benar-benar sesuai dengan pekerjaan. Tapi yang perlu kita lakukan adalah membedakan antara "C", "F" dan "K". Untungnya dc mem-parsing "C" dan "F" sebagai angka hex 12 dan 15. Dan untuk "K" itu hanya menyisakan 0 pada stack.
Keluaran:
sumber
C, 160 byte
Ini berbunyi dari stdin. Tidak ada presisi keluaran yang ditentukan, sehingga mencetak apa pun yang
printf()
terasa seperti pencetakan, yang sebagian besar lebih dari 4 digit.Versi tidak disatukan:
Beberapa penjelasan / komentar:
f
dand
yang mengandung faktor multiplikasi dan offset untuk mengkonversi Celsius ke unit lain (termasuk Celsius sendiri, untuk menghindari kasus khusus).u
adalah unit input,u / 5 - 13
petakanC
ke 0,F
ke 1, danK
ke 2.int
variabel, bukanchar
variabel untuk menerimascanf()
input. Ini adalah tipe ketidakcocokan, yang hanya akan menghasilkan hasil yang benar pada mesin endian kecil (yang hampir semuanya saat ini).sumber
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;}
. Memperoleh sedikit dengan lebih sedikit variabel, memindahkan kode. Asumsi baru adalah argc = 1 (j = 1).u = u/4 & 3
.Python 2, 168 Bytes
Saya melihat solusi Python 3 tepat ketika saya akan memposting ini, tapi apa pun, saya hanya berlatih bermain golf.
Tidak Disatukan:
sumber
Perl,
85 8076Ujilah aku .
sumber
PHP,
161153http://3v4l.org/CpvG7
Akan menyenangkan untuk bermain golf dua karakter lagi untuk masuk sepuluh besar ...sumber
\n
dan berubah menjadi baris baru yang nyata, dikonversi menjadi program lengkap (menerima data melalui GET, misalnyahttp://localhost/my_file.php?t=<temperature>
:) dan diganti$u!=K
dengan$u^K
dan$u!=F
dengan$u^F
. Jika$u
adalahK
, berjalan$u^K
akan mengembalikan string kosong, yang merupakan nilai falsy. Selain itu, ruang Anda di dalam pemisahan diubah menjadiC^c
(Hanya agar terlihat keren).Python 2, 167
Ini adalah percobaan pertama saya di CodeGolf.
sumber
Pyth, 126 byte
Ini terasa sangat lama bagi saya ... oh well.
sumber
R,
150144141 byteDiindentasi, dengan baris baru:
Pemakaian:
Terima kasih kepada @AlexA. & @MickyT. !
sumber
as.double()
daripadaas.numeric()
.switch
pernyataan itu dapat dilakukanc(x,x-273.15,5*(x-32)/9)[i]
untuk 4 karakteras.double(a[1])
denganscan(t=a[1])
.Javascript,
206193187175162159156Terima kasih kepada Pengoptimal dan Ismael Miguel karena telah membantu saya bermain golf sedikit lebih jauh.
sumber
if
else
ke?:
if ... return; return ?:
kereturn ?: ?:
a=prompt().split(" "),e=273.15,f=1.8;alert([...]
dengana=prompt(e=273.15,f=1.8).split(" "),alert([...]
. Anda juga dapat menghapus spasi setelah unit. Juga, menghapusreturn
dan memindahkan bagianalert
dalam fungsi berkurang banyak! Dan alih-alih pengaturana
, cukup gunakanapply()
metode dengan split. Tapi ini dia(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 saya dalam obrolan jika Anda ragu.Mathematica, 66
Semoga koreksi kali ini.
Contoh
sumber
Excel, 239 byte
112 byte yang digunakan untuk memisahkan Value dan Unit. Adakah yang tahu solusi yang lebih baik?
sumber