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.
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.
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.
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 Celsius
K para Kelvin
F para Fahrenheit
Este é o código-golfe, pelo que ganha a entrada mais curta em bytes! Golfe feliz!
Presumo que as saídas possam estar em qualquer ordem. É aceitável a saída dos três formatos, por exemplo 23C\n73.4F\n296.15K ? ou o formato de entrada deve ser suprimido?
@steveverrill o bit do pedido é mencionado na seção de saída. Você só precisa produzir os outros dois formatos.
Sobre a precisão da saída: 2/3=> 0.666666666666é preciso até os 4 dígitos? (Eu diria que sim). Ou deveria ser 0.6667?
— Edc65 25/05
@ edc65 0.666666666666está correto. Eu estou aplicando uma precisão baseada em arredondamento. assim 0.6666é a alternativa.
@ Dennis na saída, não há regra para imprimir o espaço ou não. Mas estará presente na entrada.
Executa as conversões em uma ordem rotativa K -> F -> C -> Kduas vezes.
Tenho que amar 'FCK'[u].
Haha que diabos, pessoal. Voto a favor da pergunta e das respostas, não do meu comentário idiota. : P
JavaScript ( ES6 ), 127 130 132 bytes
Esperando 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.
Recebe entrada dos argumentos da linha de comando.
Formatado e levemente sem golfe:
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.
Deslocamento múltiplo da unidade
K 5 273,15
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.
Unidade Asc A% 2 Mult A% 7 A% 7% 3 Deslocamento
K 75 1 5 5 2 273,15
Isso parece promissor. Mais um fato útil: os índices em Pip envolvem. Portanto, na verdade, não precisamos do %3tempo que estivermos indexando em algo de comprimento 3. Definir o:[32 0 273.15]e usar (o (Ab)%7)fará o truque. ( Aobté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 tno "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 .)
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.
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.
Algumas explicações / observações:
Isso é baseado em tabelas de pesquisa f e dconté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).
Se ufor a unidade de entrada, u / 5 - 13mapeia Cpara 0, Fpara 1 eK para 2.
A entrada é sempre convertida para Celsius.
O loop itera sobre as duas unidades que não são a entrada e converte o valor Celsius nessa unidade.
A versão golfed usa uma intvariável em vez de uma charvariável para receber a scanf()entrada. Essa é uma incompatibilidade de tipo, que só produzirá resultados corretos em pequenas máquinas endian (que são quase todas elas atualmente).
Encurtado para 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;}. Ganhou um pouco com menos variáveis, movendo o código. Nova suposição é argc = 1 (j = 1). u = u/4 & 3.
— domen 27/05
Eu vi a solução Python 3 quando estava prestes a postar isso, mas sei lá, estou apenas praticando golfe.
Teste- me .
Seria bom jogar mais dois personagens para entrar no top 10 ...
Bem, tecnicamente, com base nas regras, não precisa haver espaços entre a unidade e a temperatura na saída. Pelo meu cálculo que economiza 3 bytes.
Bom ponto :-) Eu também encontrei uma maneira de reutilizar uma variável, o que economiza outro punhado.
Solução de 135 bytes de comprimento: sandbox.onlinephpfunctions.com/code/… . Basicamente: removeu \ne 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!=Kpor $u^Ke $u!=Fcom $u^F. Se $uestiver K, a execução $u^Kretornará uma string vazia, que é um valor falso. Além disso, seu espaço dentro da divisão foi convertido em C^c(apenas para parecer legal).
Esta é minha primeira tentativa no CodeGolf.
Bem-vindo ao PPCG. Esta é uma boa tentativa para o primeiro golfe! Eu adicionei um pouco de açúcar ao seu post, corrigindo a formatação e outras coisas.
Isso parece muito longo para mim ... tudo bem.
Existe uma solução Python mais curta que essa: P
— orlp 25/05
@orlp Eu sei, eu sei ...
Graças a @AlexA. & @MickyT. !
Bom trabalho. Você pode salvar um byte usando em as.double()vez de as.numeric().
Eu acho que a switchdeclaração pode ser feito com c(x,x-273.15,5*(x-32)/9)[i]para 4 personagens
Obrigado! Na verdade, antes da versão 3.0, eu poderia reduzi-lo mais com as.real () em vez de as.numeric (), mas a função está desativada agora.
— Plannapus 27/05
Outra economia seria substituir as.double(a[1])por scan(t=a[1]).
Javascript, 206 193 187 175 162 159 159 156
Agradeço ao Optimizer e Ismael Miguel por me ajudarem a jogar um pouco mais.
Você pode salvar alguns bytes convertendo if elsepara?:
Você pode economizar um pouco mais, combinando o seu if ... return; return ?:com umreturn ?: ?:
Você pode salvar 1 byte substituindo a=prompt().split(" "),e=273.15,f=1.8;alert([...]por a=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, remover returne mover a parte alertinterna da função reduziu muito! E, em vez de definir a, basta usar o apply()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.
Eu apenas reduzi para 162 de qualquer maneira.
Você está certo, eu perdi alguns dos espaços. Obrigado por apontar isso.
Esperançosamente corrija este tempo.
O OP disse em um comentário que "você só precisa produzir os outros dois formatos".
@ Thomas: Esse e outros problemas (espero) foram corrigidos. Não é muito bom, mas estou perdendo o interesse.