Довольно простая задача сегодня:
Напишите программу или функцию, которая принимает положительное целое число N и печатает или возвращает отсортированный список уникальных чисел, которые появляются в таблице умножения, чьи мультипликаторы строк и столбцов находятся в диапазоне от 1 до N включительно.
Список может быть отсортирован в порядке возрастания (от меньшего к большему) или в порядке убывания (от наибольшего к наименьшему) и может быть выведен в любом приемлемом формате.
Самый короткий код в байтах побеждает!
пример
Когда N = 4, таблица умножения выглядит следующим образом:
1 2 3 4
-----------
1| 1 2 3 4
|
2| 2 4 6 8
|
3| 3 6 9 12
|
4| 4 8 12 16
Уникальные числа в таблице 1, 2, 3, 4, 6, 8, 9, 12, 16
. Они уже отсортированы, так что
1, 2, 3, 4, 6, 8, 9, 12, 16
может быть вашим точным выводом для N = 4. Но так как сортировка может быть обратной, и есть некоторая свобода в форматировании, это также будет допустимым выводом:
[16,12,9,8,6,4,3,2,1]
1
2
3
4
6
8
9
12
16
16 12 9 8 4 3 2 1
Тестовые случаи
N=1 -> [1]
N=2 -> [1, 2, 4]
N=3 -> [1, 2, 3, 4, 6, 9]
N=4 -> [1, 2, 3, 4, 6, 8, 9, 12, 16]
N=5 -> [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 20, 25]
N=6 -> [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 30, 36]
N=7 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 28, 30, 35, 36, 42, 49]
N=8 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 28, 30, 32, 35, 36, 40, 42, 48, 49, 56, 64]
N=9 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 54, 56, 63, 64, 72, 81]
N=10 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 50, 54, 56, 60, 63, 64, 70, 72, 80, 81, 90, 100]
N=11 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 27, 28, 30, 32, 33, 35, 36, 40, 42, 44, 45, 48, 49, 50, 54, 55, 56, 60, 63, 64, 66, 70, 72, 77, 80, 81, 88, 90, 99, 100, 110, 121]
N=12 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 27, 28, 30, 32, 33, 35, 36, 40, 42, 44, 45, 48, 49, 50, 54, 55, 56, 60, 63, 64, 66, 70, 72, 77, 80, 81, 84, 88, 90, 96, 99, 100, 108, 110, 120, 121, 132, 144]
источник
Ответы:
Pyth, 8 байт
Попробуйте онлайн.
Объяснение:
SQ
берет оцененный ввод input (Q
) и составляет список[1, 2, ..., Q]
.^SQ2
берет декартово произведение из этого списка с собой - все возможные комбинации продуктов.*M
умножает все эти пары вместе, чтобы сформировать все возможные результаты в таблице умножения,S{
делает ее уникальной и сортирует ее.источник
M
. +1Python 2,
6151 байтСпасибо xnor за сокращение некоторого синтаксиса.
источник
set(...)
Может быть просто набор компом{...}
. Также здесь разрешены функции по умолчанию, так что вы можете просто написатьlambda n:...
.f=lambda n:n*[0]and sorted(set(range(n,n*n+n,n)+f(n-1)))
.APL,
1816 байтовЭто безымянная монадическая функция. Вывод в порядке возрастания.
Объяснение:
Исправлена проблема и сохранены 2 байта благодаря Thomas Kwa!
источник
CJam,
1412 байтовПоследняя версия с улучшениями, предложенными @aditsu:
Это анонимная функция. Попробуйте онлайн , с кодом ввода / вывода, необходимым для тестирования.
@Martin предложил другое очень элегантное решение (
{,:)_ff*:|$}
) с такой же длиной. Я использовал один от aditsu, потому что он был намного больше похож на мое оригинальное решение.Основное отличие от моего первоначального решения состоит в том, что он сохраняет
0
значение в исходной последовательности, что экономит 2 байта в начале. Вы можете подумать, что это не поможет, потому что вы должны удалить0
значение из результата. Но суть идеи @ aditsu -0^
это конец, с которым есть определенная разница0
. Это удаляет0
, и в то же время, поскольку это операция набора, удаляет дубликаты элементов из набора решений. Так как для устранения дубликатов мне уже потребовалось 2 байта, удаление0
будет, по существу, бесплатным.Объяснение:
источник
{2m*::)::*_&$}
,{)2m*::*_&$0-}
{,:)_ff*:|$}
{)2m*::*0^$}
Октава, 22 байта
источник
Юлия, 24 байта
Это анонимная функция, которая принимает целое число и возвращает массив целых чисел.
Ungolfed:
источник
MATLAB, 24 байта
источник
zsh,
8656 байтспасибо @Dennis за сохранение 30 (!) байтов
Объяснение / ungolfed:
Это не работает в Bash, потому что Bash не расширяется
{1..$1}
- он просто интерпретирует его буквально (поэтомуa=5; echo {1..$a}
выводит{1..5}
вместо1 2 3 4 5
).источник
Рубин,
5048 байтовUngolfed:
Использование вложенного цикла для умножения каждого числа на любое другое число до n и последующей сортировки массива.
50 байтов
Использование:
источник
R, 39 байт
Это читает целое число из STDIN и записывает список с разделителями пробелами в STDOUT.
Мы создаем таблицу умножения как матрицу, используя
outer
, неявно сглаживая в векторе и сортируя используяsort
, выбирая уникальные элементы используяunique
, и печатая пространство, разделенное использованиемcat
.источник
Mathematica, 25 байтов
источник
К, 17 байт
Не так много, чтобы сказать здесь. Сортировать (
t@<t:
) уникальные предметы (?
),/
умноженного ( ) умноженного декартова собственного произведения (t*\:t:
) от 1 до N включительно (1+!
).В бою:
источник
Haskell,
5554 байтаПример использования:
f 4
->[1,2,3,4,6,8,9,12,16]
.nub
удаляет дубликаты элементов из списка.Редактировать: @Zgarb нашел лишнее
$
.источник
J,
2120 байтСпасибо @Zgarb за -1 байт!
Мой первый ответ J! Гольф советы приветствуются, если есть что-то для гольфа.
Это монадическая функция; мы берем внешний продукт умножением списка
1..input
на себя, выравниваем, берем уникальные элементы и сортируем.источник
Котлин, 70 байт
Безголовая версия:
Проверьте это с:
источник
Shell + коммунальные услуги, 41
Или в качестве альтернативы:
Bash + coreutils, 48
Создает расширение в фигурном расширении:
\$[{1..n}*{1..n}]
расширяется до арифметических расширений,$[1*1] $[1*2] ... $[1*n] ... $[n*n]
которые оцениваются и передаютсяprintf
, что печатает по одному на строку, по которой передаетсяsort
.Тщательное использование кавычек, экранирование и
eval
обеспечение расширения происходит в необходимом порядке.Или в качестве альтернативы:
Чистый Баш, 60
источник
Пиф, 10
Попробуйте онлайн или запустите Test Suite
источник
Минколанг 0,14 ,
252218 байтЯ вспомнил, что я очень удобно реализовывал декартовы продукты, прежде чем этот вопрос был опубликован !
Попробуй это здесь.(Выходы в обратном порядке.)
объяснение
источник
JavaScript (ES6),
9290 байтобъяснение
Тест
источник
Perl 6 , 27 байт
Пример использования:
источник
Haskell, 51 байт
Довольно скучный. Просто фильтрует список
[1..n*n]
по элементам формыa*b
сa
иb
в[1..n]
. Использованиеfilter
дает одинаковую длинуНекоторое время я пытался составить список продуктов с чем-то более умным, как
concatMap
илиmapM
, но получил только более длинные результаты. Более сложная проверка членства выполняется на 52 байта, на 1 байт длиннее, но, возможно, может быть сокращена.источник
(*)<$>..<*>..
как этоJAVA - 86 байт
Ungolfed
источник
Pyth, 11 байт
Это похоже на ответ Юлии. Благодаря @Maltysen
источник
PHP,
74,7370 байтовUngolfed:
Предыдущая:
while(($j=$i++)<$n)for(;$j++<$n;)$a[]=$i*$j;$a=array_unique($a);sort($a);
Не уверен на 100%, что делать с выводом, но
$a
содержит массив с соответствующими числами.$n
это число, полученное через$_GET['n']
, сregister_globals=1
источник
TeaScript ,
3735 символов; 40 байтСохранено 2 байта благодаря @Downgoat
TeaScript - это JavaScript для игры в гольф.
Попробуйте онлайн!
Неуправляемый и объяснение
источник
r
вместоA.r
генерации диапазоновC 96 байтов
Это печатает числа в порядке убывания. Предложения приветствуются, так как это выглядит далеко не оптимально.
источник
JavaScript (ES6), 86 байт
Глядя, чтобы сократить его (может быть, попробует вложенные циклы).
источник
Perl 5, 91 байт
запускаться путем передачи аргумента в командной строке. Это довольно много заявлений, за исключением того, чтобы работать с ограничениями и предупреждениями.
источник
Python,
124102 байтаБольше питона!
источник
l.append(i*j)
на одну строку с условным условием if. Я думаю, что в итоге получается 102 байта.+=
вместоappend
.list(set(l))
сортировка не гарантируется.Perl 5, 67 байт
источник