平方の10進連結


24

前提

ある夜、私はただ数字を考えていました。私は、7、10、12、13などのような数字についてユニークな何かを見つけました。彼らは正方形の正方形です!意味は、二乗したとき、それ自体が正方形で構成されることです。OEISは、2つ以上の正方形を10進数で連結したものを正方形と呼びます。

このような数の例には、7(49は2 2と3 2)13(169は4 2と3 2)と20(400は2 2と0 2)が含まれます。1369は1、36、9に分割できるので、他の例には37が含まれます。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 102105 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 220223230240250253260270280280285290300305306310315320320325330340342343345348350360369370370375379380390 397400402405408410413420430440441450460470475480487

これはコードゴルフなので、最短のコードが勝ちます!

がんばろう!


38²はもちろん12²&2²と書くこともできます。
ニール

@Neil yes ... c最初の100個の数字のリストにあります。
-TanMath

混乱した場合は申し訳ありませんが、38²を1²&2²&2²&2²に分解するという選択についてコメントしただけです。
ニール

@Neil oh ..なるほど。今のところはそのままにしておきますが、12 ^ 2を分解に含めることができるのは他の人には明らかだと思います。
-TanMath

回答:


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

はい、あなたの答えを読むとすぐに気付きました。それは以前のアプローチからの残り物でした...ありがとう!
デニス

私は実際に、あなたの投稿を見る前に、私のインターネットは非常に遅く、私が投稿するまであなたの更新を見なかったことを書きました。あなたや何かを狙撃しようとしない。
isaacg

1
心配ない。私はそれがそのようなものだと思いました。あなたは以前に何度も助けてくれました。(そして、私は思い密接遅いインターネットの問題に精通している:P。)
デニス・

5

ジュリア、189 145バイト

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

助けとアイデアをくれたデニスに感謝し、44バイトを節約してくれたグレンOに感謝!


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.