Żyjemy w cudownym wieku technologii, w którym możemy mieć pięknie szczegółowe ekrany 8K na naszych telewizorach, a nawet wyświetlacze 2K na naszych telefonach dla przyjemności przeglądania mobilnego. W ostatnich latach przeszliśmy długą drogę pod względem technologii ekranów.
Jednym z produktów tego terminu jest popularna przez Apple nazwa Retina . Odnosi się to do tak dużej gęstości pikseli danego wyświetlacza, że przy odległości oglądania 10-12 cali od siebie poszczególne piksele nie mogą być łatwo wybrane.
Steve Jobs powiedział, że gęstość pikseli tam, gdzie ma to miejsce, wynosi około 300 pikseli na cal , i zaczęli stosować gęstości pikseli w tym zakresie na swoich urządzeniach z modnym hasłem Retina używanym do reklamy.
Gęstość pikseli można obliczyć za pomocą następującego wzoru:
Gdzie d
jest przekątna ekranu w calach, w
to liczba pikseli na osi poziomej i h
liczba pikseli na osi pionowej.
Twoje zadanie
Do tego zadania użyjesz standardu Retina, aby zdecydować, które produkty warto kupić. Będąc nowoczesnym konsumentem, którym jesteś, kupując urządzenia, chcesz mieć pewność, że otrzymujesz dobry produkt, a nie jakieś urządzenie z lat 90.! Jako taki, chcesz zbudować program lub funkcję, która przyjmuje szerokość, wysokość i długość przekątnej ekranu jako parametry wejściowe lub funkcyjne i informuje, czy dany ekran kwalifikuje się jako ekran siatkówki ( D > 300
), drukując na ekranie lub powracając .
Z powodu twojej pogardy dla urządzeń innych niż Retina, twój program lub funkcja wyświetli się, Retina!
gdy urządzenie się zakwalifikuje, a Trash!
kiedy nie.
Możesz założyć, że wszystkie liczby będą większe niż 0. Wartości w pikselach dla szerokości i wysokości będą zawsze liczbami całkowitymi. Rozmiar ekranu można interpretować w dowolny sposób, o ile obsługuje on ułamki dziesiętne. Dane wejściowe mogą być w dowolnej wybranej przez ciebie kolejności, a także mogą składać się maksymalnie z 3 oddzielnych linii.
Przykład 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!
To jest golf golfowy , więc wygrywa najmniejsza liczba bajtów.
Oto rozwiązanie Stuck, które tworzę: język programowania oparty na stosie:
r;`;/300>"Retina!""Trash!"?
Odpowiedzi:
Pyth - 27 bajtów
Używa operatora trójskładnikowego i
abs
oblicza pitagorejczyków.Pobiera dane w dwóch wierszach, pierwszym wierszu
width, height
i drugim wierszudiag
.Zasady były rozluźnione, więc wycofano się.
Wypróbuj online tutaj .
źródło
Retina ,
530220210202201193191187185 (184) bajtówKredyty dla randomra za zapisanie 3 bajtów! (I torując drogę jeszcze kilku.)
Do celów liczenia bajtów każda linia przechodzi do osobnego pliku, ale można uruchomić powyższy kod z pojedynczego pliku, wywołując Retinę z
-s
flagą.Oczekuje się najpierw gęstości (która musi zawierać kropkę dziesiętną, nawet jeśli jest to kropka), a następnie szerokości i wysokości, tj
d w h
.To jest trochę powolne. Nie wypróbowałbym większości podanych przypadków testowych, ponieważ będzie działał przez wieki. Możesz jednak sprawdzić, czy działa poprawnie z przypadkami testowymi
Zasadniczo po pomnożeniu wszystkich liczb, aby gęstość była liczbą całkowitą, nie chcesz, aby szerokość i wysokość składały się z więcej niż 4 cyfr.
Chociaż jest to powolne, jest całkowicie dokładne ... nie ma żadnych problemów ze zmiennoprzecinkowymi ani nic podobnego. Cała arytmetyka używa (jednych) liczb całkowitych.
Zasadniczo mógłbym ogolić jeszcze jeden bajt:
^
można go pominąć, ale spowoduje to, żeTrash!
przypadki testowe będą strasznie wolne z powodu nadmiernej ilości cofania.Wyjaśnienie
Po pierwsze, zmieńmy kolejność nierówności, aby uniknąć operacji zmiennoprzecinkowych:
Możemy również zauważyć, że jest to niezmienna pod pomnożenie
w
,h
ad
przez ten sam numerx
:Istnieje kilka sposobów, aby obliczyć jednoznaczną liczbę, ale wykorzystamy tożsamość
To daje nam sposób na rozwiązanie problemu przy użyciu tylko arytmetyki liczb całkowitych (reprezentujących liczby całkowite w jedności).
Przejdźmy przez kod. Każda para linii jest podstawieniem wyrażenia regularnego.
Powoduje to kilkakrotne przesunięcie punktu dziesiętnego gęstości w prawo, mnożąc szerokość i wysokość przez 10 (
x
powyżej). Ma to na celu zapewnienie, że wszystkie liczby są liczbami całkowitymi. Zamiast dopisywać zera, dołączam_
, co będę później traktować jako zero. (Jest to sztuczka golfowa, ponieważ w przeciwnym razie musiałbym pisać,...${3}0
aby uniknąć dwuznaczności$30
.)+
Przed regex mówi Retinie, aby powtarzała tę zamianę, dopóki wynik nie przestanie się zmieniać (co ma miejsce, gdy wzór już nie pasuje) .Przygotowujemy teraz trzy liczby do konwersji na jednoargumentowe. Zasadniczo potrzebujemy znacznika (
#
) przed każdą liczbą, ale krótsze jest również dodanie jednego na końcu każdej liczby, co nie wpłynie na krok konwersji.Jest to konwersja na unary, przy użyciu sztuczki opracowanej przez dan1111 . Zasadniczo tłumaczę każdą cyfrę na samą cyfrę rep, jednocześnie mnożąc istniejące cyfry przez 10 (przesuwając
#
znacznik w prawo w trakcie procesu). Ta reprezentacja binarna będzie zbiorem różnych cyfr, ale całkowita liczba będzie równa wartości oryginalnej liczby całkowitej. Zwróć uwagę\w
na koniec - zwykle jest to po prostu0
, ale chcemy również traktować_
jako zero (co jest uważane za znak słowny w wyrażeniu regularnym).Zamieniamy każdą cyfrę na dwie
1
s, tym samym a) upewniając się, że wszystkie cyfry są takie same (co będzie konieczne później) ib) podwajając każdą z liczb.Robi to dwie rzeczy: obciąża wszystkie liczby (a raczej połowę każdej liczby, obliczając sumę
2n
) i dodaje wynikowe kwadraty szerokości i wysokości. Zauważ, że[^.]
pasuje do1
s,#
znaczników i spacji. Jeśli jest to a#
lub spacja, lookahead nie przechwyci niczego, co oznacza, że wszystkie są po prostu usuwane, tj. Wyniki dla szerokości i wysokości są łączone / dodawane..
Pozostaje przecinek dziesiętny, aby oddzielić wynikd
od tych. Jeśli[^.]
pasuje1
zamiast, to lookahead zapewnia, że przechwycimy połowę1
sekundy po nim (zaokrągloną w dół) w grupie1
. To oblicza sumę, o której wspomniałem powyżej, która następnie da kwadrat pierwotnej liczby.Łańcuch jest teraz (w jedności), a następnie (w unary). Chcemy wiedzieć, czy pierwsza liczba jednoargumentowa jest krótsza niż druga. Możemy z łatwością dokonać tego zwielokrotnienia za pomocą składni grupy przechwytywania i powtarzania. Następnie używamy (zamiast ), aby upewnić się, że druga liczba jest rzeczywiście większa od tej, a nie tylko równa. Jeśli tak, zamieniamy to wszystko na .
d2
.
w2 + h2
90000
{n}
1+
1*
Retina!
Jeśli druga liczba nie była wystarczająco duża, to poprzedni krok nic nie zmieni, a ciąg znaków zacznie się od litery
1
. Jeśli tak jest, po prostu zastępujemy cały ciąg znakówTrash!
i gotowe.źródło
Python, 49
Wykorzystuje przeplatanie ciągów.
Okazało się, że krótszy jest kwadrat po obu stronach niż użycie złożonej normy.
źródło
Retina!
alboTrash!
! Nie przesyłaj dalej @ertaisnha !!Siatkówka , 312 bajtów
Uruchomienie zajmuje sporo czasu, ale wydaje się, że działa.
Prawdopodobnie można by grać w golfa o wiele więcej ...
Wyjaśnienie:
Dodaj tagi, aby ułatwić analizowanie ciągu, i dodaj trochę śmieci, aby ułatwić konwersję do bazy 1, i dodaj 300, aby pomnożyć później
Dołącz
0
s do szerokości i wysokości, jednocześnie dołączając dziesiętną część przekątnej do części całkowitej. Gdy to nastąpi, przekątna będzie liczbą całkowitą, a szerokość i wysokość zostaną pomnożone przez liczbę10
koniecznych s.Konwertuj wszystkie liczby na bazę 1, korzystając z tabeli odnośników, którą załączyłem w pierwszym kroku
Przygotuj do kwadratu wszystkie liczby
Kwadrat każdej liczby
Pomnóż kwadrat przekątnej przez kwadrat 300, który wstawiliśmy w pierwszym kroku
Jeśli szerokość dołączona do wysokości pasuje do właśnie obliczonego produktu, gęstość pikseli jest zbyt niska i jest to Kosz!
W przeciwnym razie jest to siatkówka!
źródło
CJam,
30 2927 bajtówWymaga, aby dane wejściowe miały postać
diagonal width height
AKTUALIZACJA: 1 bajt zapisany dzięki Dennisowi!
Wypróbuj online tutaj
źródło
APL,
4036 bajtówZaoszczędź 4 bajty dzięki Dennisowi!
Tworzy to nienazwaną funkcję dyadyczną, która przyjmuje dwa pierwsze argumenty po lewej i trzeci po prawej. Sprawdza, czy suma kwadratów lewych wartości jest większa niż 300 ^ 2 razy kwadrat kwadratu prawej. Dane wyjściowe są odpowiednio drukowane.
Możesz spróbować online !
źródło
TI-BASIC, 43
Przeciąga szerokość i wysokość przez ekran główny jako listę dwóch elementów, a przekątna przez wejście.
Dwubajtowe małe litery TI-BASIC-a dodają 7 bajtów (
i
ponieważ jest to jednostka wyobrażona, to jeden bajt), co powoduje, że jest dość niekonkurencyjny. Na szczęście!
jest również jeden bajt, ponieważ reprezentuje funkcję silni.źródło
JavaScript ES6, 49 bajtów
Nienawidzę tego, że JavaScript ma tak długie operatory matematyczne. Ale nawet gdyby tak było,
Math.pythagorean
byłoby to krótsze.źródło
(w,h,d)=>w*w+h*h>9e4*d*d?'Retina!':'Trash!'
Excel, 44 bajty
Wpisz swoje dane wejściowe w tych komórkach.
A ta formuła daje wynik:
źródło
9E4*C1^2
zamiast(300*C1)^2
... daje to długość 42. Jednak wpisanie9E4
formuły w programie Excel zostanie zmienione na90000
zaraz po naciśnięciu klawisza Enter. :(Prolog, 51 bajtów
a(8192,4320,100.0,R).
Wyjścia bieżące :R = "Trash!" .
Edycja: Dzięki @PaulButcher za poprawienie wielkości krawędzi i golfowanie o jeden bajt.
źródło
180 240 1 -> Trash!
) Z przykładu. Na szczęście, ponieważ można golić dwa znaki notacji E, zmienia>
się>=
pozostawia na 52:b(W,H,D,R):-9e4*D*D>=W*W+H*H,R="Trash!";R="Retina!".
<
zamiast>=
i zamieniając wyniki dwóch ciągów ...JavaScript (ES6), 45 bajtów
CoffeeScript, 47 bajtów
Brak operatora trójskładnikowego, ale występuje potęgowanie (co nie pomaga w ostatniej próbie).
źródło
f=
) nie jest konieczna . Możesz odciąć 2 bajty we wszystkich wersjach.O ,
4037 bajtówWiele bajtów do formatowania wejściowego: \
Wypróbuj online
źródło
Pure Bash (bez bc / innych poleceń zewnętrznych),
1381361358283 bajtówPostanowiłem spróbować to zrobić w czystym stylu. Prawdopodobnie zrobiłem kilka oczywistych nieefektywności, ponieważ jest to mój pierwszy raz w golfa kodem, ale jestem BARDZO obeznany z bashem i bawiłem się w przeszłości próbując pisać rzeczy, które nie używają żadnych zewnętrznych poleceń (tj. Czystego basha).
Instrukcja printf jest najbardziej denerwująca. Czy ktoś ma lepsze pomysły na wypełnianie liczb zerami?EDYCJA: Zapisano dwa bajty, okazuje się, że printf weźmie pusty argument na zero. Zapisałem kolejny bajt, okazuje się, że wcześniej źle przeliczyłem i po prostu przypisanie wyjścia printf do zmiennej jest mniejsze niż użycie -v.
EDYCJA 2: Dzięki Digital Trauma w komentarzach jest to teraz znacznie bardziej znaczące. Sztuczki: użycie obsługi wyrażeń regularnych basha w celu zastąpienia ciągu cyfr zerami zamiast liczenia go, a następnie wydrukowanie tej liczby zer (wydaje się oczywiste, gdy tak to umieszczam ...), przechowywanie ciągów w tablicy bash w celu zapisania echa, i biorąc pod uwagę niewielką zmianę reguł, co oznacza, że możesz zakończyć wszystkie liczby wejściowe w .0.
EDYCJA 3: Dodano bajt, aby naprawić błąd wprowadzony przez sugerowaną modyfikację Digital Trauma.
źródło
a=${3#*.};d=${a/./0};((${#a}-${#3}))||d=;r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
(możesz zastąpić znakiem;
nowego wiersza - próbowałem po prostu dostać to w komentarzu)..0
(myślę, że tak), możesz zdobyć 82:a=${3#*.};d=${a/./0};r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
$d
nie jest zbyt trudne.a
zawiera cyfry gęstości po przecinku.d=${a/./0}
po prostu zastępuje wszystkie te cyfry zerami. W ten sposób możemy połączyć te zera do końcaw
ih
pomnożyć przez tę samą potęgę dziesięciu, która jest osiągnięta przez usunięcie przecinka dziesiętnego zd
.dc, 41 bajtów
Wymaga wprowadzenia argumentów w
d, w, h
kolejności - mam nadzieję, że to jest w porządku.Wyjście testowe:
źródło
Julia,
464542 bajtówTworzy to funkcję, która akceptuje trzy wartości liczbowe i zwraca ciąg znaków.
Jest to bezpośrednia implementacja formuły, tylko nieco zmieniona. Obie strony nierówności zostały
d
następnie pomnożone przez kwadrat.źródło
R,
5955 bajtówTeraz jako funkcja bez nazwy
Bardzo prosta implementacja, która eliminuje potrzebę odwołań do indeksu.
Poprzedni
Dość proste, uzyskaj dane wejściowe ze skanowania do wektora (pojedyncza linia, spacja oddzielona lub wieloliniowa). Kwadrat wektora. Wykonaj obliczenia i sprawdź wynik.
źródło
MATLAB -
4945 bajtówNajpierw musiałem zadeklarować tablicę komórek, która zawiera
Trash!
iRetina!
która jest przechowywana w miejscach 1 i 2 w tablicy komórek. Następnie wykorzystuję obserwację obserwowaną przez wielu do zmiany układu równania, tak aby sprawdzać warunek tylko za pomocą arytmetyki liczb całkowitych. Przedstawiłem 90000,9e4
aby zaoszczędzić trochę bajtów. Jeśli ten warunek jest spełniony, wyprowadzamy 1, w przeciwnym razie wyprowadzamy 0. Używam tego wyniku do indeksowania bezpośrednio do tablicy komórek. Ponieważ MATLAB rozpoczyna indeksowanie od 1, musiałem również dodać 1, aby dokończyć indeksowanie. Przyjemne jest to, że dodawanie zatrue
pomocą 1 daje 2, podczas gdy dodawanie zafalse
pomocą 1 daje 1. Spowoduje to wyświetlenie jednegoTrash!
lubRetina!
w wierszu polecenia MATLAB.Przykład
źródło
int8
, prawda + 1 to podwójne (2).logical
wyrażenie w nawiasach, aby zadziałało. Kolejność operacji ... d'oh. Dzięki za wskazówkę!hypot
ale twójw*w+h*h>9e4*d*d
jest krótszy). Czy to jednak spełnia wymagania dotyczące pytań? To program, a nie funkcja. Tak powinno zająćw
,h
id
jak wejść. Zakładam, że oznacza to stdin, jak zwykle w wyzwaniu koduXSLT, 400 bajtów
To jest debiut nigdy nie widzianego języka na PPCG, i mam nadzieję, że będę go używać w przyszłości, kiedy go lepiej poznam.Kod:
Dość drukowane
Uwagi:
Ponieważ XSLT nie ma możliwości pobierania danych wejściowych przez STDIN, musimy użyć pliku XML z danymi wejściowymi między dwoma
<input>
znacznikami. Oczywiście ta metoda ma swoje ograniczenia, ale doskonale sprawdzi się w przypadku większości wyzwań.Przykład I / O
Plik wejściowy:
Plik wyjściowy:
Plik wejściowy:
Plik wyjściowy:
źródło
C # (81)
Nie golfowany:
źródło
string D(int w,int h,double d){return w*w+h*h>9e4*d*d?"Retina":"Trash";}
. Ale musisz również dodać!
do każdego łańcucha, aby wrócił do 75, myślę.Szybki, 77 bajtów
Deklaracje parametrów funkcji oznaczają, że zajmuje to znacznie więcej znaków, niż powinno:
func r(w:Float,h:Float,d:Float){print((w*w+h*h)>9e4*d*d ?"Retina!":"Trash!")}
źródło
Szybki, 56 bajtów
Zasadniczo taki sam jak GoatInTheMachine , ale z niejawnymi parametrami zamknięcia
Kiedy Code Golfing z Swift zawsze deklaruje takie metody, jest znacznie krótszy
źródło
Haskell, 46
źródło
<interactive>:2:8: parse error on input '|'
.let f w h d|…
.C ++
7270 bajtówPodobnie jak inne rozwiązania, postanowiłem rozgrzać się w golfa kodu.
źródło
90000
jako9e4
Oto mój wkład w rozwiązanie tego problemu
Rubin, 67 bajtów odczytu ze standardowego wejścia
Ruby, 56 bajtów w funkcji
Troszkę krótszy
Dzięki poprzednim uczestnikom 9e4!
kod-golf ruby
źródło
Bash, 85 bajtów
źródło
bc
dokładność wynosi 0 miejsc po przecinku. Trzeba będzie ustawićscale
, albo prawdopodobnie uda ci się uciec, przybc -l
czym domyślnie ustawiono skalę na 20((`bc<<<"sqrt($1^2+$2^2)/$3"`>300))&&echo Retina!||echo Trash!
PHP,
47,43,4038 bajtówWymaga
register_globals==true
(nigdy nie powinno być!) Wartości GET w, h, d- Zapisano 4 bajty, usuwając cudzysłowy wokół łańcucha. Złe kodowanie, ale działa.
- Przeniesiono
d
i pierwiastek kwadratowy na drugą stronę równania, zapisującsqrt()
funkcję- Zapisano 2 bajty, przełączając na
hypot()
(dziękuję Lucas Costa)źródło
register_globals
ustawiać dyrektywy.C # 6, 67 bajtów
Ta odpowiedź jest oparta na odpowiedzi Wolfsheads. Skróciłem go o 8 bajtów, używając nowej funkcji C # 6.
źródło
JavaScript (ES6)
585443 bajtów43 bajtów
Usunięto przypisanie funkcji (zgodnie z zasadami PPCG) (-2), a także usunięto pierwiastek kwadratowy i porównano do 900 (300 ^ 2) (-12)
54 bajtów
Pozbyłem się niepotrzebnych nawiasów (-4 bajty)
58 bajtów
Wyjaśnienie tutaj:
Używa trójskładnikowych operatorów do testowania gęstości i zabija kilka bajtów za pomocą funkcji strzałek
źródło
Java,
8274 bajtyZadzwoń za pomocą
g(width,height,diagonal)
źródło
double
tablicy, takiej jak:String g(int w,int h,double x){return 9e4*x*x>w*w+h*h?"Trash!":"Retina!";}
Czasami najprostsza jest najlepsza :)Clojure, 58 bajtów
Wykorzystano fantazyjną matematykę @ Kroltana, aby to skrócić. Wykorzystuje niejawne argumenty przekazane w kolejności (w, h, d).
Pierwszy golf Clojure ... Byłem zaskoczony, jak wiele białych znaków mogę pominąć
źródło