Уходи! Нет-1 здесь!

16

Я играл с некоторыми числами и нашел последовательность, которая, конечно, на 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 за помощь в тестировании.

Связанный: это в пределах набора Кантора?

geokavel
источник
Можем ли мы вывести комплексное число двух значений? Можем ли мы предоставить две функции, одна из которых дает каждое значение?
xnor
2
Можем ли мы вывести все возможные значения, или это выходит за рамки задачи?
Коул
@cole Да, все в порядке.
геокавель
Кажется, мистеру Слоану действительно нравятся его числовые последовательности. «Для этого есть последовательность» (TM)
Pharap
1
Поскольку существует несколько решений для некоторых входных данных, было бы неплохо включить все решения в тестовые случаи. Эта программа показывает все пары решений для каждого тестового случая в том же формате, что и в тексте
Луис Мендо,

Ответы:

10

Шелуха , 21 14 13 байт

-7 байт, благодаря ответу @ Neil's JS

-1 байт, вдохновленный ответом пардавок от betaveros

Использует 0-индексацию

mḋTmMo±>ḋ2B3½

Попробуйте онлайн!

объяснение

            ½    Half the input
          B3     Convert to Base 3
   m             Map over the list
    Mo±>ḋ2       Function such that: 0 -> [0,0], 1 -> [0,1], 2 -> [1,1]
        ḋ2       Binary 2, [1,0]
    M            For each in that list
     o±>         check if the argument is greater than it
  T              Transpose
mḋ               Convert each from binary

Предыдущее 21-байтовое решение

Впервые я увидел использование для ».

mḋT»o%2+ȯ?´eḋε%3`-0B3

Попробуйте онлайн!

Дольше, как я имел дело с переносками

H.PWiz
источник
8

JavaScript (ES6), 75 71 байт

f=
n=>[1,0].map(i=>parseInt((n/2).toString(3).replace(/./g,c=>+c+i>>1),2))
<input type=number min=0 step=2 oninput=o.textContent=this.value%2?``:f(this.value)><pre id=o>

Объяснение: Разделение входных данных и элементов A005823 на 2 не меняет проблему, однако упрощает решение, поскольку троичные представления теперь используют только 0 и 1 и, следовательно, нет необходимости рассматривать их. Он также сохраняет шаг при преобразовании элемента в его индекс (троичный элемент каждого элемента в два раза больше его индекса). Примеры:

                 A005823
                  halved
            n in  values A005823
   n n/2  base 3  base 3 indices
   0   0       0   0   0   0   0  
   2   1       1   1   0   1   0
   4   2       2   1   1   1   1
   6   3      10  10   0   2   0
   8   4      11  11   0   3   0
  10   5      12  11   1   3   1
  12   6      20  10  10   2   2
  14   7      21  11  10   3   2
  16   8      22  11  11   3   3
  18   9     100 100   0   4   0
  30  15     120 110  10   6   2
  32  16     121 111  10   7   2
  46  23     212 111 101   7   5
  50  25     221 111 110   7   6
Нил
источник
6

Желе , 26, 22 , 21 байт

ḶBḤḅ3
ÇŒcS=¥Ðf⁸ḢiЀÇT

Попробуйте онлайн!

Один байт сохранен благодаря @JonathanAllan!

Объяснение:

                # Helper link: A005823 to *N* terms
Ḷ               # Lowered range(N)
 B              # Converted to binary
  Ḥ             # Double each digit
   ḅ3           # Converted from base 3 to decimal
                # Main link
Ç               # Last link
 Œc             # All combinations of 2 items (with replacement)
      Ðf        # Remove every combination where this isn't true:
   S=¥          #   The sum of the two items is equal to N
        ⁸Ḣ      # Take the first combination left
          i     # Index of
           Ѐ   # Each element of the combination
             Ç  # In the sequence
              T # Return the truthy indices
DJMcMayhem
источник
1
@JonathanAllan О, приятно знать о Œc. И да, Деннис объяснил S=¥мне проблему .
DJMcMayhem
Похоже, что вам нужно добавить обработку краев для нуля, кстати :(
Джонатан Аллан
Похоже, это основано на 1; возможно, стоило бы заявить об этом в ответ
Луис Мендо
20 байтов
Дилнан
3

Python 2 , 51 байт

f=lambda n:[n and(n/2%3>r)+2*f(n/3)[r]for r in 0,1]

Попробуйте онлайн!

Задача может быть выполнена следующим образом:

  1. Половина ввода
  2. Преобразовать в троичный список
  3. Разделите это на два двоичных списка, которые суммируются по элементам
  4. Преобразовать эти списки из двоичного

Мы можем выполнить разбиение в (3) путем преобразования 0->0,1->1,2->1для одного списка и 0->0,1->0,2->1для другого. То есть при проверке это значение выше порога 0 или 1.

Два значения могут быть найдены соответствующими рекурсивными функциями:

p=lambda n:n and(n/2%3>0)+2*p(n/3)
q=lambda n:n and(n/2%3>1)+2*q(n/3)

Функция f объединяет два из них в понимании списка. Это делает его неэффективным из-за экспоненциального ветвления.

Если бы комплексные числа могли быть выведены, мы могли бы сохранить 10 байтов с:

f=lambda n:n and(n%6>1)+n%6/4*1j+2*f(n/3)
XNOR
источник
Я думаю, комплексные числа в порядке.
геокавель
3

J, 35 32 байта

($#:I.@,)@(=[:+/~3#.+:@#:@i.@>:)

Попробуйте онлайн!

0 индексируется и ввод дается монадически. Возвращает все возможные суммы к значению (это относится a bи b aк различным возможным суммам).

Преобразование логической матрицы в индексы требует много кода ...

Я хотел бы также удалить разветвление слева, чтобы мне не приходилось использовать столько скобок и @-at, но я не могу найти хороший способ сделать это (мой альтернативный подход не сохраняет байты ).

объяснение

В целях объяснения и разгадывания рассмотрим следующие компоненты основной функции

valid_nums      =. = [: +/~ 3 #. +:@#:@i.@>:
indices_of_ones =. $ #: I.@,

valid_nums возвращает логическую матрицу, где индексы являются индексами суммированных значений последовательности. Если в этих индексах есть единица, это означает, что два числа суммируются с входным значением.

indices_of_ones - это J-идиома для определения координат единиц в булевой матрице произвольного ранга

Основная функция составлена ​​довольно просто:

indices_of_ones@valid_nums

valid_nums

= [: +/~ 3 #. +:@#:@i.@>:  Input is n
                 #:@i.@>:  Binary numbers in range [0,n]
              +:           Doubled
         3 #.              Interpreted as ternary
     +/~                   Addition table with self (sum all possible pairs)
=                          Equate to n

indices_of_ones

$ #: I.@,
        ,  Ravel matrix into a single list
     I.    Find the indices of ones in that list
  #:       Convert to the base given by
$          The shape of the matrix

,-ravel в этом случае работает, соединяя каждую строку со следующей.

   i.3 3
0 1 2
3 4 5
6 7 8
   , i.3 3
0 1 2 3 4 5 6 7 8

Мы можем видеть, что если бы это была булева матрица, координаты единиц можно найти, интерпретируя индексы разбитой матрицы как числа в основании формы этой матрицы, используя как можно больше предлоговых фраз, чтобы помочь сбить с толку бедного читателя. ,

капуста
источник
1
Ваши избыточные выходы в порядке.
геокавель
3

MATL , 22 21 19 17 байт

tQ:qBEI_ZA&+=R&fh

Выход основан на 1. Программа производит все пары решений. Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

t      % Implicit input: n. Duplicate
Q:q    % Range [0 1 ... n]
B      % Convert to binary. Gives a matrix where each row corresponds to a number
E      % Multiply each entry by 2
I_ZA   % Convert each row from ternary to a number
&+     % Matrix of all pair-wise additions
=      % Does each entry equal n?
R      % Upper triangular matrix
&f     % Push row and column indices of nonzero entries
h      % Concatenate horizontally. Implicit didsplay
Луис Мендо
источник
ОП сказал, что производство всех решений было в порядке в комментариях
H.PWiz
@ H.PWiz Спасибо! Я не видел этого
Луис Мендо
2

Pyth , 37 байт

0 индексированные

Конечно, не в гольф, как это может быть.

KUQJmi:.Bd\1\23KhfqQ+@JeT@JhTsmm,dkKK

Попробуйте онлайн!

Cowabunghole
источник
1
34 байт: hfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQU. Определенно можно играть в гольф
г-н Xcoder
1
33 байта:hfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQ
г-н Xcoder
2

Pyth , 29 байт

Этот возвращает все возможные пары индексов.

fqQ+@Kmi:.Bd\1\23QhT@KeT.cUQ2

Попробуй это здесь.

Pyth , 30 байт

hfqQ+@Kmi:.Bd\1\23QhT@KeT.cUQ2

Попробуй это здесь.

Это возвращает пары индексов как [LowerIndex, HigherIndex].


Как это работает?

hfqQ+@Kmi:.Bd\1\23QhT@KeT.cUQ2   Full Program. Q means input throughout the whole explanation.

       m          Q               Map over the range [0, Q) with a variable d.
          .Bd                     Convert to binary.
         :   \1\2                 Replace 1 with 2.
        i        3                Convert it from base 3 to integer.
      K                           Assign the mapped range to a variable K.
                         .cUQ2    All possible two-element combinations of the range [0...Q).
    +@             hT@KeT         Sum of the integers on positions in K of the two-element
                                  combination.
 fqQ                              Filter those that equal the input.
h                                 Optional: Head. Take the first element.
                                  Print the result, implicitly. 
Мистер Xcoder
источник
2

Paradoc (v0.2.10), 11 байт (CP-1252)

½3B2>_B™2Bv

Попробуйте онлайн!

Алгоритмически это очень похоже на ответ Нейла ES6 . На более низком уровне, также поразительно похож на ответ H.PWiz's Husk . Я удивлен, что мы должны использовать все три перегрузки B.

Принимает целое число в стеке, оставляет список из двух целых чисел в стеке.

Объяснение:

½           .. Halve input
 3B         .. Convert to ternary
   2        .. 2, which will get implicitly coerced to [0,1]
    >_      .. Greater than, as a block
      B     .. "Bimap": take the block and map it over the Cartesian
            .. product of the last two lists to get a matrix
       ™    .. Transpose
        2Bv .. Convert each row from binary
betaveros
источник
1

Python 3 , 122 120 байт

-2 байта благодаря мистеру Xcoder!

0 индексированные

def f(a):r=range(a);s=[int(bin(x)[2:].replace(*'12'),3)for x in r];return[(i,j)for i in r for j in r if s[i]+s[j]==a][0]

Ungolfed:

def f(a):
    r=range(a)
    s=[int(bin(x)[2:].replace(*'12'),3)for x in r]
    return[(i,j)for i in r for j in r if s[i]+s[j]==a][0]

Попробуйте онлайн!

Cowabunghole
источник
1
Надеюсь, вы не возражаете. Я добавил ссылку TiO.
Мистер Кскодер
1

Mathematica, 94 байта

(w=#;Position[s,#]&/@#&@@(k=Select)[Tuples[s=k[Range@w,DigitCount[#,3,1]==0&],{2}],Tr@#==w&])& 


1-индексированных

J42161217
источник
1

JavaScript, 120 101 байт

n=>[(A=[...Array(n+1)].map(Z=(a,b=a)=>b&&3*Z(b/2|0)+b%2*2))[F='findIndex'](a=>z=~A[F](b=>a+b==n)),~z]

Попробуйте онлайн!

0 индексированные.
Он возвращает пару индексов, где один индекс является наименьшим возможным (например, в случае 428его возврата 22,31).


источник
1

Brain-Flak , 220 166 байт

-54 байта при поиске функции по модулю в вики, что позволяет внести некоторые структурные изменения

({()<({}[()()])>}{}){({}(<>))<>(()()())({()<(({})){({}[()])<>}{}>}{}<><([{}()]{})>[()])}([]){{}<>(({}){})<>(({}){}{()<({}[()]){<>({}())<>(<{}>)}>}{})([][()])}({}{}<>)

Попробуйте онлайн!

0 индексированные.

объяснение

Как и многие другие решения, он вычисляет троичное разложение n/2и преобразует его в два двоичных числа.

Шаг 1: Разделите ввод на 2

({()<({}[()()])>}{})

 {              }     until number becomes zero:
     ({}[()()])       subtract two
( ()<          > {})  push number of iterations

Шаг 2: вычислить троичное расширение

{({}(<>))<>(()()())({()<(({})){({}[()])<>}{}>}{}<><([{}()]{})>[()])}

 ({}(<>))<>         {   (({})){({}[()])<>}{} }{}<> ([{}()]{})         modulo (from wiki)
           (()()())                                                   use 3 as base
                     ()<                    >                         evaluate as 1 every time the 3 rolls over
                   (                              <          >[()])   push number of rollovers (function is now division with remainder)
{                                                                  }  repeat until quotient is zero, leaving all remainders on stack

Шаг 3: Преобразовать в решение

([]){{}<>(({}){})<>(({}){}{()<({}[()]){<>({}())<>(<{}>)}>}{})([][()])}({}{}<>)

([]){{}                                                      ([][()])}           repeat while stack height > 1:
                                                                                 (loop happens once when initial stack height is 1, but that's fine)
       <>(({}){})                                                                double smaller output number
                 <>(({}){}                                  )                    double larger output number
                          {                              }{}                     if digit in ternary expansion is nonzero:
                           ()<                          >                        add 1 to larger output number
                              ({}[()]){                }                         if digit is 2:
                                       <>({}())<>(<{}>)                          add 1 to smaller output number
Nitrodon
источник
0

JavaScript (ES6), 70 72 байта

n=>[6,4].map(x=>parseInt((n/2).toString(3).replace(/./g,d=>x>>d&1),2)) // thanks @Neil
n=>[0,1].map(x=>parseInt((n/2).toString(3).replace(/1|2/g,d=>~-d||x),2))

(0-проиндексировано и, по-видимому, почти такое же решение, как @Neil, даже если я не видел его ответ)

Я начал с того, что вернул индекс из числа, используя обратную последовательность: зачеркнуть с основанием 3, заменить каждое 2на 1, разобрать с основанием 2.

Чтобы получить два числа, и это для каждого четного, мы только половину ввода - но теперь, также 1могут появляться цифры. Таким образом, мы заменяем его на a 0в одном числе и a 2на другое число, которое не меняет сумму двух перед этапом замены и анализа. Вот что я придумал (выполняя две замены, 1-> 0 или 2 и 2-> 1за один шаг):

n=>["001","011"].map(x=>parseInt((n/2).toString(3).replace(/./g,d=>x[d]),2))

Конечно, две карты замены (строки) отличаются только одним индексом, поэтому мы должны быть в состоянии сократить литерал массива только путем замены 1и 2на d == 2 ? 1 : x. Или d-1 || x. Где -1то же самое, что и два унарных оператора - но они выглядят страшнее :-)

Пытаясь избежать литерала массива и круглых скобок, n/2я также придумал

n=>Array.from(parseInt,(h=n/2,i)=>parseInt(h.toString(3).replace(/1|2/g,d=>~-d||i),2))

но это не оказалось плодотворным.

Берги
источник
Я тоже начал с ["001","011"]версии (ну, у меня были разные имена переменных)
Нейл
Я думаю, .replace(/./g,d=>d>>1|x)экономит 2 байта.
Нил
@Neil К сожалению, это не работает d="0"и x=1- цифра должна остаться0
Bergi
Да, я просто решил это после того, как попробовал еще несколько тестов. (И с тех пор я придумала другой вариант, но я боюсь, что так и будет в моем ответе.)
Нил
1
О, очень мило, и я подумал, что у меня
Нил
0

Pyth, 22 байта

J.m}1jb3hQxLJhfqsTQ^J2

Попробуйте онлайн: демонстрация

Объяснение:

J.m}1jb3hQxLJhfqsTQ^J2
        hQ                input + 1 
 .m                       find all values of [0, 1, 2, ..., input], where
     jb3                     value converted to base 3
   }1                        check if it contains the digit 1
                          this boolean ^ is false
J                         store this list in variable J

                   ^J2    every pair of J
              f           filter for pairs with
                sT           sum of pair
               q             equal
                  Q          the input
             h            take the first of these pairs
          xLJ             and find the corresponding indices of J
Jakube
источник