제곱의 소수 연결


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

파이썬 구현 참조 (@ 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 97100102105107108110112119120121125129130138140150160170180190191200201204204209209210 21222022323024025025326027027028085853003003063063103153203253303403423424334534548350360 369370375 3793803903909740040240540841041041342043044044414504604704704747 4450

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다!

행운을 빕니다!


38²는 물론 12² & 2²로도 쓸 수 있습니다.

@Neil yes ... c 처음 100 개의 숫자 목록에 있습니다.
TanMath

혼란스러워서 미안하지만 38²의 분해 선택을 1² & 2² & 2² & 2²로 선택하는 것에 대해서만 언급하고있었습니다.

@ 닐 오 .. 알 겠어. 지금은 그대로 두겠습니다. 분해에 12 ^ 2가 포함될 수 있다는 것은 다른 사람들에게는 분명합니다.
TanMath

답변:


8

Pyth, 23 21 20 바이트

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

1 바이트를 골라 낸 @isaacg에게 감사드립니다!

온라인으로 사용해보십시오.

작동 원리

                      (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 이상의 입력을 시도하지 않는 것이 좋습니다 .
Dennis

t있기 때문에, 불필요한 ^R2Z뜻이 포함되지 ^Z2. 파이썬의 범위와 동일하며 상단을 포함하지 않습니다.
isaacg

네 답을 읽 자마자 깨달았습니다. 그것은 이전 접근법에서 남은 것입니다 ... 감사합니다!
Dennis

실제로 게시물을보기 전에 인터넷 속도가 매우 느리며 게시 한 후에야 업데이트가 표시되지 않습니다. 당신이나 아무것도 도둑질하려고하지 않습니다.
isaacg

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에게 감사하고 44 바이트를 절약 한 Glen O에게 감사드립니다!


4

자바 스크립트 ES6, (126) 127

골프 구현으로 자바 스크립트로 변환 된 참조 구현.

명시적인 반환을 피하기 위해 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

자바 스크립트 (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)

루아 5.3이 필요합니다

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

0

파이썬 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.