Đơn hàng mới số 4: Thế giới


17

Giới thiệu (có thể bỏ qua)

Đặt tất cả các số dương theo thứ tự thông thường của nó (1, 2, 3, ...) là một chút nhàm chán, phải không? Vì vậy, đây là một loạt các thách thức xung quanh hoán vị (chia sẻ lại) của tất cả các số dương. Đây là thử thách thứ tư trong loạt bài này (liên kết đến thử thách thứ nhất , thứ haithứ ba ).

Trong thử thách này, chúng ta sẽ khám phá không chỉ một hoán vị của các số tự nhiên, mà là cả một thế giới hoán vị!

Năm 2000, Clark Kimberling đặt ra một vấn đề trong 26 ngày phát hành của Crux Mathematicorum , một tạp chí khoa học của toán học được công bố bởi Hội Toán học Canada. Vấn đề là:

Sequence a={a1=1an=an12 if an12{0,a1,...,an1}an=3an1 otherwise

Có phải mọi số nguyên dương xảy ra chính xác một lần trong chuỗi này?

Năm 2004, Mateusz Kwasnicki cung cấp bằng chứng tích cực trong cùng một tạp chí và năm 2008, ông đã xuất bản một bản chính thức hơn và (so với câu hỏi ban đầu) một bằng chứng tổng quát hơn. Ông đã xây dựng chuỗi với các tham số p và :q

{một1= =1mộtn= =mộtn-1q nếu mộtn-1q{0,một1,...,mộtn-1}mộtn= =pmộtn-1 nếu không thì

Ông đã chứng minh rằng với bất kỳ sao cho là không hợp lý, chuỗi là một hoán vị của các số tự nhiên. Vì có vô số giá trị và mà điều này là đúng, đây thực sự là toàn bộ thế giới hoán vị của các số tự nhiên. Chúng tôi sẽ gắn bó với bản gốc và đối với các tham số này, chuỗi có thể được tìm thấy là A050000 trong OEIS. 20 yếu tố đầu tiên của nó là:p,q>1tôiogp(q)pq(p,q)= =(3,2)

1, 3, 9, 4, 2, 6, 18, 54, 27, 13, 39, 19, 57, 28, 14, 7, 21, 10, 5, 15

Vì đây là một thách thức "chuỗi thuần", nên nhiệm vụ là xuất cho cho trước làm đầu vào, trong đó là A050000 .một(n)na(n)

Bài tập

Cho đầu vào số nguyên , đầu ra ở định dạng số nguyên, trong đó:na(n)

{a(1)=1a(n)=a(n1)2 if a(n1)2{0,a1,...,a(n1)}a(n)=3a(n1) otherwise

Lưu ý: lập chỉ mục dựa trên 1 được giả định ở đây; bạn có thể sử dụng lập chỉ mục dựa trên 0, vì vậy , v.v. Hãy đề cập đến điều này trong câu trả lời của bạn nếu bạn chọn sử dụng nó.a(0)=1;a(1)=3

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

Input | Output
---------------
1     |  1
5     |  2
20    |  15
50    |  165
78    |  207
123   |  94
1234  |  3537
3000  |  2245
9999  |  4065
29890 |  149853

Quy tắc

  • Đầu vào và đầu ra là các số nguyên (chương trình của bạn ít nhất phải hỗ trợ đầu vào và đầu ra trong phạm vi từ 1 đến 32767)
  • Đầu vào không hợp lệ (0, số float, chuỗi, giá trị âm, v.v.) có thể dẫn đến đầu ra không dự đoán được, lỗi hoặc (không) hành vi được xác định.
  • Mặc định I / O quy tắc áp dụng.
  • Lỗ hổng mặc định bị cấm.
  • Đây là , vì vậy câu trả lời ngắn nhất tính bằng byte sẽ thắng

Tôi sẽ trả lời điều này bằng TI-BASIC, nhưng đầu vào sẽ bị giới hạn ở vì danh sách bị giới hạn ở 999 phần tử. Tuy nhiên, thách thức lớn! 0<N<1000
Tàu

@Tau: mặc dù không có thông số kỹ thuật (và điều này không cạnh tranh), tôi sẽ quan tâm đến giải pháp của bạn. Bạn có một cái bạn có thể đăng?
bất cứ

1
Tôi đã xóa chương trình, nhưng tôi sẽ có thể tạo lại nó. Tôi sẽ đăng nó dưới dạng không cạnh tranh một khi tôi đã làm lại nó.
Tàu

@agtoever, "không cạnh tranh" không bao gồm các giải pháp không hợp lệ; nó dành cho các giải pháp sử dụng ngôn ngữ hoặc tính năng ngôn ngữ được tạo sau khi thử thách được đăng.
Shaggy

PP & CG meta thực sự rất rõ ràng về điều này. Tôi đã không trao giải cho một cách giải thích chặt chẽ như vậy về "không cạnh tranh" ... @Tau: có vẻ như bạn không thể đăng giải pháp TI-BASIC của mình theo các quy tắc này. Lấy làm tiếc.
bất cứ

Câu trả lời:


3

Japt , 15 14 byte

1 chỉ mục.

@[X*3Xz]kZ Ì}g

Thử nó

@[X*3Xz]kZ Ì}g     :Implicit input of integer U
             g     :Starting with the array [0,1] do the following U times, pushing the result to the array each time
@                  :  Pass the last element X in the array Z through the following function
 [                 :    Build an array containing
  X*3              :      X multiplied by 3
     Xz            :      X floor divided by 2
       ]           :    Close array
        kZ         :    Remove all elements contained in Z
           Ì       :    Get the last element
            }      :  End function
                   :Implicit output of the last element in the array

7

JavaScript (ES6),  55 51  50 byte

Đã lưu 1 byte nhờ @EmbodimentofIgnorance
Đã lưu 1 byte nhờ @tsh

n=>eval("for(o=[p=2];n--;)o[p=o[q=p>>1]?3*p:q]=p")

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



@EmbodimentofIgnorance Tôi thường tránh mánh khóe đó, vì mã bị đánh giá chậm hơn nhiều . Nhưng sự khác biệt hầu như không đáng chú ý đối với cái đó, vì vậy tôi đoán điều đó tốt.
Arnauld

2
Nhưng đây là môn đánh gôn, chúng tôi không quan tâm đến tốc độ, miễn là nó hoàn thành công việc
Hiện thân của sự thiếu hiểu biết

n=>eval("for(o=[p=2];n--;)o[p=o[q=p>>1]?3*p:q]=p")
tsh

5

Thạch , 15 byte

µ×3żHḞḢḟȯ1Ṫ;µ¡Ḣ

Một chương trình đầy đủ chấp nhận số nguyên, n(dựa trên 1), từ STDIN sẽ in kết quả.

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

Làm sao?

µ×3żHḞḢḟȯ1Ṫ;µ¡Ḣ - Main Link: no arguments (implicit left argument = 0)
µ           µ¡  - repeat this monadic chain STDIN times (starting with x=0)
                -                   e.g. x = ...  0      [1,0]            [9,3,1,0]
 ×3             -   multiply by 3                 0      [3,0]            [27,9,3,0]
    H           -   halve                         0      [1.5,0]          [4.5,1.5,0.5,0]
   ż            -   zip together                  [0,0]  [[3,1.5],[0,0]]  [[27,4.5],[9,1.5],[3,0.5],[0,0]]
     Ḟ          -   floor                         [0,0]  [[3,1],[0,0]]    [[27,4],[9,1],[3,0],[0,0]]
      Ḣ         -   head                          0      [3,1]            [27,4]
       ḟ        -   filter discard if in x        []     [3]              [27,4]
        ȯ1      -   logical OR with 1             1      [3]              [27,4]
          Ṫ     -   tail                          1      3                4
           ;    -   concatenate with x            [1,0]  [3,1,0]          [4,9,3,1,0]
              Ḣ - head                            1      3                4
                - implicit print

4

05AB1E , 16 15 byte

Đã lưu 1 byte nhờ Kevin Cruijssen .
Chỉ số 0.

¾ˆ$FDˆx3*‚;ï¯Kн

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

Giải trình

Sử dụng n=1làm ví dụ

¾ˆ                 # initialize global array as [0]
  $                # initialize stack with 1, input
   F               # input times do:
    Dˆ             # duplicate current item (initially 1) and add one copy to global array
                   # STACK: 1, GLOBAL_ARRAY: [0, 1]
      x            # push Top_of_stack*2
                   # STACK: 1, 2, GLOBAL_ARRAY: [0, 1]
       3*          # multiply by 3
                   # STACK: 1, 6, GLOBAL_ARRAY: [0, 1]
         ‚;ï       # pair and integer divide both by 2
                   # STACK: [0, 3], GLOBAL_ARRAY: [0, 1]
            ¯K     # remove any numbers already in the global array
                   # STACK: [3], GLOBAL_ARRAY: [0, 1]
              н    # and take the head
                   # STACK: 3


@KevinCruijssen: Cảm ơn! Tôi đã nghĩ đến việc sử dụng mảng toàn cầu, nhưng giả sử nó sẽ có cùng độ dài với một danh sách trên ngăn xếp và không bao giờ thử nó: /
Emigna

4

Perl 6 , 49 byte

-2 byte nhờ nwellnof

{(1,3,{(3*@_[*-1]Xdiv 6,1).max(*∉@_)}...*)[$_]}

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

Trả về phần tử 0-index trong chuỗi. Bạn có thể thay đổi thành 1 chỉ mục bằng cách thay đổi các yếu tố bắt đầu thành 0,1thay vì1,3

Giải trình:

{                                             }  # Anonymous code block
 (                                   ...*)[$_]   # Index into the infinite sequence
  1,3                                            # That starts with 1,3
     ,{                             }            # And each element is
       (                 ).max(    )             # The first of
          @_[*-1]X                               # The previous element
        3*        div 6                          # Halved and floored
        3*        div  ,1                        # Or tripled
                               *∉@_             # That hasn't appeared in the sequence yet

3

J , 47 40 byte

[:{:0 1(],<.@-:@{:@](e.{[,3*{:@])])^:[~]

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

vô dụng

[: {: 0 1 (] , <.@-:@{:@] (e. { [ , 3 * {:@]) ])^:[~ ]

Dịch trực tiếp định nghĩa sang J. Nó xây dựng từ dưới lên bằng cách sử dụng ^:để lặp từ giá trị bắt đầu với số lần cần thiết.


3

Java 10, 120 99 byte

n->{var L=" 1 0 ";int r=1,t;for(;n-->0;L+=r+" ")if(L.contains(" "+(r=(t=r)/2)+" "))r=t*3;return r;}

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

Giải trình:

n->{                              // Method with integer as both parameter and return-type
  var L=" 1 0 ";                  //  Create a String that acts as 'List', starting at [1,0]
  int r=1,                        //  Result-integer, starting at 1
      t;                          //  Temp-integer, uninitialized
  for(;n-->0;                     //  Loop the input amount of times:
      L+=r+" "))                  //    After every iteration: add the result to the 'List'
                          t=r     //   Create a copy of the result in `t`
                       r=(...)/2  //   Then integer-divide the result by 2
    if(L.contains(" "+(...)+" ")) //   If the 'List' contains this result//2:
      r=t*3;                      //    Set the result to `t` multiplied by 3 instead
  return r;}                      //  Return the result




2

C ++ (gcc) , 189 180 byte

-9 byte để chơi golf nhỏ

#import<vector>
#import<algorithm>
int a(int n){std::vector<int>s={1};for(int i=0;i<n;++i)s.push_back(i&&std::find(s.begin(),s.end(),s[i]/2)==s.end()?s[i]/2:3*s[i]);return s[n-1];}

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

Tính toán chuỗi lên đến n, sau đó trả về phần tử mong muốn. Chậm cho các chỉ số lớn hơn.


@ceilingcat Thật không may, điều đó ảnh hưởng đến quyền ưu tiên của nhà điều hành và thay đổi đầu ra của chức năng.
Neil A.

2

Python 2 , 66 byte

l=lambda n,p=1,s=[0]:p*(n<len(s))or l(n,3*p*(p/2in s)or p/2,[p]+s)

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

Sử dụng lập chỉ mục dựa trên không. Lambda thực hiện ít hơn là đệ quy xây dựng chuỗi và quay lại ngay khi đạt được chỉ số yêu cầu.





1

Python 3 , 105 103 100 95 83 byte

-2 byte nhờ vào agtoever
-12 byte nhờ ArBo

def f(n):
 s=0,1
 while len(s)<=n:t=s[-1]//2;s+=(t in s)*3*s[-1]or t,
 return s[-1]

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


Bạn có thể thay thế vòng lặp for bằng while len(s)<=nvà thay thế i bằng -1. Điều này sẽ cạo đi một trong hai nhân vật.
bất cứ

@agtoever thật thông minh - cảm ơn! :)
Noodle9

83 byte bằng cách làm việc với một tuple thay vì một danh sách, và loại bỏ các iftừ whilevòng lặp để cho phép một lớp màng loop
Arbo

@ArBo wow! hoàn toàn xuất sắc - cảm ơn :)
Noodle9

1

Gaia , 22 20 byte

2…@⟨:):3פḥ⌋,;D)+⟩ₓ)

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

Chỉ số dựa trên 0.

Tín dụng cho Shaggy cho cách tiếp cận

2…			| push [0 1]
  @⟨		 ⟩ₓ	| do the following n times:
    :):			| dup the list L, take the last element e, and dup that
       3פḥ⌋,		| push [3*e floor(e/2)]
	     ;D		| take the asymmetric set difference [3*e floor(e/2)] - L
	       )+	| take the last element of the difference and add it to the end of L (end of loop)
		   )	| finally, take the last element and output it

;D



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.