Преобразователь температуры


38

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

вход

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

Вы можете передать функцию или полную программу, которая считывает разделенную пробелами строку из аргумента STDIN / ARGV / function или ближайшего эквивалента и печатает вывод в 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

Это поэтому выигрывает самая короткая запись в байтах! Счастливого гольфа!

Leaderboard

<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 ? или формат ввода должен быть подавлен?
Уровень Река St

@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
Хаха, какого черта, ребята. Поднимите вопрос и ответы, а не мой глупый комментарий. : P
Алекс А.

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
F 9 32    

Мы будем строить списки этих значений и индексировать их в зависимости от того, с какой единицей мы имеем дело. Pip не имеет ассоциативных массивов / хэшей / словарей, поэтому нам нужно преобразовать символы в целочисленные индексы. Возможно, будут полезные шаблоны со значениями ASCII.

Единица Asc A% 2 Mult 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(используя другой метод индексации, @оператор).

Используя возможности программирования массива в Pip, мы можем сохранить символ поверх наивного метода:

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

(Подробнее о Пипе см. В хранилище .)


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 едва делает оценку на этом. В частности, обработка строки постоянного тока не совсем подходит для работы. Но все, что нам нужно сделать, это провести различие между «С», «F» и «К». К счастью, 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]);}

Это читает со стандартного ввода. Точность вывода не указывается, поэтому она печатает все, 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

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

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

Проверь меня .


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^Krun вернет пустую строку, которая является ложным значением. Кроме того, ваше пространство внутри раскола было преобразовано в C^c(просто чтобы выглядеть круто).
Исмаэль Мигель

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

Это моя первая попытка на 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

@ или я знаю, я знаю ...
kirbyfan64sos

2

Р, 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 (), но функция теперь не работает.
plannapus

Другая экономия будет заменена 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


ОП сказал в комментарии, что «Вы должны только вывести два других формата».
lirtosiast

@Thomas Это и другие проблемы (надеюсь) исправлены. Не очень хорошо, но я теряю интерес.
мистер Волшебник

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.