数字平方


13

考虑一个自然数序列,其中N在N ^ 2中作为子串出现。A018834

输出n此序列的第th个元素。

规则

程序仅n作为输入,仅输出一个数字- N

序列可以是0索引或1索引。

Sequence: 1 5 6 10 25 50 60 76 100 250 376 500 600 625 760 ...
Squares:  1 25 36 100 625 2500 3600 5776 10000 62500 141376 250000 360000 390625 577600 ...

这是代码高尔夫球,因此最短的代码获胜。


1
许多实现都会遇到问题(对我而言,这是由于无法创建具有超过2 ^ 32个值的数组),这将使大多数解决方案默认情况下绑定到最大大小。这些解决方案是否应取消资格?
maxb

1
@maxb我觉得理论上意味作为未必实用
Arnauld

1
@Ourous我知道这真的很低,这就是为什么我不喜欢我的解决方案的原因。我可以添加一个字节并将其用于更大的输入,因此我将其添加为替代方案
maxb

1
最好用“ N的十进制数字是N的十进制数字的[连续]子字符串”之类的字眼来表示“ N出现在N ^ 2中”(11不“出现在” 121中)。[严格地讲,“连续的”是多余的,但是很明显。”
乔纳森·艾伦

1
@JonathanAllan候补建议改写:“ N在字典上存在于N ^ 2中”
世纪

Answers:


4

05AB1E,6个字节

1索引

µNNnNå

在线尝试!

说明

µ         # loop over increasing N until counter equals input
 N        # push N (for the output)
  Nn      # push N^2
    N     # push N
     å    # push N in N^2
          # if true, increase counter

µ命令只是...我希望我有那个。
maxb

@maxb:对于需要查找Nth满足特定条件的数字的挑战,这非常实用。
Emigna

如果为真,增加计数器”?
乔纳森·艾伦,

@JonathanAllan:如,“如果N ^ 2中包含N,则将计数器的值增加1”。我可能应该写“递增计数器”。
Emigna

我实际上不理解这个解释。看来,如果å产生的结果为true,那么我们的电流就N位于堆栈的顶部(increment counter和crement N),但如果不存在,我们就继续(increment N)。也许使用“ N” 以外的其他东西,因为这是问题正文中的最终结果:p
Jonathan Allan

4

Perl 6的33 31个字节

-2字节归功于nwellnhof

{(grep {$^a²~~/$a/},1..*)[$_]}

在线尝试!

说明:

{                            }  # Anonymous code block that returns
 (                      )[$_]   # The nth index of
  grep {          },1..*        # Filtering from the natural numbers
        $^a²                    # If the square of the number
            ~~/$a/              # Contains the number


3

MathGolf,8个字节(理论上适用于任何输入,但仅适用n<10于实践)

úrgɲï╧§

在线尝试!

替代方案(n<49在实践和理论上起作用)

►rgɲï╧§

唯一的区别是10^(input),我没有创建带有值的列表,而是创建了带有10^6项目的列表。这需要一段时间才能运行,因此您可以将第一个字节交换为其他任何1字节的文字以对其进行测试。

说明

ú          pop(a), push(10**a)
 r         range(0, n)
  g        filter array by...
   É       start block of length 3
    ²      pop a : push(a*a)
     ï     index of current loop
      ╧    pop a, b, a.contains(b)
           Block ends here
       §   get from array

该解决方案无法处理大量输入的原因是,我注意到序列的增长幅度小于指数增长,但大于任何多项式增长。这就是为什么我使用10**n运算符(我想使用,2**n但是输入1失败了)。这意味着即使对于较小的输入,我也会创建一个非常大的数组,只是要过滤掉绝大多数数组,然后采用第一个元素。这是非常浪费的,但是在不增加字节数的情况下我找不到其他方法。


3

Common Lisp,95个字节

(lambda(n)(do((i 0))((= n 0)i)(if(search(format()"~d"(incf i))(format()"~d"(* i i)))(decf n))))

在线尝试!


2

干净,83字节

import StdEnv,Text

(!!)[i\\i<-[1..]|indexOf(""<+i)(""<+i^2)>=0]

在线尝试!

(!!)                               // index into the list of
 [ i                               // i for every
  \\ i <- [1..]                    // i from 1 upwards
  | indexOf (""<+i) (""<+i^2) >= 0 // where i is in the square of i
 ]

2

果冻,6 个字节

1ẇ²$#Ṫ

1个索引。

在线尝试!

怎么样?

查找n序列中的第一个作为列表,然后产生尾部N

1ẇ²$#Ṫ - Link: integer, n (>0)
1      - initialise x to 1
    #  - collect the first n matches, incrementing x, where:
   $   -   last two links as a monad:
  ²    -     square x
 ẇ     -     is (x) a substring of (x²)?
       -     (implicitly gets digits for both left & right arguments when integers)
     Ṫ - tail

如果0被认为是自然数,我们可以将1索引的完整程序ẇ²$#Ṫ用于5。




2

Java 8,66 65 63字节

n->{int r=0;for(;!(++r*r+"").contains(r+"")||--n>0;);return r;}

-1个字节感谢@Shaggy
-2个字节,感谢@Arnauld

1个索引。

在线尝试。

说明:

n->{                // Method with integer as both parameter and return-type
  int r=0;          //  Result-integer, starting at 0
  for(;             //  Loop as long as:
       !(++r*r+"")  //    (increase result `r` by 1 first with `++r`)
                    //    If the square of the result `r` (as String) 
        .contains(  //    does not contain
          r+"")||   //    the result `r` itself (as String):
       --n>0;);     //     (decrease input `n` by 1 first with `--n`)
                    //     And continue looping if input `n` is not 0 yet
  return r;}        //  Return the result `r`


1
@Shaggy Ah,当然。谢谢!
凯文·克鲁伊森

1
@Arnauld啊,结合循环和if的聪明方法!谢谢。
凯文·克鲁伊森

2

Clojure,81个字节

(fn[n](nth(filter #(clojure.string/includes?(str(* % %))(str %))(range))n))

在线尝试!(不幸的是,TIO似乎不支持Clojure的标准字符串库)

如果Clojure的导入语法较短,或者includes?在核心库中具有方法,那么这实际上可能具有一定的竞争力。clojure.string/includes?但是,仅此一个答案就比这里的一些答案更长:/

(defn nth-sq-subs [n]
  (-> ; Filter from an infinite range of numbers the ones where the square of
      ;  the number contains the number itself
    (filter #(clojure.string/includes? (str (* % %)) (str %))
            (range))

    ; Then grab the "nth" result. Inc(rementing) n so 0 is skipped, since apparently
    ;  that isn't in the sequence
    (nth (inc n))))

由于TIO链接已损坏,因此请进行测试。左边的数字是索引(n),结果(N)在右边:

(mapv #(vector % (nth-sq-subs %)) (range 100))
=>
[[0 1]
 [1 5]
 [2 6]
 [3 10]
 [4 25]
 [5 50]
 [6 60]
 [7 76]
 [8 100]
 [9 250]
 [10 376]
 [11 500]
 [12 600]
 [13 625]
 [14 760]
 [15 1000]
 [16 2500]
 [17 3760]
 [18 3792]
 [19 5000]
 [20 6000]
 [21 6250]
 [22 7600]
 [23 9376]
 [24 10000]
 [25 14651]
 [26 25000]
 [27 37600]
 [28 50000]
 [29 60000]
 [30 62500]
 [31 76000]
 [32 90625]
 [33 93760]
 [34 100000]
 [35 109376]
 [36 250000]
 [37 376000]
 [38 495475]
 [39 500000]
 [40 505025]
 [41 600000]
 [42 625000]
 [43 760000]
 [44 890625]
 [45 906250]
 [46 937600]
 [47 971582]
 [48 1000000]
 [49 1093760]
 [50 1713526]
 [51 2500000]
 [52 2890625]
 [53 3760000]
 [54 4115964]
 [55 5000000]
 [56 5050250]
 [57 5133355]
 [58 6000000]
 [59 6250000]
 [60 6933808]
 [61 7109376]
 [62 7600000]
 [63 8906250]
 [64 9062500]
 [65 9376000]
 [66 10000000]
 [67 10050125]
 [68 10937600]
 [69 12890625]
 [70 25000000]
 [71 28906250]
 [72 37600000]
 [73 48588526]
 [74 50000000]
 [75 50050025]
 [76 60000000]
 [77 62500000]
 [78 66952741]
 [79 71093760]
 [80 76000000]
 [81 87109376]
 [82 88027284]
 [83 88819024]
 [84 89062500]
 [85 90625000]
 [86 93760000]
 [87 100000000]
 [88 105124922]
 [89 109376000]
 [90 128906250]
 [91 146509717]
 [92 177656344]
 [93 200500625]
 [94 212890625]
 [95 250000000]
 [96 250050005]
 [97 289062500]
 [98 370156212]
 [99 376000000]]

这应该能够支持任何值n;只要您愿意等待它完成(在序列中找到第50至100个整数就需要15分钟)。Clojure支持任意大的整数算术,因此一旦数字开始变大,它就会开始使用BigInts。


1

木炭,25字节

Nθ≔¹ηWθ«≦⊕η¿№I×ηηIη≦⊖θ»Iη

在线尝试!链接是详细版本的代码。0索引。说明:

Nθ

输入n

≔¹η

N1 开始。(或者,它可以开始计数,0使输入成为1的索引。)

Wθ«

重复直到找到n序列中的数字。

≦⊕η

增量N

¿№I×ηηIη

如果N*N包含N,则...

≦⊖θ»

...递减n

Iη

打印N

我在打高尔夫球这进一步通过木炭一个阻碍)不具有尝试if..then除了在一个块(其加2个字节)B的端部)不具有Contains操作者(转换器的输出FindCount到一个布尔值,我可以从减去n再次成本2个字节)。


1

编辑(回复评论):Python 2,76字节

想要尝试一种非递归方法。(打高尔夫球的新手,任何技巧都很棒!)

def f(c,n=0):
    while 1:
        if`n`in`n*n`:
            if c<2:return n
            c-=1
        n+=1

感谢BMO和Vedant Kandoi!


2
您不必print(f(13))在代码中计数。此外while 1:if c==1:return nc==1 can be c<2
吠陀Kandoi

嗯,我没有看到您想要一个非递归版本nvm。无论如何,我当前计数的是76个字节而不是79个字节。
ბიმო

而且你可以节省几个:该位之前和之后`都是多余的,一前一后c<2:过,然后你可以缩进混合制表符和空格(如图所示这里):69个字节顺便说一句。不需要保留您的旧版本(有兴趣的人可以在编辑历史记录中找到),为什么不链接到TIO(或类似版本)/从那里使用模板呢?
ბიმო

1

Haskell,60个字节

([n^2|n<-[1..],elem(show n)$words=<<mapM(:" ")(show$n^2)]!!)

在线尝试!

      n<-[1..]              -- loop n through all numbers starting with 1
 [n^2|        ,    ]        -- collect the n^2 in a list where
     elem(show n)           -- the string representation of 'n' is in the list
       words ... (show$n^2) -- which is constructed as follows:

            show$n^2        -- turn n^2 into a string, i.e. a list of characters
          (:" ")            -- a point free functions that appends a space
                            -- to a character, e.g.  (:" ") '1' -> "1 "
        mapM                -- replace each char 'c' in the string (n^2) with
                            -- each char from (:" ") c and make a list of all
                            -- combinations thereof.
                            -- e.g. mapM (:" ") "123" -> ["123","12 ","1 3","1  "," 23"," 2 ","  3","   "]
      words=<<              -- split each element into words and flatten to a single list
                            -- example above -> ["123","12","1","3","1","23","2","3"]

(                      !!)  -- pick the element at the given index

1

Python 2中47 43个字节

-4个字节要感谢Dennis(将1递归调用而不是返回n-1

f=lambda c,n=1:c and-~f(c-(`n`in`n*n`),n+1)

在线尝试!

外植/松散

c,nn1,2,3n in n2cc=0

# Enumerating elements of A018834 in reverse starting with 1
def f(counter, number=1):
    # Stop counting
    if counter == 0:
        return 0
    # Number is in A018834 -> count 1, decrement counter & continue
    elif `number` in `number ** 2`:
        return f(counter-1, number+1) + 1
    # Number is not in A018834 -> count 1, continue
    else:
        return f(counter, number+1) + 1



1

的Lua137个 123 79字节

-感谢@Jo King提供44个字节

n=io.read()i=0j=0while(i-n<0)do j=j+1i=i+(n.find(j*j,j)and 1or 0)end
print(j*j)

在线尝试!


79个字节。一些通用技巧;false/true可以是0>1/ 0<1,对于ifs和whiles 不需要括号,您可以删除数字后的大多数空格(甚至换行符)。
Jo King

1

Tcl,82字节

proc S n {while 1 {if {[regexp [incr i] [expr $i**2]]&&[incr j]==$n} {return $i}}}

在线尝试!


我认为您可以将while和if混合使用:proc S n {while {[incr j [regexp [incr i] [expr $i**2]]]-$n} {};return $i}
大卫

0

整洁,24字节

{x:str(x)in'~.x^2}from N

在线尝试!

返回一个惰性列表,当像函数一样调用时,它返回n系列中的th元素。

说明

{x:str(x)in'~.x^2}from N
{x:              }from N       select all natural numbers `x` such that
   str(x)                      the string representation of `x`
         in                    is contained in
           '~.x^2              "~" + str(x^2)
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.