Vivimos en una era maravillosa de tecnología en la que podemos tener pantallas de 8K bellamente detalladas en nuestros televisores, e incluso pantallas de 2K en nuestros teléfonos para nuestro placer de navegación móvil. Hemos recorrido un largo camino en los últimos años en términos de tecnología de pantalla.
Uno de los productos de esto es un término que Apple hizo popular, Retina . Esto se refiere a que la densidad de píxeles de la pantalla en cuestión es tan alta que a una distancia de visualización de 10-12 pulgadas de distancia, los píxeles individuales no se pueden seleccionar fácilmente.
Steve Jobs dijo que la densidad de píxeles donde esto ocurre es de alrededor de 300 píxeles por pulgada , y comenzaron a emplear densidades de píxeles en este rango en sus dispositivos con la palabra de moda Retina utilizada para publicidad.
La densidad de píxeles se puede calcular mediante la siguiente fórmula:
Donde d
está la diagonal de la pantalla en pulgadas, w
es el número de píxeles en el eje horizontal y h
es el número de píxeles en el eje vertical.
Tu tarea
Para esta tarea, utilizará el estándar Retina para decidir qué productos valen la pena comprar. Siendo el consumidor moderno que eres, cuando compras dispositivos quieres asegurarte de obtener un buen producto, ¡no un dispositivo de los 90! Como tal, desea crear un programa o función que tome el ancho, la altura y la longitud diagonal de la pantalla como parámetros de entrada o función , y le indica si la pantalla en particular califica como una pantalla de retina ( D > 300
) imprimiéndola o volviendo .
Debido a su desprecio por los dispositivos que no son Retina, su programa o función saldrá Retina!
cuando el dispositivo califique y Trash!
cuando no lo haga.
Puede suponer que todos los números serán mayores que 0. Los valores de píxeles para ancho y alto siempre serán números enteros. El tamaño de la pantalla puede interpretarse de cualquier manera, siempre que sea compatible con decimales. La entrada puede estar en el orden que elija, y también puede estar en hasta 3 líneas separadas.
Ejemplo 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!
Este es el código de golf , por lo que gana la menor cantidad de bytes.
Aquí hay una solución Stuck, un lenguaje de programación basado en pila que estoy haciendo:
r;`;/300>"Retina!""Trash!"?
Respuestas:
Pyth - 27 bytes
Utiliza el operador ternario y
abs
para calcular el pitagórico.Toma entrada en dos líneas, primera línea
width, height
, segunda líneadiag
.Las reglas se relajaron, así que retrocedieron.
Pruébelo en línea aquí .
fuente
Retina ,
530220210202201193191187185 (184) bytes¡Créditos a randomra para guardar 3 bytes! (Y allanando el camino para un par más).
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
-s
bandera.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
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á queTrash!
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:
También podemos notar que esto es invariante al multiplicar
w
,h
yd
por el mismo númerox
:Hay varias formas de cuadrar un número unario, pero haremos uso de la identidad
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.
Esto mueve repetidamente el punto decimal en la densidad hacia la derecha mientras multiplica el ancho y la altura por 10 (lo
x
anterior). 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}0
para 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) .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.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\w
en cuenta que al final, normalmente esto es justo0
, pero también queremos tratarlo_
como cero (que se considera un carácter de palabra en expresiones regulares).Convertimos cada dígito en dos
1
s, 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.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 con1
s,#
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 resultadod
de esos. Si[^.]
coincide con a1
en su lugar, entonces la búsqueda anticipada asegura que capturamos la mitad de los1
s después (redondeados hacia abajo) en grupo1
. Esto calcula la suma que mencioné anteriormente, que luego arrojará el cuadrado del número original.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 + h2
90000
{n}
1+
1*
Retina!
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 porTrash!
y listo.fuente
Python, 49
Utiliza el entrelazado de cuerdas.
Resultó más corto cuadrar ambos lados que usar la norma compleja.
fuente
Retina!
oTrash!
! No retweet @ertaisnha !!Retina , 312 bytes
Esto toma bastante tiempo en ejecutarse, pero parece funcionar.
Probablemente podría jugar mucho más al golf ...
Explicación:
Agregue etiquetas para que la cadena sea más conveniente para analizar, y agregue algo de basura para que sea más fácil convertir a la base 1, y agregue un 300 para multiplicar por más tarde
Agregue
0
s al ancho y alto, mientras agrega la parte decimal de la diagonal a la parte entera. Cuando se hace esto, la diagonal será un número entero, y el ancho y la altura se multiplicarán por cuantos10
s sean necesarios.Convierta todos los números a la base 1, usando la tabla de búsqueda que agregué en el primer paso
Prepárate para cuadrar todos los números
Cuadra cada número
Multiplica el cuadrado de la diagonal por el cuadrado de los 300 que insertamos en el primer paso
Si el ancho agregado a la altura se ajusta al producto que acabamos de calcular, la densidad de píxeles es demasiado baja, ¡y es basura!
De lo contrario, es Retina!
fuente
CJam,
30 2927 bytesRequiere entrada para estar en forma de
diagonal width height
ACTUALIZACIÓN: 1 byte guardado gracias a Dennis!
Pruébalo en línea aquí
fuente
APL,
4036 bytes¡Guardado 4 bytes gracias a Dennis!
Esto crea una función diádica sin nombre que toma los dos primeros argumentos a la izquierda y el tercero a la derecha. Comprueba si la suma de los cuadrados de los valores de la izquierda es mayor que 300 ^ 2 veces el cuadrado del valor de la derecha. La salida se imprime en consecuencia.
¡Puedes probarlo en línea !
fuente
TI-BASIC, 43
Toma ancho y alto a través de la pantalla de inicio como una lista de dos elementos, y diagonal a través de Entrada.
Las letras minúsculas de dos bytes de TI-BASIC agregan 7 bytes (
i
siendo la unidad imaginaria, es un byte) hacen que sea bastante poco competitivo. Afortunadamente,!
también es un byte porque representa la función factorial.fuente
JavaScript ES6, 49 bytes
Odio que JavaScript tenga operadores matemáticos tan largos. Pero incluso si hubiera un,
Math.pythagorean
esto sería más corto.fuente
(w,h,d)=>w*w+h*h>9e4*d*d?'Retina!':'Trash!'
Excel, 44 bytes
Escriba sus entradas en estas celdas.
Y esta fórmula da tu resultado:
fuente
9E4*C1^2
lugar de(300*C1)^2
... esto produce una longitud de 42. Sin embargo, escribir9E4
una fórmula en Excel, cambiará a90000
tan pronto como presione enter. :(Prólogo, 51 bytes
a(8192,4320,100.0,R).
Salidas corrientes :R = "Trash!" .
Editar: Gracias a @PaulButcher por corregir un caso de borde y jugar al golf un byte.
fuente
180 240 1 -> Trash!
) del ejemplo. Afortunadamente, ya que se puede afeitarse dos personajes con e notación, cambiando>
a>=
lo deja a 52:b(W,H,D,R):-9e4*D*D>=W*W+H*H,R="Trash!";R="Retina!".
<
lugar de>=
e intercambiar los dos resultados de cadena ...JavaScript (ES6), 45 bytes
CoffeeScript, 47 bytes
No hay operador ternario, pero hay exponenciación (que no ayuda en el último intento).
fuente
f=
). Puede cortar 2 bytes en todas las versiones.O ,
4037 bytesMuchos bytes para el formato de entrada: \
Pruébalo en línea
fuente
Bash pura (sin BC / otros comandos externos),
1381361358283 bytesDecidí intentar hacerlo en puro golpe. Probablemente he cometido algunas ineficiencias obvias, ya que esta es mi primera vez jugando al golf de código, pero estoy MUY familiarizado con bash y me he divertido en el pasado tratando de escribir cosas que no usan ningún comando externo (es decir, bash puro).
La declaración printf es la más molesta. ¿Alguien tiene mejores ideas para rellenar números con ceros?EDITAR: Guardado dos bytes, resulta que printf tomará un argumento vacío para cero. Guardado otro byte, resulta que previamente había contado mal y solo asignar la salida de printf a una variable es más pequeño que usar -v.
EDIT2: Gracias a Digital Trauma en los comentarios, esto ahora ha disminuido mucho más significativamente. Trucos: usar el soporte de expresiones regulares de bash para reemplazar la cadena de dígitos con ceros en lugar de contarlos y luego imprimir ese número de ceros (parece obvio cuando lo pongo así ...), almacenando las cadenas en una matriz de bash para guardar un eco, y teniendo en cuenta un ligero cambio en las reglas que significa que puede finalizar todos los números de entrada en .0.
EDITAR3: Se agregó un byte para corregir el error introducido por la modificación sugerida por Digital Trauma.
fuente
a=${3#*.};d=${a/./0};((${#a}-${#3}))||d=;r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
(puede reemplazarlo;
con líneas nuevas, solo estaba tratando de obtenerlo en un comentario)..0
(ok, creo), entonces puede obtener un puntaje de 82:a=${3#*.};d=${a/./0};r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
$d
no es demasiado complicado.a
contiene los dígitos de la densidad después del punto decimal.d=${a/./0}
simplemente reemplaza todos esos dígitos con ceros. Por lo tanto, podemos concatenar esos ceros al final dew
yh
multiplicar por la misma potencia de diez que se logra eliminando el punto decimal ded
.cc, 41 bytes
Requiere que se ingresen los argumentos en
d, w, h
orden, espero que esto esté bien.Prueba de salida:
fuente
Julia,
464542 bytesEsto crea una función que acepta tres valores numéricos y devuelve una cadena.
Es una implementación directa de la fórmula, solo reorganizada un poco. Ambos lados de la desigualdad se multiplicaron por al
d
cuadrado.fuente
R,
5955 bytesComo una función sin nombre ahora
Implementación muy simple, que elimina la necesidad de referencias de índice.
Anterior
Bastante simple, obtenga la entrada del escaneo en un vector (línea única, espacio separado o multilínea). Cuadrar el vector. Haz el cálculo y obtén el resultado.
fuente
MATLAB -
4945 bytesPrimero tuve que declarar una matriz de celdas que contiene
Trash!
yRetina!
que se almacenan en las ubicaciones 1 y 2 de la matriz de celdas. A continuación, utilizo la observación observada por muchos para reorganizar la ecuación, de modo que esté verificando la condición solo usando la aritmética de enteros. Representé 90000 como9e4
para guardar algunos bytes. Si esta condición es verdadera, sacamos un 1, de lo contrario sacamos un 0. Uso esta salida para indexar directamente en la matriz de celdas. Debido a que MATLAB comienza a indexar en 1, también tuve que agregar 1 para completar la indexación. Lo bueno es que al agregartrue
con 1 se obtiene 2, mientras que al agregarfalse
con 1 se obtiene 1. Esto dará como resultadoTrash!
oRetina!
en el símbolo del sistema de MATLAB.Ejemplo
fuente
int8
, verdadero + 1 es un doble (2).logical
expresión entre paréntesis para que funcione. Orden de operaciones ... d'oh. ¡Gracias por el consejo!hypot
pero tuw*w+h*h>9e4*d*d
es más corto). Sin embargo, ¿esto cumple con los requisitos de la pregunta? Es un programa, no una función. Por lo tanto, debe tomarw
,h
yd
como entradas. Supongo que eso significa stdin, como es habitual en el desafío de códigoXSLT, 400 bytes
Este es el debut de un lenguaje nunca antes visto en PPCG, y espero usarlo más en el futuro a medida que lo conozca más.Código:
Bastante impreso
Notas:
Como XSLT no tiene forma de recibir información a través de STDIN, tenemos que usar un archivo XML, con la información entre dos
<input>
etiquetas. Por supuesto, este método tiene sus limitaciones, pero funcionará perfectamente para la mayoría de los desafíos.Ejemplo de E / S
Fichero de entrada:
Archivo de salida:
Fichero de entrada:
Archivo de salida:
fuente
C # (81)
Sin golf:
fuente
string D(int w,int h,double d){return w*w+h*h>9e4*d*d?"Retina":"Trash";}
. Pero también necesita agregar el!
en cada cadena para que vuelva a 75, creo.Swift, 77 bytes
Las declinaciones de los parámetros de función significan que esto ocupa muchos más caracteres de los que debería:
func r(w:Float,h:Float,d:Float){print((w*w+h*h)>9e4*d*d ?"Retina!":"Trash!")}
fuente
Swift, 56 bytes
Básicamente igual que el de GoatInTheMachine pero con parámetros de cierre implícitos
Cuando Code Golfing con Swift, siempre declare métodos como este, es mucho más corto
fuente
Haskell, 46
fuente
<interactive>:2:8: parse error on input '|'
.let f w h d|…
.C ++
7270 ByteAl igual que otras soluciones, descubrí que me calentaría con el código de golf.
fuente
90000
como9e4
Aquí está mi contribución para este problema.
Ruby, 67 bytes leyendo de stdin
Ruby, 56 bytes en una función.
Un poco más corto
¡Gracias a los contribuyentes anteriores por el 9e4!
código-golf ruby
fuente
Bash, 85 bytes
fuente
bc
la precisión es 0 decimales. Tendrá que configurarscale
, o probablemente pueda salirse con la suya, lobc -l
que implícitamente establece la escala en 20((`bc<<<"sqrt($1^2+$2^2)/$3"`>300))&&echo Retina!||echo Trash!
PHP,
47,43,4038 bytesRequiere
register_globals==true
(¡lo que nunca debería ser!), Con valores GET w, h, d: guardado 4 bytes eliminando comillas alrededor de la cadena. Mala codificación, pero funciona.
-
d
Raíz movida y cuadrada al otro lado de la ecuación, guardando lasqrt()
función- Guardado 2 bytes cambiando a
hypot()
(gracias Lucas Costa)fuente
register_globals
que se establezca la directiva.C # 6, 67 bytes
Esta respuesta se basa en la respuesta de Wolfsheads. Lo hice 8 bytes más corto usando una nueva característica de C # 6.
fuente
JavaScript (ES6)
585443 Bytes43 bytes
Se eliminó la asignación de funciones (según las reglas PPCG) (-2), así como también se eliminó la raíz cuadrada y se comparó con 900 (300 ^ 2) (-12)
54 bytes
Se deshizo de paréntesis inusuales (-4 bytes)
58 bytes
Explicación aquí:
Esto utiliza operadores ternarios para probar la densidad y mata un par de bytes mediante el uso de funciones de flecha
fuente
Java,
8274 bytesLlámalo con
g(width,height,diagonal)
fuente
double
String g(int w,int h,double x){return 9e4*x*x>w*w+h*h?"Trash!":"Retina!";}
Clojure, 58 bytes
Usé las elegantes matemáticas de @Kroltan para acortar esto. Utiliza argumentos implícitos pasados en el orden de (w, h, d).
Primero golf de Clojure ... Me sorprendió la cantidad de espacio en blanco que tengo permitido dejar fuera
fuente