Karelerin ondalık birleştirilmesi


24

Öncül

Bir gece, sadece sayıları düşünüyordum. 7, 10, 12, 13 ve daha fazlası gibi rakamlarla ilgili benzersiz bir şey öğrendim. Onlar kareler kareler! Yani, kare olduğunda, karelerin kendisinden ibarettir. OEIS, onlara iki veya daha fazla karenin ondalık birleşimi olan Kareler adını verir.

Bu tür sayıların örnekleri arasında 7 (49, 2 2 ve 3 2 ) 13 (169, 4 2 ve 3 2 ) ve 20 (400, 2 2 ve 0 2 ) içerir. Diğer örnekler 37'dir, 1369, 1, 36 ve 9 olarak bölünebildiği bir terimdir. 1444 (38 2 ), 1, 4, 4, 4 olarak bölünebileceği bir terimdir. .SE, ve benden sonra seçildi !

Meydan okuma

TanMath numaralarını basan bir program tasarlayın. N sayısı göz önüne alındığında (1'den başlayarak), nT TanMath numarasını, T (n) yazdırın.

Kod örneği olarak:

>> 1
>> 7

veya

>> 4
>> 13

Referans Python uygulaması (teşekkürler @ MartinBüttner ve @ 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

İşte ilk 100 sayının listesi:

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 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 475 475 480 487.

Bu bir kod golf, yani en kısa kod kazanır!

İyi şanslar!


38² ayrıca 12² ve 2² elbette yazılabilir.
Neil

@Neil evet ... cIt ilk 100 sayı listesindedir.
TanMath

Kusura bakma, eğer kafamı karıştırdıysam, sadece 38² ayrılmayı 1² & 2² & 2² & 2² olarak seçtiniz.
Neil.

@Neil oh .. Anladım. Şimdilik böyle bırakacağım, sanırım 12 ^ 2’nin ayrıştırmaya dahil olabileceğinin başkalarına haksızlık ettiğini düşünüyorum.
TanMath

Yanıtlar:


8

Pyth, 23 21 20 bayt

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

1 byte kapalı golf için @isaacg teşekkürler!

Çevrimiçi deneyin.

Nasıl çalışır

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

Çalışma zamanı karmaşıklığı felakettir. Çevrimiçi tercüman ile 60'ın üzerindeki girişleri denemeyi önermiyorum .
Dennis,

tÇünkü, gereksiz ^R2Zirade içermez ^Z2. Python'ın serisi ile aynı, üst kısmı içermiyor.
isaacg

Evet, cevabınızı okuduğumda farkettim. Bu önceki yaklaşımdan bir artık oldu ... Teşekkürler!
Dennis,

Aslında yazınızı görmeden önce internetimin çok yavaş olduğunu ve yayınlanıncaya kadar güncellemenizi görmediğimi yazdım. Seni ya da başka bir şeyi kapmaya çalışmıyorum.
isaacg

1
Telaşa gerek yok. Bunun gibi bir şey olduğunu varsaydım. Bana daha önce birçok kez yardım ettin. (Ve yavaş internet sorunuyla yakından
Dennis

5

Julia, 189 145 bayt

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)

Bu bir tamsayıyı kabul eden ve bir tamsayı döndüren adsız bir işlev oluşturur. Aramak için bir isim verin, örneğin f=n->....

Ungolfed:

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

Bazı yardımlar ve fikirler için Dennis'e ve 44 byte tasarruf için Glen O'ya teşekkürler!


4

JavaScript ES6, 126 127

Referans uygulaması, bazı hile ile Javascript'e dönüştürüldü.

Açık geri dönüşü önlemek için eval kullanımı.

Aşağıdaki snippet'i, spma operatörü, varsayılan parametreler ve ok işlevleriyle birlikte EcmaScript 6 uyumlu bir tarayıcıda çalıştığını test edin (Firefox kullanıyorum)

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 bayt

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}

kullanım

f(100)
=> 487

açıklama

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 bayt

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 gereklidir

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

0

Python 3, 283 243 bayt

Bu bir kaba kuvvet uygulamasıdır. Golf önerileri kabul edilir.

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

Ungolfed:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.