Сітківка чи сміття?


47

Ми живемо у чудову епоху технологій, де ми можемо мати прекрасно деталізовані 8К екрани на телевізорах, і навіть 2К дисплеї на своїх телефонах для задоволення мобільного перегляду. В останні роки ми пройшли довгий шлях з точки зору екранних технологій.

Одним із продуктів цього є термін, який став популярним Apple, Retina . Мається на увазі, що щільність пікселів у відповідному дисплеї настільки висока, що на відстані огляду 10-12 дюймів окремі пікселі не можуть бути легко вибрані.

Стів Джобс сказав, що щільність пікселів там, де це відбувається, становить близько 300 пікселів на дюйм , і вони почали використовувати щільність пікселів у цьому діапазоні на своїх пристроях, використовуючи для реклами мовленнєве слово Retina .

Щільність пікселів можна обчислити за такою формулою:

D = sqrt (w ^ 2 + h ^ 2) / d

Де dдіагональ екрана в дюймах w- це кількість пікселів на горизонтальній осі та hкількість пікселів на вертикальній осі.

Ваше завдання

Для цього завдання ви використовуєте стандарт Retina, щоб вирішити, які продукти варто купувати. Будучи сучасним споживачем, який ви є, купуючи прилади, ви хочете переконатися, що ви отримуєте хороший товар, а не якийсь пристрій з 90-х! Таким чином, ви хочете побудувати програму чи функцію, яка приймає ширину, висоту та довжину діагоналі екрана як параметри входу чи функції та повідомляє, чи кваліфікується конкретний екран як сітківка екрана ( D > 300) шляхом друку на екрані або повернення .

Через вашу зневагу до пристроїв, що не належать до Retina, ваша програма або функція видаватиметься, Retina!коли пристрій буде кваліфіковано, а Trash!коли - ні.

Ви можете припустити, що всі числа будуть більше 0. Значення пікселів для ширини та висоти завжди будуть цілими числами. Розмір екрана може бути інтерпретований будь-яким способом, якщо він підтримує десяткові місця. Вхід може бути в будь-якому обраному вами порядку, а також може містити до 3 окремих рядків.

Приклад вводу / виводу

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!

Це , тому виграє найменша кількість байтів.


Ось рішення Stuck, мова програмування на основі стека:

r;`;/300>"Retina!""Trash!"?

34
Хто - то, будь ласка, зробіть Retina відповідь
Digital Trauma

2
@DigitalTrauma Але пливе.
Sp3000

7
@ Sp3000 pfft, виправдання !. Створіть свій власний регекс поплавкового аналізу в Retina!
Оптимізатор

46
@ Sp3000 Добре, давайте збільшити ставки. Я обіцяю ляпнути велику соковиту винагороду в розмірі 500 пт за найкоротший юридичний (консенсус громади) відповідь на це запитання за тиждень з цього коментаря, який розміщує мітку часу.
Цифрова травма

2
Гм, вибраний поріг не зовсім відповідає маркетингу Apple, наприклад, для Retina iMac: 5120 2880 27
Ed Avis,

Відповіді:


5

Pyth - 27 байт

Використовує потрійний оператор і absдля обчислення піфагора.

?>c.avzQ300"Retina!""Trash!

Здійснює введення в два рядки, перший рядок width, height, другий рядок diag.

Правила були розслаблені, так відкочуючись.

Спробуйте його онлайн тут .


115

Сітківка , 530 220 210 202 201 193 191 187 185 (184) байт

Кредити до випадкових випадків, щоб зберегти 3 байти! (І проклавши шлях ще на пару.)

+`\.(\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!

Для цілей підрахунку байтів кожен рядок складається в окремому файлі, але ви можете запустити вищевказаний код, як і в одному файлі, звернувшись до Retina із -sпрапором.

Тут очікується спочатку щільність (яка повинна містити десяткову точку, навіть якщо вона є кінцевою), а потім шириною та висотою, тобто d w h.

Це трохи повільно. Я б не намагався пробувати більшість поданих тестових випадків, тому що це буде працювати протягом віків. Однак ви можете перевірити, чи правильно він працює з тестовими кейсами

19. 4096 2160     -> Trash!
1. 180 240        -> Trash!
1. 181 240        -> Retina!
1. 180 241        -> Retina!
0.04 10 10        -> Retina!

В основному, помноживши всі числа на цілі, щоб щільність була цілою, вам не потрібно, щоб ширина і висота мали більше 4 цифр.

Хоча це повільно, це абсолютно точно ... немає проблем з плаваючою точкою чи чогось подібного. Вся арифметика використовує (одинарні) цілі числа.

В принципі, я міг би відголити ще один байт: ^можна пропустити, але це зробить Trash!тестові випадки жахливо повільними через надмірну кількість зворотних трекінгів.

Пояснення

Спочатку давайте переставимо нерівність, щоб уникнути операцій з плаваючою комою:

√(w2 + h2) / d > 300
√(w2 + h2) > 300 d
w2 + h2 > 90000 d2

Ми також можемо помітити, що це інваріантно при множенні w, hі dна ту саму кількість 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

Існує кілька способів скласти одинарне число, але ми використовуємо ідентичність

n2 = Σi=1..2n ⌊i/2⌋

Це дає нам спосіб вирішити задачу, використовуючи лише цілу арифметику (представляючи цілі числа в одинакових).

Перейдемо до коду. Кожна пара рядків є заміною регулярного виразка.

+`\.(\d)(.+)( .+)
$1.$2_$3_

Це неодноразово переміщує десяткову точку в густині праворуч, помноживши ширину і висоту на 10 ( xвище). Це потрібно для того, щоб усі числа були цілими числами. Замість того, щоб додавати нулі, я додаю _, що згодом я буду вважати нулем. (Це хитрість з гольфу, тому що в противному випадку мені потрібно написати, ...${3}0щоб уникнути неоднозначності $30.) +Перед регексом вказує Ретіні повторювати цю заміну, поки результат не перестане змінюватися (що стосується випадків, коли шаблон більше не збігається) .

\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#

Це перетворення на одинарне, використовуючи трюк, розроблений dan1111 . По суті, я перекладаю кожну цифру на саму повторну цифру, при цьому множуючи існуючі цифри на 10 (переміщуючи #маркер вправо в процесі). Це двійкове представлення буде досить сукупністю різних цифр, але загальна кількість буде дорівнює значенню вихідного цілого числа. Зверніть увагу \wна кінець - зазвичай це справедливо 0, але ми також хочемо трактувати _як нуль (що в регулярному вираженні вважається символом слова).

\d
11

Перетворюємо кожну цифру на дві 1s, тим самим a) забезпечуючи, щоб усі цифри були однаковими (що буде потрібно пізніше) і b) подвоєння кожного з чисел.

(?=(1*)\1)[^.]
$1

Це робить дві речі: він розподіляє всі числа (а точніше половину кожного числа, обчислюючи суму більше 2n), і додає отримані квадрати ширини та висоти. Зауважте, що [^.]відповідає 1s, #маркери та пробіли. Якщо це #або пробіл, lookahead нічого не буде захоплювати, це означає, що всі вони просто видаляються, тобто результати для ширини та висоти об'єднуються / додаються. Десяткова крапка .залишається відокремлювати результат dвід цих. Якщо замість цього [^.]відповідає збіг 1, то lookahead гарантує, що ми захопимо половину 1s після нього (округлюємо вниз) у групі 1. Це обчислює суму, про яку я згадував вище, і отримає квадрат початкового числа.

^(1+)\.\1{90000}1+
Retina!

Рядок тепер (унарний), потім , потім (унарний). Ми хочемо знати, чи коротше перше одинарне число разів , ніж друге. Ми можемо легко зробити це множення за допомогою групи захоплення та синтаксису повторень. Ми використовуємо (замість цього ) згодом, щоб переконатися, що друге число насправді більше, ніж це, а не просто рівне. Якщо так, ми замінюємо все це на .d2.w2 + h290000{n}1+1*Retina!

1.+
Trash!

Якщо друге число було недостатньо великим, то попередній крок нічого не змінив, і рядок все одно розпочнеться з а 1. Якщо це так, ми просто замінюємо весь рядок на Trash!і робимо.


24
Ну, сталося. Тепер ми всі можемо померти щасливими.
Олексій А.

94
Як зауваження, оскільки це Retina, чи всі інші відповіді сміття?
Олексій А.

5
Наш бог приїхав!
Каде

7
Гаразд, тому моя обіцянка з нагодою все ще стоїть, але я хотів би побачити ґрунтовне пояснення (концептуально я думаю, що я знаю, як це зроблено, але хотів би побачити деталі). Також я присуджую винагороду за найкоротший юридичний відповідь на сітківку, тож, люди, щедро відкритий для коротших відповідей на сітківку!
Цифрова травма

2
@AlexA. Ні, тому що є ще одна відповідь Retina.
Ісмаїл Мігель

38

Пітона, 49

lambda w,h,d:"RTertaisnha!!"[w*w+h*h<=9e4*d*d::2]

Використовується переплетення рядків.

Виявилося коротше квадратних обох сторін, ніж використання складної норми.

w*w+h*h<=9e4*d*d
abs(w+1j*h)<=300*d

18
Ми повинні були надрукувати Retina!або Trash!! Не ретвітнув @ertaisnha !!
Оптимізатор


2
@Mew, але це навпаки;)
Оптимізатор

Приємно, я ще не бачив, щоб (ab) використовувався для друку тієї чи іншої рядка
Nick T

15

Сітківка , 312 байт

(\d+) (\d+) (\d+)(?:\.(\d+))?
a$1bc$2dj300ke$3fg$4h9iiiiiiiii8iiiiiiii7iiiiiii6iiiiii5iiiii4iiii3iii2ii1i0
+`(b.*)(d.*)fg(\d)
0$10$2$4fg
+`(a|c|e|j)(\d)(\d*)(i*)((?:b|d|f|k).*h.*\2(i*))
$1$3$4$4$4$4$4$4$4$4$4$4$6$5
g`(i+)
Q$1R$1
+`Q(i+)Ri
$1Q$1R
+`(j(i*).*e)i(.*f)
$1$3$2
a(i*).*c(i*).*f\1\2.*
Trash!
.*0
Retina!

Бігати це потрібно досить довго, але, здається, працює.

Можливо, в гольф можна було б набагато більше ...

Пояснення:

(\d+) (\d+) (\d+)(?:\.(\d+))?
a$1bc$2dj300ke$3fg$4h9iiiiiiiii8iiiiiiii7iiiiiii6iiiiii5iiiii4iiii3iii2ii1i0

Додайте теги, щоб зробити рядок зручнішим для розбору, а також додайте трохи небажаного, щоб полегшити перетворення на базу 1, а 300 додати, щоб помножити на пізніше

+`(b.*)(d.*)fg(\d)
0$10$2$4fg

Додайте 0s до ширини та висоти, додаючи десяткову частину діагоналі до цілої частини. Коли це буде зроблено, діагональ буде цілим числом, а ширина і висота помножать на скільки б 10було потрібно s.

+`(a|c|e|j)(\d)(\d*)(i*)((?:b|d|f|k).*h.*\2(i*))
$1$3$4$4$4$4$4$4$4$4$4$4$6$5

Перетворіть усі числа в базу 1, використовуючи таблицю пошуку, яку я додав на першому кроці

g`(i+)
Q$1R$1

Підготуйтеся до квадратних всіх чисел

+`Q(i+)Ri
$1Q$1R

Квадратне кожне число

+`(j(i*).*e)i(.*f)
$1$3$2

Помножимо квадрат діагоналі на квадрат 300, який ми вставили на першому кроці

a(i*).*c(i*).*f\1\2.*
Trash!

Якщо ширина, додана до висоти, вписується в продукт, який ми тільки що обчислили, щільність пікселів занадто низька, і це кошик!

.*0
Retina!

Інакше це Ретіна!



9

APL, 40 36 байт

Збережено 4 байти завдяки Деннісу!

{(9E4×⍵*2)<+/⍺*2:'Retina!''Trash!'}

Це створює безіменну діадичну функцію, яка бере перші два аргументи зліва і третій справа. Він перевіряє, чи більша сума квадратів лівих значень більше 300 ^ 2 рази більше квадрата правого. Результат друкується відповідно.

Ви можете спробувати онлайн !


Потрібно було оновитись перед публікацією ... Ви можете зберегти кілька байтів, взявши перші два аргументи зліва.
Денніс

@Dennis Дякуємо за вашу допомогу! Я вирішив видалити свою відповідь, коли побачив вашу, тому що ваша була краща. : P
Олексій А.

9

TI-BASIC, 43

Визначає ширину та висоту на головному екрані як двоелементний список, а по діагоналі - через Введення.

Input D
If 300D>√(sum(Ans²
Then
Disp "Retina!
Else
"Trash!

Двобайтові малі літери TI-BASIC додають 7 байтів ( iбудучи уявною одиницею, є одним байтом), тому вони є досить неконкурентоспроможними. На щастя, !це також один байт, тому що він представляє функціональну функцію.


9

JavaScript ES6, 49 байт

(w,h,d)=>Math.hypot(w,h)/d>300?'Retina!':'Trash!'

Я ненавиджу, що у JavaScript є такі довготривалі математичні оператори. Але навіть якби це було, Math.pythagoreanце було б коротше.


Хтось розум пояснює потік?
Пуховик

Можливо, за занадто довгий час.
lirtosiast

1
@ThomasKwa Python просто на 1 байт коротший
Optimizer

5
Замість обчислення квадратного кореня він може бути коротшим, якщо порівнювати квадрати значень.
Рето Кораді

4
@RetoKoradi Так, це коротше:(w,h,d)=>w*w+h*h>9e4*d*d?'Retina!':'Trash!'
pepkin88

8

Excel, 44 байти

Введіть свої дані в ці клітинки.

  • A1 = Ширина в пікселях
  • B1 = висота в пікселях
  • C1 = Діагональ у дюймах

І ця формула дає ваш результат:

=IF((300*C1)^2<A1^2+B1^2,"Retina!","Trash!")

4
Я намагався виграти 2 байти з цього поля, ввівши 9E4*C1^2замість (300*C1)^2... це дає довжину 42. Однак, набравши 9E4формулу в Excel, буде змінено на, 90000як тільки ви натиснете клавішу Enter. :(
Росс Пресер

7

Пролог, 51 байт

a(W,H,D,R):-9e4*D*D<W*W+H*H,R="Retina!";R="Trash!".

Виконання a(8192,4320,100.0,R).результатів:R = "Trash!" .

Редагування: Дякуємо @PaulButcher за виправлення крайового корпусу та гольф на один байт.


Це повертає "Сітківку!", Коли щільність становить 300 (наприклад 180 240 1 -> Trash!) із прикладу. До щастя, так як ви можете збрити два символу з електронного запису, зміни >в >=листі нього на 52:b(W,H,D,R):-9e4*D*D>=W*W+H*H,R="Trash!";R="Retina!".
Пол Батчер

@PaulButcher Використання 9e4 замість 90000 насправді голить 2 символи, а не один. Таким чином, ви ефективно скоротили мою відповідь на один байт, а також виправили цей крайній випадок, дякую.
Фаталізувати

1
Молодці! Добре бачити досить короткий приклад Prolog.
Пол М'ясник

@PaulButcher Поголив ще один байт, фактично використовуючи <замість цього >=і
поміняючи

5

JavaScript (ES6), 45 байт

f=(w,h,d)=>w*w+h*h>d*d*9e4?'Retina!':'Trash!'

CoffeeScript, 47 байт

Немає потрійного оператора, але є експоненція (що не допомагає в останній спробі).

f=(w,h,d)->w*w+h*h>d*d*9e4&&'Retina!'||'Trash!'

# Previous attempt
f=(w,h,d)->(w*w+h*h)**.5/d>300&&'Retina!'||'Trash!'

1
За специфікацією не потрібно мати функцію з назвою ( f=). Ви можете відрізати 2 байти у всіх версіях.
Кролтан


5

Pure Bash (без bc / інших зовнішніх команд), 138 136 135 82 83 байт

a=${3#*.}
d=${a//?/0}
r=(Trash Retina)
echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!

Я вирішив спробувати це робити в чистому стилі. Я, мабуть, зробив декілька очевидних неефективностей, оскільки це мій гольф з першим кодом, але я ДУЖЕ знайомий з bash і в минулому розважався, намагаючись писати речі, які не використовують жодних зовнішніх команд (тобто чистий баш).

Заява printf найбільше дратує. У когось є кращі ідеї для заміщення чисел з нулями?

EDIT: Збережено два байти, виявляється, printf візьме порожній аргумент за нуль. Збережено ще один байт, виявляється, я раніше неправильно рахував і просто присвоєння виводу printf змінної менше, ніж використання -v.

EDIT2: Завдяки цифровій травмі в коментарях, це знижується набагато значно. Прийоми: використовуючи підтримку регулярного виразів bash для заміни рядка цифр нулями, а не підраховуючи його, після чого друкує це число нулів (здається очевидним, коли я ставлю це так ...), зберігаючи рядки в масиві bash, щоб зберегти відлуння, і зважаючи на незначну зміну правил, що означає, що ви можете закінчити всі вхідні цифри в .0.

EDIT3: Додано байт, щоб виправити помилку, внесену запропонованою модифікацією Digital Trauma.


Щось подібне до оцінки 102: a=${3#*.};d=${a/./0};((${#a}-${#3}))||d=;r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}! (ви можете замінити ;нові рядки - я просто намагався отримати це в коментарі).
Цифрова травма

І якщо ви припускаєте, що цілі числа щільності закінчаться .0(добре, я думаю), ви можете набрати 82:a=${3#*.};d=${a/./0};r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
Digital Trauma

У початковому прикладі було декілька, які не закінчились .0, але я помічаю, що питання тепер було змінено, так що це дозволить заощадити зовсім небагато. Дякую за ідеї! Особливо мені подобається ваша ідея скоротити два заяви ехо; Я намагався розібратися, як це зробити, мені чомусь не спало на думку використовувати масив! Чомусь мені так і не спадало на думку, що ви можете використовувати ** ... Я спробую перевірити вашу відповідь, я трохи розгублений у тому, як $ d тут працює, але я зрозумію це.
Мюзер

Це $dне надто хитро. aмістить цифри густини після коми. d=${a/./0}просто замінює всі ці цифри нулями. Таким чином, ми можемо присвоїти ці нулі до кінця wта hпомножити на ту саму потужність на десять, яка досягається шляхом видалення десяткової крапки з d.
Цифрова травма

1
Ура, я думав, що на хвилину я з’їду з розуму!
Мюзер

4

постійного струму, 41 байт

[[Retina!]pq]sr?d*rd*+vr/300<r[Trash!]p

Вимагає введення аргументів для d, w, hпорядку - сподіваюся, це нормально.

Тестовий вихід:

$ for t in \
> "4.95 1920 1080" \
> "5.96 2560 1440" \
> "10.5 1920 1080" \
> "0.04 10 10" \
> "19 4096 2160" \
> "100.00 8192 4320" \
> "11.18 3000 1500" ; do \
> echo $t | dc -e'9k[[Retina!]pq]sr?d*rd*+vr/300<r[Trash!]p'
> done
Retina!
Retina!
Trash!
Retina!
Trash!
Trash!
Retina!
$ 

3

Юлія, 46 45 42 байт

f(w,h,d)=w^2+h^2>9e4d^2?"Retina!":"Trash!"

Це створює функцію, яка приймає три числові значення і повертає рядок.

Це пряма реалізація формули, просто трохи переставлена. Обидві сторони нерівності множилися на dтодішні квадрати.


3

R, 59 55 байт

Як безіменна функція зараз

function(h,w,d)if(h^2+w^2>9e4*d^2)'Retina!'else'Trash!'

Дуже проста реалізація, що виключає потребу в посиланнях на індекс.

Попередній

cat(if((n=scan()^2)[1]+n[2]>9e4*n[3])'Retina!'else'Trash!')

Досить просто, отримайте вхід від сканування у вектор (окремий рядок, розділений пробіл або багаторядковий). Площа вектора. Зробіть розрахунок і зарахуйте результат.


3

MATLAB - 49 45 байт

c={'Trash!','Retina!'};c{(w*w+h*h>9e4*d*d)+1}

Я спершу повинен був оголосити масив комірок, який містить Trash!і Retina!які зберігаються в місцях 1 і 2 в масиві комірок. Далі я використовую спостереження, яке спостерігають багато людей, щоб переставити рівняння так, щоб ви перевіряли стан лише за допомогою арифметики цілочисленних чисел. Я представляв 90000, 9e4щоб зберегти кілька байт. Якщо ця умова вірна, ми виводимо 1, а інше виводимо 0. Я використовую цей вихід для індексації безпосередньо в масиві комірок. Оскільки MATLAB починає індексувати з 1, я також повинен був додати 1, щоб завершити індексацію. Приємно те, що додавання trueз 1 дає 2, а додавання falseз 1 дає 1. Це виведе Trash!або Retina!в командному рядку MATLAB.

Приклад

>> w=1920;h=1080;d=4.95;
>> c={'Trash!','Retina!'};c{(w*w+h*h>9e4*d*d)+1}

ans =

Retina!

вам не потрібно int8, true + 1 - це подвійний (2).
Йонас

@Jonas Я спробував це. Це не змінилося б на 2 на MATLAB R2013a ... Дивно.
rayryeng

@Jonas - Мені довелося інкапсулювати logicalвираз у дужках, щоб він працював. Порядок операцій ... d'oh. Дякую за пораду!
rayryeng

Гарний підхід! (Я спробував, hypotале ваш w*w+h*h>9e4*d*dкоротший). Однак, чи відповідає це питанням вимогам? Це програма, а не функція. Тому вона повинна прийняти w, hі в dякості вхідних даних. Я припускаю, що це означає stdin, як зазвичай у
кодовому

@LuisMendo ах, мені доведеться це змінити! Спасибі
rayryeng

3

XSLT, 400 байт

Це дебют ніколи раніше не баченої мови на PPCG, і я сподіваюсь, що її більше використовуватиму в майбутньому, оскільки я її більше знаю.

Код:

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="input"><xsl:variable name="n" select="for $i in tokenize(.,'[^\d\.]+')return number($i)" /><xsl:choose><xsl:when test="$n[1]*$n[1]+$n[2]*$n[2]>90000*$n[3]*$n[3]">Retina!</xsl:when><xsl:otherwise>Trash!</xsl:otherwise></xsl:choose></xsl:template></xsl:stylesheet>

Досить друковані

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="input">
        <xsl:variable name="n" select="for $i in tokenize(.,'[^\d\.]+')return number($i)" />
        <xsl:choose>
            <xsl:when test="$n[1]*$n[1]+$n[2]*$n[2]>90000*$n[3]*$n[3]">
                Retina!
            </xsl:when>
            <xsl:otherwise>
                Trash!
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Примітки:

Оскільки XSLT не має можливості приймати дані через STDIN, ми повинні використовувати XML-файл із введенням між двома <input>тегами. Звичайно, у цього методу є свої обмеження, але він спрацює ідеально для більшості проблем.

Приклад вводу / виводу

Вхідний файл:

<?xml version="1.0" encoding="ISO-8859-1"?>
<input>3000 1500 11.18</input> 

Вихідний файл:

<?xml version="1.0" encoding="UTF-8"?>Retina!

Вхідний файл:

<?xml version="1.0" encoding="ISO-8859-1"?>
<input>1920 1080 10.5</input>

Вихідний файл:

<?xml version="1.0" encoding="UTF-8"?>Trash!

2

C # (81)

string D(int w,int h,double d){return Math.Sqrt(w*w+h*h)/d>300?"Retina":"Trash";}

Безголівки:

string Density(int width, int height, double diagonal)
{
    return Math.Sqrt(width * width + height * height) / diagonal > 300 ? "Retina" : "Trash";
}

Ви можете скоротити це до 73 з трюком деякі інші використовували переписати формулу і видалити операцію SQRT: string D(int w,int h,double d){return w*w+h*h>9e4*d*d?"Retina":"Trash";}. Але вам також потрібно додати !до кожного рядка, щоб це було 75, я думаю.
goric

2

Свіфт, 77 байт

Оголошення параметрів функції означають, що це займає набагато більше символів, ніж слід:

func r(w:Float,h:Float,d:Float){print((w*w+h*h)>9e4*d*d ?"Retina!":"Trash!")}


2

Швидкий, 56 байт

let r={print($0*$0+$1*$1>9e4*$2*$2 ?"Retina!":"Trash!")}

В основному те саме, що GoatInTheMachine 's, але з неявними параметрами закриття

Коли Code Golfing з Swift завжди оголошуйте такі способи, це набагато коротше


2

Хаскелл, 46 років

f w h d|w^2+h^2>d^2*9e4="Retina!"|0<1="Trash!"

Яку систему Haskell слід використовувати? Це не працює з версією ghci, яку я спробував, даючи <interactive>:2:8: parse error on input '|'.
Ed Avis

@EdAvis: GHCi не запускає програми; щоб спробувати там, потрібно let f w h d|….
Ри-

2

C ++ 72 70 байт

void F(int w,int h,float d){cout<<w*w+h*h>9e4*d*d?"Retina!":"Trash!";}

Подібний до інших рішень, придумав себе розігрітися з кодом гольфу.


1
Можна поголити пару, написавши 90000як9e4
Toby Speight

2

Ось мій внесок у цю проблему

Рубі, 67 байт зчитування від stdin

w,h,d=ARGV.map{|v|Float(v)}
puts w*w+h*h>d*d*9e4?"Retina!":"Trash!"

Ruby, 56 байт у функції

Трохи коротше

def r(w,h,d)
puts w*w+h*h>d*d*9e4?"Retina!":"Trash!"
end

Дякуємо попереднім учасникам програми 9e4!


2

Баш, 85 байт

if [ $(echo "sqrt($1^2+$2^2)/$3"|bc) -gt 300 ];then
echo Retina!
else
echo Trash!
fi

1
Це не працює для "3000 1500 11,18". За замовчуванням bcточність становить 0 знаків після коми. Вам потрібно буде встановити scale, або ви, ймовірно, можете піти з того, bc -lщо неявно встановлює шкалу до 20
Digital Trauma

О добре, я оновив свою відповідь. Дякую!
Аддісон

1
О, та перевірити codegolf.stackexchange.com/questions/15279 / ... . Наприклад((`bc<<<"sqrt($1^2+$2^2)/$3"`>300))&&echo Retina!||echo Trash!
Digital Trauma

2

PHP, 47,43,40 38 байт

<?=sqrt($w*$w+$h*$h)/$d>300?'Retina':'Trash'?>!
<?=sqrt($w*$w+$h*$h)/$d>300?Retina:Trash?>!
<?=$w*$w+$h*$h>9e4*$d*$d?Retina:Trash?>!

<?=hypot($w,$h)/$d>300?Retina:Trash?>!

Потрібен register_globals==true(який він ніколи не повинен бути!), Зі значеннями GET w, h, d
- збережено 4 байти, видаливши лапки навколо рядка. Погане кодування, але воно працює.
- Переміщений dта квадратний корінь на іншу сторону рівняння, збереження sqrt()функції
- Збережено 2 байти шляхом переходу на hypot()(спасибі Лукас Коста)


Вам слід просто сказати, що це відповідь PHP4.1, і вам не потрібно встановлювати register_globalsдирективу.
Ісмаїл Мігель

2
Будь-який варіант настільки ж поганий ха-ха
Martijn

2

C # 6, 67 байт

string D(int w,int h,double d)=>w*w+h*h>9e4*d*d?"Retina!":"Trash!";

Ця відповідь ґрунтується на відповіді Вовчиці. Я зробив це на 8 байт коротше, використовуючи нову функцію C # 6.


2

JavaScript (ES6) 58 54 43 байт

43 байт

Видалено призначення функції (згідно з правилами PPCG) (-2), а також видалити квадратний корінь і порівняти з 900 (300 ^ 2) (-12)

(w,h,d)=>w*w+h*h/d*d>300?"Retina!":"Trash!"

54 байт

Позбувся непостійних дужок (-4 байти)

a=(w,h,d)=>Math.sqrt(w*w+h*h)/d>300?"Retina!":"Trash!"

58 байт

a=(w,h,d)=>Math.sqrt((w*w)+(h*h))/d>300?"Retina!":"Trash!"

Пояснення тут:

a =                           // The function is a
 (w,h,d) =>                   // Accepts the three arguments
   Math.sqrt((w*w)+(h*h))/d   // Calculate pixel density
   > 300                      // Above the threshold
   ? "Retina!"                // If so, return "Retina!"
   : "Trash!"                 // Otherwise return "Trash!"

Це використовує потрійні оператори для перевірки щільності та вбиває пару байтів за допомогою функцій стрілки


1
Ви можете зробити це коротшим, уникаючи квадратного кореня та порівнявши квадрати значень.
Рето Коради

1

Java, 82 74 байти

String g(int w,int h,double d){return 9e4*d*d>w*w+h*h?"Trash!":"Retina!";}

Телефонуйте за допомогою g(width,height,diagonal)


1
Ви можете зменшити це, позбувшись дорогого doubleмасиву на кшталт: String g(int w,int h,double x){return 9e4*x*x>w*w+h*h?"Trash!":"Retina!";}Іноді найпростіше найкраще :)
Geobits

@Geobits Спасибі, я не знайшов часу, щоб вирахувати байти на два підходи, я радий, що ти все це схопив!
DeadChex

1

Clojure, 58 байт

#(if(>(+(* %1%1)(* %2%2))(* %3%3 90000))"Retina!""Trash!")

Використовуйте вигадливу математику @ Kroltan, щоб скоротити це. Використовує неявні аргументи, передані в порядку (w, h, d).

Перший гольф Clojure ... Я був здивований, скільки пробілів мені дозволено залишити

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.