Hình vuông trong hình vuông


10

Cho đầu vào của một số nguyên dương n, viết chương trình hoàn thành quy trình sau.

  • Tìm số nguyên dương nhỏ nhất lớn hơn nđó là một hình vuông hoàn hảo và là phép nối nvà một số số khác. Thứ tự của các chữ số ncó thể không được thay đổi. Số được nối vào nđể tạo ra một hình vuông hoàn hảo có thể được gọi r_1.
  • Nếu r_1không phải là một hình vuông hoàn hảo, hãy lặp lại quy trình trên với r_1tư cách là đầu vào mới cho quy trình. Lặp lại cho đến khi r_klà một hình vuông hoàn hảo, ký hiệu s.
  • In giá trị của sqrt(s).

Đầu vào có thể được thực hiện trong bất kỳ định dạng. Bạn có thể cho rằng đó nlà một số nguyên dương. Nếu bất kỳ r_kcó số 0 đứng đầu (và r_k≠ 0), số 0 có thể bị bỏ qua.


Các trường hợp thử nghiệm

Dưới đây là một số trường hợp thử nghiệm. Quá trình thể hiện các bước trên.

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

Đây là mã golf. Quy tắc chuẩn áp dụng. Câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.

Câu trả lời:


2

Bình thường, 26 byte

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

Bộ kiểm tra

Đầu ra là như một float. Nếu đầu ra là một int mong muốn, nó sẽ là 1 byte thêm.

Giải trình:

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 byte

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

Hãy thử trực tuyến!

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

Con trăn 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

Hãy thử trực tuyến .


Vì dù sao chúng ta cũng ở trong vùng lạm dụng phao ... while x**.5%1:có lẽ vậy?
Sp3000

@ Sp3000 cảm ơn! Tôi đã đánh nó xuống một chút bây giờ.
grc

@Ampora chỉ có liên kết ideone in quy trình, nhưng tôi đã thay đổi điều đó ngay bây giờ.
grc

1

Python, 200 198 178 byte

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)

Bạn có thể tiết kiệm một số lượng tốt của byte bằng cách rút ngắn math.sqrttới m.
Arcturus

@Ampora Aww yeah, đã lưu 2 byte
CóGoesMySanity

1

Brachylog , 26 byte

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

Hãy thử trực tuyến!

Trường hợp thử nghiệm cuối cùng đã bị bỏ qua trong liên kết TIO vì một mình nó mất hơn một phút để thực thi. Tôi chạy nó trên máy tính xách tay của tôi và kết quả chính xác đã đạt được trong không quá hai giờ.

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

Thứ hai đến cuối cùng là cần thiết khi đầu vào ban đầu đã là một hình vuông hoàn hảo, do đó, hình vuông hoàn hảo đầu tiên có chính nó là tiền tố, và !cần phải đảm bảo rằng quay lại lặp lại thay vì tìm một hình vuông được ghép lớn hơn, nhưng tôi không thực sự biết tại sao lại cần thiết, tôi chỉ biết rằng 5 câu trả lời sai mà không có nó.


(Nhờ một lỗi trong trình phân tích cú pháp, mớ hỗn độn khủng khiếp của các biến và tên được đặt tên thực sự ngắn hơn so với sử dụng bánh sandwich.)
Chuỗi không liên quan

0

Perl 6 , 101 byte

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 byte

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}

Vâng, tôi có thể có thể lưu một byte bằng cách sử dụng eval.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.