Wir leben in einem wundervollen Zeitalter der Technologie, in dem wir auf unseren Fernsehern wunderschön detaillierte 8K-Bildschirme und auf unseren Handys sogar 2K-Bildschirme für unser mobiles Surfvergnügen haben können. In den letzten Jahren haben wir in Bezug auf die Bildschirmtechnologie einen langen Weg zurückgelegt.
Eines der Produkte davon ist ein Begriff, der von Apple, Retina, populär gemacht wurde . Dies bezieht sich auf die Pixeldichte der fraglichen Anzeige, die so hoch ist, dass bei einem Betrachtungsabstand von 10 bis 12 Zoll einzelne Pixel nicht einfach herausgegriffen werden können.
Steve Jobs sagte, dass die Pixeldichte, bei der dies auftritt, ungefähr 300 Pixel pro Zoll beträgt , und sie begannen, Pixeldichten in diesem Bereich auf ihren Geräten mit dem für Werbung verwendeten Retina- Schlagwort zu verwenden.
Die Pixeldichte kann mit der folgenden Formel berechnet werden:
Wo d
ist die Diagonale des Bildschirms in Zoll, w
ist die Anzahl der Pixel auf der horizontalen Achse und h
ist die Anzahl der Pixel auf der vertikalen Achse.
Deine Aufgabe
Für diese Aufgabe verwenden Sie den Retina- Standard, um zu entscheiden, welche Produkte es wert sind, gekauft zu werden. Als der moderne Verbraucher, der Sie sind, möchten Sie beim Kauf von Geräten sicherstellen, dass Sie ein gutes Produkt erhalten, kein Gerät aus den 90er Jahren! Als solches möchten Sie ein Programm oder eine Funktion erstellen , die die Bildschirmbreite, -höhe und -diagonale als Eingabe- oder Funktionsparameter verwendet und Ihnen mitteilt, ob der jeweilige Bildschirm als Retina-Bildschirm ( D > 300
) qualifiziert ist, indem Sie auf den Bildschirm drucken oder zurückkehren .
Aufgrund Ihrer Missachtung von Nicht-Retina-Geräten wird Ihr Programm oder Ihre Funktion ausgegeben, Retina!
wenn sich das Gerät qualifiziert und Trash!
wenn dies nicht der Fall ist.
Sie können davon ausgehen, dass alle Zahlen größer als 0 sind. Pixelwerte für Breite und Höhe sind immer ganze Zahlen. Die Bildschirmgröße kann beliebig interpretiert werden, sofern Dezimalstellen unterstützt werden. Die Eingabe kann in beliebiger Reihenfolge erfolgen und sich auch in bis zu 3 separaten Zeilen befinden.
Beispiel 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!
Das ist Code-Golf , also gewinnt die geringste Anzahl von Bytes.
Hier ist eine Stuck-Lösung, eine stapelbasierte Programmiersprache, die ich mache:
r;`;/300>"Retina!""Trash!"?
Antworten:
Pyth - 27 Bytes
Verwendet den ternären Operator und
abs
zur Berechnung des Pythagoras.Nimmt Eingaben in zwei Zeilen vor, erste Zeile
width, height
, zweite Zeilediag
.Die Regeln waren locker, also rollte sie zurück.
Probieren Sie es hier online aus .
quelle
Retina ,
530220210202201193191187185 (184) BytesDank an randomra für das Speichern von 3 Bytes! (Und ebnen den Weg für ein paar mehr.)
Zu Zwecken der Byte-Zählung wird jede Zeile in eine separate Datei geschrieben. Sie können den obigen Code jedoch wie aus einer einzelnen Datei ausführen, indem Sie Retina mit dem
-s
Flag aufrufen .Dies erwartet zuerst die Dichte (die einen Dezimalpunkt enthalten muss , auch wenn es sich um einen nachgestellten handelt), gefolgt von Breite und Höhe, d
d w h
. H.Das ist etwas langsam. Ich würde die meisten Testfälle nicht ausprobieren, da sie ewig laufen werden. Sie können jedoch überprüfen, ob es mit den Testfällen ordnungsgemäß funktioniert
Nach dem Multiplizieren aller Zahlen, um die Dichte zu einer Ganzzahl zu machen, soll die Breite und Höhe nicht mehr als 4 Stellen haben.
Dies ist zwar langsam, aber völlig genau ... es gibt keine Fließkomma-Probleme oder ähnliches. Alle Arithmetik verwendet (unäre) Ganzzahlen.
Im Prinzip könnte ich ein weiteres Byte
^
weglassen : das kann weggelassen werden, aber es wirdTrash!
Testfälle aufgrund von übermäßig viel Backtracking schrecklich langsam machen .Erläuterung
Zuerst ordnen wir die Ungleichung neu an, um Gleitkommaoperationen zu vermeiden:
Wir können auch feststellen , dass diese invariant unter Multiplikation ist
w
,h
undd
durch die gleiche Anzahlx
:Es gibt verschiedene Möglichkeiten, eine unäre Zahl zu quadrieren, aber wir werden die Identität nutzen
Dies gibt uns eine Möglichkeit, das Problem nur mit einer Ganzzahlarithmetik (die Ganzzahlen in Unary darstellt) zu lösen.
Lass uns den Code durchgehen. Jedes Zeilenpaar ist eine reguläre Ersetzung.
Dadurch wird der Dezimalpunkt in der Dichte wiederholt nach rechts verschoben, während Breite und Höhe mit 10 multipliziert werden (siehe
x
oben). Dies soll sicherstellen, dass alle Zahlen Ganzzahlen sind. Anstatt Nullen anzufügen, füge ich Nullen hinzu,_
die ich später als Null behandeln werde. (Dies ist ein Golf-Trick, da ich sonst schreiben müsste...${3}0
, um Mehrdeutigkeiten zu vermeiden$30
.) Das+
vor der Regex weist Retina an, diese Ersetzung zu wiederholen, bis sich das Ergebnis nicht mehr ändert (was der Fall ist, wenn das Muster nicht mehr übereinstimmt). .Wir bereiten die drei Zahlen für die Umwandlung in Unary vor. Grundsätzlich benötigen wir einen Marker (das
#
) vor jeder Zahl, aber es ist auch kürzer, einen am Ende jeder Zahl hinzuzufügen, was den Konvertierungsschritt nicht beeinflusst.Dies ist die Umstellung auf Unary mit einem von dan1111 entwickelten Trick . Im Wesentlichen übersetze ich jede Ziffer in eine Wiederholungsziffer für sich selbst, während ich die vorhandenen Ziffern mit 10 multipliziere (dabei bewege ich den
#
Marker nach rechts). Diese binäre Darstellung ist ein Durcheinander verschiedener Ziffern, aber die Gesamtzahl entspricht dem Wert der ursprünglichen Ganzzahl. Beachten Sie die\w
am Ende - normalerweise ist dies nur0
, aber wir möchten auch_
als Null behandeln (was in regulären Ausdrücken als Wortzeichen betrachtet wird).Wir wandeln jede Ziffer in zwei
1
s um, um a) sicherzustellen, dass alle Ziffern gleich sind (was später erforderlich sein wird) und b) jede der Zahlen zu verdoppeln.Dies führt zu zwei Dingen: Es quadriert alle Zahlen (oder vielmehr die Hälfte jeder Zahl, indem eine Summe berechnet wird
2n
) und addiert die resultierenden Quadrate der Breite und der Höhe. Beachten Sie, dass s, Markierungen und Leerzeichen[^.]
übereinstimmen . Wenn es sich um ein oder ein Leerzeichen handelt, erfasst der Lookahead nichts. Dies bedeutet, dass alle Elemente einfach entfernt werden, dh die Ergebnisse für die Breite und Höhe werden verkettet / hinzugefügt. Das Komma bleibt, um das Ergebnis von diesen zu trennen . Wenn Streichhölzer ein statt, dann sind die Look - Ahead stellt sicher , dass wir capture Hälfte der s , nachdem es (abgerundet) in der Gruppe . Dies berechnet die oben erwähnte Summe, die dann das Quadrat der ursprünglichen Zahl ergibt.1
#
#
.
d
[^.]
1
1
1
Die Zeichenfolge ist jetzt (in unary), dann , dann (in unary). Wir wollen wissen, ob die erste unäre Zahl kürzer ist als die zweite. Wir können diese Multiplikation leicht mit einer Erfassungsgruppen- und Wiederholungssyntax durchführen. Wir verwenden (anstatt ) danach, um sicherzustellen, dass die zweite Zahl tatsächlich größer als diese und nicht gleich ist. Wenn ja, ersetzen wir das alles durch .
d2
.
w2 + h2
90000
{n}
1+
1*
Retina!
Wenn die zweite Zahl nicht groß genug war, hat der vorherige Schritt nichts geändert und die Zeichenfolge beginnt immer noch mit einem
1
. In diesem Fall ersetzen wir einfach die gesamte Zeichenfolge durchTrash!
und sind fertig.quelle
Python, 49
Verwendet String-Interleaving.
Es stellte sich heraus, dass es kürzer war, beide Seiten zu quadrieren, als die komplexe Norm zu verwenden.
quelle
Retina!
oderTrash!
! Nicht retweetet @ertaisnha !!Retina , 312 Bytes
Das dauert eine Weile, aber es scheint zu funktionieren.
Könnte wohl noch viel mehr golfen werden ...
Erläuterung:
Fügen Sie Tags hinzu, um das Parsen der Zeichenfolge zu vereinfachen, und fügen Sie Junk hinzu, um die Konvertierung in Basis 1 zu vereinfachen, und fügen Sie 300 hinzu, um sie mit später zu multiplizieren
Fügen Sie
0
s an die Breite und Höhe an, während Sie den Dezimalteil der Diagonale an den ganzzahligen Teil anhängen. In diesem Fall ist die Diagonale eine ganze Zahl, und Breite und Höhe werden mit den10
erforderlichen Werten multipliziert .Konvertieren Sie alle Zahlen zur Basis 1, indem Sie die im ersten Schritt angehängte Nachschlagetabelle verwenden
Bereiten Sie sich darauf vor, alle Zahlen zu quadrieren
Quadrieren Sie jede Zahl
Multiplizieren Sie das Quadrat der Diagonale mit dem Quadrat der 300, die Sie im ersten Schritt eingefügt haben
Wenn die an die Höhe angehängte Breite in das gerade berechnete Produkt passt, ist die Pixeldichte zu niedrig und es handelt sich um Papierkorb!
Ansonsten ist es Retina!
quelle
CJam,
30 2927 BytesErfordert die Eingabe in Form von
diagonal width height
UPDATE: 1 Byte gespart dank Dennis!
Probieren Sie es hier online aus
quelle
APL,
4036 Bytes4 Bytes gespart dank Dennis!
Dies erzeugt eine unbenannte dyadische Funktion, die die ersten beiden Argumente links und das dritte rechts übernimmt. Es wird geprüft, ob die Summe der Quadrate der linken Werte größer ist als das 300-fache des Quadrats der rechten. Die Ausgabe wird entsprechend gedruckt.
Sie können es online ausprobieren !
quelle
TI-BASIC, 43
Legt Breite und Höhe als Liste mit zwei Elementen über den Homescreen und diagonal über die Eingabe fest.
Die 2-Byte-Kleinbuchstaben von TI-BASIC addieren 7 Byte (da
i
es sich um die imaginäre Einheit handelt, die aus einem Byte besteht), wodurch die Wettbewerbsfähigkeit beeinträchtigt wird. Zum Glück!
ist auch ein Byte, weil es die Fakultätsfunktion darstellt.quelle
JavaScript ES6, 49 Byte
Ich hasse es, dass JavaScript so lange mathematische Operatoren hat. Aber selbst wenn es einen
Math.pythagorean
gäbe, wäre dieser kürzer.quelle
(w,h,d)=>w*w+h*h>9e4*d*d?'Retina!':'Trash!'
Excel, 44 Bytes
Geben Sie Ihre Eingaben in diese Zellen ein.
Und diese Formel gibt Ihr Ergebnis:
quelle
9E4*C1^2
anstelle von(300*C1)^2
... zu golfen. Dies ergibt eine Länge von 42. Das Eingeben9E4
einer Formel in Excel wird jedoch in geändert,90000
sobald Sie die Eingabetaste drücken. :(Prolog, 51 Bytes
Laufende
a(8192,4320,100.0,R).
Ausgaben:R = "Trash!" .
Edit: Danke an @PaulButcher für das Korrigieren eines Edge-Cases und das Golfen eines Bytes.
quelle
180 240 1 -> Trash!
aus dem Beispiel 300 (z. B. ) beträgt . Zum Glück, da Sie zwei Zeichen mit e-Notation abschneiden können>
,>=
bleibt es bei 52:b(W,H,D,R):-9e4*D*D>=W*W+H*H,R="Trash!";R="Retina!".
<
stattdessen tatsächlich>=
die beiden Zeichenfolgenergebnisse verwendet undJavaScript (ES6), 45 Byte
CoffeeScript, 47 Bytes
Kein ternärer Operator, aber es gibt eine Potenzierung (die beim letzten Versuch nicht hilft).
quelle
f=
) zu haben. Sie können in allen Versionen 2 Bytes abschneiden.O ,
4037 BytesViele Bytes für die Eingabeformatierung: \
Probieren Sie es online aus
quelle
Pure Bash (kein bc / andere externe Befehle),
1381361358283 BytesIch beschloss, es in purer Bash zu versuchen. Ich habe wahrscheinlich ein paar offensichtliche Ineffizienzen gemacht, da dies mein erstes Mal Code-Golfen ist, aber ich bin SEHR vertraut mit Bash und hatte in der Vergangenheit Spaß daran, Dinge zu schreiben, die keine externen Befehle verwenden (dh reine Bash).
Die printf-Anweisung ist am ärgerlichsten. Hat jemand bessere Ideen für das Auffüllen von Zahlen mit Nullen?BEARBEITEN: Zwei Bytes gespeichert. Es stellt sich heraus, dass printf ein leeres Argument für Null akzeptiert. Hat ein weiteres Byte gespeichert, hat sich herausgestellt, dass ich zuvor falsch gezählt habe, und die Ausgabe von printf nur einer Variablen zuzuweisen, ist kleiner als die Verwendung von -v.
EDIT2: Dank Digital Trauma in den Kommentaren ist dies jetzt viel deutlicher gesunken. Tricks: Verwenden Sie die Regex-Unterstützung von bash, um die Ziffernfolge durch Nullen zu ersetzen, anstatt sie zu zählen, und drucken Sie dann diese Anzahl von Nullen aus (scheint offensichtlich, wenn ich es so ausdrücke ...). Speichern Sie die Zeichenfolgen in einem Bash-Array, um ein Echo zu speichern. und unter Berücksichtigung einer geringfügigen Änderung der Regeln, dh Sie können alle eingegebenen Zahlen in .0 beenden.
EDIT3: Ein Byte wurde hinzugefügt, um den Fehler zu beheben, der durch die vorgeschlagene Änderung von Digital Trauma verursacht wurde.
quelle
a=${3#*.};d=${a/./0};((${#a}-${#3}))||d=;r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
(Sie können das;
durch Zeilenumbrüche ersetzen - ich habe nur versucht, es in einem Kommentar zu bekommen)..0
(ok, glaube ich), können Sie 82 Punkte erzielen:a=${3#*.};d=${a/./0};r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
$d
ist nicht zu knifflig.a
enthält die Nachkommastellen der Dichte.d=${a/./0}
Ersetzt einfach alle diese Ziffern durch Nullen. Auf diese Weise können wir diese Nullen bis zum Ende zusammenfassenw
undh
mit derselben Zehnerpotenz multiplizieren, die durch Entfernen des Dezimalpunkts von erreicht wirdd
.Gleichstrom, 41 Bytes
Benötigt die Eingabe von Argumenten in der richtigen
d, w, h
Reihenfolge - ich hoffe, das ist in Ordnung.Testausgang:
quelle
Julia,
464542 BytesDadurch wird eine Funktion erstellt, die drei numerische Werte akzeptiert und eine Zeichenfolge zurückgibt.
Es ist eine direkte Implementierung der Formel, die nur ein wenig umgestellt wurde. Beide Seiten der Ungleichung wurden
d
dann zum Quadrat multipliziert .quelle
R
5955 BytesAls unbenannte Funktion jetzt
Sehr einfache Implementierung, bei der keine Indexverweise erforderlich sind.
Bisherige
Ziemlich einfach ist es, die Eingabe vom Scan in einen Vektor zu übertragen (einzeilig, durch Leerzeichen getrennt oder mehrzeilig). Quadrieren Sie den Vektor. Mach die Berechnung und kater das Ergebnis.
quelle
MATLAB -
4945 BytesIch musste zuerst ein Zellenarray deklarieren, das die Positionen 1 und 2 des Zellenarrays enthält
Trash!
und inRetina!
diesen gespeichert ist. Als nächstes benutze ich die Beobachtung, die von vielen beobachtet wurde, um die Gleichung neu zu ordnen, so dass Sie die Bedingung nur mit Ganzzahlarithmetik überprüfen. Ich habe 90000 dargestellt9e4
, um einige Bytes zu sparen. Wenn diese Bedingung erfüllt ist, geben wir eine 1 aus, ansonsten eine 0. Mit dieser Ausgabe indiziere ich direkt in das Zellenarray. Da MATLAB mit der Indizierung bei 1 beginnt, musste ich auch 1 hinzufügen, um die Indizierung abzuschließen. Was schön ist, ist, dass das Hinzufügentrue
mit 1 2 ergibt, während das Hinzufügenfalse
mit 1 1 ergibt. Dies wird entwederTrash!
oderRetina!
in der MATLAB-Eingabeaufforderung ausgegeben .Beispiel
quelle
int8
, true + 1 ist ein double (2).logical
Ausdruck in Klammern kapseln, damit er funktioniert. Reihenfolge der Operationen ... oh. Danke für den Tipp!hypot
aber deinw*w+h*h>9e4*d*d
ist kürzer). Entspricht dies jedoch den Fragenanforderungen? Es ist ein Programm, keine Funktion. Also sollte es dauernw
,h
undd
als Eingänge. Ich nehme an, das bedeutet Standard, wie bei Code-Abfragen üblichXSLT, 400 Bytes
Dies ist das Debüt einer noch nie dagewesenen Sprache bei PPCG, und ich hoffe, dass ich sie in Zukunft mehr verwenden kann, wenn ich sie näher kennenlerne.Code:
Ziemlich gedruckt
Anmerkungen:
Da XSLT keine Möglichkeit zur Eingabe über STDIN bietet, müssen wir eine XML-Datei verwenden, bei der die Eingabe zwischen zwei
<input>
Tags erfolgt. Natürlich hat diese Methode ihre Grenzen, aber für die meisten Herausforderungen funktioniert sie einwandfrei.Beispiel I / O
Eingabedatei:
Ausgabedatei:
Eingabedatei:
Ausgabedatei:
quelle
C # (81)
Ungolfed:
quelle
string D(int w,int h,double d){return w*w+h*h>9e4*d*d?"Retina":"Trash";}
. Aber Sie müssen auch!
zu jeder Zeichenfolge hinzufügen , so dass ich denke, zurück zu 75 wäre.Schnell, 77 Bytes
Deklarationen von Funktionsparametern bedeuten, dass dies viel mehr Zeichen erfordert, als es sollte:
func r(w:Float,h:Float,d:Float){print((w*w+h*h)>9e4*d*d ?"Retina!":"Trash!")}
quelle
Schnell, 56 Bytes
Grundsätzlich dasselbe wie bei GoatInTheMachine , jedoch mit impliziten Schließparametern
Wenn Code Golfing mit Swift immer solche Methoden deklariert, ist es viel kürzer
quelle
Haskell, 46
quelle
<interactive>:2:8: parse error on input '|'
.let f w h d|…
.C ++
7270 ByteÄhnlich wie bei anderen Lösungen habe ich mich mit Codegolf aufgewärmt.
quelle
90000
als9e4
Hier ist mein Beitrag für dieses Problem
Ruby, 67 Bytes, die von stdin lesen
Ruby, 56 Bytes in einer Funktion
Ein bisschen kürzer
Vielen Dank an die bisherigen Mitwirkenden für den 9e4!
Code-Golf Rubin
quelle
Bash, 85 Bytes
quelle
bc
beträgt die Genauigkeit 0 Dezimalstellen. Sie müssen festlegenscale
, oder Sie können wahrscheinlich davonkommen, mitbc -l
dem implizit die Skalierung auf 20 festgelegt wird((`bc<<<"sqrt($1^2+$2^2)/$3"`>300))&&echo Retina!||echo Trash!
PHP,
47,43,40,38 BytesBenötigt
register_globals==true
(was es niemals sein sollte!), Mit GET-Werten w, h, d- 4 Bytes durch Entfernen von Anführungszeichen um den String gespeichert. Schlechte Codierung, aber es funktioniert.
- Verschoben
d
und Quadratwurzel auf die andere Seite der Gleichung, Speichern dersqrt()
Funktion- 2 Bytes durch Umschalten auf gespeichert
hypot()
(danke Lucas Costa)quelle
register_globals
Direktive nicht setzen müssen.C # 6, 67 Bytes
Diese Antwort basiert auf der Antwort von Wolfsheads. Ich habe es mit einer neuen Funktion von C # 6 um 8 Bytes kürzer gemacht.
quelle
JavaScript (ES6)
585443 Bytes43 Bytes
Funktionszuweisung (gemäß PPCG-Regeln) entfernt (-2) sowie Quadratwurzel entfernt und mit 900 (300 ^ 2) verglichen (-12)
54 Bytes
Unnötige Klammern (-4 Bytes) loswerden
58 Bytes
Erklärung hier:
Hierbei werden ternäre Operatoren verwendet , um die Dichte zu testen, und mithilfe von Pfeilfunktionen werden einige Bytes gelöscht
quelle
Java,
8274 BytesNennen Sie es mit
g(width,height,diagonal)
quelle
double
Array wieString g(int w,int h,double x){return 9e4*x*x>w*w+h*h?"Trash!":"Retina!";}
folgtClojure, 58 Bytes
Benutzt @ Kroltans ausgefallene Mathematik, um dies zu verkürzen. Verwendet implizite Argumente, die in der Reihenfolge (w, h, d) übergeben werden.
Erste Clojure Golf ... Ich war überrascht, wie viel Leerzeichen ich auslassen darf
quelle