平方的十进制串联


24

前提

一天晚上,我只是在考虑数字。我发现一些关于数字的独特之处,例如7、10、12、13等。他们是正方形的正方形!意思是,当平方时,由平方本身组成。OEIS称它们为Squares,它们是两个或多个正方形的十进制连接。

这样的数字的示例包括7(49具有2 2和3 2)13(169具有4 2和3 2)和20(400具有2 2和0 2)。其他示例包括37,因为1369是一个术语,可以将其划分为1、36和9。1444(38 2)是一个术语,可以将其划分为1、4、4、4。 .SE,它以我的名字命名

挑战

设计一个打印TanMath数字的程序。给定数字n(从1开始),打印第n个TanMath数字T(n)。

作为代码示例:

>> 1
>> 7

要么

>> 4
>> 13

参考Python实现(感谢@MartinBüttner和@ Sp3000!):

from math import sqrt

n = input()

def r(digits, depth):
    z = len(digits)
    if z < 1:
        return (depth > 1)
    else:
        for i in range(1, z+1):
            t = int(digits[:i])
            if sqrt(t).is_integer() and r(digits[i:], depth+1):
                return True
        return False


i=0
t=0
while t < n:
    i += 1

    if r(str(i**2), 0):
        t += 1

print i

以下是前100个数字的列表:

7 10 12 13 19 20 21 30 35 37 38 40 41 44 50 57 60 65 70 80 90 95 97 100 102 105 107 108 110 112 119 120 121 125 129 130 138 140 150 160 170 180 190 191 200 201 204 205 209 210 212 220 223 230 240 250 253 260 270 280 290 290 300 305 306 310 315 320 325 330 340 342 343 345 348 350 360 369 370 375 379 380 390 3390 4007 402 405 405 408 410 413 420 430 440 440 440 441 450 460 470 475 480 487 487

这是代码高尔夫,所以最短的代码获胜!

祝好运!


当然38²也可以写成12²和2²。
尼尔

@Neil是... c它在前100个数字的列表中。
TanMath

对不起,如果我让您感到困惑,但我只是在评论您选择将38²分解为1²&2²&2²&2²。
尼尔

@尼尔哦..我明白了。我暂时将其保留下来,我认为分解中可以包含12 ^ 2的内容被其他人忽略了。
TanMath

Answers:


8

Pyth,23 21 20字节

e.ff!-sMT^R2Z./`^Z2Q

感谢@isaacg高尔夫球了1个字节!

在线尝试。

怎么运行的

                      (implicit) Store the evaluated input in Q.
 .f                Q  Filter; find the first Q positive integers Z such that:
                ^Z2     Compute the square of Z.
               `        Cast to string.
             ./         Compute all partitions of the string.
   f                    Filter; find all partitions T such that:
      sMT                 Cast all elements of T to integer.
         ^R2Z             Compute the squares of all integers in [0, ..., Z-1].
     -                    Remove the squares from the integers in T.
    !                     Compute the logical NOT of the result. This returns True
                          iff all integers in T are squares of numbers less than Z.
                        Keep T if `!' returned True.
                      Keep Z if `!' returned True for at least one T.
e                     Retrieve the last of the Q matches.

运行时的复杂性是灾难性的。我不建议在线解释器尝试输入超过60个字符。
丹尼斯

t是不必要的,因为^R2Z不包含^Z2。它与Python的范围相同,但不包括高端。
isaacg 2015年

是的,我一经阅读您的答案,便意识到。那是以前方法的遗留物……谢谢!
丹尼斯

我实际上写道,在看到您的帖子之前,我的互联网非常缓慢,直到发布后我才看到您的更新。不试图to你或其他任何东西。
isaacg 2015年

1
别担心。我以为是那样。你曾经帮助过我很多次。(我很亲密熟悉的互联网速度较慢的问题:P)
丹尼斯

5

朱莉娅189145字节

n->(c=m=0;while c<n m+=1;d=["$(m^2)"...];for p=partitions(d) d==[p...;]&&!any(√map(parse,map(join,p))%1.>0)&&endof(p)>1&&(c+=1;break)end;end;m)

这将创建一个未命名的函数,该函数接受一个整数并返回一个整数。要给它起个名字,例如f=n->...

取消高尔夫:

function tanmath(n::Integer)
    # Initialize the number to check (c) and the nth TanMath
    # number (m) both to 0
    c = m = 0

    # While we've generated fewer than n TanMath numbers...
    while c < n
        # Increment the TanMath number
        m += 1

        # Get the digits of m^2 as characters
        d = ["$(m^2)"...]

        # Loop over the unordered partitions of the digits
        for p in partitions(d)
            # Convert the partition of digits to parsed numbers
            x = map(parse, map(join, p))

            # If the partition is in the correct order, none of the
            # square roots of the digits are non-integral, and p is
            # of length > 1...
            if d == [p...;] && !any(sqrt(x) % 1 .> 0) && endof(p) > 1
                # Increment the check
                c += 1

                # Leave the loop
                break
            end
        end
    end

    # Return the nth TanMath number
    return m
end

感谢Dennis的帮助和想法,也感谢Glen O节省了44个字节!


4

JavaScript的ES6,126 127

参考实现,通过一些技巧将其转换为Javascript。

使用eval避免显式返回。

使用扩展运算符,默认参数和箭头功能,在符合EcmaScript 6的浏览器中测试以下代码段的运行情况(我使用Firefox)

F=n=>eval('for(i=t=0;t<n;t+=k([...i*i+""]))++i',k=(s,l=1,n="")=>s[0]?s.some((d,i)=>Math.sqrt(n+=d)%1?0:k(s.slice(i+1),l-1)):l)

// Less golfed

U=n=>{
  k = (s,l=1,n="") =>
    s[0]
    ? s.some((d,i) => 
             Math.sqrt(n+=d)%1 ? 0 : k(s.slice(i+1),l-1)
            )
    : l;
  for(i=t=0; t<n; ) {
    ++i;
    t += k([...i*i+""])
  }  
  return i
}

function test() { R.innerHTML=F(+I.value) }

test()
<input id=I value=100><button onclick='test()'>-></button>
<span id=R></span>


3

JavaScript(ES6),143字节

f=n=>{for(i=c=0;c<n;c+=1<g(++i*i+""))g=s=>{for(var l=0;s[l++];)if(!(Math.sqrt(s.slice(0,l))%1)&&!s[l]|(r=!!g(s.slice(l))))return 1+r};return i}

用法

f(100)
=> 487

说明

f=n=>{
  for(
    i=                     // i = current number to check
      c=0;                 // c = number of TanMath numbers found so far
    c<n;                   // keep looping until we have found the required TanMath number
    c+=1<                  // increment the count if it has multiple squares in the digits
      g(++i*i+"")          // check if the current number is a TanMath number
  )
    g=s=>{                 // this function is passed a number as a string and returns the
                           //     number of squares found (max 2) or undefined if 0
      for(var l=0;s[l++];) // loop through each digit
                           // ('var' is necessary because the function is recursive)
        if(
          !(Math.sqrt(     // check if the square root of the digits is a whole number
            s.slice(0,l)   // get the digits to check
          )%1)&&
          !s[l]|           // finish if there are no more digits left to check
          (r=!!            // r = true if number of squares in remaining digits > 0
            g(s.slice(l))  // get number of squares in remaining digits
          )
        )
          return 1+r       // return number of squares found
    };
  return i                 // return the number that the loop finished at
}

0

Lua,148个字节

c=...r=load"a=a or...==''for p=0,...and n-1or-1 do p='^'..p*p..'(.*)'r(p.match(...,p))end"n=-1repeat
n=n+1r(n*n)c,a=c-(a and 1or 0)until c<1print(n)

需要Lua 5.3

$ lua program.lua 1
7
$ lua program.lua 10
37
$ lua program.lua 100
487

0

Python 3中,283个 243字节

这是蛮力的实现。欢迎打高尔夫球。

from itertools import*
def t(n):
 a=m=0
 while a<n:m+=1;d=str(m*m);r=range(1,len(d));c=[i*i for i in range(m)];a+=any(all(p in c for p in q)for q in[[int(d[x:y])for x,y in zip((0,)+j,j+(None,))]for i in r for j in combinations(r,i)])
 return m

取消高尔夫:

import itertools
def tanmath(n):
    a = 0
    m = 0
    while a < n:
        m += 1
        d = str(m*m)
        squares = [i*i for i in range(m)]
        z = []
        # partitions code
        for i in range(1, len(d)):
            for j in itertools.combinations(range(1, len(d)), i):
                partition_indices = zip((0,)+j, j+(None,))
                z.append([int(d[x:y]) for x, y in partition_indices]
        # end partitions code
        if any(all(p in squares for p in q) for q in z):
            a += 1
    return m
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.