Заголовок составлен из «Номера индекса последовательности не».
Вызов:
Дано целое число , n
которое >= 0
, выведите n
«й номер следующей последовательности.
Вот первые 50 элементов с индексом (0-index) над ним:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
1 0 3 2 5 4 7 6 9 8 22 20 30 24 23 26 25 28 27 32 11 33 10 14 13 16 15 18 17 31 12 29 19 21 50 40 41 42 44 45 35 36 37 51 38 39 52 53 55 56 34
Как работает эта последовательность?
Число в индексе n
должно быть первым, чтобы не иметь общих цифр с n
, и еще не встречалось для предыдущих индексов. Итак, когда мы посмотрим на нормальную последовательность, как это из 0-60
:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
Мы определяем n
'-ые значения следующим образом:
0
: Первое число (0
) содержит ту же цифру, поэтому мы ищем следующее (1
), которое не содержит той же цифры. Итак,n=0
выводы1
.1
: Первое число (0
) не содержит одинаковую цифру, поэтомуn=1
выводится0
.2
: Мы уже встречали0
и1
, и следующая цифра (2
) содержит ту же цифру, поэтому мы ищем следующую (3
), которая не содержит той же цифры. Итак,n=2
выводы3
.- ...
10
: Мы уже встречались0-9
, поэтому следующий в очереди10
.10-19
содержит совпадающую цифру1
,20
содержит совпадающую цифру0
, снова21
содержит совпадающую цифру1
,22
является действительным, поэтомуn=10
выводит22
.- и т.п.
Правила соревнований:
- Если ваш язык индексируется 1 (или вы выбираете), вы можете начать последовательность с
3 2 5 4 7 ...
(пропуская1
atn=0
и0
atn=1
). - Минимальный наибольший индекс, который вы должны поддерживать, это
25,000
. ПРИМЕЧАНИЕ. Последовательность заканчивается индексом1,023,456,788
, поскольку следующий индекс в строке содержит все 10 цифр. - Вы также можете выводить / возвращать массив / список всей последовательности вплоть до индекса,
n
если хотите.
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение, если это необходимо.
Тестовые случаи:
Эта последовательность фактически создала пары относительно индекса и выходов. Если индекс n
выводит o
, индекс o
выводит n
. Таким образом, вы можете ввести либо левую, либо правую, и вывод будет с другой стороны:
0 <-> 1 (this test case is optional)
2 <-> 3
10 <-> 22
12 <-> 30
34 <-> 50
89 <-> 100
111 <-> 200
112 <-> 300
199 <-> 322
2231 <-> 4456
9605 <-> 11118
19235 <-> 46000
23451 <-> 60668
25000 <-> 13674
Вот пастбин из первых 25 001 контрольных примеров, если вы хотите попробовать другие.
Ответы:
Pyth , 18 байт
Попробуй это здесь! или проверьте больше тестовых случаев!
Обратите внимание, что это возвращает всю последовательность вплоть до индекса N , но ссылка возвращает только последнее число, добавляя
e
(конец). Если вы хотите увидеть необработанное значение, возвращаемое этой программой, просто удалите его .Как это работает
источник
Python 2 ,
92918988 байтПопробуйте онлайн!
Распечатывает список первых
n+1
чиселДругой подход, который намного быстрее:
Python 2 , 96 байт
Попробуйте онлайн!
источник
Haskell,
8069 байтовПопробуйте онлайн!
Очень медленно для большого
n
.Изменить: @Laikoni сэкономил 10 байтов. Благодарность!
источник
APL (Дьялог) , 39 байт
Использует
⎕IO←0
.Попробуйте онлайн!
Как?
Рекурсия.
0=⍵:1
- сделать предположение.~⍺∊0∇¨⍳⍵
- левый арг (аккумулятор) уже не в предыдущих результатах∧⊃∧/≠/⍕¨⍺⍵
- и строковое представление аккумулятора иn
разные:⍺
- затем верните аккумулятор.⍵∇⍨⍺+1
- в противном случае увеличьте накопитель и восстановите.источник
n=10
истек в TIO ..: S Это должно быть очень трудоемкой операцией, которую вы там выполняете. Это рекурсия вызывает это или что-то еще является узким местом?Python 3 , 92 байта
Попробуйте онлайн!
Это печатает все термины до N- го. Спасибо Деннису за
-4-5 байт!источник
Java (OpenJDK 8) ,
218217213210202200172171170168167 байтЯ не могу поверить, что я не просто вернулся
k
все это время ...Попробуйте онлайн!
источник
for(char f:(""+k).toCharArray())
чтобыfor(int f:(""+k).getBytes())
,r.substring(-~r.trim().lastIndexOf(32));
иr.substring(r.lastIndexOf(32)-1)
.Go ,
217205 байтАльтернативная версия (программа вместо пакета): попробуйте онлайн!
Улучшения:
for
, используя множественное присваивание дляi,k
"fmt";
+fmt.Print
корочеos.Stdout.WriteString
(удержание сpackage main
момента, когда был нужен os.Args)источник
25000
контрольный пример. :) Так что не только правильное решение, но и с относительно хорошими характеристиками. +1 от меня! (PS: В вашей TIO-ссылке это аргумент, который вы используете, ввод можно удалить / не использовать.)JavaScript (ES6),
103 8881Редактировать Пересмотрено, включая много умных идей @Neil
Отправная точка
Основная идея: цикл от 0 до n, а внутренний цикл проверки значений все еще не используется
Текущая версия более читабельна
Тест
источник
~s.search(d)
сs.match(d)
работой?0
егоj++
, удалив++
изj
него, который был раньше, а затем начавj
с0
вместо-1
.n=>eval("for(r=[j=i='0'];i<=n;)r[j]|[...''+j].some(d=>i.match(d))?j++:(i=++i+'',r[k=j]=1,j=0);k")
Октава , 114 байт
Попробуйте онлайн!
Спасибо Кевину Круйссену и Длоску за сравнение характера игры в гольф.
Ungolfed
Основное объяснение:
i
, а другой для значения, чтобы добавитьj
Для каждого
i
продолжайте увеличивать,j
если выполняется одно из следующих:j
был использован раньше10
становится[1 0]
), используяint2str
. Затем сравните два числа с помощьюismember
(например,[1 0]
и[2 1]
вернул бы[1 0]
), а затемnnz
посмотрите, совпадают ли какие-либо столбцы.Если ничего из перечисленного не выполнено, у вас есть следующий номер! Добавить к
o
выходной матрицеисточник
-'0'
. Но если есть какой-то крайний случай, о котором мы оба не подумали,-48
будет более короткая альтернатива. Также обаsprintf('%d',...)
могут бытьint2str(...)
.Perl 5 , 60 байт
59 байт код + 1 для
-p
.Попробуйте онлайн! (Включает
-l
для визуальных целей и$-=0;
для сброса каждой итерации)источник
Пип , 30 байт
29 байт кода, +1 для
-p
флага.Попробуйте онлайн!
Выводит весь список. Предупреждение: крайне неэффективно;
2231
на моем ноутбуке ввода продолжался более 35 минут и до сих пор не завершен.объяснение
источник
Visual Basic .NET (.NET 4.5) ,
260259 байт-1 байт благодаря Кевину Круйссену
Перебирает, генерируя предыдущие термины в последовательности, чтобы потом сравнивать позже. Затем повторяет число в виде строки, ища совпадения.
Злоупотребление системой ввода VB.NET. Например,
j
это строка, но добавление одной конвертирует в целое число для меня. Целые преобразуются в булевы , где0
находитсяFalse
а остальныеTrue
.Попробуйте онлайн!
источник
If Not p.Contains(j)Then
же, как вы это сделалиIf j.Contains(c)Then g=0
ниже. Кроме того,If Not p.Contains(j)Then \n g=1 \n For Each c In i.ToString \n If j.Contains(c)Then g=0 \n Next \n If g Then Exit While \n End If
может быть сокращен путем удаленияg
и использованияExit While
непосредственно в цикле for:,If Not p.Contains(j)Then \n For Each c In i.ToString \n If j.Contains(c)Then Exit While \n Next \n End If
который, по внешнему виду, станет 241 байтом .Contains(c)Then
, я просто пропустил это. Мне нравится то, что вы думаете, но я используюg
в качестве дозорного, чтобы увидеть, содержит ли строка номер или нет. Ваша ссылка дает неправильные ответы, но я посмотрю, смогу ли я переработать некоторую внутреннюю логику в соответствии с тем, что вы думаете.Желе , 20 байт
Пиф побеждает желе. Иди мистер Xcoder!
Полная программа, принимающая ввод из STDIN и выводящая в опции формата списка, используя представление списка Jelly *. Использует стандартное индексирование на основе 0.
* Не списки одного элемента имеют не окружающие
[]
, поэтому0
выходы1
, а1
выходы и[1, 0]
т.д.Попробуйте онлайн!
Как?
источник