Kotak di Kotak

10

Diberikan masukan bilangan bulat positif n, tulis sebuah program yang menyelesaikan proses berikut.

  • Temukan bilangan bulat positif terkecil yang lebih besar dari nitu adalah kuadrat sempurna dan merupakan gabungan dari ndan beberapa angka lainnya. Urutan digit ntidak dapat diubah. Angka yang digabungkan nuntuk menghasilkan kuadrat sempurna bisa disebut r_1.
  • Jika r_1bukan kuadrat sempurna, ulangi proses di atas dengan r_1sebagai input baru untuk proses. Ulangi sampai r_kpersegi sempurna, dilambangkan s.
  • Cetak nilai sqrt(s).

Input dapat diambil dalam format apa pun. Anda dapat menganggap bahwa itu nadalah bilangan bulat positif. Jika ada yang r_kmemiliki nol di depan (dan r_k≠ 0), nol dapat diabaikan.


Uji kasus

Berikut ini beberapa test case. Proses tersebut menunjukkan langkah-langkah di atas.

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

Ini golf kode. Aturan standar berlaku. Jawaban terpendek (dalam byte) menang.

Arcturus
sumber

Jawaban:

2

Pyth, 26 byte

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

Suite uji

Output adalah sebagai pelampung. Jika output sebagai int diinginkan, itu akan menjadi 1 byte tambahan.

Penjelasan:

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.
isaacg
sumber
2

MATL , 35 44,0 byte

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

Cobalah online!

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
Luis Mendo
sumber
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

Cobalah online .

grc
sumber
Karena kita berada di wilayah penyalahgunaan float ... while x**.5%1:mungkin?
Sp3000
@ Sp3000 terima kasih! Saya telah menurunkannya sedikit lebih sekarang.
grc
@Ampora hanya tautan ideone yang mencetak prosesnya, tetapi saya telah mengubahnya sekarang.
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)
AdaGameMySanity
sumber
Anda dapat menyimpan sejumlah byte dengan menyingkat math.sqrtmenjadi m.
Arcturus
@Ampora Aww ya, disimpan 2 byte
ThereGoesMySanity
1

Brachylog , 26 byte

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

Cobalah online!

Kasing uji terakhir dihilangkan dalam tautan TIO karena hanya dibutuhkan lebih dari satu menit untuk mengeksekusi. Saya menjalankannya di laptop saya dan hasil yang benar dicapai dalam waktu tidak lebih dari dua jam.

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

Yang kedua-terakhir diperlukan ketika input awal sudah merupakan kuadrat sempurna, sehingga kuadrat sempurna pertama yang menjadikannya sebagai awalan itu sendiri, dan !perlu untuk memastikan bahwa menelusuri kembali iterates alih-alih menemukan kotak yang lebih besar, tetapi saya tidak benar-benar tahu mengapa itu perlu, saya hanya tahu bahwa 5 menghasilkan jawaban yang salah tanpa itu.

String yang tidak terkait
sumber
(Berkat bug di parser, kekacauan mengerikan dari variabel bernama dan s sebenarnya lebih pendek daripada menggunakan sandwich.)
Unrelated String
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
Brad Gilbert b2gills
sumber
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}

Ya, saya mungkin bisa menyimpan byte dengan menggunakan eval.

Neil
sumber