Я играл с некоторыми числами и нашел последовательность, которая, конечно, на OEIS. Это A005823 : числа, троичное расширение которых не содержит единиц . Идет:
a (2n) = 3 * a (n) +2
a (2n + 1) = 3 * a (n + 1)
а (1) = 0
а = 0,2,6,8,18,20,24,26,54 ....
Я написал CJam-программу, которая генерирует первые n из этих чисел путем преобразования индекса в двоичный, замены 1 на 2 и преобразования из троичного в десятичное.
Я также заметил, что любое четное число можно получить, взяв сумму двух чисел в последовательности (иногда число с самим собой).
Соревнование:
Если в качестве входных данных выбрано любое неотрицательное четное число, выведите индексы двух чисел в суммирующей последовательности. (Обратите внимание, что иногда возможно несколько пар.)
Правила:
- Укажите, используете ли вы 0- или 1-индексацию.
- Если вы выводите в виде строки, поместите разделитель между двумя индексами.
- Вам разрешено выводить как комплексное число.
- При желании вы можете вывести каждую действительную пару.
- Code Golf: самый короткий ответ выигрывает
Тестовые случаи
Я использую 0-индексацию. Здесь я перечисляю все возможные выходные данные для каждого входа, но вам нужно вывести только один.
0: [0 0] 2: [1 0] 4: [1 1] 6: [2 0] 8: [2 1] [3 0] 10: [3 1] 12: [2 2] 14: [3 2] 16: [3 3] 18: [4 0] 30: [6 2] 32: [6 3] [7 2] 46: [7 5] 50: [7 6] 120: [10 10] 338: [19 18] 428: [30 23] [31 22] 712: [33 27] [35 25] [41 19] [43 17] [49 11] [51 9] [57 3] [59 1] 1016: [38 37] [39 36]Спасибо @Luis Mendo за помощь в тестировании.
Связанный: это в пределах набора Кантора?
источник
Ответы:
Шелуха ,
211413 байт-7 байт, благодаря ответу @ Neil's JS
-1 байт, вдохновленный ответом пардавок от betaveros
Использует 0-индексацию
Попробуйте онлайн!
объяснение
Предыдущее 21-байтовое решение
Впервые я увидел использование для
»
.Попробуйте онлайн!
Дольше, как я имел дело с переносками
источник
JavaScript (ES6),
7571 байтОбъяснение: Разделение входных данных и элементов A005823 на 2 не меняет проблему, однако упрощает решение, поскольку троичные представления теперь используют только 0 и 1 и, следовательно, нет необходимости рассматривать их. Он также сохраняет шаг при преобразовании элемента в его индекс (троичный элемент каждого элемента в два раза больше его индекса). Примеры:
источник
Желе ,
26, 22, 21 байтПопробуйте онлайн!
Один байт сохранен благодаря @JonathanAllan!
Объяснение:
источник
Œc
. И да, Деннис объяснилS=¥
мне проблему .Python 2 , 51 байт
Попробуйте онлайн!
Задача может быть выполнена следующим образом:
Мы можем выполнить разбиение в (3) путем преобразования
0->0,1->1,2->1
для одного списка и0->0,1->0,2->1
для другого. То есть при проверке это значение выше порога 0 или 1.Два значения могут быть найдены соответствующими рекурсивными функциями:
Функция
f
объединяет два из них в понимании списка. Это делает его неэффективным из-за экспоненциального ветвления.Если бы комплексные числа могли быть выведены, мы могли бы сохранить 10 байтов с:
источник
J,
3532 байтаПопробуйте онлайн!
0 индексируется и ввод дается монадически. Возвращает все возможные суммы к значению (это относится
a b
иb a
к различным возможным суммам).Преобразование логической матрицы в индексы требует много кода ...
Я хотел бы также удалить разветвление слева, чтобы мне не приходилось использовать столько скобок и
@
-at, но я не могу найти хороший способ сделать это (мой альтернативный подход не сохраняет байты ).объяснение
В целях объяснения и разгадывания рассмотрим следующие компоненты основной функции
valid_nums возвращает логическую матрицу, где индексы являются индексами суммированных значений последовательности. Если в этих индексах есть единица, это означает, что два числа суммируются с входным значением.
indices_of_ones - это J-идиома для определения координат единиц в булевой матрице произвольного ранга
Основная функция составлена довольно просто:
valid_nums
indices_of_ones
,
-ravel в этом случае работает, соединяя каждую строку со следующей.Мы можем видеть, что если бы это была булева матрица, координаты единиц можно найти, интерпретируя индексы разбитой матрицы как числа в основании формы этой матрицы, используя как можно больше предлоговых фраз, чтобы помочь сбить с толку бедного читателя. ,
источник
MATL ,
22211917 байтВыход основан на 1. Программа производит все пары решений. Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Pyth , 37 байт
0 индексированные
Конечно, не в гольф, как это может быть.
Попробуйте онлайн!
источник
hfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQU
. Определенно можно играть в гольфhfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQ
Pyth , 29 байт
Этот возвращает все возможные пары индексов.
Попробуй это здесь.
Pyth , 30 байт
Попробуй это здесь.
Это возвращает пары индексов как
[LowerIndex, HigherIndex]
.Как это работает?
источник
Paradoc (v0.2.10), 11 байт (CP-1252)
Попробуйте онлайн!
Алгоритмически это очень похоже на ответ Нейла ES6 . На более низком уровне, также поразительно похож на ответ H.PWiz's Husk . Я удивлен, что мы должны использовать все три перегрузки
B
.Принимает целое число в стеке, оставляет список из двух целых чисел в стеке.
Объяснение:
источник
Python 3 ,
122120 байт-2 байта благодаря мистеру Xcoder!
0 индексированные
Ungolfed:
Попробуйте онлайн!
источник
Mathematica, 94 байта
1-индексированных
источник
JavaScript,
120101 байтПопробуйте онлайн!
0 индексированные.
Он возвращает пару индексов, где один индекс является наименьшим возможным (например, в случае
428
его возврата22,31
).источник
Brain-Flak ,
220166 байт-54 байта при поиске функции по модулю в вики, что позволяет внести некоторые структурные изменения
Попробуйте онлайн!
0 индексированные.
объяснение
Как и многие другие решения, он вычисляет троичное разложение
n/2
и преобразует его в два двоичных числа.Шаг 1: Разделите ввод на 2
Шаг 2: вычислить троичное расширение
Шаг 3: Преобразовать в решение
источник
JavaScript (ES6), 70
72байта(0-проиндексировано и, по-видимому, почти такое же решение, как @Neil, даже если я не видел его ответ)
Я начал с того, что вернул индекс из числа, используя обратную последовательность: зачеркнуть с основанием 3, заменить каждое
2
на1
, разобрать с основанием 2.Чтобы получить два числа, и это для каждого четного, мы только половину ввода - но теперь, также
1
могут появляться цифры. Таким образом, мы заменяем его на a0
в одном числе и a2
на другое число, которое не меняет сумму двух перед этапом замены и анализа. Вот что я придумал (выполняя две замены,1
-> 0 или 2 и2
->1
за один шаг):Конечно, две карты замены (строки) отличаются только одним индексом, поэтому мы должны быть в состоянии сократить литерал массива только путем замены
1
и2
наd == 2 ? 1 : x
. Илиd-1 || x
. Где-1
то же самое, что и два унарных оператора - но они выглядят страшнее :-)Пытаясь избежать литерала массива и круглых скобок,
n/2
я также придумално это не оказалось плодотворным.
источник
["001","011"]
версии (ну, у меня были разные имена переменных).replace(/./g,d=>d>>1|x)
экономит 2 байта.d="0"
иx=1
- цифра должна остаться0
Pyth, 22 байта
Попробуйте онлайн: демонстрация
Объяснение:
источник