Введение (может быть проигнорировано)
Размещать все положительные числа в обычном порядке (1, 2, 3, ...) немного скучно, не правда ли? Итак, вот серия проблем, связанных с перестановками (перестановками) всех положительных чисел. Это второй вызов в этой серии. Первый вызов можно найти здесь .
В этом вызове мы используем коды Грея, чтобы переставить натуральные числа. Код Грея или «отраженный двоичный код» - это двоичное кодирование таким образом, что два последовательных значения отличаются только одним битом. Практическое применение этого кодирования - использовать его в поворотных кодировщиках , поэтому я ссылаюсь на «Turn My Way» .
Обратите внимание, что эта кодировка оставляет некоторую степень свободы. Например, после бинарного 1100, существует четыре возможных следующие коды: 1101, 1110, 1000 и 0100. Поэтому я определим , как наименьший, а не ранее используемое значение , которое отличается только один символ в двоичной кодировке. Эта последовательность соответствует A163252 .
Поскольку это задача «чистой последовательности», задача состоит в том, чтобы вывести для заданного качестве входных данных, где - это A163252 .
задача
Учитывая целочисленный ввод , выведите в целочисленном формате ( не в двоичном формате).
определяется как наименее положительное целое число, не встречающееся ранее в последовательности, так что и отличаются только одним битом при записи в двоичном виде.
Примечание: здесь предполагается индексирование на основе 1; Вы можете использовать индексирование на основе 0, поэтому и т. д. Пожалуйста, укажите это в своем ответе, если вы решите использовать это.
Контрольные примеры
Input | Output
--------------
1 | 1
5 | 4
20 | 18
50 | 48
123 | 121
1234 | 1333
3000 | 3030
9999 | 9997
правила
- Вход и выход являются целыми числами (ваша программа должна по крайней мере поддерживать вход и выход в диапазоне от 1 до 32767)
- Неверный ввод (0, значения с плавающей запятой, строки, отрицательные значения и т. Д.) Может привести к непредсказуемым результатам, ошибкам или (не) определенному поведению. В A163252 , ( 0 ) определяется как 0. Для этой задачи мы будем игнорировать это.
- Стандартные правила ввода / выводаПрименяются .
- Лазейки по умолчанию запрещены.
- Это код-гольф , поэтому самые короткие ответы в байтах выигрывают
Конечная нота
Смотрите следующие связанные (но не равные) вопросы PP & CG:
JavaScript (ES6), 65 байт
1-индексироваться.
Попробуйте онлайн!
комментарии
источник
Желе ,
2620 байтПопробуйте онлайн!
Полная программа, которая принимает n в качестве единственного аргумента. Работает для всех тестовых случаев. Также обратите внимание, что, хотя и не обязательно, он обрабатывает n = 0.
объяснение
Вспомогательная ссылка: найти следующий термин и предварять
Главная ссылка
источник
Java (JDK) ,
14213812412313213098 байтПопробуйте онлайн!
источник
import java.util.*;
+Set s=new HashSet();
кvar s=new java.util.HashSet();
. Кроме того, остальные могут быть golfed к:Integer i=0,j,k=0;for(;i++<n;s.add(k=j))for(j=0;s.contains(++j)|i.bitCount(j^k)>1;);return k;
. Хороший ответ тем не менее, так что +1 от меня. :)Stack
вместоHashSet
. Намного медленнее, но работает!Python 2 , 81 байт
Индексирование на основе 1
Попробуйте онлайн!
Python 2 , 79 байт
Это занимает много времени (9999 не был закончен после локального запуска в течение 7 минут)
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 74 байта
Попробуйте онлайн!
источник
APL (Dyalog Extended) , 46 байтов
Попробуйте онлайн!
источник
Древесный уголь , 65 байт
Попробуйте онлайн!Ссылка на подробную версию кода. Объяснение:
Инициализируйте результат до 0.
петля
n
раз.Сохраните предыдущий результат, чтобы мы не использовали его снова.
Найти старший бит в предыдущем результате.
Хотя этот бит больше 1, если бит установлен в предыдущем результате, попробуйте вычесть этот бит, чтобы увидеть, является ли результат невидимым результатом. Это гарантирует, что потенциальные результаты проверяются в порядке возрастания стоимости.
Теперь попробуйте XORing этот бит с предыдущим результатом, удваивая бит, пока не будет найден невидимый результат. Это обрабатывает случаи, когда бит должен быть установлен, опять-таки в порядке возрастания значения, но также и случай, когда необходимо переключить младший бит, который предыдущий цикл не потрудит проверить (потому что он проверяет гольф что здесь). Если предыдущий цикл обнаружил невидимый результат, этот цикл никогда не запускается; если это не так, то этот цикл будет бесполезно повторно тестировать эти результаты.
Обновите результат, на самом деле XORing бит с ним.
Выведите окончательный результат в конце цикла.
источник
05AB1E ,
212018 байтДовольно неэффективно, поэтому чем больше ввод, тем больше времени требуется для получения результата. Работает ли для ввода
0
, хотя.Попробуйте онлайн или проверьте первыйN термины .
Объяснение:
источник
Haskell , 101 байт
Попробуйте онлайн!
Кажется, стыдно брать на себя импорт
xor
, но я пока не нашел хорошего обходного пути. Мне также интересно, есть ли лучший способ выразить цикл.источник
R , 90 байт
Попробуйте онлайн!
источник