Cuadrados en los cuadrados

10

Dada la entrada de un entero positivo n, escriba un programa que complete el siguiente proceso.

  • Encuentre el número entero positivo más pequeño mayor que nese es un cuadrado perfecto y es la concatenación de ny algún otro número. El orden de los dígitos de nno puede modificarse. Se npuede llamar al número concatenado para producir un cuadrado perfecto r_1.
  • Si r_1no es un cuadrado perfecto, repita el proceso anterior con r_1como la nueva entrada al proceso. Repita hasta que quede r_kun cuadrado perfecto, denotado s.
  • Imprime el valor de sqrt(s).

La entrada se puede tomar en cualquier formato. Puede suponer que nes un número entero positivo. Si alguno r_ktiene un cero inicial (y r_k≠ 0), el cero puede ser ignorado.


Casos de prueba

Aquí hay algunos casos de prueba. El proceso demuestra los pasos anteriores.

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

Este es el código de golf. Aplican reglas estándar. La respuesta más corta (en bytes) gana.

Arcturus
fuente

Respuestas:

2

Pyth, 26 bytes

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

Banco de pruebas

La salida es como un flotador. Si se desea la salida como int, sería 1 byte adicional.

Explicación:

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
fuente
2

MATL , 35 44.0 bytes

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

Pruébalo en línea!

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
fuente
2

Pitó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

Pruébalo en línea .

grc
fuente
Ya que estamos en territorio de abuso de flotador de todos modos ... while x**.5%1:¿tal vez?
Sp3000
@ Sp3000 gracias! Lo he jugado un poco más ahora.
grc
@Ampora solo el enlace ideone imprimió el proceso, pero lo he cambiado ahora.
grc
1

Python, 200 198 178 bytes

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)
ThereGoesMySanity
fuente
Puede guardar una buena cantidad de bytes acortando math.sqrta m.
Arcturus
@Ampora Aww sí, ahorró 2 bytes
ThereGoesMySanity
1

Brachylog , 26 bytes

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

Pruébalo en línea!

El último caso de prueba se omitió en el enlace TIO porque solo lleva más de un minuto ejecutarlo. Lo ejecuté en mi computadora portátil y el resultado correcto se logró en no más de dos horas.

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

El penúltimo es necesario para cuando la entrada inicial ya es un cuadrado perfecto, por lo que el primer cuadrado perfecto que lo tiene como prefijo es en sí mismo, y !es necesario para asegurarse de que el retroceso se repita en lugar de encontrar un cuadrado concatenado más grande, pero realmente no sé por qué es necesario, solo sé que 5 produce una respuesta incorrecta sin ella.

Cadena no relacionada
fuente
(Gracias a un error en el intérprete, que horrible desastre de variables con nombre y S es en realidad más corto que el uso de un sándwich.)
Sin relación Cadena
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
Brad Gilbert b2gills
fuente
0

ES7, 116 bytes

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}

Sí, probablemente podría guardar un byte usando eval.

Neil
fuente