Đi chỗ khác! Số 1 ở đây!


16

Tôi đã chơi xung quanh với một số con số và tìm thấy một chuỗi, tất nhiên, là trên OEIS. Đó là A005823 : Các số có phần mở rộng về phía trước không chứa 1 . Nó đi:

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

Tôi đã viết một chương trình CJam tạo ra n đầu tiên của những con số này bằng cách chuyển đổi chỉ mục thành nhị phân, thay thế 1 bằng 2 và chuyển đổi từ ternary sang thập phân.

Tôi cũng nhận thấy rằng bất kỳ số chẵn nào cũng có thể thu được bằng cách lấy tổng của hai số trong chuỗi (đôi khi là số với chính nó).

Các thách thức:

Cho bất kỳ số chẵn không âm nào làm đầu vào, hãy xuất các chỉ số của hai số trong chuỗi cộng với nó. (Lưu ý rằng đôi khi nhiều cặp có thể.)

Những quy định:

  • Chỉ định nếu bạn đang sử dụng lập chỉ mục 0 hoặc 1.
  • Nếu bạn xuất ra dưới dạng một chuỗi, hãy đặt một dấu phân cách giữa hai chỉ mục.
  • Bạn được phép xuất ra dưới dạng số phức.
  • Nếu bạn rất mong muốn, bạn có thể xuất ra mọi cặp hợp lệ.
  • Code Golf: câu trả lời ngắn nhất sẽ thắng

Các trường hợp thử nghiệm

Tôi sử dụng chỉ mục 0. Ở đây tôi liệt kê mọi đầu ra có thể cho mỗi đầu vào, nhưng bạn chỉ cần xuất một đầu ra.

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]
Cảm ơn @Luis Mendo đã giúp đỡ trường hợp thử nghiệm.

Liên quan: Có phải trong bộ Cantor?


Chúng ta có thể xuất một số phức của hai giá trị không? Chúng tôi có thể cung cấp hai chức năng, một cho mỗi giá trị?
xnor

2
Chúng ta có thể đưa ra tất cả các giá trị có thể, hoặc là vượt qua thử thách?
cole

@cole Vâng, không sao đâu.
geokavel

Có vẻ như ông Sloane thực sự thích các chuỗi số của mình. "Có một chuỗi cho điều đó" (TM)
Pharap

1
Vì có một số giải pháp cho một số đầu vào, sẽ rất tốt nếu bao gồm tất cả các giải pháp trong các trường hợp thử nghiệm. Chương trình này hiển thị tất cả các cặp giải pháp cho từng trường hợp thử nghiệm, có cùng định dạng như trong văn bản thử thách (dựa trên 0, mỗi cặp được sắp xếp ngày càng tăng)
Luis Mendo

Câu trả lời:


10

Husk , 21 14 13 byte

-7 byte, nhờ câu trả lời JS của @ Neil

-1 byte lấy cảm hứng từ câu trả lời Parradoc của betaveros

Sử dụng chỉ mục 0

mḋTmMo±>ḋ2B3½

Hãy thử trực tuyến!

Giải trình

            ½    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

Giải pháp 21 byte trước đó

Lần đầu tiên tôi thấy sử dụng cho ».

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

Hãy thử trực tuyến!

Lâu hơn, như tôi đã làm việc với mang


8

JavaScript (ES6), 75 71 byte

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>

Giải thích: Việc phân chia đầu vào và các yếu tố của A005823 cho 2 không làm thay đổi vấn đề, tuy nhiên, điều này làm cho giải pháp đơn giản hơn vì các biểu diễn ternary hiện chỉ sử dụng 0 và 1 và do đó không cần phải xem xét. Nó cũng lưu một bước khi chuyển đổi từ phần tử sang chỉ mục của nó (phần ba của phần tử gấp đôi số nhị phân của chỉ mục). Ví dụ:

                 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

Jelly , 26, 22 , 21 byte

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

Hãy thử trực tuyến!

Một byte được lưu nhờ vào @Jonathan ALLan!

Giải trình:

                # 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

1
@Jonathan ALLan Oh, rất vui được biết về Œc. Và vâng, Dennis đã giải thích vấn đề với S=¥tôi.
DJMcMayhem

Có vẻ như bạn cần thêm xử lý trường hợp cạnh cho số 0 bằng cách này :(
Jonathan Allan

Có vẻ như đây là 1 dựa trên; có lẽ sẽ đáng để nói điều đó trong câu trả lời
Luis Mendo


3

Python 2 , 51 byte

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

Hãy thử trực tuyến!

Nhiệm vụ có thể được thực hiện như thế này:

  1. Giảm một nửa đầu vào
  2. Chuyển đổi sang danh sách ternary
  3. Chia nó thành hai danh sách nhị phân tổng hợp theo từng phần tử với nó
  4. Chuyển đổi các danh sách từ nhị phân

Chúng tôi có thể thực hiện phân tách trong (3) bằng cách chuyển đổi 0->0,1->1,2->1cho một danh sách và0->0,1->0,2->1 cho khác. Nghĩa là, bằng cách kiểm tra là giá trị nằm trên ngưỡng 0 hoặc 1.

Hai giá trị có thể được tìm thấy bởi các hàm đệ quy tương ứng:

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)

Chức năng f kết hợp cả hai trong số này trong một danh sách hiểu. Điều này làm cho nó không hiệu quả do phân nhánh theo cấp số nhân.

Nếu số phức có thể là đầu ra, chúng ta có thể lưu 10 byte với:

f=lambda n:n and(n%6>1)+n%6/4*1j+2*f(n/3)

Tôi đoán số phức là ok.
geokavel

3

J, 35 32 byte

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

Hãy thử trực tuyến!

0-index và đầu vào được đưa ra một cách đơn điệu. Trả về tất cả các tổng có thể có giá trị (nó xử lý a bb a các tổng khác nhau có thể có).

Chuyển đổi từ ma trận boolean sang các chỉ mục cần rất nhiều mã ...

Tôi cũng muốn loại bỏ ngã ba ở bên trái để tôi không phải sử dụng nhiều dấu ngoặc đơn và @-ats, nhưng tôi không thể tìm ra cách nào tốt để làm điều đó (cách tiếp cận thay thế của tôi không lưu bất kỳ byte nào ).

Giải trình

Đối với mục đích giải thích và vô ý, hãy xem xét các thành phần sau của chức năng chính

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

valid_nums mang lại một ma trận boolean trong đó các chỉ số là các chỉ số của các giá trị chuỗi tổng. Nếu có một tại các chỉ số đó, điều đó có nghĩa là hai số đó tổng hợp với giá trị đầu vào.

indices_of_ones là một thành ngữ J để đưa ra tọa độ của các tọa độ trong một ma trận boolean xếp hạng tùy ý

Hàm chính được cấu tạo khá đơn giản là

indices_of_ones@valid_nums

hợp lệ

= [: +/~ 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 hoạt động trong trường hợp này bằng cách nối từng hàng tiếp theo.

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

Chúng ta có thể thấy rằng nếu đây là một ma trận boolean, có thể tìm thấy tọa độ của các ma trận bằng cách giải thích các chỉ số của ma trận rốn như các số trong cơ sở hình dạng của ma trận đó bằng cách sử dụng càng nhiều cụm từ giới từ càng tốt để giúp gây nhầm lẫn cho người đọc kém .


1
đầu ra dự phòng của bạn là ok.
geokavel

3

MATL , 22 21 19 17 byte

tQ:qBEI_ZA&+=R&fh

Đầu ra là 1 dựa trên. Chương trình tạo ra tất cả các cặp giải pháp. Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

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

OP nói rằng việc sản xuất tất cả các giải pháp đều ổn trong các bình luận
H.PWiz

@ H.PWiz Cảm ơn! Tôi đã không thấy điều đó
Luis Mendo


2

Bình , 29 byte

Điều này trả về tất cả các cặp chỉ số có thể.

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

Hãy thử nó ở đây.

Bình thường , 30 byte

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

Hãy thử nó ở đây.

Điều này trả về các cặp chỉ số là [LowerIndex, HigherIndex].


Cái này hoạt động ra sao?

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. 

2

Nghịch lý (v0.2.10), 11 byte (CP-1252)

½3B2>_B™2Bv

Hãy thử trực tuyến!

Về mặt thuật toán, nó rất giống câu trả lời ES6 của Neil . Ở cấp độ thấp hơn, cũng tương tự như câu trả lời Husk của H.PWiz . Tôi thích thú rằng chúng tôi phải sử dụng cả ba quá tải B.

Lấy một số nguyên trên ngăn xếp, để lại danh sách hai số nguyên trên ngăn xếp.

Giải trình:

½           .. 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

1

Python 3 , 122 120 byte

-2 byte nhờ ông Xcoder!

Chỉ số 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]

Ung dung:

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]

Hãy thử trực tuyến!


1
Hy vọng bạn không phiền. Tôi đã thêm một liên kết TiO.
Ông Xcoder

1

Toán học, 94 byte

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


1 chỉ mục


1

JavaScript, 120 101 byte

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]

Hãy thử trực tuyến!

Chỉ số 0.
Nó trả về cặp chỉ số trong đó một chỉ số là nhỏ nhất có thể (ví dụ trong trường hợp 428nó trả về 22,31).


1

Brain-Flak , 220 166 byte

-54 byte bằng cách tra cứu chức năng modulo trên wiki, cho phép một số thay đổi cấu trúc

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

Hãy thử trực tuyến!

Chỉ số 0.

Giải trình

Giống như nhiều giải pháp khác, điều này tính toán sự mở rộng về phía trước n/2và chuyển đổi nó thành hai số nhị phân.

Bước 1: Chia đầu vào cho 2

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

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

Bước 2: tính toán mở rộng ternary

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

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

Bước 3: Chuyển đổi sang giải pháp

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

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

0

JavaScript (ES6), 70 72 byte

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

(Được lập chỉ mục 0 và dường như là giải pháp gần giống với @Neil ngay cả khi tôi không thấy câu trả lời của anh ấy)

Tôi bắt đầu với việc lấy lại chỉ mục từ một số bằng cách sử dụng ngược lại quá trình: xâu chuỗi với cơ sở 3, thay thế mọi 2bằng 1, phân tích bằng cơ sở 2.

Để có được hai số, và cứ sau một số, chúng ta chỉ cần một nửa số đầu vào - nhưng bây giờ, cũng 1có thể xảy ra các chữ số. Vì vậy, chúng tôi thay thế nó bằng một 0trong một số và một 2số khác, không thay đổi tổng của hai, trước bước thay thế và phân tích cú pháp. Đây là những gì tôi đã đưa ra (thực hiện hai thay thế, 1-> 0 hoặc 2 và 2->1 trong một bước):

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

Tất nhiên hai bản đồ thay thế (chuỗi) chỉ khác nhau ở một chỉ mục, vì vậy chúng ta sẽ có thể rút ngắn mảng bằng chữ chỉ bằng cách thay thế 12bằng d == 2 ? 1 : x. Hoặc làd-1 || x . Trường hợp -1nào giống như hai toán tử đơn nguyên - nhưng chúng trông đáng sợ hơn :-)

Cố gắng tránh các mảng theo nghĩa đen và dấu ngoặc đơn xung quanh n/2 tôi cũng nghĩ ra

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

nhưng nó không mang lại kết quả.


Tôi cũng bắt đầu với ["001","011"]phiên bản (tên biến của tôi cũng khác)
Neil

Tôi nghĩ .replace(/./g,d=>d>>1|x)tiết kiệm 2 byte.
Neil

@Neil Thật không may là nó không hoạt động d="0"x=1- chữ số sẽ ở lại0
Bergi

Vâng, tôi chỉ làm việc đó sau khi thử thêm một vài trường hợp thử nghiệm. (Và tôi đã nghĩ ra một biến thể khác, nhưng đó là câu trả lời của tôi, tôi sợ.)
Neil

1
Ồ rất hay, và tôi nghĩ rằng tôi đã rất thông minh khi đánh bại phiên bản trước của bạn ...
Neil

0

Bình thường, 22 byte

J.m}1jb3hQxLJhfqsTQ^J2

Dùng thử trực tuyến: Trình diễn

Giải trình:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.