Похожие цифры
Два прямоугольника похожи, если отношения их сторон одинаковы.
Рассмотрим эти два прямоугольника; прямоугольник высотой 5 строк и шириной 11 символов:
===========
===========
===========
===========
===========
и прямоугольник высотой 10 строк и шириной 22 символа:
======================
======================
======================
======================
======================
======================
======================
======================
======================
======================
Эти формы похожи, потому что соотношения их сторон одинаковы. Чтобы выразить это формально ( - самая короткая сторона, а - самая длинная):
Вы также можете сделать:
Соревнование
Напишите программу или функцию, которая принимает «основной» прямоугольник и некоторые «другие» прямоугольники и печатает, какие из «других» похожи на «основные».
Вход
Форма и список форм. Каждая фигура состоит из 2 ненулевых натуральных чисел, которые обозначают ширину и высоту прямоугольника. Например, это:
(4,2), (3,9)
обозначает два прямоугольника, 4x2 и 3x9. Точный формат ввода может быть любым, по вашему желанию.
Выход
Индексы «других» фигур похожи на «основные». Вы можете выбрать, будут ли индексы основаны на 0 или 1, а также на точном формате и порядке вывода.
Пример программы
В Python:
main = eval(raw_input()) # The main rectangle.
rects = eval(raw_input()) # The list of rectangles.
similar = set()
for i, rect in enumerate(rects):
if max(main)*min(rect) == min(main)*max(rect): # Cross-multiply
# They are similar.
similar.add(i)
print similar
Пример ввода и вывода
Входные данные:
(1, 2)
[(1, 2), (2, 4)]
Выход:
set([0, 1])
Входные данные:
(1, 2)
[(1, 9), (2, 5), (16, 8)]
Выход:
set([2])
выигрыш
Это код-гольф, поэтому выигрывает самое короткое представление.
Заметки
- Это само собой разумеется, но стандартные лазейки запрещены .
- Никакие встроенные функции для поиска похожих фигур не могут быть использованы. (Я даже не знаю, существует ли это, но я не удивлюсь!)
источник
[1.0 2.0]
ли приемлемый формат ввода?[(1,2), (2,4), (1,9), (2,5), (16,8)]
, только[0,1,4]
и[1,2,5]
разрешено, или мы могли бы также вывести[1,1,0,0,1]
или[(1,2), (2,4), (16,8)]
?Ответы:
Pyth, 15 байт
источник
Python, 61 байт
Да, я трачу 9 символов, чтобы написать
enumerate
. Принимает участие как1, 2, [(1, 9), (3,6), (2, 5), (16, 8)]
. Для Python 2 входные значения должны быть записаны как числа с плавающей запятой.На один символ длиннее (62) в Python 3:
источник
i
как индекс и(x,y)
как точка. Затем он проверяет,x/y
равняется ли значение либо исходному двум числам 'quotient (a/b
), либо его обратному (b/a
). Если оно равно одному из этих значений, это значениеi
добавляется в список, в противном случае оно отбрасывается.CJam,
222019 байтовВыше приведена анонимная функция, которая извлекает один массив пар с плавающей запятой (первая пара - игла) из стека и возвращает массив индексов, основанных на 1, в ответ.
Попробуйте онлайн в интерпретаторе CJam .
Как это работает
источник
Haskell , 48 байтов
Попробуйте онлайн!
Назовите это как
(!) 1 2 [(1, 9), (3,6), (2, 5), (16, 8)]
.Ближний порт моего ответа Python . Выражение
zip[0..]l
перечисляет список с его индексами.Выражение
x/y+y/x==a/b+b/a
проверяет, что отношениеx/y
равноa/b
илиb/a
, так как функцияf(z) = z + 1/z
имеетf(z) = f(1/z)
и не имеет других коллизий.источник
h
оператора принимать три аргумента? Это спасло бы один байт, и я думаю, что это останется в рамках правил.Снеговик 1.0.2 , 61 символ
Чистая тарабарщина (если только вы не знаете Снеговика), то есть в точности совпадающая с целью создания языка, которая заключается в том, чтобы как можно больше сбивать с толку.
Формат ввода такой же, как и в посте, формат вывода тоже минус
set(
и)
.Ungolfed (или unminified, действительно):
Я очень горжусь некоторыми уловками, которые я использовал в этом:
Я использовал тот же формат ввода, что и в посте. Но вместо того, чтобы попытаться как-то разобрать его, что может привести к путанице, я просто объединил две строки, а затем использовал регулярное выражение для извлечения всех чисел в один большой массив (что я и сделал
2aG
, то есть получил каждую группу из 2).:nD;aF
это довольно модно Он просто берет массив из двух элементов и делит первый на второй. Это кажется довольно простым, но сделать это интуитивно понятным способом (a[0]/a[1]
) было бы намного, намного дольше в Snowman:0aa`NiN`aA|,nD
(и это предполагает, что нам не нужно беспокоиться о путанице с другими существующими переменными). Вместо этого я использовал метод «сгиба» с предикатом «делить», который для массива из двух элементов достигает одного и того же.0AAgaA
выглядит достаточно безобидным, но на самом деле он сохраняет0
переменные, а затем берет все переменные с индексом, превышающим этот (то есть все переменные, кроме первой). Но хитрость заключается в том, что вместоAaG
(который избавит от исходного массива и0
) я использовалAAg
, который сохраняет оба. Теперь я используюaA
at-index, используя тот же самый,0
чтобы получить первый элемент массива - более того, он находится в режиме потребления (aA
вместоaa
), поэтому он также избавляется от0
и исходного массива, который теперь является мусором для нас.Увы,
0AAgaA*|
делает по существу то же самое , что делает GolfScript в один символ:(
. Тем не менее, я все еще думаю, что это довольно хорошо, по стандартам Snowman. :)источник
Mathematica, 41 байт
Использование:
источник
Pyth - 14 байт
Фильтры путем сравнения факторов, затем карты
indexOf
.Тестовый пакет .
источник
1,2
и[(1, 2), (2, 4), (1, 2)]
даст[0, 1, 0]
а не правильно[0, 1, 2]
.APL (Dyalog Unicode) ,
1613 байтов SBCSПопробуйте онлайн!
-3 спасибо @ngn!
Объяснение:
Выходной формат - это двоичный вектор, подобный
1 1 0 0 1
которому «другой» прямоугольник похож на другой.APL (Dyalog Extended) , 11 байтов SBCS
Попробуйте онлайн!
Объяснение:
Формат вывода совпадает с основным ответом Dyalog.
Спасибо Адаму за помощь в игре в гольф + Extended.
источник
(=.×∘⌽∨=.×)⍤1
Юлия, 62 байта
find
Функция находит истинные элементы булева вектора..*
выполняет поэлементное умножение векторов.Ungolfed:
Использование:
источник
К5, 19 байт
Я думаю, что это добьется цели:
Принимает список пар, где первая является «главной». Вычисляет соотношение путем деления отсортированных размеров каждой пары. Возвращает список позиций с 0 индексами совпадающих пар. (возможно, выбранный формат ввода делает это -1 индексируемым - если это считается недействительным
1+
в начале и добавляет два символа к размеру моей программы.)Пример использования:
Это работает хорошо - обратите внимание, что я неявно зависим от деления, всегда приводящего к результатам с плавающей запятой. Это будет работать в Kona, если вы добавите десятичную точку ко всем числам на входе и добавите пробел после
_
.источник
Октава / Матлаб, 44 байта
Использование анонимной функции:
Результат - индексирование на основе 1.
Чтобы использовать его, определите функцию
и назовите его в следующем формате
Вы можете попробовать это онлайн .
Если результат может быть в логической индексации (
0
указывает на не похожее,1
указывает на сходное): 38 байт :Тот же пример, что и выше:
источник
Брахилог , 14 байт
Попробуйте онлайн!
Принимает входные данные в виде списка, содержащего список, содержащий основной прямоугольник и список других прямоугольников (так что тестовый пример 1
[[[1,2]],[[1,2],[2,4]]]
), и выводит список индексов на основе 0 через выходную переменную.Если такое нечетное и специфичное форматирование ввода обманывает, это немного дольше ...
Брахилог , 18 байт
Попробуйте онлайн!
Принимает входные данные в виде списка, содержащего основной прямоугольник и список других прямоугольников (таким образом, тестовый пример 1 является более очевидным
[[1,2],[[1,2],[2,4]]]
), и выводит список основанных на 0 индексов через выходную переменную.Чтобы определить, представляют ли две пары ширина-высота одинаковые прямоугольники, требуется всего четыре байта
pᵐ/ᵛ
(которые выводят общее отношение или его обратную величину). Все остальное обрабатывает несколько прямоугольников для сравнения, а выходные данные являются индексами.источник
dzaima / APL , 7 байтов
Попробуйте онлайн!
8 байтов, выводящих список индексов вместо логического вектора
источник
[0,1,4]
или[1,2,5]
не уверен, что ваш язык имеет индекс 0 или 1). Было бы лучше, если бы все три формата вывода были разрешены: индексы; фильтр для сохранения правдивых значений; список истинных / ложных значений (как у вас сейчас), а не только разрешенные индексы.[0,1,4]
,[1,2,5]
,4\n0\n1
,5 2 1
и т.д. и т.п., так как он по- прежнему указано индексы , Но я попросил ОП уточнить (если они ответят, так как это 4-летний вызов). В моем ответе 05AB1E это означало бы 14 байтов, если индексы являются обязательными, против 8 байтов, если разрешен любой из двух других вариантов. Несмотря на это, я проголосовал за ваш ответ. :)Haskell, 75 байт
источник
PowerShell , 57 байт
Попробуйте онлайн!
Индексы основаны на 1.
источник
PowerShell ,
5856 байт-2 байта благодаря mazzy x2
Попробуйте онлайн!
Это немного нарушает
input may be however you desire
предложение, поскольку компоненты первой фигуры идут отдельно, чтобы сохранить 3 байта.PowerShell ,
6159 байтПопробуйте онлайн!
Использует условную индексацию для переключения между текущим индексом, начинающимся с нуля, и нулем в зависимости от того, выстроены ли соотношения. К счастью, в этом случае
$i
увеличивается, независимо от того, напечатан он или нет.источник
-
вместо этого-ne
.Javascript (ES6), 75
Альтернатива, также 75
Ввод принимается как объект JSON, а массив объектов JSON
источник
05AB1E ,
1514 байтовПопробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
J
OINS там , потому что 05AB1E не может определить индексы на многомерные списки AFAIKЕсли вывести пары ширины / высоты, которые являются правдивыми, или вывести список значений истинности / фальши на основе input-list, это может быть 8 байт :
Попробуйте онлайн или проверьте все контрольные примеры .
Попробуйте онлайн или проверьте все контрольные примеры .
источник