สี่เหลี่ยมในสี่เหลี่ยม


10

รับอินพุตของจำนวนเต็มบวกnเขียนโปรแกรมที่เสร็จสิ้นกระบวนการต่อไปนี้

  • ค้นหาจำนวนเต็มบวกที่เล็กที่สุดที่มากกว่าnสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบและเป็นการต่อเชื่อมnและอีกจำนวนหนึ่ง ลำดับของตัวเลขnอาจไม่สามารถเปลี่ยนแปลงได้ จำนวนตัดแบ่งไปยังการผลิตตารางที่สมบูรณ์แบบอาจจะเรียกว่าnr_1
  • ถ้าr_1ไม่ใช่สี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบให้ทำซ้ำกระบวนการข้างต้นด้วยr_1เช่นเดียวกับอินพุตใหม่เข้าสู่กระบวนการ ทำซ้ำจนกว่าจะเป็นตารางที่สมบูรณ์ชี้แนะr_ks
  • sqrt(s)พิมพ์ค่าของ

สามารถป้อนข้อมูลในรูปแบบใดก็ได้ คุณสามารถสันนิษฐานว่าnเป็นจำนวนเต็มบวก ถ้าr_kมีศูนย์นำ (และr_k≠ 0), ศูนย์สามารถถูกละเว้น


กรณีทดสอบ

นี่คือบางกรณีทดสอบ กระบวนการสาธิตขั้นตอนข้างต้น

Input:   23
Process: 23, 2304, 4
Output:  2

Input:   10
Process: 10, 100, 0
Output:  0

Input:   1
Process: 1, 16, 6, 64, 4
Output:  2

Input:   5
Process: 5, 529, 29, 2916, 16
Output:  4

Input:   145
Process: 145, 145161, 161, 16129, 29, 2916, 16
Output:  4

Input:   1337
Process: 1337, 13373649, 3649, 36493681, 3681, 368102596, 2596, 25969216, 9216
Output:  96

นี่คือรหัสกอล์ฟ ใช้กฎมาตรฐาน คำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

คำตอบ:


2

Pyth, 26 ไบต์

LsI@b2 fy=sh.fys+QZ1\0)@Q2

ชุดทดสอบ

การส่งออกเป็นแบบลอย หากต้องการเอาต์พุตเป็น int จะเป็น 1 ไบต์พิเศษ

คำอธิบาย:

LsI@b2 fy=sh.fys+QZ1\0)s@Q2
                               Q = eval(input())
L                              def y(b): return
   @b2                         Square root of b
 sI                            Is an integer.
       f              )        Find the first positive integer T that satisfies
           h.f     1\0         Find the first digit string Z that satisfies
                +QZ            Concatenation of Q and Z
               s               Converted to an integer
              y                Is a pergect square.
          s                    Convert the string to an integer
         =                     Assign result to the next variable in the code, Q
        y                      Repeat until result is a perfect square
                               (The space) Discard return value
                        @Q2    Take square root of Q and print.

2

MATL , 35 44.0ไบต์

XK``x@2^tVKVXf1=a~]VKVnQ0h)UXKX^t1\

ลองออนไลน์!

XK        % implicit input: n. Copy to clipboard K
`         % do...while. Each iteration applies the algorithm
  `       %   do...while. Each iteration tests a candidate number
    x     %     delete top of stack
    @2^   %     iteration index squared
    t     %     duplicate
    V     %     convert to string                
    K     %     paste from clipboard K: n or r_k
    V     %     convert to string  
    Xf    %     find one string within another. Gives indices of starting matches, if any 
    1=a~  %     test if some of those indices is 1. If not: next iteration
  ]       %   end. We finish with a perfect square that begins with digits of n or r_k
  V       %   convert to string
  K       %   paste from clipboard K: n or r_k
  VnQ0h   %   index of rightmost characters, as determined by r_k
  )       %   keep those figures only
  U       %   convert to number. This is the new r_k
  XK      %   copy to clipboard K, to be used as input to algorithm again, if needed
  X^      %   square root
  1\      %   fractional part. If not zero: apply algorithm again
          % implitic do...while loop end
          % implicit display

2

Python 2, 98

i=input();d=o=9
while~-d:
 n=i;d=o+1;o=i=0
 while(n*d+i)**.5%1:i=-~i%d;d+=9*d*0**i
print'%d'%n**.5

ลองมันออนไลน์


เนื่องจากเราอยู่ในดินแดนทารุณกรรมต่อไป ... while x**.5%1:อาจจะ?
Sp3000

@ Sp3000 ขอบคุณ! ฉันตีกอล์ฟมันลงไปอีกหน่อย
grc

@Ampora เพียงลิงค์ ideone เท่านั้นที่พิมพ์กระบวนการ แต่ฉันเปลี่ยนมันแล้ว
grc

1

Python, 200 198 178 ไบต์

import math
def r(i):
 j=int(i**.5)+1
 while str(j*j)[:len(str(i))]!=str(i):j+=1
 return int(str(j*j)[len(str(i)):])
q=r(int(input()))
while math.sqrt(q)%1!=0:q=r(q)
print(q**.5)

คุณสามารถบันทึกจำนวนไบต์ที่ดีโดยการย่อmath.sqrtให้mเหลือ
Arcturus

@Ampora Aww ใช่บันทึก 2 ไบต์
ThereGoesMySanity

1

Brachylogขนาด 26 ไบต์

{~a₀X√ℕ∧YcX∧Yh?∧Ybcℕ≜!}ⁱ√ℕ

ลองออนไลน์!

กรณีทดสอบสุดท้ายถูกละเว้นในลิงก์ TIO เนื่องจากใช้เวลาดำเนินการมากกว่าหนึ่งนาที ฉันวิ่งบนแล็ปท็อปของฉันและผลลัพธ์ที่ถูกต้องก็ทำได้ภายในไม่เกินสองชั่วโมง

{                             The input
 ~a₀                          is a prefix of
    X√                        X, the square root of which
      ℕ                       is a whole number.
       ∧YcX                   Y concatenated is X.
           ∧Yh?               The input is the first element of Y.
               ∧Yb            The rest of Y,
                  c           concatenated,
                      }       is the output
                   ℕ          which is a whole number.
                    ≜         Make sure that it actually has a value,
                     !        and discard all choice points.
{                     }ⁱ      Keep feeding that predicate its own output until
                        √     its output's square root
                         ℕ    is a whole number
                              which is the output.

ครั้งที่สองถึงครั้งสุดท้ายเป็นสิ่งที่จำเป็นสำหรับเมื่ออินพุตเริ่มต้นนั้นเป็นสี่เหลี่ยมที่สมบูรณ์แบบดังนั้นสแควร์ที่สมบูรณ์แบบแรกที่มันมีคำนำหน้านั้นเป็นของตัวเองและ!มีความจำเป็นเพื่อให้แน่ใจว่า backtracking iterates แทนที่จะค้นหาสี่เหลี่ยมขนาดใหญ่ แต่ฉันไม่รู้จริง ๆ ว่าทำไมถึงมีความจำเป็นฉันเพิ่งรู้ว่า 5 สร้างคำตอบที่ผิดถ้าไม่มีมัน


(ขอบคุณข้อผิดพลาดใน parser ที่ยุ่งเหยิงน่ากลัวของตัวแปรชื่อและs จริงสั้นกว่าการใช้แซนวิช.)
สตริงที่ไม่เกี่ยวข้อง

0

Perl 6 , 101 bytes

my&q={$^k;$_=({++($||=$k.sqrt.Int)**2}.../^$k/)[*-1];+S/$k//}
put (q(get),&q...!(*.sqrt%1))[*-1].sqrt
my &q = {
  $^k; # declare placeholder parameter
  # set default scalar to:
  $_ = ( # a list
    # code block that generates every perfect square
    # larger than the input
    { ++( $ ||= $k.sqrt.Int )**2 }
    ...   # produce a sequence
    /^$k/ # ending when it finds one starting with the argument
  )[*-1]; # last value in sequence

  # take the last value and remove the argument
  # and turn it into a number to remove leading zeros
  +S/$k//
}

put (     # print the result of:
  q(get),     # find the first candidate
  &q          # find the rest of them
  ...         # produce a sequence
  !(*.sqrt%1) # ending with a perfect square
)[*-1]        # last value in sequence
.sqrt         # find the sqrt

0

ES7, 116 ไบต์

n=>{do{for(i=n;!(r=(''+Math.ceil((i*=10)**0.5)**2)).startsWith(+n););n=r.replace(+n,'');r=n**0.5}while(r%1);return r}

evalใช่ผมอาจจะสามารถประหยัดไบต์โดยใช้

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