Esse é um desafio de tamanho de byte, no qual é necessário converter uma temperatura de entrada em uma das três unidades (Celsius, Kelvin e Fahrenheit) nas outras duas.
Entrada
Você receberia uma temperatura como número seguido por uma unidade (separada por espaço). A temperatura pode ser um número inteiro ou um número de ponto flutuante (23 vs 23.0 ou 23.678).
Você pode enviar uma função ou um programa completo que leia a sequência separada por espaço do argumento STDIN / ARGV / function ou o equivalente mais próximo e imprima a saída em STDOUT ou equivalente mais próximo.
Saída
Sua saída deve ser a temperatura convertida nos outros dois formatos, separada por uma nova linha e seguida pelo caractere de unidade correspondente em cada linha (opcionalmente separado por um espaço). A ordem das duas unidades não importa.
Precisão de saída
- O número convertido deve ter precisão de pelo menos 4 casas decimais sem arredondamento.
- Zeros à direita ou casas decimais são opcionais, desde que as primeiras 4 casas decimais (sem arredondamento) sejam precisas. Você também pode pular os 4 zeros e / ou o ponto decimal, caso a resposta real tenha 4 zeros após o ponto decimal.
- Não deve haver zeros à esquerda
- Qualquer formato numérico é aceitável desde que cumpra os três requisitos acima.
Representação da unidade
A unidade de temperatura pode ser apenas um dos seguintes:
C
para CelsiusK
para KelvinF
para Fahrenheit
Exemplos
Entrada:
23 C
Saída:
73.4 F
296.15 K
Entrada:
86.987 F
Saída:
303.6983 K
30.5483 C
Entrada:
56.99999999 K
Saída:
-216.1500 C
-357.0700 F
Este é o código-golfe, pelo que ganha a entrada mais curta em bytes! Golfe feliz!
Entre os melhores
<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>
fonte
23C\n73.4F\n296.15K
? ou o formato de entrada deve ser suprimido?2/3
=>0.666666666666
é preciso até os 4 dígitos? (Eu diria que sim). Ou deveria ser0.6667
?0.666666666666
está correto. Eu estou aplicando uma precisão baseada em arredondamento. assim0.6666
é a alternativa.Respostas:
CJam,
77656059555452 bytesExperimente on-line no intérprete CJam .
Como funciona
fonte
Python 3,
118116 bytesExecuta as conversões em uma ordem rotativa
K -> F -> C -> K
duas vezes.fonte
'FCK'[u]
.JavaScript ( ES6 ), 127
130 132bytesEsperando por uma resposta esolíngüe incrível, não encontrei muito para jogar golfe aqui.
Usando a sequência de modelo, as três novas linhas são significativas e contadas.
Execute o snippet no Firefox para testar.
fonte
Pip,
5857 bytesRecebe entrada dos argumentos da linha de comando.
Formatado e levemente sem golfe:
Explicação:
A fórmula geral de conversão entre a unidade 1 e a unidade 2 é
temp2 = (temp1 - offset1) * mult2 / mult1 + offset2
. As compensações podem ser zero absoluto ou qualquer outra temperatura conveniente; vamos usar 0 ° C.Criaremos listas desses valores e os indexaremos com base na unidade com a qual estamos lidando. O Pip não possui matrizes / hashes / dicionários associativos, portanto, precisamos converter os caracteres em índices inteiros. Talvez haja padrões úteis com os valores ASCII.
Isso parece promissor. Mais um fato útil: os índices em Pip envolvem. Portanto, na verdade, não precisamos do
%3
tempo que estivermos indexando em algo de comprimento 3. Definiro:[32 0 273.15]
e usar(o (Ab)%7)
fará o truque. (A
obtém o valor ASCII de um caractere. A(l i)
sintaxe é usada para indexar em iterables, bem como para chamadas de função.)Para os multiplicadores, precisamos apenas dos dois números 9 e 5. Como os números são iguais às seqüências de caracteres no Pip e, portanto, são indexáveis, obter o multiplicador é tão simples quanto
95@Ab
(usando o outro método de indexação, o@
operador).Usando os recursos de programação de array do Pip, podemos salvar um caractere sobre o método ingênuo:
Por fim, adicione o deslocamento para a nova unidade, concatene um espaço e o símbolo da nova unidade no final e imprima.
Fazemos isso para cada
t
no"CFK" RM b
, convertendo, assim, para cada unidade, exceto o original.Chamada de amostra:
(Para mais informações sobre o Pip, consulte o repositório .)
fonte
dc, 102 bytes
Tenho certeza de que isso pode ser mais praticado, mas aqui está o começo:
dc mal faz a nota neste. Especificamente, o manuseio de string dc não é realmente adequado para o trabalho. Mas tudo o que precisamos fazer é diferenciar entre "C", "F" e "K". Felizmente, dc analisa "C" e "F" como números hexadecimais 12 e 15. E para "K", apenas deixa 0 na pilha.
Saída:
fonte
C, 160 bytes
Isto lê de stdin. Nenhuma precisão de saída é especificada; portanto, ela imprime o
printf()
que parecer ser de impressão, com mais de quatro dígitos.Versão não destruída:
Algumas explicações / observações:
f
ed
contém os fatores de multiplicação e as compensações para converter Celsius em qualquer outra unidade (incluindo o próprio Celsius, para evitar casos especiais).u
for a unidade de entrada,u / 5 - 13
mapeiaC
para 0,F
para 1 eK
para 2.int
variável em vez de umachar
variável para receber ascanf()
entrada. Essa é uma incompatibilidade de tipo, que só produzirá resultados corretos em pequenas máquinas endian (que são quase todas elas atualmente).fonte
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;}
. Ganhou um pouco com menos variáveis, movendo o código. Nova suposição é argc = 1 (j = 1).u = u/4 & 3
.Python 2, 168 bytes
Eu vi a solução Python 3 quando estava prestes a postar isso, mas sei lá, estou apenas praticando golfe.
Ungolfed:
fonte
Perl,
85 8076Teste- me .
fonte
PHP,
161153http://3v4l.org/CpvG7
Seria bom jogar mais dois personagens para entrar no top 10 ...fonte
\n
e mudou para novas linhas reais, convertido em um programa completo (recebendo os dados por GET, por exemplo:)http://localhost/my_file.php?t=<temperature>
e substituído$u!=K
por$u^K
e$u!=F
com$u^F
. Se$u
estiverK
, a execução$u^K
retornará uma string vazia, que é um valor falso. Além disso, seu espaço dentro da divisão foi convertido emC^c
(apenas para parecer legal).Python 2, 167
Esta é minha primeira tentativa no CodeGolf.
fonte
Pitão, 126 bytes
Isso parece muito longo para mim ... tudo bem.
fonte
R,
150144141 bytesRecuado, com novas linhas:
Uso:
Graças a @AlexA. & @MickyT. !
fonte
as.double()
vez deas.numeric()
.switch
declaração pode ser feito comc(x,x-273.15,5*(x-32)/9)[i]
para 4 personagensas.double(a[1])
porscan(t=a[1])
.Javascript,
206193187175162159 159156Agradeço ao Optimizer e Ismael Miguel por me ajudarem a jogar um pouco mais.
fonte
if
else
para?:
if ... return; return ?:
com umreturn ?: ?:
a=prompt().split(" "),e=273.15,f=1.8;alert([...]
pora=prompt(e=273.15,f=1.8).split(" "),alert([...]
. Além disso, você pode remover os espaços após a unidade. Além disso, removerreturn
e mover a partealert
interna da função reduziu muito! E, em vez de definira
, basta usar oapply()
método com a divisão. Mas aqui vai você(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 bytes ( -21 bytes). Ping me no chat, se você tiver dúvidas.Mathematica, 66
Esperançosamente corrija este tempo.
Exemplo
fonte
Excel, 239 bytes
112 bytes dos quais são usados para separar Valor e Unidade. Alguém conhece uma solução melhor?
fonte