새로운 주문 # 4 : 세계


17

소개 (무시 될 수 있음)

모든 양수를 규칙적인 순서 (1, 2, 3, ...)로 넣는 것은 약간 지루하지 않습니까? 그래서 여기 모든 양수의 순열 (순환)에 관한 일련의 도전이 있습니다. 이것이이 시리즈의 네 번째 과제입니다 ( 첫 번째 , 두 번째세 번째 도전에 연결됨).

이 도전에서, 우리는 자연수의 순열 하나 가 아니라 순열의 전 세계 를 탐구 할 것입니다 !

2000 년, 클락 킴 벌링은 26에서 문제를 제기 의 문제 기틀 Mathematicorum , 캐나다 수학 협회에서 발행 수학 과학 저널. 문제는 :

Sequence a={a1=1an=an12 if an12{0,a1,...,an1}an=3an1 그렇지 않으면

이 순서에서 모든 양의 정수가 정확히 한 번 발생합니까?

2004 년 마테우스 Kwasnicki는 같은 저널에 긍정적 인 증거를 제공하고 2008 년에, 그는 출판 더 일반적인 증거 (원래의 질문에 비해)을 더 공식적이고. 그는 매개 변수 와 시퀀스를 공식화했습니다 .

{a1=1an=an1q if an1q{0,a1,...,an1}an=pan1 otherwise

그는 대해 가 비이성적 인 임의의 시퀀스는 자연수의 순열 임을 증명했다 . 이것이 사실 인 무한한 및 값 이 있기 때문에 , 이것은 실제로 자연수의 순열의 전체 세계 입니다. 우리는 원래의 를 고수 하고 ,이 매개 변수들에 대해 , OEIS에서 시퀀스는 A050000 으로 찾을 수 있습니다 . 처음 20 개 요소는 다음과 같습니다.p,q>1logp(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

이는 "순수한 시퀀스"문제이므로, 주어진 대한 a 을 입력 으로 출력 것이 좋습니다 . 여기서 은 A050000 입니다.a(n)n( N )a(n)

직무

정수 입력 주어지면 을 정수 형식으로 출력 .na(n)

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

참고 : 여기서는 1 기반 색인 작성이 가정됩니다. 0 기반 인덱싱을 사용할 수 있으므로 등이 있습니다. 이것을 사용하기로 선택한 경우 답에 언급하십시오.a(0)=1;a(1)=3

테스트 사례

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

규칙

  • 입력 및 출력은 정수입니다 (프로그램은 1에서 32767까지의 입력 및 출력을 지원해야합니다)
  • 유효하지 않은 입력 (0, 부동 수, 문자열, 음수 값 등)으로 인해 예기치 않은 출력, 오류 또는 (정의되지 않은) 동작이 발생할 수 있습니다.
  • 기본 I / O 규칙이 적용됩니다.
  • 기본 허점 은 금지되어 있습니다.
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.

TI-BASIC을 사용하여이 질문에 대답하지만 목록이 999 개의 요소 로 제한되므로 입력이 으로 제한됩니다. 그럼에도 불구하고 큰 도전! 0<N<1000
Tau

@Tau : 사양이 맞지 않고 경쟁이 없지만 솔루션에 관심이 있습니다. 게시 할 수있는 것이 있습니까?
agtoever

1
프로그램을 삭제했지만 다시 만들 수 있어야합니다. 다시 한 번 비경쟁으로 게시 합니다.
Tau

@agtoever, "비경쟁"은 유효하지 않은 솔루션을 다루지 않습니다. 챌린지가 게시 된 후 작성된 언어 또는 언어 기능을 사용하는 솔루션을위한 것입니다.
Shaggy

PP & CG 메타 는 실제로 매우 명확합니다. "비경쟁"에 대한 엄격한 해석을 수상한 것은 아닙니다 ... @ Tau : TI-BASIC 솔루션을 이러한 규칙에 따라 게시 할 수없는 것 같습니다. 죄송합니다.
agtoever

답변:


3

Japt , 15 14 바이트

1- 색인.

@[X*3Xz]kZ Ì}g

시도 해봐

@[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

자바 스크립트 (ES6),  55 51  50 바이트

@EmbodimentofIgnorance 덕분에
1 바이트 절약 @tsh 덕분에 1 바이트 절약

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

온라인으로 사용해보십시오!



무지의 @ EmbodimentofIval'ed 코드가 훨씬 느리기 때문에 나는 보통 그 트릭을 피합니다 . 그러나 그 차이는 거의 눈에 띄지 않으므로 괜찮습니다.
Arnauld

2
그러나 이것은 코드 골프입니다. 우리는 작업이 완료되는 한 속도에 대해서는 신경 쓰지 않습니다.
무지의 구현

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

5

젤리 , 15 바이트

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

nSTDIN에서 정수 (1부터 시작)를 허용하는 전체 프로그램으로 결과를 인쇄합니다.

온라인으로 사용해보십시오!

어떻게?

µ×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 바이트

Kevin Cruijssen 덕분에 1 바이트를 절약했습니다 .
인덱스가 0입니다.

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

온라인으로 사용해보십시오!

설명

n=1예제로 사용

¾ˆ                 # 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 : 감사합니다! 전역 배열을 사용하려고 생각했지만 스택의 목록과 길이가 같고 시도하지 않았다고 가정했습니다. /
Emigna

4

펄 6 , 49 바이트

nwellnof 덕분에 -2 바이트

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

온라인으로 사용해보십시오!

순서대로 0 인덱스 요소를 돌려줍니다. 0,1대신 시작 요소를 변경하여 1- 색인으로 변경할 수 있습니다.1,3

설명:

{                                             }  # 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 바이트

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

온라인으로 사용해보십시오!

언 골프

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

정의를 J로 직접 변환 ^:합니다. 시작 값에서 필요한 횟수만큼 반복 하여 사용하여 상향식으로 작성됩니다 .


3

자바 10, 120 99 바이트

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;}

온라인으로 사용해보십시오.

설명:

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) , 189180 바이트

작은 골프에 -9 바이트

#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];}

온라인으로 사용해보십시오!

까지 시퀀스를 계산 한 n다음 원하는 요소를 반환합니다. 큰 지수의 경우 속도가 느립니다.


@ceilingcat 불행히도 이는 연산자 우선 순위에 영향을 미치고 함수의 출력을 변경합니다.
Neil A.

2

파이썬 2 , 66 바이트

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

온라인으로 사용해보십시오!

0부터 시작하는 인덱싱을 사용합니다. 람다는 시퀀스를 재귀 적으로 구축하고 필요한 인덱스에 도달하자마자 돌아 오는 것 이상을 수행하지 않습니다.





1

파이썬 (3) , 105 (103) 100 95 83 바이트

agtoever 덕분에 -2 바이트 ArBo 덕분에
-12 바이트

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]

온라인으로 사용해보십시오!


for 루프를 while len(s)<=n로 바꾸고 i를로 바꿉니다 -1. 두 문자 중 하나를 제거해야합니다.
agtoever

@agtoever 정말 영리합니다-감사합니다! :)
국수 9

목록 대신 튜플을 사용 if하여 while루프에서 1- 라이닝을 허용하도록 루프 에서를 제거하여 83 바이트
ArBo

@ArBo 와우! 절대적으로 화려한-감사합니다 :)
국수 9

1

가이아 , 22 20 바이트

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

온라인으로 사용해보십시오!

0부터 시작하는 인덱스

접근에 대한 Shaggy의 신용

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



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.