Мы живем в эпоху замечательных технологий, где у нас могут быть великолепно детализированные 8K-экраны на наших телевизорах и даже 2K-экраны на наших телефонах для нашего мобильного просмотра. В последние годы мы прошли долгий путь с точки зрения технологии экранов.
Одним из продуктов этого термина стал популярный термин Apple, Retina . Это означает, что плотность пикселей рассматриваемого дисплея настолько высока, что на расстоянии просмотра 10-12 дюймов отдельные пиксели не могут быть легко выбраны.
Стив Джобс сказал, что плотность пикселей, где это происходит, составляет около 300 пикселей на дюйм , и они начали использовать плотность пикселей в этом диапазоне на своих устройствах с умным словом Retina, используемым для рекламы.
Плотность пикселей можно рассчитать по следующей формуле:
Где 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!"?
Ответы:
Pyth - 27 байт
Использует троичный оператор и
abs
для вычисления пифагорейского.Принимает ввод в две строки, первая строка
width, height
, вторая строкаdiag
.Правила были смягчены, поэтому откат.
Попробуйте это онлайн здесь .
источник
Retina ,
530220210202201193191187185 (184) байтКредиты рандоме для сохранения 3 байта! (И прокладывает путь еще на пару.)
Для подсчета байтов каждая строка идет в отдельном файле, но вы можете запустить приведенный выше код как один из одного файла, вызвав Retina с
-s
флагом.Это первое ожидает , что плотность (которая должна содержать десятичную точку, даже если это замыкающий один), а затем по ширине и высоте, то есть
d w h
.Это немного медленно. Я бы не стал пробовать большинство из приведенных тестов, потому что он будет работать целую вечность. Тем не менее, вы можете проверить, что он работает правильно с тестовыми примерами
По сути, после умножения всех чисел на целые значения плотности не требуется, чтобы ширина и высота имели более 4 цифр.
Хотя это медленно, это совершенно точно ... нет проблем с плавающей запятой или что-то в этом роде. Вся арифметика использует (унарные) целые числа.
В принципе, я мог бы сбрить еще один байт:
^
опустить его можно, но это сделаетTrash!
тестовые случаи ужасно медленными из-за чрезмерного количества возвратов.объяснение
Во-первых, давайте изменим неравенство, чтобы избежать операций с плавающей запятой:
Можно также заметить , что это инвариантно относительно умножения
w
,h
иd
одним и тем же номеромx
:Есть несколько способов возвести в квадрат одинарное число, но мы будем использовать тождество
Это дает нам возможность решить проблему, используя только целочисленную арифметику (представляющую целые числа в унарном).
Давайте пройдемся по коду. Каждая пара строк является подстановкой регулярного выражения.
Это многократно перемещает десятичную точку в плотности вправо, умножая ширину и высоту на 10 (
x
выше). Это делается для того, чтобы все числа были целыми числами. Вместо добавления нулей я добавляю_
, что позже буду трактовать как ноль. (Это игра в гольф, потому что в противном случае мне нужно было бы написать,...${3}0
чтобы избежать двусмысленности$30
.)+
Перед регулярным выражением перед Retina указывается повторять эту замену до тех пор, пока результат не перестанет изменяться (что является случаем, когда шаблон больше не совпадает) ,Мы готовим три числа для преобразования в унарный. В принципе, нам нужен маркер (
#
) перед каждым числом, но короче, чтобы добавить один к концу каждого числа, что не повлияет на шаг конвертации.Это преобразование в унарный, используя трюк, разработанный dan1111 . По сути, я перевожу каждую цифру в саму повторную цифру, умножая существующие цифры на 10 (при этом перемещая
#
маркер вправо). В этом двоичном представлении будет довольно много разных цифр, но общее число будет равно значению исходного целого числа. Обратите внимание\w
на конец - обычно это просто0
, но мы также хотим трактовать_
как ноль (который в регулярном выражении считается символом слова).Мы превращаем каждую цифру в две
1
s, тем самым а) обеспечивая, чтобы все цифры были одинаковыми (что будет необходимо позже), и б) удваивая каждое из чисел.Это делает две вещи: он возводит в квадрат все числа (или, точнее, половину каждого числа, вычисляя сумму над
2n
) и добавляет полученные квадраты ширины и высоты. Обратите внимание, что[^.]
соответствует1
s,#
маркеры и пробелы. Если это#
или пробел, заглядывание не будет ничего захватывать, что означает, что все они просто удаляются, то есть результаты для ширины и высоты объединяются / добавляются. Десятичная точка.
остается отделить результат дляd
тех. Если вместо этого[^.]
совпадает с a1
, то предварительный просмотр гарантирует, что мы захватим половину1
s после него (округлено) в группе1
. Это вычисляет сумму, которую я упомянул выше, которая затем даст квадрат исходного числа.Строка теперь (в унарном), затем , затем (в унарном). Мы хотим знать, короче ли первое унарное число раз, чем второе. Мы можем легко сделать это умножение, используя группу захвата и синтаксис повторения. Мы используем (вместо ) впоследствии, чтобы убедиться, что второе число на самом деле больше , а не просто равно. Если это так, мы заменим все это на .
d2
.
w2 + h2
90000
{n}
1+
1*
Retina!
Если второе число не было достаточно большим, то предыдущий шаг ничего не изменит, и строка все равно будет начинаться с
1
. Если это так, мы просто заменим всю строку наTrash!
и все готово.источник
Python, 49
Использует чередование строк.
Оказалось, короче, чтобы квадрат обе стороны, чем использовать сложную норму.
источник
Retina!
илиTrash!
! Не ретвит @ertaisnha !!Сетчатка , 312 байт
Это занимает довольно много времени, но кажется, что это работает.
Вероятно, можно было бы играть в гольф намного больше ...
Объяснение:
Добавьте теги, чтобы сделать строку более удобной для анализа, и добавьте мусор, чтобы упростить преобразование в базу 1, и добавьте 300 для умножения на более поздние.
Добавьте
0
s к ширине и высоте, добавляя десятичную часть диагонали к целочисленной части. Когда это будет сделано, диагональ будет целым числом, а ширина и высота будут умножены на любое количество10
s.Преобразовать все числа в основание 1, используя таблицу соответствия, которую я добавил на первом шаге
Приготовьтесь выровнять все числа
Квадрат каждого числа
Умножьте квадрат диагонали на квадрат 300, который мы вставили в первый шаг
Если ширина, добавленная к высоте, соответствует продукту, который мы только что вычислили, плотность пикселей слишком мала, и это мусор!
Иначе это Retina!
источник
CJam,
30 2927 байтТребует ввода в форме
diagonal width height
ОБНОВЛЕНИЕ: 1 байт сохранен благодаря Деннису!
Попробуйте онлайн здесь
источник
APL,
4036 байтСохранено 4 байта благодаря Денису!
Это создает безымянную двоичную функцию, которая принимает первые два аргумента слева и третий справа. Он проверяет, больше ли сумма квадратов левых значений в 300 ^ 2 раза по сравнению с квадратом правых. Вывод печатается соответственно.
Вы можете попробовать это онлайн !
источник
TI-BASIC, 43
Принимает ширину и высоту через домашний экран в виде списка из двух элементов и по диагонали через ввод.
Двухбайтовые строчные буквы TI-BASIC добавляют 7 байтов (
i
будучи мнимой единицей, это один байт), что делает его довольно неконкурентоспособным. К счастью,!
это также один байт, потому что он представляет факториальную функцию.источник
JavaScript ES6, 49 байт
Я ненавижу, что JavaScript имеет такие длинные математические операторы. Но даже если бы
Math.pythagorean
это было короче.источник
(w,h,d)=>w*w+h*h>9e4*d*d?'Retina!':'Trash!'
Excel, 44 байта
Введите свои данные в эти ячейки.
И эта формула дает ваш результат:
источник
9E4*C1^2
вместо(300*C1)^2
... это дает длину 42. Тем не менее, ввод9E4
формулы в Excel будет изменен на,90000
как только вы нажмете ввод. :(Пролог, 51 байт
Запуск
a(8192,4320,100.0,R).
выходов:R = "Trash!" .
Редактировать: Спасибо @PaulButcher за исправление краевого случая и игру в гольф на один байт.
источник
180 240 1 -> Trash!
) из примера. К счастью, так как вы можете сбрить два символа с электронной записи, изменения>
в>=
листьях него на 52:b(W,H,D,R):-9e4*D*D>=W*W+H*H,R="Trash!";R="Retina!".
<
вместо>=
двух строк результаты и поменяв их местами ...JavaScript (ES6), 45 байт
CoffeeScript, 47 байт
Нет троичного оператора, но есть возведение в степень (что не помогает в последней попытке).
источник
f=
). Вы можете отрезать 2 байта во всех версиях.О ,
4037 байтМного байтов для форматирования ввода: \
Попробуйте онлайн
источник
Pure Bash (без bc / других внешних команд),
1381361358283 байтаЯ решил попробовать сделать это в чистом виде. Я, вероятно, сделал несколько очевидных неэффективностей, так как это мой первый раз, когда играю в код, но я ОЧЕНЬ знаком с bash и в прошлом весело проводил время, пытаясь писать вещи, которые не используют никаких внешних команд (то есть чистый bash).
Утверждение printf самое раздражающее. У кого-нибудь есть лучшие идеи для заполнения чисел нулями?РЕДАКТИРОВАТЬ: Сохраненные два байта, оказывается, printf будет принимать пустой аргумент для нуля. Сохранив еще один байт, оказалось, что я ранее ошибочно учел и просто присвоить вывод printf переменной меньше, чем с помощью -v.
РЕДАКТИРОВАТЬ 2: Благодаря цифровой травме в комментариях, теперь это гораздо более существенно. Трюки: использование поддержки регулярных выражений в bash для замены строки цифр на нули вместо подсчета, а затем печать этого числа нулей (кажется очевидным, когда я так говорю ...), сохранение строк в массиве bash для сохранения эха, и принимая во внимание небольшое изменение в правилах, это означает, что вы можете завершить все вводимые числа в .0.
EDIT3: добавлен байт для исправления ошибки, представленной предложенной модификацией Digital Trauma.
источник
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]}!
$d
не слишком сложно.a
содержит цифры плотности после десятичной точки.d=${a/./0}
просто заменяет все эти цифры на нули. Таким образом, мы можем соединить эти нули до концаw
иh
умножить на ту же степень десяти, что достигается удалением десятичной точки изd
.постоянный ток, 41 байт
Требует ввода аргументов в
d, w, h
порядке - я надеюсь, что это нормально.Тестовый вывод:
источник
Юлия,
464542 байтаЭто создает функцию, которая принимает три числовых значения и возвращает строку.
Это прямая реализация формулы, просто немного переставленная. Обе стороны неравенства были умножены к тому
d
времени в квадрате.источник
R,
5955 байтКак неназванная функция сейчас
Очень простая реализация, которая устраняет необходимость в индексных ссылках.
предыдущий
Довольно просто, получить входные данные от сканирования в вектор (одна строка, разделенный пробелом или многострочный). Квадратный вектор. Сделайте расчет и следите за результатом.
источник
MATLAB -
4945 байтСначала я должен был объявить массив ячеек, который содержит
Trash!
иRetina!
который хранится в местах 1 и 2 в массиве ячеек. Затем я использую наблюдение, наблюдаемое многими, чтобы изменить уравнение так, чтобы вы проверяли условие только с помощью целочисленной арифметики. Я представлял 90000,9e4
чтобы сэкономить несколько байтов. Если это условие истинно, мы выводим 1, в противном случае выводим 0. Я использую этот вывод для индексации непосредственно в массиве ячеек. Поскольку MATLAB начинает индексирование с 1, мне также пришлось добавить 1 для завершения индексации. Что приятно , что добавлениеtrue
с 1 дает 2, при добавленииfalse
с 1 дает 1. Этот выход либоTrash!
илиRetina!
в команде MATLAB быстрой.пример
источник
int8
, true + 1 является двойным (2).logical
выражение в скобки, чтобы оно работало. Порядок операций ... д'оо. Спасибо за чаевые!hypot
но вашw*w+h*h>9e4*d*d
короче). Однако соответствует ли это требованиям вопроса? Это программа, а не функция. Поэтому она должна принятьw
,h
и вd
качестве входных данных. Я предполагаю, что это означает стандартный ввод кода, как обычно в вызове кодаXSLT, 400 байт
Это дебют невиданного ранее языка PPCG, и я надеюсь использовать его больше в будущем, когда узнаю больше.Код:
Довольно печатный
Примечания:
Поскольку XSLT не может принимать данные через STDIN, мы должны использовать XML-файл с вводом между двумя
<input>
тегами. Конечно, у этого метода есть свои ограничения, но он будет отлично работать для большинства задач.Пример ввода / вывода
Входной файл:
Выходной файл:
Входной файл:
Выходной файл:
источник
C # (81)
Ungolfed:
источник
string D(int w,int h,double d){return w*w+h*h>9e4*d*d?"Retina":"Trash";}
. Но вы также должны добавить в!
каждую строку, чтобы вернуться к 75, я думаю.Swift, 77 байт
Значения параметров функции означают, что они занимают больше символов, чем должны:
func r(w:Float,h:Float,d:Float){print((w*w+h*h)>9e4*d*d ?"Retina!":"Trash!")}
источник
Swift, 56 байт
В основном так же, как GoatInTheMachine , но с неявными параметрами закрытия
Когда Code Golfing с Swift, всегда объявляйте такие методы, это намного короче
источник
Хаскелл, 46
источник
<interactive>:2:8: parse error on input '|'
.let f w h d|…
.C ++
7270 байтПохоже на другие решения, разобрался с собой, чтобы согреться с помощью кода гольфа.
источник
90000
как9e4
Вот мой вклад в эту проблему
Ruby, чтение 67 байтов со стандартного ввода
Ruby, 56 байт в функции
Немного короче
Спасибо предыдущим авторам за 9e4!
код-гольф рубин
источник
Баш, 85 байт
источник
bc
точность составляет 0 десятичных знаков. Вам нужно будет установитьscale
, или вы, вероятно, можете сойти с рук,bc -l
что неявно устанавливает масштаб на 20((`bc<<<"sqrt($1^2+$2^2)/$3"`>300))&&echo Retina!||echo Trash!
PHP,
47,43,4038 байтТребуется
register_globals==true
(что никогда не должно быть!) Со значениями GET w, h, d- Сохранено 4 байта путем удаления кавычек вокруг строки. Плохое кодирование, но это работает.
- Перемещение
d
и квадратный корень на другую сторону уравнения, сохранениеsqrt()
функции- Сохранение 2 байтов путем переключения на
hypot()
(спасибо Лукас Коста)источник
register_globals
директиву.C # 6, 67 байт
Этот ответ основан на ответе Wolfsheads. Я сделал его на 8 байт короче, используя новую функцию C # 6.
источник
JavaScript (ES6)
585443 байт43 байта
Удалено назначение функции (согласно правилам PPCG) (-2), а также удаление квадратного корня и сравнение с 900 (300 ^ 2) (-12)
54 байта
Избавился от лишних скобок (-4 байта)
58 байт
Объяснение здесь:
Это использует троичные операторы для проверки плотности и убивает пару байтов, используя функции стрелок
источник
Java,
8274 байтаПозвони с
g(width,height,diagonal)
источник
double
массива, такого как:String g(int w,int h,double x){return 9e4*x*x>w*w+h*h?"Trash!":"Retina!";}
Иногда самое простое лучше :)Clojure, 58 байт
Использовал причудливую математику @ Kroltan, чтобы сократить это. Использует неявные аргументы, передаваемые в порядке (w, h, d).
Первый гольф Clojure ... Я был удивлен, сколько пробелов мне позволено пропустить
источник