Nous vivons à une époque technologique merveilleuse où nous pouvons avoir des écrans 8K joliment détaillés sur nos téléviseurs, et même des écrans 2K sur nos téléphones pour notre plus grand plaisir de navigation. Nous avons parcouru un long chemin au cours des dernières années en termes de technologie d'écran.
Un des produits de cette technologie est un terme qui a été rendu populaire par Apple, Retina . Cela fait référence à la densité de pixels de l’affichage en question étant si élevée qu’à une distance de visualisation de 10-12 pouces, les pixels individuels ne peuvent pas être facilement sélectionnés.
Steve Jobs a déclaré que la densité de pixels dans laquelle cela se produit avoisine les 300 pixels par pouce . Ils ont commencé à utiliser des densités de pixels dans cette plage sur leurs appareils avec le mot à la mode Retina utilisé pour la publicité.
La densité de pixels peut être calculée à l'aide de la formule suivante:
Où d
est la diagonale de l'écran en pouces, w
le nombre de pixels sur l'axe horizontal et h
le nombre de pixels sur l'axe vertical.
Ta tâche
Pour cette tâche, vous utiliserez le standard Retina pour décider quels produits valent la peine d'être achetés. En tant que consommateur moderne que vous êtes, lorsque vous achetez des appareils, vous voulez vous assurer d'obtenir un bon produit, pas un appareil des années 90! En tant que tel, vous souhaitez créer un programme ou une fonction prenant la largeur, la hauteur et la diagonale de l'écran en tant que paramètres d'entrée ou fonctions , et vous indiquant si cet écran peut être qualifié de rétine ( D > 300
) en le visualisant ou en le retournant .
En raison de votre mépris pour les périphériques non-Retina, votre programme ou votre fonction apparaîtra Retina!
lorsque le périphérique est qualifié et Trash!
quand il ne l'est pas.
Vous pouvez supposer que tous les nombres seront supérieurs à 0. Les valeurs de pixels pour la largeur et la hauteur seront toujours des nombres entiers. La taille de l'écran peut être interprétée de n'importe quelle manière, à condition qu'elle prenne en charge les nombres décimaux. La saisie peut se dérouler dans l’ordre que vous choisissez et sur 3 lignes distinctes au maximum.
Exemple I / O
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!
C'est du code-golf , donc le plus petit nombre d'octets gagne.
Voici une solution Stuck, un langage de programmation basé sur une pile que je crée:
r;`;/300>"Retina!""Trash!"?
Réponses:
Pyth - 27 octets
Utilise l'opérateur ternaire et
abs
pour calculer pythagore.Prend une entrée sur deux lignes, première ligne
width, height
, seconde lignediag
.Les règles ont été assouplies, donc reculons.
Essayez-le en ligne ici .
la source
Retina ,
530220210202201 201193191187185 (184) octetsCrédits à randomra pour la sauvegarde de 3 octets! (Et ouvrant la voie pour un couple de plus.)
Pour le comptage d'octets, chaque ligne est placée dans un fichier séparé, mais vous pouvez exécuter le code ci-dessus tel quel à partir d'un seul fichier en appelant Retina avec l'
-s
indicateur.Cela attend d'abord la densité (qui doit contenir un point décimal, même s'il s'agit d'un point final), suivie de la largeur et de la hauteur, c'est-à-dire
d w h
.C'est un peu lent. Je ne voudrais pas essayer la plupart des cas de test donnés, car il durera des siècles. Cependant, vous pouvez vérifier qu'il fonctionne correctement avec les cas de test
En gros, après avoir multiplié tous les nombres pour que la densité soit un entier, vous ne voulez pas que la largeur et la hauteur aient plus de 4 chiffres.
Bien que ce soit lent, il est tout à fait exact ... il n'y a pas de problèmes de virgule flottante ou quelque chose comme ça. Toute l'arithmétique utilise des entiers (unaires).
En principe, je pourrais supprimer un octet de plus:
^
on peut l'omettre, mais celaTrash!
ralentira horriblement les tests en raison du nombre excessif de retours en arrière.Explication
Tout d'abord, réorganisons l'inégalité pour éviter les opérations en virgule flottante:
On peut aussi remarquer que ceci est invariant en multipliant
w
,h
etd
par le même nombrex
:Il y a plusieurs façons de mettre en correspondance un nombre unaire, mais nous allons utiliser l'identité
Cela nous donne un moyen de résoudre le problème en utilisant uniquement l'arithmétique entière (représentant des entiers dans unaire).
Passons en revue le code. Chaque paire de lignes est une substitution de regex.
Cela déplace à plusieurs reprises le point décimal de la densité vers la droite tout en multipliant la largeur et la hauteur par 10 (valeur
x
ci - dessus). Cela permet de s'assurer que tous les nombres sont des entiers. Au lieu d’ajouter des zéros, je l’ajoute_
, ce que je considérerai comme zéro plus tard. (Ceci est une astuce de golf, car sinon, je devrais écrire...${3}0
pour éviter toute ambiguïté$30
.) Le+
texte placé devant la regex indique à Retina de répéter cette substitution jusqu'à ce que le résultat cesse de changer (ce qui est le cas lorsque le motif ne correspond plus). .Nous préparons les trois chiffres pour la conversion en unaire maintenant. En principe, nous avons besoin d’un marqueur (le
#
) devant chaque numéro, mais il est plus court d’ajouter un à la fin de chaque numéro, ce qui n’affectera pas l’étape de conversion.C'est la conversion au unaire, utilisant une astuce développée par dan1111 . Essentiellement, je traduis chaque chiffre en un chiffre de rep, tout en multipliant les chiffres existants par 10 (en déplaçant le
#
marqueur à droite dans le processus). Cette représentation binaire sera un mélange de chiffres différents, mais le nombre total sera égal à la valeur de l'entier original. Notez le\w
à la fin - normalement c'est juste0
, mais nous voulons_
aussi traiter comme zéro (ce qui est considéré comme un caractère de mot dans une regex).Nous transformons chaque chiffre en deux
1
, ce qui permet a) de nous assurer que tous les chiffres sont identiques (ce qui sera nécessaire ultérieurement) et b) de doubler chacun des nombres.Cela fait deux choses: il met tous les nombres au carré (ou plutôt la moitié de chaque nombre, en calculant une somme
2n
), et ajoute les carrés résultants de la largeur et de la hauteur. Notez que[^.]
correspond à1
s, aux#
marqueurs et aux espaces. Si c'est un#
ou un espace, le lookahead ne capturera rien, ce qui signifie que tous ceux-ci sont simplement supprimés, c'est-à-dire que les résultats pour la largeur et la hauteur sont concaténés / ajoutés. Le point décimal.
reste à séparer le résultatd
de ceux-ci. Si[^.]
correspond à un à la1
place, le lookahead garantit que nous capturons la moitié du1
s après celui-ci (arrondi au bas) dans le groupe1
. Ceci calcule la somme que j'ai mentionnée ci-dessus, qui donnera alors le carré du nombre original.La chaîne est maintenant (en unaire), alors , ensuite (en unaire). Nous voulons savoir si le premier nombre unaire est plus court que le second. Nous pouvons facilement faire cette multiplication en utilisant une syntaxe de groupe de capture et de répétition. Nous utilisons (au lieu de ) par la suite pour nous assurer que le deuxième nombre est réellement supérieur à celui-ci et pas simplement égal. Si c'est le cas, nous remplaçons tout cela par .
d2
.
w2 + h2
90000
{n}
1+
1*
Retina!
Si le second nombre n'était pas assez grand, alors l'étape précédente n'aura rien changé et la chaîne commencera toujours par un
1
. Si c'est le cas, nous remplaçons simplement la chaîne entière parTrash!
et nous avons terminé.la source
Python, 49
Utilise l'entrelacement de chaînes.
Il s'est avéré plus court pour concilier les deux côtés que pour utiliser la norme complexe.
la source
Retina!
ou l' autreTrash!
! Pas retweet @ertaisnha !!Rétine , 312 octets
Cela prend un certain temps à courir, mais cela semble fonctionner.
Peut-être pourrait-on jouer au golf beaucoup plus ...
Explication:
Ajoutez des balises pour rendre la chaîne plus facile à analyser, et ajoutez des éléments indésirables pour faciliter la conversion en base 1, et ajoutez un 300 pour la multiplier ultérieurement.
Ajoute
0
s à la largeur et à la hauteur, tout en ajoutant la partie décimale de la diagonale à la partie entière. Lorsque cela sera fait, la diagonale sera un entier et la largeur et la hauteur seront multipliées par le nombre de10
s nécessaires.Convertir tous les nombres en base 1, en utilisant la table de correspondance que j'ai ajoutée à la première étape
Préparez-vous à concilier tous les chiffres
Place chaque numéro
Multipliez le carré de la diagonale par le carré des 300 insérés dans la première étape
Si la largeur ajoutée à la hauteur correspond au produit que nous venons de calculer, la densité de pixels est trop faible, et c'est la corbeille!
Sinon, c'est la rétine!
la source
CJam,
30 2927 octetsNécessite une entrée sous forme de
diagonal width height
UPDATE: 1 octet enregistré grâce à Dennis!
Essayez-le en ligne ici
la source
APL,
4036 octetsSauvegardé 4 octets grâce à Dennis!
Cela crée une fonction dyadique non nommée qui prend les deux premiers arguments à gauche et le troisième à droite. Il vérifie si la somme des carrés des valeurs de gauche est supérieure à 300 ^ 2 fois le carré de la droite. La sortie est imprimée en conséquence.
Vous pouvez l' essayer en ligne !
la source
TI-BASIC, 43
Prend la largeur et la hauteur à travers l’écran d’accueil en tant que liste à deux éléments et en diagonale à l’entrée
Les lettres minuscules à deux octets de TI-BASIC ajoutent 7 octets (
i
l'unité imaginaire étant un octet), ce qui le rend très peu compétitif. Heureusement,!
est également un octet, car il représente la fonction factorielle.la source
JavaScript ES6, 49 octets
Je déteste le fait que JavaScript ait de tels opérateurs de calcul longs. Mais même s'il y en avait un,
Math.pythagorean
ce serait plus court.la source
(w,h,d)=>w*w+h*h>9e4*d*d?'Retina!':'Trash!'
Excel, 44 octets
Tapez vos entrées dans ces cellules.
Et cette formule donne votre résultat:
la source
9E4*C1^2
place de(300*C1)^2
... cela donne une longueur de 42. Cependant, taper9E4
une formule dans Excel, sera remplacé90000
par dès que vous appuierez sur entrée. :(Prolog, 51 octets
a(8192,4320,100.0,R).
Sorties en cours d'exécution :R = "Trash!" .
Edit: Merci à @PaulButcher pour avoir corrigé un cas de bord et joué un octet au golf.
la source
180 240 1 -> Trash!
) de l'exemple. Heureusement, puisque vous pouvez raser deux caractères avec la notation e, en changeant>
de>=
feuilles il à 52:b(W,H,D,R):-9e4*D*D>=W*W+H*H,R="Trash!";R="Retina!".
<
au lieu de>=
et en échangeant les deux résultats de chaîne ...JavaScript (ES6), 45 octets
CoffeeScript, 47 octets
Pas d'opérateur ternaire, mais il y a une exponentiation (ce qui n'aide pas dans la dernière tentative).
la source
f=
). Vous pouvez couper 2 octets dans toutes les versions.O ,
4037 octetsBeaucoup d'octets pour le formatage d'entrée: \
Essayez-le en ligne
la source
Pure Bash (pas de commande bc / autre commande externe),
1381361358283 octetsJ'ai décidé d'essayer de le faire en pure bash. J'ai probablement fait quelques inefficacités évidentes car il s'agit de ma première participation au golf, mais je connais TRÈS bien bash et je me suis amusé par le passé à essayer d'écrire des choses qui n'utilisent aucune commande externe (c'est-à-dire un pur bash).
La déclaration printf est la plus agaçante. Quelqu'un a-t-il de meilleures idées pour remplir les chiffres avec des zéros?EDIT: sauvegardé deux octets, printf prendra un argument vide pour zéro. Un autre octet enregistré, s’avère que j’avais précédemment mal compté et que l’attribution de la sortie de printf à une variable est plus petite que l’utilisation de -v.
EDIT2: Grâce à Digital Trauma dans les commentaires, cette baisse est maintenant beaucoup plus importante. Astuces: utiliser le support regex de bash pour remplacer la chaîne de chiffres par des zéros au lieu de le compter, puis d'afficher ce nombre de zéros (cela semble évident quand je le mets comme ça ...), en stockant les chaînes dans un tableau bash pour enregistrer un écho, et en tenant compte d'un léger changement dans les règles, cela signifie que vous pouvez mettre fin à tous les nombres entrés en 0,0.
EDIT3: Ajout d'un octet pour corriger un bug introduit par la modification suggérée par Digital Trauma.
la source
a=${3#*.};d=${a/./0};((${#a}-${#3}))||d=;r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
(vous pouvez remplacer le;
avec de nouvelles lignes - j'essayais juste de le faire dans un commentaire)..0
(bon, je pense), vous pourrez marquer 82:a=${3#*.};d=${a/./0};r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
$d
n'est pas trop délicat.a
contient les chiffres de la densité après le point décimal.d=${a/./0}
remplace simplement tous ces chiffres par des zéros. Ainsi, nous pouvons concaténer ces zéros à la fin dew
eth
les multiplier par la même puissance de dix obtenue en supprimant le point décimald
.dc, 41 octets
Requiert que les arguments soient entrés dans l'
d, w, h
ordre - j'espère que c'est correct.Test de sortie:
la source
Julia,
464542 octetsCela crée une fonction qui accepte trois valeurs numériques et renvoie une chaîne.
C'est une implémentation directe de la formule, juste réorganisée un peu. Les deux côtés de l'inégalité ont été multipliés par deux
d
.la source
R,
5955 octetsEn tant que fonction non nommée maintenant
Une implémentation très simple, qui élimine le besoin de références d'index.
précédent
Assez simple, obtenez l’entrée de la numérisation dans un vecteur (ligne simple, espace séparé ou multiligne). Place le vecteur. Faites le calcul et cat le résultat.
la source
MATLAB -
4945 octetsJ'ai d'abord dû déclarer un tableau de cellules qui contient
Trash!
etRetina!
qui sont stockés aux emplacements 1 et 2 du tableau de cellules. Ensuite, j'utilise l'observation observée par beaucoup pour réorganiser l'équation afin que vous vérifiiez la condition en utilisant uniquement l'arithmétique entière. Je représentais 900009e4
pour sauver quelques octets. Si cette condition est vraie, nous émettons un 1, sinon nous émettons un 0. J'utilise cette sortie pour indexer directement dans le tableau de cellules. Comme MATLAB commence à indexer à 1, j'ai également dû ajouter 1 pour compléter l'indexation. Ce qui est bien, c’est que l’ajouttrue
avec 1 donne 2, alors que l’ajoutfalse
avec 1 donne 1. Cela produira l’invite de commande MATLABTrash!
ouRetina!
.Exemple
la source
int8
, vrai + 1 est un double (2).logical
expression entre parenthèses pour que cela fonctionne. Ordre des opérations ... Merci pour le conseil!hypot
mais tonw*w+h*h>9e4*d*d
est plus court). Cependant, cela répond-il aux exigences de la question? C'est un programme, pas une fonction. Donc, cela devrait prendrew
,h
etd
comme intrants. Je suppose que ça veut dire stdin, comme d'habitude en code challengeXSLT, 400 octets
Ceci est le début d'un langage jamais vu auparavant sur PPCG, et j'espère l'utiliser davantage à l'avenir à mesure que je le connaîtras davantage.Code:
Joli imprimé
Remarques:
Comme XSLT n'a aucun moyen de prendre une entrée via STDIN, nous devons utiliser un fichier XML, avec l'entrée entre deux
<input>
balises. Bien sûr, cette méthode a ses limites mais elle fonctionnera parfaitement bien pour la plupart des défis.Exemple I / O
Fichier d'entrée:
Fichier de sortie:
Fichier d'entrée:
Fichier de sortie:
la source
C # (81)
Ungolfed:
la source
string D(int w,int h,double d){return w*w+h*h>9e4*d*d?"Retina":"Trash";}
. Mais vous devez également ajouter le!
à chaque chaîne pour que ce soit de nouveau à 75, je pense.Rapide, 77 octets
Les décélérations de paramètres de fonction signifient que cela prend beaucoup plus de caractères qu'il ne le devrait:
func r(w:Float,h:Float,d:Float){print((w*w+h*h)>9e4*d*d ?"Retina!":"Trash!")}
la source
Rapide, 56 octets
Fondamentalement identique à celui de GoatInTheMachine mais avec des paramètres de fermeture implicites
Quand Code Golfing avec Swift, déclare toujours des méthodes comme celle-ci, c'est beaucoup plus court
la source
Haskell, 46 ans
la source
<interactive>:2:8: parse error on input '|'
.let f w h d|…
.C ++
7270 octetsComme pour d’autres solutions, je me suis dit que je pouvais me réchauffer avec le code golf.
la source
90000
comme9e4
Voici ma contribution à ce problème
Ruby, 67 octets lisant stdin
Ruby, 56 octets dans une fonction
Un peu plus court
Merci aux précédents contributeurs pour le 9e4!
rubis de golf
la source
Bash, 85 octets
la source
bc
la précision est de 0 décimale. Vous aurez besoin de réglerscale
, ou vous pouvez probablement vous en sortir,bc -l
ce qui fixe implicitement l'échelle à 20((`bc<<<"sqrt($1^2+$2^2)/$3"`>300))&&echo Retina!||echo Trash!
PHP,
47,43,4038 octetsRequiert
register_globals==true
(ce qui ne devrait jamais être!), Avec les valeurs GET w, h, d- 4 octets enregistrés en supprimant les guillemets autour de la chaîne. Mauvais codage, mais ça marche.
- Déplacé
d
et racine carrée de l'autre côté de l'équation, en enregistrant lasqrt()
fonction- 2 octets sauvegardés en passant à
hypot()
(merci Lucas Costa)la source
register_globals
de définir la directive.C # 6, 67 octets
Cette réponse est basée sur la réponse de Wolfsheads. Je l'ai fait 8 octets plus court en utilisant une nouvelle fonctionnalité de C # 6.
la source
JavaScript (ES6)
585443 octets43 octets
Suppression de l'attribution de fonction (selon les règles PPCG) (-2), suppression de la racine carrée et comparaison à 900 (300 ^ 2) (-12)
54 octets
Élimine les parenthèses inutiles (-4 octets)
58 octets
Explication ici:
Ceci utilise des opérateurs ternaires pour tester la densité et tue quelques octets en utilisant des fonctions de flèche
la source
Java,
8274 octetsAppelez-le avec
g(width,height,diagonal)
la source
double
tableau coûteux comme:String g(int w,int h,double x){return 9e4*x*x>w*w+h*h?"Trash!":"Retina!";}
Parfois, le plus simple est le meilleur :)Clojure, 58 octets
Utilisez les mathématiques sophistiquées de @ Kroltan pour raccourcir ceci. Utilise des arguments implicites passés dans l’ordre de (w, h, d).
Premier golf Clojure ... J'ai été surpris de voir combien d'espaces je suis autorisé à laisser de côté
la source