Если заданы два натуральных числа p и q , ваша задача - вернуть массив A, созданный с помощью следующего алгоритма:
- Начните с A = [p, q] и d = 2
- Для каждой пары (x, y) смежных чисел в A , сумма которых делится на d , вставьте (x + y) / d между x и y .
- Если была найдена хотя бы одна подходящая пара, увеличьте d и перейдите к шагу № 2. В противном случае, остановка и возвращение .
пример
Ниже подробно описан процесс для p = 1 и q = 21 .
1 21 | Iteration #1: we start with d = 2 and A = [1, 21]
\/ | 1 + 21 is divisible by 2 -> we insert 11
22/2=11 |
|
1 11 21 | Iteration #2: d = 3, A = [1, 11, 21]
\/ | 1 + 11 is divisible by 3 -> we insert 4
12/3=4 |
|
1 4 11 21 | Iteration #3: d = 4, A = [1, 4, 11, 21]
\/ | 11 + 21 is divisible by 4 -> we insert 8
32/4=8 |
|
1 4 11 8 21 | Iteration #4: d = 5, A = [1, 4, 11, 8, 21]
\/ \/ | 1 + 4 is divisible by 5 -> we insert 1
5/5=1 15/5=3 | 4 + 11 is divisible by 5 -> we insert 3
|
1 1 4 3 11 8 21 | Iteration #5: d = 6, A = [1, 1, 4, 3, 11, 8, 21]
| no sum of two contiguous numbers is divisible by 6
| -> we stop here
Отсюда и ожидаемый результат: [1, 1, 4, 3, 11, 8, 21]
Разъяснения и правила
- Ввод и вывод могут быть обработаны в любом разумном формате. Целые числа p и q гарантированно будут больше 0. Если это поможет, вы можете предположить, q ≥ p .
- 2-й шаг алгоритма не должен применяться рекурсивно к элементам, которые только что были вставлены на одной и той же итерации. Например, A = [1, 1] и d = 2 должны привести к [1, 1, 1] (не бесконечный список из 1).
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах!
Контрольные примеры
p | q | Output
----+-----+-------------------------------------------------------------------------------
1 | 1 | [1,1,1]
1 | 2 | [1,2]
1 | 3 | [1,1,2,3]
2 | 6 | [2,1,2,1,4,1,2,6]
3 | 13 | [3,1,8,1,3,1,7,1,2,1,5,1,3,2,13]
9 | 9 | [9,6,9,6,9]
60 | 68 | [60,13,1,4,31,2,3,5,2,19,64,7,13,1,2,5,2,27,44,3,4,8,2,1,12,1,5,3,28,2,4,16,1,
| | 2,12,1,2,1,10,1,6,68]
144 | 336 | [144,68,3,4,8,1,12,1,4,2,28,13,128,44,17,92,240,58,108,5,17,1,2,5,3,28,3,1,11,
| | 60,3,6,2,42,2,4,26,192,54,132,7,1,15,1,3,1,18,1,4,2,30,3,1,12,1,9,78,46,336]
Если вы хотите протестировать свой код на чуть большем тестовом примере, вот ожидаемый результат для:
- р = 12096 (2 6 * 3) 3 * 7)
- q = 24192 (2 7 * 3 3 * 7)
code-golf
array-manipulation
Arnauld
источник
источник
ü
работает ... это позволило мне улучшить один из моих предыдущих ответов :-)[1,2,3,4] ü = [[1,2],[2,3],[3,4]]
, также, если вы добавите «-d» в аргументах при запуске 05AB1E, он выдаст «отладочный» вывод, который я прикрепил выше. (Также добавлена ссылка на отладку выше). Парная причина заключается в том, что для команд, которые векторизуются автоматически, она просто применяет команду попарно (выполнениеü)
по списку хорошо показывает это).-d
... Я нашел об этом слишком поздно, после "отладки" с помощью,q
"напечатать и остановить". Было больно.=
его, потому что он не вылетает, а просто печатает последний элемент,U
вы можете заменитьX
наŠ
.Mathematica,
72645958 байтПопробуйте онлайн!
Как это устроено
Мы принимаем входные данные в виде списка
{p,q}
. Шаг итерации переформулирован так:(a+b)/d
между каждыми двумя элементамиa
иb
:(x+{##2,}&@@x)
вычисляет последовательностьa+b
's, сa+Null
в конце. Мы делим наd
, иRiffle
вставляем каждый(a+b)/d
междуa
иb
. инкрементd
.Integer
элементы результирующего списка. (Это избавляет отNull
введенного{##2,}
тоже.)Это повторяется до тех пор, пока результат не изменится (что может произойти только потому, что мы удалили все новые элементы, потому что ни один из них не был целым числом).
-8 байт благодаря @MartinEnder за использование
//.
вместоFixedPoint
(и за принятие ввода в виде списка).-6 больше, потому что на
ListConvolve
самом деле это не так здоровоисточник
//.
козыриFixedPoint
, и я бы просто взял входные данные в виде пары целых чисел вместо двух отдельных целых чисел:(d=2;#//.x_:>x~Riffle~ListConvolve[{1,1}/d++,x]~Cases~_Integer)&
//.
наFixedPoint
, потому что мне действительно очень нравитсяFixedPoint
.Integer
.Рубин , 80 байт
Попробуйте онлайн!
Рекурсивная функция,
f
принимающая входные данные в качестве массива[p, q]
.источник
Haskell,
8581 байтПопробуйте онлайн!
Ввод принимается в виде списка, например
[1,2]
.Изменить: -4 байта благодаря @Laikoni.
источник
l%d|l==l#d=l|e<-d+1=l#d%e
.Python 2 ,
112110108105103 байт-2 байта благодаря Джонатану Фреху
-5 байтов благодаря Эрику Аутгольферу
Попробуйте онлайн!
источник
y+=[...]*(...);y+=b,
эквивалентноy+=[...]*(...)+[b]
?Python 2 , 98 байт
Вызывать как
f([p,q])
. Попробуйте онлайн!Джонатан Аллан спас 12 байтов. Спасибо ~!
объяснение
f
является рекурсивной функцией:f(A, B, d)
возвращает значениеf(next_A, A, d+1)
, если толькоA == B
, в этом случае оно возвращаетA
. (Это обрабатывается следующим образомA*(A==B)or …
: если A ≠ B,A*(A==B)
это пустой список, который имеет значение false-y, поэтому…
часть оценивается; если A = B, тоA*(A==B)
естьA
, что непусто и, следовательно, верно, и оно возвращается.)next_A
вычисляется как:Это лучше всего объяснить на примере. Когда например
d = 5
иA = [1, 4, 11, 8, 21]
:источник
zip
вместо перечисления и используя[A[0]]
в качествеsum
начального значения.[A[0]]
наA[:1]
:)A*(A==B)
.Python 2 , 111 байт
Попробуйте онлайн!
-8 спасибо Роду .
-2 спасибо Линн .
источник
i
иa[x:x]
корочеa.insert
o
: pzip
и сохрани два байта !for
цикл наwhile A[o+1:]:o+=1;s=A[o-1]+A[o];b=s%d<1;A[o:o]=[s/d]*b;m|=b;o+=b
Шелуха , 22 байта
Принимает список из 2 элементов, возвращает список целых чисел и чисел с плавающей точкой. Попробуйте онлайн!
объяснение
источник
Perl 5 , 92 + 1 (
-a
) = 93 байтаПопробуйте онлайн!
источник
Сетчатка , 111 байт
Попробуйте онлайн!
Принимает ввод как разделенные пробелами числа. Весьма наивно следует заданному алгоритму, при этом единственная заметная техника заключается в использовании символа маркера,
a
, чтобы отмечать, когда любое из чисел было сохранено. Это используется для работы с несколько ограниченными возможностями зацикливания Retina, которые позволяют вам зацикливаться только до тех пор, пока набор этапов не изменит общих входных данных этих этапов.Объяснение:
Это будет использовать тот же пример, что и в вопросе.
Мы изменим входной массив чисел в унарный массив, разделенный точкой с запятой, поэтому у нас будет:
Поместите
d
в наш код в начале, давая нам:Это немного сложнее.
{
запускает группу этапов, которые будут выполняться, пока они не достигнут фиксированной точки. Затем+
указывает, что сам этот этап должен выполняться до фиксированной точки. Эта стадия добавляет каждую пару соседних чисел, но вставляет их без дополнительной точки с запятой. Теперь у нас будет:Другая сложная стадия, эта накапливает наш делитель в первой группе захвата и заменяет любое число в нашем списке без конечной точки с запятой на это число, разделенное на
d
. Мы также добавляем ведущиеa
к этим числам, чтобы указать, что что-то было сохранено, вместе с тем,;
чтобы указать, что это должно быть постоянно частью массива. Теперь у нас будет:Это удаляет числа, которые не делятся
d
ни в массиве до этого раунда. Это не вносит изменений в нашем примере.Это жадно совпадает с начала строки до последней буквы
a
во входных данных. Это означает, что может быть не более одного матча. Если мы внесли какие-либо изменения, мы добавляем ихd
, в противном случае оставляем их такими же, чтобы мы могли выйти из цикла.)
Закрывает цикл , начатый{
(не ставят под сомнение его!) , И в противном случае этот этап просто удаляет маркеры мы кладем вниз ранее. Так как это конец цикла, мы повторяем вышеупомянутые этапы много раз, однако я просто продолжу, как если бы я забыл цикл, поскольку это делает пример более непрерывным.Этот этап удаляет из нашего вывода:
Этот этап заменяет одинарные числа десятичными числами:
Завершающий этап избавляет от точек с запятой:
Очевидно, что пропуск цикла лишает нас результата, но, надеюсь, это не смущает.
источник
JavaScript (ES6),
898782 байтаСпасибо @Arnauld за -2 байта и за помощь в сохранении еще 5 байтов.
Принимает ввод в виде массива:
f([p,q])
.Тестовые случаи
источник
v
(v+=b[++i]
) вместо того,s
чтобы сохранить 1 байт. Вы можете сохранить другой байт|r
вместо&&r
(я думаю, что это безопасно, но я не перепроверил).|r
действительно прошло все тестовые случаи.push()
.push
только один раз вместо двух; после пересмотра этой идеи я пришел к этому за 86 байтов. Может быть, это можно улучшить?push(v,...)
а затем использоватьv+=
снова для 84 байтов .Röda , 90 байт
Попробуйте онлайн!
источник
Java 8, 180 байт
Объяснение:
Попробуй это здесь.
источник
C #, 280 байт
Первая попытка кода гольф, который является целой программой. Проверь это
Попытка 2, 159 байт
Убираем леса, поскольку задача состоит в том, чтобы предоставить функцию, которая может взять пару чисел (работает массив) и вернуть массив. Учитывая, что Func <int [], int []> F может использоваться для удовлетворения требований, просто определите F :
Протестируйте полную программу здесь
Это может быть меньше, если универсальный List считается допустимым выводом (сбросьте .ToArray (), чтобы сохранить 10 байтов).
Если вход также может быть изменен, то передача List <int> вместо массива избавляет от необходимости инициализировать вывод (выводится в 126 байтах).
Если сделать еще один шаг вперед, в этом случае нет необходимости возвращать значение. Использование Action вместо этого удаляет 9 байтов, используемых оператором return.
источник
Желе , 19 байт
Попробуйте онлайн!
источник