Distância da raiz quadrada dos números inteiros

20

Dado um número decimal k, encontre o menor número inteiro, de nmodo que a raiz quadrada de nesteja dentro kde um número inteiro. No entanto, a distância deve ser diferente de zero - nnão pode ser um quadrado perfeito.

Dado k, um número decimal ou uma fração (o que for mais fácil para você), de modo que 0 < k < 1, produz o menor número inteiro positivo, de nmodo que a diferença entre a raiz quadrada de ne o número inteiro mais próximo da raiz quadrada de nseja menor ou igual a, kmas diferente de zero .

Se ié o número inteiro mais próximo da raiz quadrada de n, você está procurando o primeiro nonde 0 < |i - sqrt(n)| <= k.

Regras

  • Você não pode usar a implementação insuficiente de um número não inteiro de um idioma para banalizar o problema.
  • Caso contrário, você pode assumir que kisso não causará problemas com, por exemplo, arredondamento de ponto flutuante.

Casos de teste

.9         > 2
.5         > 2
.4         > 3
.3         > 3
.25        > 5
.2         > 8
.1         > 26
.05        > 101
.03        > 288
.01        > 2501
.005       > 10001
.003       > 27888
.001       > 250001
.0005      > 1000001
.0003      > 2778888
.0001      > 25000001
.0314159   > 255
.00314159  > 25599
.000314159 > 2534463

Entradas de caso de teste separadas por vírgula:

0.9, 0.5, 0.4, 0.3, 0.25, 0.2, 0.1, 0.05, 0.03, 0.01, 0.005, 0.003, 0.001, 0.0005, 0.0003, 0.0001, 0.0314159, 0.00314159, 0.000314159

Isso é , então a resposta mais curta em bytes vence.

Stephen
fonte

Respostas:

18

Wolfram Language (Mathematica) , 34 bytes

Min[⌈.5/#+{-#,#}/2⌉^2+{1,-1}]&

Experimente online!

Explicação

O resultado deve estar no formato m2±1 por algummN . Resolvendo as inequaçõesm2+1mkemm21k , obtemosm1k22k em1+k22k respectivamente. Então o resultado émin(1k22k2+1,1+k22k21).

alefalpha
fonte
8

Python , 42 bytes

lambda k:((k-1/k)//2)**2+1-2*(k<1/k%2<2-k)

Experimente online!

Com base na fórmula de alefalpha , verificando explicitamente se estamos no m2-1 oum2+1 caso por meio da condiçãok<1/k%2<2-k.

O Python 3.8 pode salvar um byte com uma atribuição embutida.

Python 3.8 , 41 bytes

lambda k:((a:=k-1/k)//2)**2-1+2*(a/2%1<k)

Experimente online!

Estes venceram minha solução recursiva:

50 bytes

f=lambda k,x=1:k>.5-abs(x**.5%1-.5)>0 or-~f(k,x+1)

Experimente online!

xnor
fonte
4

05AB1E , 16 bytes

nD(‚>I·/înTS·<-ß

Porto de @alephalpha é resposta Mathematica , com inspiração @Sok ' s resposta Pyth , por isso certifique-se de upvote ambos!

Experimente online ou verifique todos os casos de teste .

Explicação:

n                 # Take the square of the (implicit) input
                  #  i.e. 0.05 → 0.0025
 D(‚              # Pair it with its negative
                  #  i.e. 0.0025 → [0.0025,-0.0025]
    >             # Increment both by 1
                  #  i.e. [0.0025,-0.0025] → [1.0025,0.9975]
     I·           # Push the input doubled
                  #  i.e. 0.05 → 0.1
       /          # Divide both numbers with this doubled input
                  #  i.e. [1.0025,0.9975] / 0.1 → [10.025,9.975]
        î         # Round both up
                  #  i.e. [10.025,9.975] → [11.0,10.0]
         n        # Take the square of those
                  #  i.e. [11.0,10.0] → [121.0,100.0]
          TS      # Push [1,0]
            ·     # Double both to [2,0]
             <    # Decrease both by 1 to [1,-1]
              -   # Decrease the earlier numbers by this
                  #  i.e. [121.0,100.0] - [1,-1] → [120.0,101.0]
               ß  # Pop and push the minimum of the two
                  #  i.e. [120.0,101.0] → 101.0
                  # (which is output implicitly)
Kevin Cruijssen
fonte
Legal, obrigado por vincular a resposta que tem a fórmula usada. Eu estava fazendo ginástica mental tentando descobrir a fórmula da sempre estranha sintaxe de 05AB1E.
Magic Octopus Urn
3

JavaScript (ES7),  51  50 bytes

f=(k,n)=>!(d=(s=n**.5)+~(s-.5))|d*d>k*k?f(k,-~n):n

Experimente online!

(falha nos casos de teste que exigem muita recursão)


Versão não recursiva,  57  56 bytes

k=>{for(n=1;!(d=(s=++n**.5)+~(s-.5))|d*d>k*k;);return n}

Experimente online!

Ou para 55 bytes :

k=>eval(`for(n=1;!(d=(s=++n**.5)+~(s-.5))|d*d>k*k;);n`)

Experimente online!

(mas este é significativamente mais lento)

Arnauld
fonte
3

J , 39 29 bytes

[:<./_1 1++:*:@>.@%~1+(,-)@*:

NB. Esta versão mais curta simplesmente usa a fórmula de @ alephalpha.

Experimente online!

39 bytes, força bruta original

2(>:@])^:((<+.0=])(<.-.)@(-<.)@%:)^:_~]

Experimente online!

Lida com todos os casos de teste

Jonah
fonte
3

Japonês , 18 16 bytes

-2 bytes de Shaggy

_=¬u1)©U>½-½aZ}a

Experimente online!

Somente ASCII
fonte
Pode ser mais curto usando a solução de Arnauld
somente ASCII
Ah ... é claro que eu poderia ter revertido isso:. Também isso %1 &&é desagradável, não tenho certeza se o uso da solução de Arnauld seria mais curto (talvez não)
somente ASCII
16 bytes reatribuindo Z¬u1para Zno início da função.
Shaggy
O outro método parece ser 26:[1,-1]®*U²Ä /U/2 c ²-Z} rm
somente ASCII em
3

Pitão, 22 21 bytes

hSm-^.Ech*d^Q2yQ2d_B1

Experimente online aqui ou verifique todos os casos de teste de uma vez aqui .

Outro porto da excelente resposta de alefhalpha , certifique-se de dar-lhes um voto positivo !

hSm-^.Ech*d^Q2yQ2d_B1   Implicit: Q=eval(input())
                  _B1   [1,-1]
  m                     Map each element of the above, as d, using:
           ^Q2            Q^2
         *d               Multiply by d
        h                 Increment
       c      yQ          Divide by (2 * Q)
     .E                   Round up
    ^           2         Square
   -             d        Subtract d
 S                      Sort
h                       Take first element, implicit print

Edit: Salvo um byte, graças a Kevin Cruijssen

Sok
fonte
1
Eu não sei Pyth, mas é possível criar [-1,1]em 3 bytes também, ou você precisa de um reverso adicional para que se torne 4 bytes? Se for possível em 3 bytes, você pode fazer isso e depois alterar *_dpara *de +dpara -d. Além disso, Pyth não tem um mínimo embutido, em vez de classificar e pegar primeiro?
Kevin Cruijssen 26/02
1
@KevinCruijssen A ordem dos dois elementos não é importante, pois estamos levando o mínimo, embora não consiga pensar em uma maneira de criar o par em 3 bytes. Uma boa dica para alterá-lo para isso - ... d, me economiza um byte! Obrigado
Sok
@KevinCruijssen Também não há, infelizmente, uma função mínima ou máxima de um byte: o (
Sok
1
Ah, claro. Você mapeia os valores, portanto, não importa se é [1,-1]ou não [-1,1]. Eu estava comparando a *de -dcom a minha resposta 05AB1E, onde não uso um mapa, mas posso subtrair / multiplicar uma matriz 2D de / com outra matriz 2D, portanto não preciso de um mapa. Ainda bem que pude ajudar a salvar um byte nesse caso. :) E obrigado pela inspiração para a minha resposta 05AB1E.
Kevin Cruijssen 26/02
3

Perl 6 , 34 33 29 bytes

-1 byte graças ao Grimy

{+(1...$_>*.sqrt*(1|-1)%1>0)}

Experimente online!

Nwellnhof
fonte
-1 byte substituindo >=por >. As raízes quadradas dos números inteiros são inteiros ou irracionais; portanto, o caso da igualdade provavelmente não pode acontecer.
Grimmy
1
@ Grimy Obrigado, isso parece ser permitido de acordo com as regras do desafio. (Embora os números de ponto flutuante sejam sempre racionais, é claro.)
nwellnhof
2

APL (Dyalog Unicode) , SBCS de 27 bytes

⌊/0~⍨¯1 1+2*⍨∘⌈+⍨÷⍨1(+,-)×⍨

Experimente online!

Trem monádico, tendo um argumento. Este é um porto de resposta dos alefalpha .

Quão:

⌊/0~⍨¯1 1+2*⍨∘⌈+⍨÷⍨1(+,-)×⍨  Monadic train

                         ×⍨  Square of the argument
                   1(+,-)    1 ± that (returns 1+k^2, 1-k^2)
                 ÷⍨          divided by
               +⍨            twice the argument
             ∘⌈              Ceiling
          2*⍨                Squared
     ¯1 1+                   -1 to the first, +1 to the second
  0~⍨                        Removing the zeroes
⌊/                           Return the smallest
J. Sallé
fonte
2

C # (compilador interativo do Visual C #) , 89 85 71 bytes

k=>{double n=2,p;for(;!((p=Math.Sqrt(n)%1)>0&p<k|1-p<k);n++);return n;}

Experimente online!

-4 bytes graças a Kevin Cruijssen!

Forma de Ignorância
fonte
Você pode salvar um byte colocando o n++no loop, para que ele -1possa ser removido do retorno:k=>{double n=1,p;for(;Math.Abs(Math.Round(p=Math.Sqrt(0d+n))-p)>k|p%1==0;n++);return n;}
Kevin Cruijssen
Além disso, o 0d+pode ser removido, não pode?
Kevin Cruijssen 26/02
@KevinCruijssen Sim, pode, eu esqueci o que njá era duplo
Modalidade de Ignorância
2

Java (JDK) , 73 70 bytes

k->{double i=1,j;for(;(j=Math.sqrt(++i)%1)==0|j>=k&1-j>=k;);return i;}

Experimente online!

-3 bytes graças a @ceilingcat

Sara J
fonte
@ceilingcat Neat, obrigado.
Sara J
1

MathGolf , 16 bytes

²_b*α)½╠ü²1bαm,╓

Experimente online!

Não é um grande fã desta solução. É uma porta da solução 05AB1E, baseada na mesma fórmula que a maioria das respostas está usando.

Explicação

²                  pop a : push(a*a)
 _                 duplicate TOS
  b                push -1
   *               pop a, b : push(a*b)
    α              wrap last two elements in array
     )             increment
      ½            halve
       ╠           pop a, b, push b/a
        ü          ceiling with implicit map
         ²         pop a : push(a*a)
          1        push 1
           b       push -1
            α      wrap last two elements in array
             m     explicit map
              ,    pop a, b, push b-a
               ╓   min of list
maxb
fonte
Todo símbolo é considerado um bytecódigo de golfe? Porque alguns de seus personagens requerem mais de um único byte. Eu não quero nit-pick, eu estou realmente me perguntando :)
schroffl
Boa pergunta! Um "byte" no golfe se refere ao tamanho mínimo de arquivo necessário para armazenar um programa. O texto usado para visualizar esses bytes pode ser qualquer bytes. Eu escolhi o Código para visualizar meus scripts, mas a parte importante são os bytes reais que definem o código-fonte.
maxb 27/02
Um bom exemplo do número de caracteres e do número de bytes ser diferente é esta resposta. Aqui, o 'ԓ'caractere é na verdade 2 bytes, mas o restante são caracteres de 1 byte.
maxb 27/02
1

Quarto (gforth) , 76 bytes

: f 1 begin 1+ dup s>f fsqrt fdup fround f- fabs fdup f0> fover f< * until ;

Experimente online!

Explicação

Inicia um contador em 1 e o incrementa em um loop. Cada iteração verifica se o valor absoluto da raiz quadrada do contador - o número inteiro mais próximo é menor que k

Código Explicação

: f                   \ start a new word definition
  1                   \ place a counter on the stack, start it at 1
  begin               \ start and indefinite loop
    1+                \ add 1 to the counter
    dup s>f           \ convert a copy of the counter to a float
    fsqrt             \ get the square root of the counter
    fdup fround f-    \ get the difference between the square root and the next closes integer
    fabs fdup         \ get the absolute value of the result and duplicate
    f0>               \ check if the result is greater than 0 (not perfect square)
    fover f<          \ bring k to the top of the float stack and check if the sqrt is less than k
    *                 \ multiply the two results (shorter "and" in this case)
  until               \ end loop if result ("and" of both conditions) is true
;                     \ end word definition
reffu
fonte
1

Gelatina , 13 bytes

Eu não consegui ficar nada mais tenso do que a mesma abordagem que os alefalpha
- voto a favor da resposta dele no Mathematica !

²;N$‘÷ḤĊ²_Ø+Ṃ

Experimente online!

Quão?

²;N$‘÷ḤĊ²_Ø+Ṃ - Link: number, n (in (0,1))
²             - square n        -> n²
   $          - last two links as a monad:
  N           -   negate        -> -(n²)
 ;            -   concatenate   -> [n², -(n²)]
    ‘         - increment       -> [1+n², 1-(n²)]
      Ḥ       - double n        -> 2n
     ÷        - divide          -> [(1+n²)/n/2, (1-(n²))/n/2]
       Ċ      - ceiling         -> [⌈(1+n²)/n/2⌉, ⌈(1-(n²))/n/2⌉]
        ²     - square          -> [⌈(1+n²)/n/2⌉², ⌈(1-(n²))/n/2⌉²]
          Ø+  - literal         -> [1,-1]
         _    - subtract        -> [⌈(1+n²)/n/2⌉²-1, ⌈(1-(n²))/n/2⌉²+1]
            Ṃ - minimum         -> min(⌈(1+n²)/n/2⌉²-1, ⌈(1-(n²))/n/2⌉²+1) 
Jonathan Allan
fonte
1

Japonês , 14 bytes

_=¬aZ¬r¹©U¨Z}a

Tente

_=¬aZ¬r¹©U¨Z}a     :Implicit input of integer U
_                  :Function taking an integer Z as an argument
 =                 :  Reassign to Z
  ¬                :    Square root of Z
   a               :    Absolute difference with
    Z¬             :      Square root of Z
      r            :      Round to the nearest integer
       ¹           :  End reassignment
        ©          :  Logical AND with
         U¨Z       :  U greater than or equal to Z
            }      :End function
             a     :Return the first integer that returns true when passed through that function
Shaggy
fonte