Retina , 530 220 210 202 201 193 191 187 185 (184) bytes
¡Créditos a randomra para guardar 3 bytes! (Y allanando el camino para un par más).
+`\.(\d)(.+)( .+)
$1.$2_$3_
\b
#
+`(\d*)#((((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|\w)
$1$1$1$1$1$1$1$1$1$1$3$4$5$6$7$8$9$10$11#
\d
11
(?=(1*)\1)[^.]
$1
^(1+)\.\1{90000}1+
Retina!
1.+
Trash!
Para fines de conteo de bytes, cada línea va en un archivo separado, pero puede ejecutar el código anterior tal como es desde un solo archivo invocando Retina con la -sbandera.
Esto espera primero la densidad (que debe contener un punto decimal, incluso si es uno posterior), seguido de ancho y alto, es decir d w h.
Esto es un poco lento. No probaría la mayoría de los casos de prueba dados, porque durará mucho tiempo. Sin embargo, puede verificar que funciona correctamente con los casos de prueba
19. 4096 2160 -> Trash!
1. 180 240 -> Trash!
1. 181 240 -> Retina!
1. 180 241 -> Retina!
0.04 10 10 -> Retina!
Básicamente, después de multiplicar todos los números para hacer que la densidad sea un número entero, no desea que el ancho y la altura tengan más de 4 dígitos.
Si bien esto es lento, es completamente exacto ... no hay problemas de coma flotante ni nada de eso. Toda la aritmética está usando enteros (unarios).
En principio, podría eliminar un byte más: ^se puede omitir, pero hará que Trash!los casos de prueba sean terriblemente lentos debido a las cantidades excesivas de retroceso.
Explicación
Primero, reorganicemos la desigualdad para evitar operaciones de coma flotante:
√(w2 + h2) / d > 300
√(w2 + h2) > 300 d
w2 + h2 > 90000 d2
También podemos notar que esto es invariante al multiplicar w, hy dpor el mismo número x:
w2 + h2 > 90000 d2
(x w)2 + (x h)2 > 90000 (x d)2
x2 (w2 + h2) > 90000 x2 d2
w2 + h2 > 90000 d2
Hay varias formas de cuadrar un número unario, pero haremos uso de la identidad
n2 = Σi=1..2n ⌊i/2⌋
Esto nos da una manera de resolver el problema usando solo aritmética de enteros (que representa enteros en unario).
Veamos el código. Cada par de líneas es una sustitución de expresiones regulares.
+`\.(\d)(.+)( .+)
$1.$2_$3_
Esto mueve repetidamente el punto decimal en la densidad hacia la derecha mientras multiplica el ancho y la altura por 10 (lo xanterior). Esto es para asegurar que todos los números sean enteros. En lugar de agregar ceros, estoy agregando _, lo que trataré como cero más adelante. (Este es un truco de golf, porque de lo contrario tendría que escribir ...${3}0para evitar ambigüedades $30). El +frente de la expresión regular le dice a Retina que repita esta sustitución hasta que el resultado deje de cambiar (que es el caso cuando el patrón ya no coincide) .
\b
#
Estamos preparando los tres números para la conversión a unario ahora. En principio, necesitamos un marcador (el #) delante de cada número, pero también es más corto agregar uno al final de cada número, lo que no afectará el paso de conversión.
+`(\d*)#((((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|\w)
$1$1$1$1$1$1$1$1$1$1$3$4$5$6$7$8$9$10$11#
Esta es la conversión a unario, utilizando un truco desarrollado por dan1111 . Esencialmente, estoy traduciendo cada dígito a un dígito de repetición de sí mismo, mientras multiplico los dígitos existentes por 10 (moviendo el #marcador a la derecha en el proceso). Esta representación binaria será una mezcla de diferentes dígitos, pero el número total será igual al valor del entero original. Tenga \wen cuenta que al final, normalmente esto es justo 0, pero también queremos tratarlo _como cero (que se considera un carácter de palabra en expresiones regulares).
\d
11
Convertimos cada dígito en dos 1s, por lo tanto a) asegurando que todos los dígitos sean iguales (lo que será necesario más adelante) yb) duplicando cada uno de los números.
(?=(1*)\1)[^.]
$1
Esto hace dos cosas: cuadra todos los números (o más bien la mitad de cada número, calculando una suma 2n), y agrega los cuadrados resultantes del ancho y la altura. Observe que [^.]coincide con 1s, #marcadores y espacios. Si es un #o un espacio, la búsqueda anticipada no capturará nada, lo que significa que todos ellos simplemente se eliminan, es decir, los resultados para el ancho y la altura se concatenan / agregan. El punto decimal .permanece para separar el resultado dde esos. Si [^.]coincide con a 1en su lugar, entonces la búsqueda anticipada asegura que capturamos la mitad de los 1s después (redondeados hacia abajo) en grupo 1. Esto calcula la suma que mencioné anteriormente, que luego arrojará el cuadrado del número original.
^(1+)\.\1{90000}1+
Retina!
La cadena es ahora (en unario), luego , luego (en unario). Queremos saber si el primer número unario veces es más corto que el segundo. Podemos hacer esta multiplicación fácilmente usando un grupo de captura y sintaxis de repetición. Usamos (en lugar de ) después para asegurarnos de que el segundo número sea realmente mayor que eso y no solo igual. Si es así, reemplazamos todo eso por .d2.w2 + h290000{n}1+1*Retina!
1.+
Trash!
Si el segundo número no era lo suficientemente grande, entonces el paso anterior no habrá cambiado nada y la cadena aún comenzará con a 1. Si ese es el caso, simplemente reemplazamos la cadena completa por Trash!y listo.