Idź stąd! No-1's Here!

16

Bawiłem się kilkoma liczbami i znalazłem sekwencję, która oczywiście znajduje się w OEIS. Jest to A005823 : Liczby, których rozszerzenie potrójne nie zawiera 1 . To idzie:

a (2n) = 3 * a (n) +2

a (2n + 1) = 3 * a (n + 1)

a (1) = 0

a = 0,2,6,8,18,20,24,26,54 ....

Napisałem program CJam, który generuje pierwszą n tych liczb, konwertując indeks na binarny, zamieniając jedynki na 2 i konwertując z trójskładnikowej na dziesiętną.

Zauważyłem również, że dowolną liczbę parzystą można uzyskać, biorąc sumę dwóch liczb w sekwencji (czasami liczbę samą w sobie).

Wyzwanie:

Biorąc pod uwagę dowolną nieujemną liczbę parzystą jako dane wejściowe, wypisz wskaźniki dwóch liczb w sekwencji, które ją sumują. (Należy pamiętać, że czasami możliwe jest użycie wielu par.)

Zasady:

  • Określ, czy korzystasz z indeksowania 0 czy 1.
  • Jeśli wyprowadzasz wynik jako ciąg, umieść separator między dwoma indeksami.
  • Możesz wyprowadzać dane jako liczbę zespoloną.
  • Jeśli chcesz, możesz wypisać każdą prawidłową parę.
  • Code Golf: wygrywa najkrótsza odpowiedź

Przypadki testowe

Używam indeksowania 0. Tutaj wymienię wszystkie możliwe dane wyjściowe dla każdego wejścia, ale wystarczy tylko jedno.

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]
Dzięki @Luis Mendo za pomoc dotyczącą przypadków testowych.

Powiązane: Czy jest w zestawie Cantor?

geokavel
źródło
Czy możemy wygenerować złożoną liczbę dwóch wartości? Czy możemy zapewnić dwie funkcje, z których każda daje każdą wartość?
xnor
2
Czy możemy wyprowadzić wszystkie możliwe wartości, czy to wykracza poza wyzwanie?
cole
@cole Tak, w porządku.
geokavel
Wygląda na to, że Sloane naprawdę lubi sekwencje numerów. „Jest na to sekwencja” (TM)
Pharap
1
Ponieważ istnieje kilka rozwiązań dla niektórych danych wejściowych, dobrze byłoby dołączyć wszystkie rozwiązania do przypadków testowych. Ten program pokazuje wszystkie pary rozwiązań dla każdego przypadku testowego, w tym samym formacie, co w tekście wyzwania (w oparciu o 0, każda para jest sortowana coraz częściej)
Luis Mendo

Odpowiedzi:

10

Łuska , 21 14 13 bajtów

-7 bajtów, dzięki odpowiedzi JS @ Neila

-1 bajt zainspirowany odpowiedzią betaveros Parradoc

Wykorzystuje indeksowanie 0

mḋTmMo±>ḋ2B3½

Wypróbuj online!

Wyjaśnienie

            ½    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

Poprzednie 21 bajtowe rozwiązanie

Pierwszy raz widziałem zastosowanie ».

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

Wypróbuj online!

Dłużej, ponieważ miałem do czynienia z niesie

H.PWiz
źródło
8

JavaScript (ES6), 75 71 bajtów

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>

Objaśnienie: Dzielenie danych wejściowych i elementów A005823 przez 2 nie zmienia problemu, jednak upraszcza to rozwiązanie, ponieważ reprezentacje trójskładnikowe używają teraz tylko zer i jedynek, a zatem nie ma potrzeby rozważania przeniesienia. Zapisuje również krok podczas konwersji z elementu na jego indeks (trójskładnik każdego elementu jest dwa razy dwójkowy jego indeksu). Przykłady:

                 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
Neil
źródło
6

Galaretka , 26, 22 , 21 bajtów

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

Wypróbuj online!

Jeden bajt zapisany dzięki @JonathanAllan!

Wyjaśnienie:

                # 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
źródło
1
@JonathanAllan Och, miło wiedzieć Œc. I tak, Dennis wyjaśnił S=¥mi problem .
DJMcMayhem
Nawiasem mówiąc, musisz dodać obsługę marginesów dla zera :(
Jonathan Allan
Wygląda na to, że jest to oparte na 1; być może warto byłoby podać to w odpowiedzi
Luis Mendo
20 bajtów
dylnan
3

Python 2 , 51 bajtów

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

Wypróbuj online!

Zadanie można wykonać w następujący sposób:

  1. Zmniejsz o połowę wkład
  2. Konwertuj na listę trójskładnikową
  3. Podziel to na dwie listy binarne, które sumują się elementarnie
  4. Konwertuj te listy z plików binarnych

Możemy dokonać podziału na (3), konwertując 0->0,1->1,2->1dla jednej listy i 0->0,1->0,2->1dla drugiej. Oznacza to, że poprzez sprawdzenie, czy wartość przekracza próg 0 lub 1.

Dwie wartości można znaleźć za pomocą odpowiednich funkcji rekurencyjnych:

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)

Ta funkcja fłączy oba te elementy ze zrozumieniem listy. To czyni go nieefektywnym z powodu wykładniczego rozgałęzienia.

Jeśli można by uzyskać liczby zespolone, moglibyśmy zapisać 10 bajtów za pomocą:

f=lambda n:n and(n%6>1)+n%6/4*1j+2*f(n/3)
xnor
źródło
Chyba liczby zespolone są w porządku.
geokavel
3

J, 35 32 bajtów

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

Wypróbuj online!

Indeksowane 0, a dane wejściowe podawane są monadycznie. Zwraca wszystkie możliwe sumowania do wartości (traktuje a bi b ajako różne możliwe sumowania).

Przekształcenie matrycy boolowskiej w indeksy wymaga dużo kodu ...

Chciałbym również usunąć widelec po lewej stronie, więc nie muszę używać tylu nawiasów i @-at, ale nie mogę znaleźć dobrego sposobu na zrobienie tego (moje alternatywne podejście nie oszczędza żadnych bajtów ).

Wyjaśnienie

W celu wyjaśnienia i zakazu gry weź pod uwagę następujące elementy głównej funkcji

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

valid_nums daje macierz boolowską, w której indeksy są indeksami zsumowanych wartości sekwencji. Jeśli istnieje jeden przy tych indeksach, oznacza to, że dwie liczby sumują się do wartości wejściowej.

indices_of_ones to idiom J, który podaje współrzędne tych w macierzy boolowskiej o dowolnej randze

Główna funkcja składa się po prostu jako

indices_of_ones@valid_nums

ważne liczby

= [: +/~ 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 działa w tym przypadku, łącząc każdy wiersz do następnego.

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

Widzimy, że gdyby była to matryca boolowska, współrzędne jednych można znaleźć, interpretując wskaźniki matrycy zniszczonej jako liczby w podstawie kształtu tej macierzy, używając jak największej liczby wyrażeń przyimkowych, aby pomieszać biednego czytelnika .

kapusta
źródło
1
twoje nadmiarowe wyjścia są w porządku.
geokavel
3

MATL , 22 21 19 17 bajtów

tQ:qBEI_ZA&+=R&fh

Wyjście jest oparte na 1. Program tworzy wszystkie pary rozwiązań. Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

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
Luis Mendo
źródło
OP powiedział, że tworzenie wszystkich rozwiązań jest w porządku w komentarzach
H.PWiz
@ H.PWiz Dzięki! Nie widziałem tego
Luis Mendo
2

Pyt , 37 bajtów

0-indeksowane

Na pewno nie grał w golfa tak dobrze, jak mógłby być.

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

Wypróbuj online!

Cowabunghole
źródło
1
34 bajtów: hfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQU. Z całą pewnością można
grać w
1
33 bajty:hfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQ
Pan Xcoder
2

Pyth , 29 bajtów

Ten zwraca wszystkie możliwe pary indeksów.

fqQ+@Kmi:.Bd\1\[email protected]

Wypróbuj tutaj.

Pyth , 30 bajtów

hfqQ+@Kmi:.Bd\1\[email protected]

Wypróbuj tutaj.

Zwraca to pary indeksów jako [LowerIndex, HigherIndex].


Jak to działa?

hfqQ+@Kmi:.Bd\1\[email protected]   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. 
Pan Xcoder
źródło
2

Paradoc (v0.2.10), 11 bajtów (CP-1252)

½3B2>_B™2Bv

Wypróbuj online!

Algorytmicznie przypomina bardzo odpowiedź Neila ES6 . Na niższym poziomie, również uderzająco podobny do odpowiedzi Łuska H.PWiza . Cieszę się, że musimy wykorzystać wszystkie trzy przeciążenia B.

Bierze liczbę całkowitą na stosie, pozostawia listę dwóch liczb całkowitych na stosie.

Wyjaśnienie:

½           .. 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
źródło
1

Python 3 , 122 120 bajtów

-2 bajty dzięki Mr. Xcoder!

0-indeksowane

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]

Nie golfowany:

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]

Wypróbuj online!

Cowabunghole
źródło
1
Mam nadzieję że nie masz nic przeciwko. Dodałem link TiO.
Pan Xcoder
1

Mathematica, 94 bajty

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


1-indeksowany

J42161217
źródło
1

JavaScript, 120 101 bajtów

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]

Wypróbuj online!

0-indeksowane.
Zwraca parę indeksów, w których jeden indeks jest najmniejszy z możliwych (na przykład w przypadku 428zwrotu 22,31).


źródło
1

Brain-Flak , 220 166 bajtów

-54 bajty, patrząc na funkcję modulo na wiki, pozwalając na pewne zmiany strukturalne

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

Wypróbuj online!

0-indeksowane.

Wyjaśnienie

Podobnie jak wiele innych rozwiązań, oblicza to trójskładnikową ekspansję n/2i konwertuje ją na dwie liczby binarne.

Krok 1: Podziel dane wejściowe przez 2

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

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

Krok 2: oblicz trójskładnikową ekspansję

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

 ({}(<>))<>         {   (({})){({}[()])<>}{} }{}<> ([{}()]{})         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

Krok 3: Konwertuj na rozwiązanie

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

([]){{}                                                      ([][()])}           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
źródło
0

JavaScript (ES6), 70 72 bajtów

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))

(Indeksowane 0 i najwyraźniej prawie takie samo rozwiązanie jak @Neil, nawet jeśli nie widziałem jego odpowiedzi)

I rozpoczął się z coraz tyłu indeksu z szeregu za pomocą odwrotnego procesu: stringify z podstawy 3, należy wymienić każdy 2z 1, analizować z podstawą 2.

Aby uzyskać dwie liczby, i to na każdą parzystą, mamy tylko połowę danych wejściowych - ale teraz 1mogą wystąpić również cyfry. Zastępujemy go liczbą 0w jednym i 2drugą liczbą, co nie zmienia sumy dwóch przed krokiem zamiany i parsowania. Oto, co wymyśliłem (wykonując dwie zamiany, 1-> 0-lub-2 i 2-> 1w jednym kroku):

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

Oczywiście dwie zastępcze mapy (ciągi znaków) różnią się tylko jednym indeksem, więc powinniśmy być w stanie skrócić literał tablicy tylko poprzez zamianę 1 i 2z d == 2 ? 1 : x. Lub d-1 || x. Gdzie -1to samo, co dwa jednoargumentowe operatory - ale wyglądają bardziej przerażająco :-)

Próba uniknięcia literału tablicowego i nawiasu wokół niego n/2 mnie

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

ale nie okazało się to owocne.

Bergi
źródło
Zacząłem też od ["001","011"]wersji (no cóż, moje zmienne nazwy były różne)
Neil
Myślę, że .replace(/./g,d=>d>>1|x)oszczędza 2 bajty.
Neil
@Neil Niestety to nie działa d="0"i x=1- cyfra powinna pozostać0
Bergi
Tak, właśnie to wypracowałem po wypróbowaniu kilku kolejnych przypadków testowych. (I od tego czasu wymyśliłem inny wariant, ale obawiam się, że tak właśnie jest w mojej odpowiedzi.)
Neil
1
Och, bardzo miło, i pomyślałem, że sprytnie pokonałem twoją poprzednią wersję ...
Neil
0

Pyth, 22 bajty

J.m}1jb3hQxLJhfqsTQ^J2

Wypróbuj online: demonstracja

Wyjaśnienie:

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
źródło