Перетворювач температури


38

Це виклик розміром в байтах, коли вам потрібно перетворити вхідну температуру в одному з трьох одиниць (Цельсій, Кельвін і Фаренгейт) в інші два.

Вхідні дані

Вам буде надана температура як число, за яким слід одиниця (розділена пробілом). Температура може бути цілим чи числом з плаваючою точкою (23 проти 23,0 або 23,678).

Ви можете подати функцію або повну програму, яка читає розділений пробілом рядок з аргументу STDIN / ARGV / функції або найближчого еквівалента та друкує вихід у STDOUT або найближчий еквівалент.

Вихідні дані

Вихід повинен бути температурою, перетвореною на два інші формати, розділені новою лінією та подальшим відповідним символом одиниці в кожному рядку (необов'язково розділеним пробілом). Порядок двох одиниць значення не має.

Вихідна точність

  • Перетворене число повинно бути точним принаймні до 4 знаків після коми, без округлення.
  • Кінцеві нулі або десяткові знаки необов’язкові до тих пір, поки перші 4 десяткових знаки (без округлення) точні. Ви також можете пропустити 4 нулі та / або десяткову точку, якщо фактична відповідь має 4 нулі після десяткової крапки.
  • Провідні нулі не повинні бути
  • Будь-який формат чисел прийнятний до тих пір, поки він відповідає вищевказаним трьом вимогам.

Представлення підрозділу

Одиниця температури може бути лише однією з таких:

  • C за Цельсієм
  • K для Кельвіна
  • F для Фаренгейта

Приклади

Вхід:

23 C

Вихід:

73.4 F
296.15 K

Вхід:

86.987 F

Вихід:

303.6983 K
30.5483 C

Вхід:

56.99999999 K

Вихід:

-216.1500 C
-357.0700 F

Це тому найкоротший запис у байтах виграє! Щасливого гольфу!

Таблиця лідерів

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


Я припускаю, що результати можуть бути в будь-якому порядку. Чи прийнятно, наприклад, для виведення всіх трьох форматів 23C\n73.4F\n296.15K ? чи повинен бути придушений формат введення?
Рівень Св. Св

@steveverrill біт замовлення згадується у вихідному розділі. Вам потрібно вивести лише два інші формати.
Оптимізатор

Про точність виведення: 2/3=> 0.666666666666точна до 4-х цифр? (Я б сказав ТАК). Або це повинно бути 0.6667?
edc65

@ edc65 0.666666666666правильний. Я застосовую точність, що не базується на округленні. так 0.6666це альтернатива.
Оптимізатор

1
@ Деніс у виході, немає правила друкувати пробіл чи ні. Але він буде присутній у вхідних даних.
Оптимізатор

Відповіді:


13

CJam, 77 65 60 59 55 54 52 байт

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

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Як це працює

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 байт

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 -> Kдвічі.


43
Маю кохання 'FCK'[u].
Олексій А.

11
Ха-ха, чорт, хлопці. Обґрунтуйте питання та відповіді, а не мій німий коментар. : П
Олексій А.

10

JavaScript ( ES6 ), 127 130 132 байт

Очікуючи чудової відповіді на мовні, я не знайшов багато для гольфу тут.

Використовуючи рядок шаблону, 3 нові рядки є значущими і підраховуються.

Запустіть фрагмент у Firefox для тестування.

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

Піп, 58 57 байт

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

Приймає дані з аргументів командного рядка.

Відформатований і злегка неозорений:

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

Пояснення:

Загальна формула перетворення між блоком 1 і блоком 2 є temp2 = (temp1 - offset1) * mult2 / mult1 + offset2. Зсуви можуть бути до абсолютного нуля або до будь-якої іншої зручної температури; скористаємось 0 ° C.

Блок зсуву
C 5 0     
К 5 273.15
Ж 9 32    

Ми побудуємо списки цих значень та індексуємо їх на основі того, з якою одиницею маємо справу. У Pip немає асоціативних масивів / хешів / словників, тому нам потрібно перетворити символи в цілі індекси. Можливо, будуть корисні зразки зі значеннями ASCII.

Одиниця вибуху A% 2 Мульти A% 7 A% 7% 3 Зсув
C 67 1 5 4 1 0
К 75 1 5 5 2 273,15
F 70 0 9 0 0 32

Це виглядає перспективно. Ще один корисний факт: індекси в Pip обгортаються. Таким чином, насправді нам не потрібно до %3тих пір, поки ми індексуємо щось на тривалість 3. Визначення o:[32 0 273.15]та використання (o (Ab)%7)виконає трюк. ( Aотримує значення символу ASCII. (l i)Синтаксис використовується для індексації в ітерабелях, а також для викликів функцій.)

Для множників нам потрібні лише два числа 9 і 5. Оскільки числа є такими ж, як рядки в Pip, і, таким чином, піддаються індексації, отримати множник так само просто, як і 95@Ab(використовуючи інший метод індексації, @оператор).

Використовуючи функції програмування масиву Піпа, ми можемо зберегти персонаж через наївний метод:

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

Нарешті, додайте зміщення для нового блоку, об'єднайте пробіл та символ нового блоку на кінець та надрукуйте.

Ми робимо це для кожного tв "CFK" RM b, перетворюючи таким чином на кожен блок, крім оригіналу.

Зразок виклику:

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

(Докладніше про Pip див. У сховищі .)


6

постійного струму, 102 байти

Я впевнений, що на цьому можна більше пограти в гольф, але ось для початку:

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 ледве робить оцінку на цьому. Зокрема, обробка струн dc насправді не підходить до завдання. Але все, що нам потрібно зробити, - це розмежувати "C", "F" і "K". На щастя, dc розбирає "C" і "F" як шістнадцяткові цифри 12 і 15. І для "K" це просто залишає 0 на стеку.

Вихід:

$ 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 байт

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

Це читається з stdin. Не визначається точність виводу, тому він друкує все, що printf()відчуває, як друк, який в основному перевищує 4 цифри.

Негольована версія:

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

Деякі пояснення / зауваження:

  • Це засновано на довідкових таблиць fі dякий містить коефіцієнти множення і зміщення для перетворення градусів Цельсія в будь-який інший одиниці ( в тому числі сам по Цельсію, щоб уникнути особливих випадків).
  • Якщо uвхідний блок, u / 5 - 13відображається Cна 0, Fна 1 і Kна 2.
  • Вхід завжди перетворюється на Цельсій.
  • Цикл повторюється над двома одиницями, які не є входом, і перетворює значення Цельсія в цей блок.
  • Версія для гольфу використовує intзмінну замість charзмінної для отримання scanf()вводу. Це невідповідність типу, яка дасть правильні результати лише на маленьких ендіанських машинах (що майже всі вони в наші дні).

Скорочений до 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;}. Отримав трохи менше змінних, переміщуючи код. Нове припущення - argc = 1 (j = 1). u = u/4 & 3.
Домен

4

Пітон 2, 168 байт

Я бачив рішення Python 3 саме тоді, коли я збирався опублікувати це, але що б там не було, я просто займаюся гольфінгом.

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

Безголовки:

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

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

Було б добре пограти ще двома персонажами, щоб потрапити в першу десятку ...


Технічно, виходячи з правил, не повинно бути проміжків між блоком, а температура на виході. За моїм розрахунком, це економить 3 байти.
Каде

Хороший момент :-) Я також знайшов спосіб повторно використовувати змінну, що економить ще одну кучу.
Стівен

135 байт довжиною рішення: sandbox.onlinephpfunctions.com/code / ... . В основному: видалено \nта змінено на реальні нові рядки, перетворено на повну програму (отримання даних по GET, наприклад:) http://localhost/my_file.php?t=<temperature>та замінено $u!=Kна $u^Kі $u!=Fна $u^F. Якщо $uце так K, біг $u^Kповерне порожню рядок, що є помилковим значенням. Крім того, ваш простір усередині розколу був перетворений на C^c(Просто, щоб виглядати круто).
Ісмаїл Мігель

3

Пітон 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]]`

Це моя перша спроба на CodeGolf.


Ласкаво просимо до PPCG. Це приємна спроба найпершого гольфу! Я додав трохи цукру до вашої публікації, виправляючи форматування та інше.
Оптимізатор

2

Pyth, 126 байт

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"

Мені це здається дуже довго ... ну добре.


8
Є рішення Python коротше цього: P
orlp

@orlp Я знаю, я знаю ...
kirbyfan64sos

2

R, 150 144 141 байт

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

Відступ, з новими рядками:

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

Використання:

> 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 & @ MickyT. !


Хороша робота. Ви можете зберегти байт, використовуючи, as.double()а не as.numeric().
Олексій А.

Я думаю, що switchзаяву можна зробити c(x,x-273.15,5*(x-32)/9)[i]для 4 символів
MickyT

Спасибі! Насправді, до версії 3.0, я міг би скоротити її більше як as.real () замість as.numeric (), але функція зараз не працює.
планнапус

Ще одна економія була б заміною as.double(a[1])на 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")))

Дякуємо оптимізатору та Ісмаелю Мігелю за те, що вони допомагають мені трохи більше пограти.


1
Ви можете зберегти кілька байт шляхом перетворення if elseв?:
оптимізатор

1
Ви можете заощадити ще кілька, поєднавши свій if ... return; return ?:ізreturn ?: ?:
Даніель,

1
Ви можете зберегти 1 байт заміною a=prompt().split(" "),e=273.15,f=1.8;alert([...]на a=prompt(e=273.15,f=1.8).split(" "),alert([...]. Крім того, ви можете видалити пробіли після пристрою. Крім того, видалення returnта переміщення alertвсередині функції значно скоротилося! І замість налаштування aпросто використовуйте apply()метод із розділенням. Але тут ви йдете: (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 байт ( -21 байт). Пінг мені в чаті, якщо у вас є сумніви.
Ісмаїл Мігель

1
Я все одно це знизив до 162.
SuperJedi224

1
Ви маєте рацію, я пропустив деякі місця. Дякую, що вказали на це.
SuperJedi224

2

Математика, 66

Сподіваємось, виправте цього разу.

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

Приклад

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

310,15 К

98,6 F


У коментарі ОП заявило, що "Ви повинні виводити лише два інші формати".
ліртосіаст

@Thomas Це та інші проблеми (сподіваємось) виправлені. Не дуже добре, але я втрачаю інтерес.
Mr.Wizard

1

Excel, 239 байт

=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 байт, які використовуються для відокремлення Значення та Одиниці. Хтось знає краще рішення?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.