Десяткове конкатенація квадратів


24

Приміщення

Однієї ночі я просто роздумував над номерами. Я дізнався про щось унікальне щодо чисел, таких як 7, 10, 12, 13 та більше. Вони - квадрати квадратів! Це означає, що коли вони складаються з квадратів, вони складаються з самих квадратів. OEIS називає їх квадратами, які є десятковою конкатенацією двох або більше квадратів.

Приклади таких чисел включають 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. Я запитав про це на Math .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 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

Це кодовий гольф, тому найкоротший код виграє!

Удачі!


38² можна також записати 12² та 2 ² звичайно.
Ніл

@Neil так ... cI в списку перших 100 номерів.
TanMath

Вибачте, якщо я вас заплутав, але я просто коментував ваш вибір розкладання 38 ² як 1 ² & 2 ² & 2 ² & 2 ².
Ніл

@Neil о .. я бачу. Я зараз залишу це так, я вважаю, що це дотримується інших, що 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 байтів!


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

Луа, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.