การต่อข้อมูลทศนิยมของสี่เหลี่ยม


24

หลักฐาน

คืนหนึ่งฉันแค่ใคร่ครวญเรื่องตัวเลข ฉันค้นพบเกี่ยวกับสิ่งที่ไม่เหมือนใครเกี่ยวกับตัวเลขเช่น 7, 10, 12, 13 และอื่น ๆ พวกมันเป็นสี่เหลี่ยมกำลังสอง! ความหมายที่ว่าเมื่อยกกำลังสองจะประกอบด้วยกำลังสองของตัวเอง OEIS เรียกพวกมันว่า Squares ซึ่งเป็นการแบ่งส่วนทศนิยมของ Squares สองตัวขึ้นไป

ตัวอย่างของตัวเลขดังกล่าว ได้แก่ 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 ฉันถามเรื่องนี้ทางคณิตศาสตร์ . SE และมันถูกตั้งชื่อตามฉัน!

ท้าทาย

ออกแบบโปรแกรมที่พิมพ์ตัวเลข TanMath ระบุหมายเลข n (เริ่มต้นที่ 1) พิมพ์หมายเลข TanMath ที่ n, 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 140 160 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 330 330 340 342 343 345 348 350 360 369 370 375 379 380 390 397 400 402 405 404 404 404 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 5 5 5 5 5 5 5 5 5

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ!

โชคดี!


แน่นอนว่าสามารถเขียนขนาด38²ได้12² & 2²
Neil

@Neil ใช่ ... cIt อยู่ในรายการหมายเลข 100 ตัวแรก
TanMath

ขออภัยถ้าฉันสับสนคุณ แต่ฉันเพียงแค่แสดงความคิดเห็นในการเลือกของคุณในการสลายตัวของ38²เป็น1² & 2² & 2² & 2²
Neil

@ 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มันเหมือนกับช่วงไพ ธ อน แต่ก็ไม่รวมถึงปลายด้านบน
isaacg

ใช่ฉันรู้ทันทีที่ฉันอ่านคำตอบของคุณ นั่นคือสิ่งที่เหลือจากวิธีการก่อนหน้านี้ ... ขอบคุณ!
เดนนิส

ฉันเขียนว่าก่อนที่ฉันจะเห็นโพสต์ของคุณอินเทอร์เน็ตของฉันช้ามากและฉันไม่เห็นการอัปเดตของคุณจนกว่าฉันจะโพสต์ ไม่พยายามที่จะจาม
isaacg

1
ไม่ต้องห่วง. ฉันคิดว่ามันเป็นอย่างนั้น คุณช่วยฉันหลายครั้งก่อน (และฉันคุ้นเคยสนิทสนมกับปัญหาอินเทอร์เน็ตช้า: P)
Dennis

5

Julia, 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->...เรียกว่าให้มันชื่อเช่น

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

ขอบคุณเดนนิสสำหรับความช่วยเหลือและแนวคิดและขอบคุณ Glen O สำหรับการบันทึก 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

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

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.