Vivemos em uma era maravilhosa da tecnologia, onde podemos ter telas 8K lindamente detalhadas em nossas TVs e até telas 2K em nossos telefones para o nosso prazer de navegação móvel. Percorremos um longo caminho nos últimos anos em termos de tecnologia de tela.
Um dos produtos é um termo popularizado pela Apple, Retina . Isso se refere à densidade de pixels da tela em questão ser tão alta que, a uma distância de visualização de 10 a 12 polegadas, os pixels individuais não podem ser facilmente capturados.
Steve Jobs disse que a densidade de pixels em que isso ocorre é de aproximadamente 300 pixels por polegada , e eles começaram a empregar densidades de pixels nessa faixa em seus dispositivos com a palavra-chave Retina usada para publicidade.
A densidade de pixels pode ser calculada pela seguinte fórmula:
Onde d
é a diagonal da tela em polegadas, w
é o número de pixels no eixo horizontal e h
é o número de pixels no eixo vertical.
Sua tarefa
Para esta tarefa, você usará o padrão Retina para decidir quais produtos valem a pena comprar. Sendo o consumidor moderno que você é, quando compra dispositivos, deseja ter certeza de que está obtendo um bom produto, não um dispositivo dos anos 90! Como tal, você deseja criar um programa ou função que considere a largura, a altura e o comprimento diagonal da tela como parâmetros de entrada ou função e informa se uma determinada tela se qualifica como uma tela retina ( D > 300
) imprimindo na tela ou retornando .
Devido ao seu desprezo por dispositivos que não sejam da Retina, seu programa ou função será exibidoRetina!
quando o dispositivo for qualificado e Trash!
quando não for.
Você pode assumir que todos os números serão maiores que 0. Os valores de pixel para largura e altura sempre serão números inteiros. O tamanho da tela pode ser interpretado de qualquer forma, contanto que decimais. A entrada pode estar na ordem que você escolher e também pode estar em até 3 linhas separadas.
Exemplo de E / S
1920 1080 4.95 -> Retina!
2560 1440 5.96 -> Retina!
1920 1080 10.5 -> Trash!
10 10 0.04 -> Retina!
4096 2160 19(.0) -> Trash!
8192 4320 100.00 -> Trash!
3000 1500 11.18 -> Retina!
180 240 1(.0) -> Trash!
Isso é código-golfe , então o menor número de bytes vence.
Aqui está uma solução Stuck, uma linguagem de programação baseada em pilha que estou criando:
r;`;/300>"Retina!""Trash!"?
Respostas:
Pitão - 27 bytes
Usa operador ternário e
abs
para calcular pitagórico.Recebe entrada em duas linhas, primeira linha
width, height
, segunda linhadiag
.As regras estavam relaxadas, revertendo.
Experimente online aqui .
fonte
Retina ,
530220210202201193191187185 (184) bytesCréditos ao randomra por economizar 3 bytes! (E abrindo caminho para mais algumas.)
Para fins de contagem de bytes, cada linha entra em um arquivo separado, mas você pode executar o código acima como em um único arquivo, chamando Retina com o
-s
sinalizador.Isso espera que a densidade primeiro (que deve conter um ponto decimal, mesmo que seja à direita), seguida por largura e altura, ou seja
d w h
.Isso é um pouco lento. Eu não tentaria a maioria dos casos de teste fornecidos, porque ele será executado por séculos. No entanto, você pode verificar se ele funciona corretamente com os casos de teste
Basicamente, depois de multiplicar todos os números para tornar a densidade um número inteiro, você não deseja que a largura e a altura tenham mais de 4 dígitos.
Enquanto isso é lento, é completamente exato ... não há problemas de ponto flutuante ou algo assim. Toda aritmética está usando números inteiros (unários).
Em princípio, eu poderia economizar mais um byte:
^
pode ser omitido, mas isso tornaráTrash!
os casos de teste terrivelmente lentos devido a quantidades excessivas de retorno.Explicação
Primeiro, vamos reorganizar a desigualdade para evitar operações de ponto flutuante:
Também podemos notar que este é invariante sob multiplicação
w
,h
ed
pelo mesmo númerox
:Existem várias maneiras de colocar um número unário ao quadrado, mas usaremos a identidade
Isso nos dá uma maneira de resolver o problema usando apenas aritmética inteira (representando números inteiros em unário).
Vamos analisar o código. Cada par de linhas é uma substituição de regex.
Isso move repetidamente o ponto decimal na densidade para a direita, multiplicando a largura e a altura por 10 (
x
acima). Isso é para garantir que todos os números sejam inteiros. Em vez de acrescentar zeros, estou acrescentando_
, que tratarei como zero mais tarde. (Esse é um truque de golfe, porque, caso contrário, eu precisaria escrever...${3}0
para evitar ambigüidades$30
.) O+
na frente do regex diz ao Retina para repetir essa substituição até que o resultado pare de mudar (o que acontece quando o padrão não corresponde mais) .Estamos preparando os três números para a conversão em unário agora. Em princípio, precisamos de um marcador (o
#
) na frente de cada número, mas é mais curto adicionar um ao final de cada número também, o que não afetará a etapa de conversão.Esta é a conversão para unário, usando um truque que foi desenvolvido por dan1111 . Basicamente, estou traduzindo cada dígito para um dígito repetitivo, enquanto multiplica os dígitos existentes por 10 (movendo o
#
marcador para a direita no processo). Essa representação binária será uma mistura de dígitos diferentes, mas o número total será igual ao valor do número inteiro original. Observe o\w
final - normalmente isso é justo0
, mas também queremos tratar_
o zero (que é considerado um caractere de palavra no regex).Transformamos cada dígito em dois
1
s, assim: a) garantindo que todos os dígitos sejam os mesmos (o que será necessário posteriormente) eb) dobrando cada um dos números.Isso faz duas coisas: esquadra todos os números (ou melhor, metade de cada número, calculando uma soma acima
2n
) e adiciona os quadrados resultantes da largura e da altura. Observe que[^.]
corresponde a1
s,#
marcadores e espaços. Se for um#
ou um espaço, a cabeça de impressão não captura nada, o que significa que todos são simplesmente removidos, ou seja, os resultados para a largura e altura são concatenados / adicionados. O ponto decimal.
permanece para separar o resultadod
daqueles. Se[^.]
corresponder a um1
, o lookahead garantirá que capturamos metade dos1
s depois dele (arredondado para baixo) no grupo1
. Isso calcula a soma que eu mencionei acima, que produzirá o quadrado do número original.A cadeia é agora (em unário), então , então (em unário). Queremos saber se o primeiro número unário vezes é menor que o segundo. Podemos facilmente fazer essa multiplicação usando um grupo de captura e sintaxe de repetição. Usamos (em vez de ) posteriormente para garantir que o segundo número seja realmente maior que isso e não apenas igual. Nesse caso, substituímos tudo isso por .
d2
.
w2 + h2
90000
{n}
1+
1*
Retina!
Se o segundo número não for grande o suficiente, a etapa anterior não terá alterado nada e a sequência ainda começará com a
1
. Se for esse o caso, apenas substituímos a cadeia inteira porTrash!
e pronto.fonte
Python, 49
Usa intercalação de strings.
Descobriu-se mais curto ao quadrado de ambos os lados do que usar a norma complexa.
fonte
Retina!
ouTrash!
! Não retweetou @ertaisnha !!Retina , 312 bytes
Isso demora um pouco para ser executado, mas parece funcionar.
Provavelmente poderia ser jogado muito mais ...
Explicação:
Adicione tags para tornar a string mais conveniente para analisar e adicione algum lixo para facilitar a conversão para a base 1 e adicione 300 para multiplicar mais tarde
Acrescente
0
s à largura e altura, enquanto a parte decimal da diagonal à parte inteira. Quando isso for feito, a diagonal será um número inteiro, e a largura e a altura serão multiplicadas por quantos10
s forem necessários.Converta todos os números na base 1, usando a tabela de consulta que eu anexei na primeira etapa
Prepare o quadrado de todos os números
Esquadre cada número
Multiplique o quadrado da diagonal pelo quadrado dos 300 que inserimos na primeira etapa
Se a largura anexada à altura se encaixa no produto que acabamos de calcular, a densidade de pixels é muito baixa e é Lixo!
Caso contrário, é Retina!
fonte
CJam,
30 2927 bytesRequer que a entrada esteja na forma de
diagonal width height
ATUALIZAÇÃO: 1 byte economizado graças ao Dennis!
Experimente online aqui
fonte
APL,
4036 bytesEconomizou 4 bytes graças a Dennis!
Isso cria uma função diádica sem nome que recebe os dois primeiros argumentos à esquerda e o terceiro à direita. Ele verifica se a soma dos quadrados dos valores da esquerda é maior que 300 ^ 2 vezes o quadrado do valor da direita. A saída é impressa de acordo.
Você pode experimentá-lo online !
fonte
TI-BASIC, 43
Leva largura e altura através da tela inicial como uma lista de dois elementos e diagonal através de Entrada.
As letras minúsculas de dois bytes da TI-BASIC adicionam 7 bytes (
i
sendo a unidade imaginária, é de um byte), fazendo com que seja bastante competitivo. Felizmente,!
também é um byte porque representa a função fatorial.fonte
JavaScript ES6, 49 bytes
Odeio que o JavaScript tenha operadores de matemática tão longos. Mas, mesmo que houvesse um,
Math.pythagorean
isso seria mais curto.fonte
(w,h,d)=>w*w+h*h>9e4*d*d?'Retina!':'Trash!'
Excel, 44 bytes
Digite suas entradas nessas células.
E esta fórmula fornece seu resultado:
fonte
9E4*C1^2
vez de(300*C1)^2
... isso gera um comprimento de 42. No entanto, digitar9E4
uma fórmula no Excel será alterado para90000
assim que você pressionar enter. :(Prolog, 51 bytes
a(8192,4320,100.0,R).
Saídas em execução :R = "Trash!" .
Edit: Obrigado a @PaulButcher por corrigir um caso de borda e jogar um byte.
fonte
180 240 1 -> Trash!
) do exemplo. Felizmente, como você pode cortar dois caracteres com notação e, alterando>
para>=
deixa-o em 52:b(W,H,D,R):-9e4*D*D>=W*W+H*H,R="Trash!";R="Retina!".
<
vez de>=
e trocando os dois resultados de cadeia de caracteres ...JavaScript (ES6), 45 bytes
CoffeeScript, 47 bytes
Nenhum operador ternário, mas existe exponenciação (que não ajuda na última tentativa).
fonte
f=
). Você pode cortar 2 bytes em todas as versões.O ,
4037 bytesMuitos bytes para a formatação de entrada: \
Experimente online
fonte
Pure Bash (sem bc / outros comandos externos),
1381361358283 bytesEu decidi tentar fazê-lo em pura festa. Provavelmente fiz algumas ineficiências óbvias, pois esta é minha primeira vez com código de golfe, mas estou MUITO familiarizado com o bash e me diverti no passado tentando escrever coisas que não usam nenhum comando externo (por exemplo, bash puro).
A declaração printf é a mais irritante. Alguém tem alguma idéia melhor para preencher números com zeros?EDIT: Salvo dois bytes, verifica-se printf terá um argumento vazio para zero. Salvei outro byte, descobri que eu desconectei anteriormente e apenas atribuir a saída de printf a uma variável é menor do que usar -v.
EDIT2: Graças ao Digital Trauma nos comentários, isso agora diminuiu muito mais significativamente. Truques: usando o suporte a regex do bash para substituir a sequência de dígitos por zeros em vez de contá-lo e imprimindo esse número de zeros (parece óbvio quando eu coloco assim ...), armazenando as strings em uma matriz do bash para salvar um eco, e levando em consideração uma pequena alteração nas regras, o que significa que você pode finalizar todos os números de entrada em 0,0.
EDIT3: Adicionado um byte para corrigir o erro introduzido pela modificação sugerida pelo Digital Trauma.
fonte
a=${3#*.};d=${a/./0};((${#a}-${#3}))||d=;r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
(você pode substituir o;
por novas linhas - eu estava apenas tentando obtê-lo em um comentário)..0
(ok, eu acho), então você pode marcar 82:a=${3#*.};d=${a/./0};r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
$d
não é muito complicado.a
contém os dígitos da densidade após o ponto decimal.d=${a/./0}
apenas substitui todos esses dígitos por zeros. Assim, podemos concaturar esses zeros até o final dew
eh
multiplicar pela mesma potência de dez obtida com a remoção do ponto decimal ded
.dc, 41 bytes
Requer args para serem inseridos em
d, w, h
ordem - espero que esteja tudo bem.Saída de teste:
fonte
Julia,
464542 bytesIsso cria uma função que aceita três valores numéricos e retorna uma string.
É uma implementação direta da fórmula, apenas reorganizada um pouco. Ambos os lados da desigualdade foram multiplicados por
d
então ao quadrado.fonte
R,
5955 bytesComo uma função sem nome agora
Implementação muito simples, que elimina a necessidade das referências de índice.
Anterior
Bastante simples, obtenha a entrada da digitalização em um vetor (linha única, espaço separado ou várias linhas). Quadrado o vetor. Faça o cálculo e calcule o resultado.
fonte
MATLAB -
4945 bytesPrimeiro tive que declarar uma matriz de células que contém
Trash!
eRetina!
que são armazenadas nos locais 1 e 2 na matriz de células. Em seguida, utilizo a observação observada por muitos para reorganizar a equação, para que você verifique a condição apenas usando aritmética inteira. Eu representei 900009e4
para salvar alguns bytes. Se essa condição for verdadeira, emitimos um 1, caso contrário, um 0. Eu uso essa saída para indexar diretamente no array de células. Como o MATLAB começa a indexação em 1, eu também precisei adicionar 1 para concluir a indexação. O legal é que adicionartrue
1 dá 2, enquanto adicionarfalse
1 dá 1. Isso produzirá umTrash!
ouRetina!
no prompt de comando do MATLAB.Exemplo
fonte
int8
, verdadeiro + 1 é um duplo (2).logical
expressão entre parênteses para que funcionasse. Ordem das operações ... d'oh. Obrigado pela dica!hypot
mas o seuw*w+h*h>9e4*d*d
é mais curto). No entanto, isso atende aos requisitos da pergunta? É um programa, não uma função. Por isso, deve levarw
,h
ed
como entradas. Presumo que isso significa stdin, como de costume em desafio códigoXSLT, 400 bytes
Esta é a estréia de uma linguagem nunca vista no PPCG, e espero usá-la mais no futuro à medida que a conhecer.Código:
Pretty Printed
Notas:
Como o XSLT não tem como receber entradas via STDIN, precisamos usar um arquivo XML, com a entrada entre duas
<input>
tags. Obviamente, esse método tem suas limitações, mas funcionará perfeitamente bem para a maioria dos desafios.Exemplo de E / S
Arquivo de entrada:
Arquivo de saída:
Arquivo de entrada:
Arquivo de saída:
fonte
C # (81)
Ungolfed:
fonte
string D(int w,int h,double d){return w*w+h*h>9e4*d*d?"Retina":"Trash";}
. Mas você também precisa adicionar!
a cada string para que eu volte a 75, eu acho.Rápido, 77 bytes
Declerations de parâmetro de função significam que isso ocupa muito mais caracteres do que deveria:
func r(w:Float,h:Float,d:Float){print((w*w+h*h)>9e4*d*d ?"Retina!":"Trash!")}
fonte
Rápido, 56 bytes
Basicamente o mesmo que o de GoatInTheMachine , mas com parâmetros implícitos de fechamento
Quando Code Golfing com Swift, sempre declara métodos como este, é muito mais curto
fonte
Haskell, 46
fonte
<interactive>:2:8: parse error on input '|'
.let f w h d|…
.C ++
7270 ByteSemelhante a outras soluções, imaginei me aquecer com o código de golfe.
fonte
90000
como9e4
Aqui está a minha contribuição para este problema
Ruby, 67 bytes de leitura de stdin
Ruby, 56 bytes em uma função
Um pouco mais curto
Obrigado aos colaboradores anteriores do 9e4!
código-golfe rubi
fonte
Bash, 85 bytes
fonte
bc
a precisão de é 0 casas decimais. Você precisará definirscale
ou provavelmente poderá se safar com obc -l
que implicitamente define a escala para 20((`bc<<<"sqrt($1^2+$2^2)/$3"`>300))&&echo Retina!||echo Trash!
PHP,
47,43,4038 bytesRequer
register_globals==true
(que nunca deveria ser!), Com valores GET w, h, d- salvou 4 bytes removendo aspas ao redor da string. Codificação incorreta, mas funciona.
- Movida
d
e raiz quadrada para o outro lado da equação, salvando asqrt()
função- Salvo 2 bytes, alternando para
hypot()
(obrigado Lucas Costa)fonte
register_globals
diretiva seja definida.C # 6, 67 bytes
Esta resposta é baseada na resposta Wolfsheads. Tornei 8 bytes mais curtos usando um novo recurso do C # 6.
fonte
JavaScript (ES6)
585443 bytes43 bytes
Designação de função removida (conforme regras do PPCG) (-2), além de remover raiz quadrada e comparar com 900 (300 ^ 2) (-12)
54 bytes
Livre-se dos parênteses indesejáveis (-4 bytes)
58 bytes
Explicação aqui:
Isso usa operadores ternários para testar a densidade e mata alguns bytes usando as funções de seta
fonte
Java,
8274 bytesLigue com
g(width,height,diagonal)
fonte
double
matriz dispendiosa, como:String g(int w,int h,double x){return 9e4*x*x>w*w+h*h?"Trash!":"Retina!";}
Às vezes, a mais simples é a melhor :) :)Clojure, 58 bytes
Usou a matemática sofisticada de @ Kroltan para encurtar isso. Usa argumentos implícitos passados na ordem de (w, h, d).
Primeiro golfe Clojure ... Fiquei surpreso com quanto espaço em branco posso deixar de fora
fonte