вступление
Что-то, с чем я играл в рекреационной математике, - это создание таблицы делителей для визуального сравнения / сопоставления простых делителей набора чисел. Множество входных чисел находится в верхней части в виде меток столбцов, простые делители слева в виде меток строк, а метка указывает, где эти две строки располагаются вверх.
Например, для ввода будет 6, 9, 14, 22
построена таблица, подобная следующей:
6 9 14 22
2 * * *
3 * *
7 *
11 *
Это потому, что 6
имеет простые делители 2
и 3
, 9
имеет простые делители 3
и так далее.
строительство
- Таблица построена так, что входные числа образуют метки столбцов, разделенные пробелами и в порядке возрастания (можно предположить, что они предварительно отсортированы), а простые делители перечислены слева в порядке возрастания по одному на строку в строке, образующей строку этикетки.
- Обратите внимание, что начальные пробелы на простых делителях и входных числах могут потребоваться, если числа имеют разную длину, поэтому все столбцы имеют одинаковую ширину и выстроены в линию соответствующим образом.
- Каждый делитель представлен одним
*
(или другим подходящим символом ASCII по вашему выбору, при условии, что один и тот же символ используется для всех случаев). - Несколько делителей игнорируются (например,
3 x 3 = 9
но*
для этого пересечения есть только один ). *
Могут быть размещены в любом месте в горизонтальном положении в колонне, так долго , как это однозначна ( у меня есть все мои примеры с*
выравниванием по правому краю).
вход
- Список целых положительных чисел в любом удобном формате , каждый
>1
. - Вы можете предположить, что вход предварительно отсортирован.
- Входные данные гарантированно имеют только уникальные значения.
Выход
Результирующее ASCII художественное представление таблицы простых делителей.
правила
- Начальные или завершающие символы новой строки или пробелы являются необязательными, при условии, что сами символы выстроены правильно.
- Если короче иметь разделительную линию, отделяющую заголовки столбцов / строк от табличных данных, это тоже разрешено.
- Допустимы либо полная программа, либо функция. Если функция, вы можете вернуть вывод, а не распечатать его.
- Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы люди могли опробовать ваш код!
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
Примеры
6,9,14,22
6 9 14 22
2 * * *
3 * *
7 *
11 *
2,3,5,7
2 3 5 7
2 *
3 *
5 *
7 *
2,4,8,16,32
2 4 8 16 32
2 * * * * *
75,99,151,153
75 99 151 153
3 * * *
5 *
11 *
17 *
151 *
Ответы:
Mathematica,
10190 байтСпасибо ngenisis за сохранение 11 байтов!
Символ
∣
около трети пути - это U + 2223 (3 байта). Безымянная функция переменного числа аргументов, каждый из которых представляет собой ненулевое целое число, которое возвращаетTableForm
объект (форматированный вывод) следующим образом:f=#&@@@FactorInteger[1##]
определяетf
набор всех простых чисел, разделяющих любые входные данные (эквивалентно, делящих их произведение1##
), аg
список, состоящий из входных данных.Outer[If[#∣#2,Y,""]&,f,g]
создает таблицу изY
s и пустых строк, соответствующих делимости (мы используем неопределенный токенY
вместо строки"Y"
или"*"
чтобы сохранить два байта). Затем мы используемTableForm[...,TableHeadings->{f,g}]
для форматирования результирующего массива соответствующие заголовки строк и столбцов.Предыдущее представление:
источник
""
.TableForm[Outer[If[#∣#2,Y,""]&,f=#&@@@FactorInteger[1##],g={##}],TableHeadings->{f,g}]&
если разрешены разделителиp[f,]
.TableForm
это круто, надеюсь, что останется в моем наборе инструментов!Желе , 18 байт
Пользы
1
вместо того*
, что разрешено правилами.Попробуйте онлайн!
Как это работает
источник
Желе ,
2523 байтаПопробуйте онлайн!
Как?
Это может быть короче использовать
ÆE
и отфильтровывать пустые строки.источник
JavaScript (ES6),
264260...179173 байтаЯ думаю, что этот подход теперь постоянно превышает рекурсивный (в настоящее время 178 байтов):
Пользы
0
вместо того*
, что разрешено вызовом.Тестовый фрагмент
Показать фрагмент кода
источник
|
оператор в операторе if, поскольку вы сравниваете 2 логических значения ...i<2
чек внутри.map
функции?...i<2?a:a.map(x=>x%i&&c)
в...a.map(x=>i<2?x:x%i&&c)
, это не короче. Если вы имеете в виду, переместите это в другой.map
, возможно ...Python 2 - 197 байт
Переключен на Python 2 для облегчения обработки ввода и разрешения `` для преобразования строк. Используется
gmpy2
для генерации следующего простого числа. Формат вывода по-прежнему основан на предыдущей отправке Python 3 (см. Ниже), а именно заполнение спискаg
символами и его форматирование.Попробуйте онлайн!
объяснение
Для тех, кто не хочет декодировать его самостоятельно.
предыдущий
Python 3 - 251 байт
Уверен, кто-то может сделать лучше. На основании этого ответа для генерации простых чисел
k
.Неуправляемая версия и объяснение последуют.
источник
i=list(map(int,input().split(',')))
вы могли бы просто сделатьi=input()
и принять данные в форме[1, 2, 3, 4]
.p=gmpy2.next_prime(p);t=['*'[m%p:]for m in i]
, и удалить пространство вif"*" in
.Mathematica, 165 байт
Скорее многословно - может быть, кто-то может что-то с этим сделать:
источник
Утилиты Bash + GNU,
134133132125123 байтаПопробуйте онлайн!
источник
Python 2 ,
181179 байт-2 байта благодаря FlipTack
Вход должен быть кортежем.
Попробуйте онлайн!
источник
all(i%j for j in p)
вместо использованияmap
?Пакет, 451 байт
Объяснение: Начинается с вычисления ширины поля
w
по максимуму входных значенийm
. Генерирует первую строку вывода, дополняя пустую строку и введенные числа шириной,w
используя подпрограммуt
. Затем перебирает целые числа, начиная с 2, генерируя строку вывода, заполняя целое число, а затем вызывая подпрограмму.c
для заполнения пустой строки или звездочки в зависимости от каждого значения, однако сгенерированная строка пропускается, если в ней нет звездочек. Когда вывод генерируется, каждое значение делится на целое число до тех пор, пока оно не оставит остаток, поэтому цикл завершается, когда никакое значение не превышает 1.Обратите внимание , что
set v=
запускается на выполнение после%v%
подставляется вfor
петлю на одной и той же линии.источник
Python 2 ,
157148146145143 байтаИспользует
0
вместо того*
, что разрешено правилами.Попробуйте онлайн!
Задний план
Чтобы определить простые числа, мы используем следствие теоремы Вильсона :
Как это работает
Первая строка определяет вспомогательную функцию.
p принимает переменное число аргументов, которые он хранит в кортеже t .
'%%%ds '%len(`x[-1]`)
Использует формат строки , чтобы построить строку формата;%%
является буквенным знаком процента,%d
является заполнителем для целого числа, котороеlen(`x[-1]`)
возвращает, т. е. количество цифр последнего элемента в x (входные данные, еще не определены) иs
является литералом.Если, например, последний элемент x имеет три цифры, это дает
%3s
, что*len(t)
повторяется один раз для каждого элемента x . Наконец,%t
применяет эту строку формата к кортежу t , создавая строку элементов t , разделенных пробелом и выровненных по правому краю до определенной длины.Вторая строка определяет фактическую отправку: функция f, которая принимает список x в качестве входных данных. После замены
exec
оператора, который выполняет строку, которой он предшествовалx[-1]
, наfor
цикл, мы получаем следующий код.Сначала f инициализирует k и m до 1 . Обратите внимание, что (k - 1)! = 0! = 1 = т .
Затем
p(' ',*x)
печатает пробел и целые числа в x , используя функцию p .Теперь мы входим в цикл для печати оставшегося вывода.
Сначала составляется
r=[n%k and' 'for n in x]
список остатков каждого целого числа n в x, разделенный на k . Положительные остатки, то есть остатки, которые не соответствуют кратным k , являются правдивыми и заменяются пробелом наand' '
.Далее мы строим
m%k*r
. Так как m = (k - 1)! Согласно следствию из теоремы Вильсона, это будет просто r, если k простое число, но пустой список, если нет. Если в результате есть хотя бы один 0 , т. Е. Если k простое, а хотя бы одно целое число в x делится на k ,0in m%k*r
вернет True иp(k,*r)
будет вызван, печатая k и индикаторы делимости:0
если делится, пробел если нет ,Наконец, мы умножаем m на k² и увеличиваем k , так что качество m = (k - 1)! продолжает держать.
источник
MATL , 31 байт
Используется
1
вместо того*
, как разрешено вызовом.Попробуйте онлайн! Или проверьте все тестовые случаи .
Объяснение ( устарело )
источник
Ракетка 176 байт
Ungolfed:
Тестирование:
Выход:
источник