Kết hợp số thập phân của hình vuông


24

Tiền đề

Một đêm nọ, tôi chỉ đang suy ngẫm về những con số. Tôi phát hiện ra điều gì đó độc đáo về các số như 7, 10, 12, 13 và hơn thế nữa. Chúng là hình vuông của hình vuông! Có nghĩa là, khi bình phương, bao gồm chính hình vuông. OEIS gọi chúng là Hình vuông là phần ghép thập phân của hai hoặc nhiều hình vuông.

Ví dụ về các số như vậy bao gồm 7 (49 có 2 2 và 3 2 ) 13 (169 có 4 2 và 3 2 ) và 20 (400 có 2 2 và 0 2 ). Các ví dụ khác bao gồm 37, vì 1369 là một thuật ngữ vì nó có thể được phân vùng thành 1, 36 và 9. 1444 (38 2 ) là một thuật ngữ vì nó có thể được phân vùng thành 1, 4, 4, 4. Tôi đã hỏi về điều này trên Toán học .SE, và nó được đặt theo tên của tôi!

Thử thách

Thiết kế một chương trình in số TanMath. Cho số n (bắt đầu từ 1), in số TanMath thứ n, T (n).

Như một ví dụ mã:

>> 1
>> 7

hoặc là

>> 4
>> 13

Tham khảo triển khai Python (cảm ơn @ MartinBüttner và @ 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

Dưới đây là danh sách 100 số đầu tiên:

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 190 200 201 204 205 209 210 212 220 223 230 240 250 253 260 270 280 285 290 300 305 306 310 315 320 325 330 340 342 343 345 348 350 360 369 370 375 379 380 390 397 400 402 405 408 410 413 420 430 440 441 450 460 470 475 480 487

Đây là một mã golf, vì vậy mã ngắn nhất sẽ thắng!

Chúc may mắn!


38² cũng có thể được viết 12² & 2² tất nhiên.
Neil

@ Không có ... cIt nằm trong danh sách 100 số đầu tiên.
TanMath

Xin lỗi nếu tôi làm bạn bối rối, nhưng tôi chỉ nhận xét về sự lựa chọn phân tách của bạn là 38² là 1² & 2² & 2² & 2².
Neil

@Neil oh .. Tôi hiểu rồi. Bây giờ tôi sẽ để nó như thế, tôi nghĩ rằng điều đó thật khó chịu với người khác rằng 12 ^ 2 có thể được đưa vào phân tách.
TanMath

Câu trả lời:


8

Bình thường, 23 21 20 byte

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

Cảm ơn @isaacg vì đã chơi golf 1 byte!

Hãy thử trực tuyến.

Làm thế nào nó hoạt động

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

Chạy phức tạp thời gian là thảm họa. Tôi không khuyên bạn nên thử đầu vào trên 60 với trình thông dịch trực tuyến.
Dennis

Điều tnày là không cần thiết, bởi vì ^R2Zsẽ không chứa ^Z2. Nó giống như phạm vi của Python, nó không bao gồm đầu cuối.
isaacg

Vâng, tôi nhận ra rằng ngay khi tôi đọc câu trả lời của bạn. Đó là một phần còn lại từ cách tiếp cận trước đó ... Cảm ơn!
Dennis

Tôi thực sự đã viết rằng trước khi tôi thấy bài đăng của bạn, internet của tôi rất chậm và tôi đã không thấy cập nhật của bạn cho đến khi tôi đăng. Không cố gắng bắn tỉa bạn hoặc bất cứ điều gì.
isaacg

1
Đừng lo lắng. Tôi cho rằng nó là một cái gì đó như thế. Bạn đã giúp tôi nhiều lần trước đây. (Và tôi thân mật quen thuộc với vấn đề internet chậm: P.)
Dennis

5

Julia, 189 145 byte

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)

Điều này tạo ra một hàm không tên chấp nhận một số nguyên và trả về một số nguyên. Để gọi nó, đặt tên cho nó, vd f=n->....

Ung dung:

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

Cảm ơn Dennis vì một số trợ giúp và ý tưởng và cảm ơn Glen O vì đã tiết kiệm được 44 byte!


4

JavaScript ES6, 126 127

Việc thực hiện tham chiếu, được chuyển đổi thành Javascript với một số mẹo chơi gôn.

Sử dụng eval để tránh trả lại rõ ràng.

Kiểm tra chạy đoạn mã dưới đây trong trình duyệt tuân thủ EcmaScript 6, với toán tử trải rộng, tham số mặc định và các hàm mũi tên (Tôi sử dụng 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 byte

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}

Sử dụng

f(100)
=> 487

Giải trình

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 byte

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 là bắt buộc

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

0

Python 3, 283 243 byte

Đây là một thực hiện vũ phu. Gợi ý chơi golf chào mừng.

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

Ung dung:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.