计算A190810


27

您的任务非常简单,计算A190810的第n个元素。

A190810的元素是根据以下规则计算的:

  1. 第一个元素是1
  2. 顺序在增加
  3. 如果x发生的顺序,然后2x+13x-1还做

您可以使用基于1的索引或基于0的索引,但是如果您使用基于0的索引,请在回答中说明。

测试用例

a(1) = 1
a(2) = 2
a(3) = 3
a(4) = 5
a(5) = 7
a(10) = 17
a(20) = 50
a(30) = 95
a(55) = 255

由于这是代码高尔夫球,因此以字节为单位的最短答案会获胜!


2
您应该添加更大的测试用例。
mbomb007'7

7
您能更清楚地解释一下吗?我是说英语的人,我不知道什么是“ ...如果x在a中,那么2x + 1和3x-1在a中”。应该是这个意思。

1
@cat x ϵ A → (2*x) + 1 ϵ Ax ϵ A → (3*x)-1 ϵ A,其中的ϵ意思是“是”的成员,可以理解为“隐含”。
史蒂文H.

3
隐含条件:该序列不包含其他规则不需要的数字。(否则$ a(i)= i $将是有效序列)
Stig Hemmer

1
您将获得免费的Mathematica和Haskell答案,其起点从:)
停止危害莫妮卡(Monica)

Answers:


9

果冻,16 字节

×3’;Ḥ‘$;
1Ç¡ṢQ³ị

非常低效的。在线尝试!

怎么运行的

1Ç¡ṢQ³ị   Main link. Argument: n (integer)

1         Set the return value to 1.
 Ç¡       Execute the helper link n times.
   Ṣ      Sort the resulting array.
    Q     Unique; deduplicate the sorted array.
     ³ị   Retrieve its n-th element.


×3’;Ḥ‘$;  Helper link. Argument: A (array)

×3        Multiply all elements of A by 3.
  ’       Decrement the resulting products.
      $   Combine the two links to the left into a monadic chain.
    Ḥ     Unhalve; multiply all elements of A by 2.
     ‘    Increment the resulting products.
   ;      Concatenate 3A-1 and 2A+1.
       ;  Concatenate the result with A.

1
那可能是16个字符,但是我不知道有少于30 个字节的编码。
rich remer

18
果冻有自己的代码页,允许这些字符各为1个字节。

15

Python 2,88 83 72字节

您可能想以相反的顺序阅读此答案中的程序...

得益于丹尼斯,速度更慢,更短:

L=1,;exec'L+=2*L[0]+1,3*L[0]-1;L=sorted(set(L))[1:];'*input()
print L[0]

在线尝试


它的运行速度不是很快,而是更短(83个字节)。通过在每次迭代中排序和删除重复项,以及删除第一个元素,我无需在列表中使用索引。结果只是n迭代之后的第一个元素。

我可能打败了丹尼斯。:D

L=[1]
n=input()
while n:L+=[2*L[0]+1,3*L[0]-1];n-=1;L=sorted(set(L))[1:]
print L[0]

在线尝试


下面的这个版本(88个字节)运行得非常快,大约在两秒钟内找到了500000个元素。

很简单 计算列表中的元素,直到元素比多三倍n,因为添加的每个元素最多可以添加2个以上的唯一元素。然后删除重复项,排序并打印nth元素(零索引)。

L=[1]
i=0
n=input()
while len(L)<3*n:L+=[2*L[i]+1,3*L[i]-1];i+=1
print sorted(set(L))[n]

在线尝试


8

Python 2,59个字节

t={1}
exec'm=min(t);t=t-{m}|{2*m+1,3*m-1};'*input()
print m

基于@ mbomb007的Python答案。在Ideone上进行测试


“一个人不能简单地超越丹尼斯”……我希望我会考虑使用集合文字。现在看来是如此明显。如果从执行字符串更改为实际代码,此答案是否比我的“快速”程序还要快?
mbomb007'7

不。慢一点 设置操作更昂贵。
mbomb007'7

是的,minO(n),而列表索引是O(1),所以此解决方案至少是O(n²) ...
Dennis

8

Haskell,76 73 69字节

a#b=mod a b<1&&t(div a b)
t x=x<2||(x-1)#2||(x+1)#3
(filter t[1..]!!)

使用基于0的索引。用法示例:(filter t[1..]!!) 54-> 255

而不是通过反复将建立名单2x+1,并3x-1在大多数其他的答案看出,我经历的所有整数,并检查他们是否可以降低到1通过重复应用(x-1) / 2(x+1) / 3如果整除。


那实际上并没有定义函数或有效的代码片段,对吗?
Zeta

@Zeta最后一行计算为一个未命名的函数。
Zgarb

@Zgarb这是Haskell文件中的错误,据我所知没有解释器支持这种功能。因此,请启发我,用户应该如何使用它而不以任何方式修改上面的代码?还是您可以指出允许此类代码的元文章?
Zeta

2
@Zgarb我认为对于最后一行,将其分配给绑定(例如f=filter t[1..]!!),因为我认为这是不正确的。
TuxCrafting's

1
@TùxCräftîñg在此Meta帖子上,确定在这种情况下默认情况下可接受其他辅助功能。这也是我通常在这里为Haskell回答的格式。当然,您作为挑战作者拥有最终决定权。
Zgarb

7

哈斯克尔, 77 74字节

import Data.List
i=insert
f(x:y)=x:f(i(2*x+1)$i(3*x-1)y)
a=(!!)(nub$f[1])

a为第n个条目提供了功能。它的索引为零。或者,a=nub$f[1]将创建整个列表(延迟)。

这是Reinhard Zumkeller Set代码的列表变量。


为什么不能y代替xs救两个字节?另外,我相信您可以减少最后一行,例如(!!)$nub.f[1]
Michael Klein

@MichaelKlein:我已经很习惯了(x:xs),完全忘记了,谢谢。
Zeta

6

Python 2,88 84字节

g=lambda k:g(k%2*k/2)|g(k%3/2*-~k/3)if k>1else k
f=lambda n,k=1:n and-~f(n-g(k),k+1)

Ideone上进行测试


13
您是将简单的东西变成不可读的专家。
mbomb007'7


5

Brachylog,45个字节

:1-I,?:?*:1ydo:Im.
1.|:1-:1&I(:3*:1-.;I*:1+.)

N = 1000在我的计算机上大约需要6秒钟的时间进行计算。

这是1索引的,例如

run_from_file('code.brachylog',1000,Z).
Z = 13961 .

说明

  • 主要谓词:

    :1-I,               I = Input - 1
         ?:?*           Square the Input
             :1y        Find the first Input*Input valid outputs of predicate 1
                do      Remove duplicates and order
                  :Im.  Output is the Ith element
    
  • 谓词1:

    1.                  Input = Output = 1
    |                   Or
    :1-:1&I             I is the output of predicate 1 called with Input - 1 as input
           (            
             :3*:1-.      Output is 3*I-1
           ;            Or
             I*:1+.       Output is 2*I+1
           )
    

您可能会注意到,调用时,我们不会将任何输入传递给谓词1 y - Yield。由于约束传播,一旦到达1.将传播正确输入值的子句,它将找到正确的输入。


4

MATL,19,18 17个字节

1w:"tEQy3*qvSu]G)

这是一个非常低效的算法。对于大于13的输入,在线解释器的内存不足。

感谢路易斯·门多(Luis Mendo),节省了一个字节!

在线尝试!

此版本更长,但效率更高(21字节)

1`tEQy3*qvSutnG3*<]G)

在线尝试

说明:

这样做的逻辑方法是将元素添加到数组中,直到足够长的时间来抓取第i个元素。这就是有效的方式。的golfy(和低效)的方式来做到这一点,是只是增加数组的大小倍。

首先,我们定义start数组:1。然后,我们交换顶部的两个元素,从而使输入位于顶部。w。现在,我们使用遍历输入:"。所以时代:

t             %Duplicate our starting (or current) array.
 EQ           %Double it and increment
   y          %Push our starting array again
    3*q       %Multiply by 3 and decrement
       v      %Concatenate these two arrays and the starting array
        Su    %Sort them and remove all duplicate elements.

现在,我们有了一个巨大的序列数组。(比计算所需的更多)所以我们停止循环],并使用G)(1-indexed)从此数组中获取第i个数字


@LuisMendo感谢您的提示!您将如何用while循环而不是for循环来重写它?(对于MATL聊天室,这可能是一个更好的问题)
DJMcMayhem

可以通过以下方式完成:1`tEQy3*qvuStnG<]G)。循环条件为tnG<(当阵列已具有所需大小时退出)
Luis Mendo

不知道有多少作弊,但是在for-loop版本中,您可以将一元输入作为字符串并删除:
Luis Mendo

4

JavaScript(ES6),63个字节

 f=(n,a=[1],i=0)=>a[i++]?--n?f(n,a,a[i*2]=a[i*3-2]=1):i:f(n,a,i)

由于递归,可能很快就放弃了。


4

视网膜,57

^.+
$*¶¶1
¶¶(1(1*))
¶1$1$1¶$2$1$1
O`
}`(¶1+)\1\b
$1
G2`
1

在线尝试!

0索引。遵循常用的算法:从当前集中删除最小值,将其称为x,然后将2x+13x-1该集合相加并等于输入的次数,然后得出前导数字。视网膜中的“集合”只是一个列表,该列表被反复排序并仅包含唯一元素。高尔夫算法中增加了一些偷偷摸摸的地方,一旦有更多时间,我将进行解释。

非常感谢Martin高尔夫球了大约20个字节!


4

Clojure,114108字节

#(loop[a(sorted-set 1)n 1](let[x(first a)](if(= n %)x(recur(conj(disj a x)(+(* 2 x)1)(-(* 3 x)1))(inc n)))))

如果这可以打很多/减少很多,但我不感到惊讶,但是set不支持nth确实会伤害我的思路。

在线尝试

带空格的版本:

#(loop [a (sorted-set 1)
        n 1]
  (let [x (first a)]
    (if (= n %)
      x
      (recur (conj (disj a x) (+ (* 2 x) 1) (- (* 3 x) 1)) (inc n))
      )))

4

05AB1E,18 17字节

使用CP-1252编码。

$Fз>s3*<)˜Ù}ï{¹è

说明

$                  # initialize with 1
 F          }      # input number of times do
  Ð                # triplicate current list/number
   ·>              # double one copy and add 1
     s3*<          # multiply one copy by 3 and subtract 1
         )˜Ù       # combine the 3 lists to 1 list and remove duplicates
             ï{    # convert list to int and sort
               ¹è  # take the element from the list at index input

在线尝试少量

非常慢。
使用基于0的索引。


3

C ++,102字节

[](int i){int t;map<int,int>k;for(k[1];i--;k.erase(t))t=k.begin()->first,k[t*2+1],k[t*3-1];return t;};

此lambda函数需要#include <map>using std::map

map只是键的集合;它们的值将被忽略。我使用map以便从简洁的插入代码中受益:

k[1]; // inserts the key 1 into the map

由于的排序顺序map,最小元素被提取k.begin()->first


1
稍短(97),使用set和初始化列表:[](int i){int t;set<int>k{1};for(;i--;k.erase(t))t=*k.begin(),k.insert({t*2+1,t*3-1});return t;};
nwn

3

其实是27个位元组

╗1#╜`;;2*1+)3*1@-#++╔S`n╜@E

在线尝试!

该程序使用基于0的索引。这种方法是蛮力的,所以不要指望它可以在在线解释器中用于更大的输入。

说明:

╗1#╜`;;2*1+)3*1@-#++╔S`n╜@E
╗                            save input (n) in register 0
 1#                          push [1]
   ╜                         push n
    `;;2*1+)3*1@-#++╔S`n     do the following n times:
     ;;                        make two copies of the list
       2*1+                    apply 2x+1 to each element in one copy
           )3*1@-              and 3x-1 to each element in the other copy
                 #             workaround for a weird list bug
                  ++           append those two lists to the original list
                    ╔S         uniquify and sort
                        ╜@E  get the nth element (0-indexed)

2

CJam(25字节)

ri1a1${{_2*)1$3*(}%_&}*$=

在线演示。请注意,这使用基于零的索引。

这在大多数情况下使用类似的方法:应用转换n时间,然后对第一n项进行排序和提取。为了提高效率,重复数据删除应用于循环内部,而排序则应用于循环外部。


2
22 :(1ari{(_2*)\3*(@||$}*0=效率也更高。)
马丁·恩德

2

视网膜,48字节

.+
$*
+1`^(((!*)!(!|\3)(?=\3!1))*!)1|\b
!$1
-2`.

在线尝试!

受到nimi答案的启发,我认为我将为Retina尝试另一种方法,利用正则表达式引擎的回溯来确定是否有给定的(一元)数字。事实证明,可以使用27字节的正则表达式确定它,但是使用它要花费更多,但最终仍比生成方法要短。

这是另一种48字节的解决方案:

.+
$*
{`1\b
1!
}T`1``1((!*)!(!|\2)(?=!\2$))*!$
!

使用一元I / O,我们可以处理42个字节,但是我试图避免这种情况,另一个Retina答案也使用了十进制:

1\b
1!
}T`1``1((!*)!(!|\2)(?=!\2$))*!$
!
1

2

Ruby,70个字节

->n{a=*1
n.times{a<<a.map{|i|([2*i+1,3*i-1]-a).min||1.0/0}.min}
a[-2]}

说明

->n{
    # Magical, golfy way of initializing an array. Equivalent to a = [1].
    a=*1
    n.times{
        # Generate the next element in the sequence, by...
        a<<
            # ... finding the minimal term that will appear at some point.
            a.map{|i|
                ([2*i+1,3*i-1]-a).min||1.0/0
            }.min
    }
    # We generated n+1 elements, so we'll take the *second* to last one.
    a[-2]
}

1
这个*1技巧很巧妙
TuxCrafting '16

1

J,31个字节

{1(]]/:~@~.@,3&*,&:<:2*>:)^:[~]

使用基于零的索引。内存效率非常低。

说明

{1(]]/:~@~.@,3&*,&:<:2*>:)^:[~]  Input: n
                              ]  Identity function, gets n
 1                               The constant 1
  (                      )^:[~   Repeat n times with an initial array a = [1]
                       >:          Increment each in a
                     2*            Multiply by 2 to get 2a+2
             3&*                   Multiply each in a by 3 to get 3a
                 &:<:              Decrement both x and y to get 2a+1 and 3a-1
                ,                  Join them
    ]                              Identity function, gets a
            ,                      Join a with 2a+1 and 3a-1
         ~.@                       Take the distinct values
     /:~@                          Sort up
   ]                               Return the sorted list
{                                Select the value from the list at index n and return it

1

八度,68字节

function r=a(n)s=1;for(i=1:n)r=s(i);s=union(s,[r*2+1 r*3-1]);end;end

您可以删除决赛;end
路易斯·门多

在我使用的版本上,至少(4.0.0)您不能...
dcsohl

1

Perl中,173 132 -n = 133字节+1

sub c{my$a=pop;return($a==1||($a%2&&c(($a-1)/2))?1:$a%3!=2?0:$a%3==2?c(($a+1)/3):1)}while($#b<$_){$i++;@b=(@b,$i)if c$i}say$b[$_-1];

取消高尔夫:

my @array = ();
my $n = <>;
sub chk {
    my $a = shift;
    return 1 if ($a == 1);
    if ($a % 2 == 0) {
        if ($a % 3 != 2) {
            return 0;
        } else {
            return chk(($a + 1) / 3);
        }
    } else {
        if (chk(($a - 1) / 2) == 0) {
            if ($a % 3 != 2) {
                return 0;
            } else {
                return chk(($a + 1) / 3);
            }
        } else {
            return 1
        }
    }
}
my $i = 1;
while ($#array < $n-1) {
    push(@array,$i) if (chk($i) == 1);
    $i++;
}
print $array[$n];

如果我想得更多,我可能会做得更好,但这是我几分钟后想到的。我第一次打高尔夫球,所以这很有趣!

感谢@Dada和@TùxCräftîñg(以及一些次要的字节优化),用于-40个字节


1
我认为您可以在mys,the return和the 之后添加空格print(无法测试,没有perl)
TuxCrafting

1
@TùxCräftîñg是正确的return。该print可以通过更换say。在大多数情况下my是不需要的(你只需要之前,一个$a在我认为的功能。没有初始化,也不申报@b,你可能会下降的初始化$i如果你$i++在的同时而不是在结束的开始。pop在短于shift记住不是还有更多Perl的高尔夫不仅仅是...删除空格和换行。
达达

0

JavaScript(ES6),58

n=>(a=>{for(;n;)a[++i]?a[i-~i]=a[3*i-1]=--n:0})([i=0,1])|i

少打高尔夫球

n=>{
  a=[];
  a[1] = 1;
  for(i = 0; n;)
  {
    ++i
    if (a[i])
    {
      a[2*i+1] = 1;
      a[3*i-1] = 1;
      --n;
    }
  }
  return i
}

测试

关于时间和内存:我的FireFox 64位Alpha使用的元素500000在约20秒内和300MB

F=
n=>(a=>{for(;n;)a[++i]?a[i-~i]=a[3*i-1]=--n:0})([i=0,1])|i

function test() {
  var n=+I.value, t0=+new Date
  O.textContent = F(n)
  console.log((+new Date-t0)/1000,'sec')
}  

test()
#I { width:5em}
<input id=I type=number value=10 oninput="test()"> 
<span id=O></span>

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.