新订单4:世界


17

简介(可以忽略)

将所有正数按其常规顺序(1、2、3,...)有点无聊,不是吗?因此,这是围绕所有正数的排列(重新排列)的一系列挑战。这是本系列的第四个挑战(链接到第一个第二个第三个挑战)。

在这个挑战中,我们将探讨不是一个自然数的排列,而是整个世界的排列!

2000年,克拉克·金伯林在26提出了一个问题的问题症结Mathematicorum,由加拿大数学学会出版的数学科学杂志。问题是:

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

是否每个正整数都按此顺序恰好出现一次?

2004年,Mateusz Kwasnicki在同一期刊上提供了肯定的证明; 2008年,他发表了更正式的证明(与原始问题相比),给出了更一般的证明。他用参数pq制定了序列:

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

他证明了对于任何pq>1个使得ØGpq是不合理的,该序列是自然数的排列。由于存在无数个pq值,因此,这确实是自然数置换的整个世界。我们将坚持与原始pq=32,并且对于这些paramters,序列可以发现A050000在OEIS中。它的前20个元素是:

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

由于这是一个“纯序列”质询,因此任务是针对给定的n输出a(n)作为输入,其中a n A050000na(n

任务

给定整数输入n,以整数格式输出a(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 meta对此确实很清楚。我并没有获得对“非竞争”如此严格的解释……@Tau:看来您不能按照这些规则发布TI-BASIC解决方案。抱歉。
凌晨

Answers:


3

Japt15 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

JavaScript(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")

在线尝试!



@EmbodimentofIgnorance我通常避免这种技巧,因为评估的代码慢得多。但是对于那一个,差异几乎不明显,所以我想这很好。
阿纳尔德

2
但是,这只是代码问题,我们不关心速度,只要它能完成工作即可
无知的体现

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

5

果冻,15 字节

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

n从STDIN 接受整数(从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

05AB1E16 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

Perl 6,49个字节

-2字节归功于nwellnof

{(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

J47 40字节

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

在线尝试!

不打高尔夫球

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

将定义直接转换为J。通过使用^:从起始值迭代所需的次数来建立自底向上的结果。


3

Java 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

3

Haskell67 65字节

(h[1,0]!!)
h l@(a:o)|elem(div a 2)o=a:h(3*a:l)|1>0=a:h(div a 2:l)

在线尝试!

使用基于0的索引。

编辑:通过使用elem代替notElem和切换条件保存了2个字节




2

C ++(gcc)189 180字节

-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不幸的是,这会影响运算符的优先级并更改函数的输出。
尼尔·A,

2

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

在线尝试!

使用基于零的索引。Lambda所做的只是递归地建立序列并在达到所需索引后立即返回。





1

Python 3中105 103 100 95 83个字节

-2字节归功于agtoever
-12字节归功于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]

在线尝试!


您可以将for循环while len(s)<=n替换为并将i替换为-1。这应该删除两个字符之一。
agtoever

@agtoever太聪明了-谢谢!:)
Noodle19年

通过使用元组而不是列表来处理83个字节,并ifwhile循环中删除,以允许对该循环进行
单行处理

@ArBo哇!绝对出色-谢谢:)
Noodle9 '19

1

Gaia22 20字节

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

在线尝试!

从0开始的索引。

感谢长毛的方法

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.