Учитывая конечную арифметическую последовательность натуральных чисел с некоторыми членами, удаленными из середины, реконструируйте всю последовательность.
Задание
Рассмотрим арифметическую последовательность: список натуральных чисел, в которых разница между любыми двумя последовательными элементами одинакова.
2 5 8 11 14 17
Теперь предположим, что одно или несколько целых чисел удалены из последовательности при условии соблюдения следующих ограничений:
- Удаленные целые числа будут последовательными членами последовательности.
- Первое и последнее целые числа в последовательности не будут удалены.
- По крайней мере три целых числа останутся в последовательности.
Для вышеуказанной последовательности возможные удаления включают в себя:
2 5 8 14 17 (removed 11)
2 5 17 (removed 8 11 14)
2 14 17 (removed 5 8 11)
Ваша задача: учитывая одну из этих частичных последовательностей, восстановить исходную полную последовательность.
Детали
Вы можете предположить, что ввод действителен (имеет решение) и отсутствует хотя бы один термин. Все числа в последовательности будут положительными (> 0) целыми числами. Последовательность может иметь положительную или отрицательную разницу между терминами (т.е. она может увеличиваться или уменьшаться). Это не будет постоянная последовательность (например 5 5 5
).
Ваше решение может быть полной программой или функцией . Любой из методов ввода и вывода по умолчанию является приемлемым.
Ваш ввод и вывод может быть строкой (с любым разумным разделителем), списком строк или списком чисел. Вы можете представлять числа в любой удобной для вашего языка базе.
Пожалуйста, укажите любые необычные методы / форматы ввода / вывода в вашей заявке, чтобы другие могли легче протестировать ваш код.
Контрольные примеры
In: 2 5 8 14 17
Out: 2 5 8 11 14 17
In: 2 5 17
Out: 2 5 8 11 14 17
In: 2 14 17
Out: 2 5 8 11 14 17
In: 21 9 6 3
Out: 21 18 15 12 9 6 3
In: 10 9 5
Out: 10 9 8 7 6 5
In: 1 10 91 100
Out: 1 10 19 28 37 46 55 64 73 82 91 100
Это код-гольф ; самый короткий ответ на каждом языке выигрывает.
2 5 ... 17
Ответы:
Haskell , 63 байта
Попробуйте онлайн!
В основном работает, пытаясь построить результат спереди и, если это не удается, сзади. При этом используется тот факт, что первый и последний члены ввода всегда будут правильными, тот факт, что удаленные элементы должны быть последовательными, и тот факт, что во входе всегда будет как минимум три элемента. Все, что мне нужно сделать, это предположить, что второй или второй по порядку члены точны и проверить, работает ли он. К счастью, у Haskell очень красивый синтаксис для создания арифметических рядов.
РЕДАКТИРОВАТЬ: спасибо @xnor за указание на ошибку и предоставление решения!
источник
[1,3,4,5]
дает[1,3,5]
.all(`elem`s)c
следует исправить это с тем же количеством байтов.05AB1E ,
98 байтПопробуйте онлайн!
объяснение
Сохранено 1 байт с использованием
gcd of deltas
вместоmin delta
, вдохновленный user202729источник
Brachylog v2, 9 байт
Попробуйте онлайн!
Это функция представления. Интерпретатор Brachylog может быть сделан для оценки функции, как если бы она была полной программой, передавая ее
Z
в качестве аргумента командной строки; в этом случае ввод указывается в формате, например,[1, 2, 4]
и вывод возвращается в аналогичном формате, напримерZ = [1, 2, 3, 4]
. (Конечно, для отправки функции ввод и вывод не в любом формате; это просто списки.)На самом деле это решает более сложную проблему, чем та, которую запрашивал OP: он обрабатывает кратчайшую арифметическую последовательность целых чисел, содержащую указанные значения в указанном порядке, независимо от того, являются ли удаления последовательными или нет. Поскольку он использует грубую силу, он может быть очень медленным, если будет удалено много значений.
объяснение
Программа состоит из трех основных частей.
⊆
находит суперпоследовательность ввода (то есть последовательность, которая имеет вход в качестве подпоследовательности). Когда существует более одного возможного вывода из программы Brachylog, выбранный вывод является первым выводом в порядке разрыва связей, и порядок разрыва связей определяется первой командой в программе, которая имеет мнение по этому поводу; в этом случае⊆
указывает порядок, который предпочитает короткие выходы по сравнению с длинными. Таким образом, вывод, который мы получим, будет самой короткой последовательностью ввода, которая подчиняется ограничениям в остальной части программы..
…∧
Используется для вывода значения, которое он видит в качестве входных данных (т. Е. В данном случае является суперпоследовательность), но также утверждает, что для него выполняется определенное условие Другими словами, мы выводим самую короткую суперпоследовательность, которая подчиняется определенному условию (и игнорируем любые промежуточные результаты, используемые для проверки, соответствует ли оно условию).Наконец, мы имеем
s₂ᵇ-ᵐ
=
, то есть «все дельты последовательности равны», условие, которое мы применяем к выводу. (Возвращаемое значение из этого является списком дельт, а не самой суперпоследовательностью, поэтому нам нужно.
…∧
чтобы гарантировать, что правильная вещь выводится.)Brachylog сдерживается тем, что не имеет встроенных функций, которые могут обрабатывать вычисления дельт, применяет операцию к перекрывающимся парам из списка и т.п. Вместо этого мы должны сказать, что мы имеем в виду в явном виде:
s₂ᵇ
находит все (ᵇ
) подстроки (s
) длины 2 (₂
) (использованиеᵇ
необходимо для сохранения связи между неизвестными в подстроках и в суперпоследовательности; чем чаще используется, темᶠ
больше ссылка). Затем-ᵐ
вычитает каждую из этих пар, чтобы получить дельту. Раздражает необходимость записывать пять байтовs₂ᵇ-ᵐ
для чего-то, для чего есть встроенные возможности большинства современных языков игры в гольф, но я думаю, именно так иногда и поступает Codegolf.источник
Python 2,
104978983716760 байтСпасибо Часу Брауну за сохранение 4 байта.
Спасибо ovs за сохранение 7 байтов.
Введите список по аргументам.
Попробуйте онлайн!
Объяснение:
Поскольку удаленные являются последовательными, достаточно проверить различия между двумя парами последовательных элементов.
источник
b if b%c else c
на[c,b][b%c>0]
.key=abs
! Кажется, что здесь люди часто пропускаютf=
часть, если не используется рекурсивная функция; таким образом, вы можете сэкономить 2 байта таким образом.a[-1]-a[-2]
наa[2]-a[1]
- логика та же самая, и вы получите еще 2 байта.Pyth , 11 байт
Попробуй это здесь!
Спасибо Стивену Х. за сохранение байта!
Pyth , 12 байт
Попробуй это здесь!
Как это работает
источник
Q
так что вы можете сортировать и взять первый элемент вместо того , чтобы,abs(GCD(Q))
как и в%hS.+SQ}hQe
11 байт. Тестовый наборЖеле , 8 байт
Попробуйте онлайн!
Заметки:
Работайте только на какой-то старой версии Jelly. ( это коммит например) (где
g
usefractions.gcd
, у которого знак результата совпадает с входным знаком, вместоmath.gcd
которого всегда возвращают положительное значение).Ссылка TIO выше - это ссылка Python 3 TIO, код Python состоит из исходного кода Jelly из коммита, о котором я упоминал выше, за исключением всего (3 файла), упакованного в один и тот же файл (для запуска TIO) и
dictionary.py
уменьшенного до только несколько строк. Темdictionary.py
не менее, не имеет отношения к этому ответу, так как он не использует сжатую строку. (“...»
конструкция)Объяснение:
Во-первых, поскольку непрерывный сегмент удаляется и остается по крайней мере 3 элемента, в старом списке остаются два последовательных числа, и все дельты будут кратны шагу. Поэтому список
gcd
разностей (I
приращений) будет абсолютным значением шага.К счастью,
gcd
подписано (см. Примечание выше)Так что программа делает:
Увеличение целочисленного диапазона от
Ṃ
минимума доṀ
аксиума.Модульный, выбрать каждый n-й элемент.
$
Цепочка Monadic ( ) объединяетI
(приращения, различия) иg/
(сокращаетgcd
элементы списка). Если приращения положительны, то значениеgcd
будет положительным, а возвращаемый список будет слева направо (с увеличением) и наоборот.источник
gcd
вместо того, чтобыmin
сделать нас галстуком. Жаль, что я получаю gcd со знаком, иначе я был бы в 7;)MATL , 13 байт
Попробуйте онлайн!
Объяснение:
источник
JavaScript (ES6),
9290Отредактируйте 2 байта, сохраненных благодаря Арно
Легко, так как достаточно проверить разницу между первыми двумя и двумя последними. Но все еще невероятно долго.
Меньше гольфа
Тест
источник
a-=d=e*e>d*d?d:e
должен работать и сохранить 2 байта.Wolfram Language (Mathematica) , 50 байтов
Попробуйте онлайн!
источник
{##}
и ,Last@{##}
но лучшее , что я мог бы получить с этим было 51 байт.Рубин ,
65 62 5554 байтаПопробуйте онлайн!
-1 байт благодаря Джастину Маринеру
источник
h
, оставив вас сa,*,b,c
. Попробуйте онлайн!Haskell ,
7369 байтовПопробуйте онлайн!
источник
J ,
49, 4746 байтовВдохновленный решением Эмигны.
Как это работает:
Попробуйте онлайн!
источник
Шелуха , 9 байт
Попробуйте онлайн!
Большое спасибо H.PWiz за половину количества байтов, указав, что применение
…
к списку повышает его! ...источник
F⌋
заменить на▼
?gcd
было иметь дело с отрицательными дельтамиC # (.NET Core) ,
167 + 13 = 180145 + 13 = 158 байтПопробуйте онлайн!
+13 за
using System;
Удивительно, но этот вызов имел больше нюансов, чем я изначально ожидал.
Подтверждения
-22 байта сохранено из-за некоторых простых упрощений из @DLosc.
DeGolfed
источник
Python 2 , 147 байт
Попробуйте онлайн!
источник
Python 2 , 78 байт
Попробуйте онлайн!
источник
Желе , 8 байт
Попробуйте онлайн!
источник
постоянный ток , 64 байта
Попробуйте онлайн!
источник
Japt , 12 байт
Попытайся
объяснение
Создайте массив целых чисел (
õ
) от последнего элемента входного массива (Ì
) до первого (Ug
). Рассчитайте шаг между элементами, получив все две пары элементов из входных данных и уменьшив их на абсолютную разницу (Uäa
), затем отсортировав (ñ
) этот массив и получив первый элемент (g
).источник