Distanza radice quadrata da numeri interi


20

Dato un numero decimale k, trova il numero intero più piccolo in modo ntale che la radice quadrata di nsia all'interno kdi un numero intero. Tuttavia, la distanza dovrebbe essere diversa da zero - nnon può essere un quadrato perfetto.

Dato kun numero decimale o una frazione (a seconda di quale sia la più facile per te), in modo tale 0 < k < 1, emetta il numero intero positivo più piccolo in modo ntale che la differenza tra la radice quadrata di ne il numero intero più vicino alla radice quadrata di nsia minore o uguale a kma diverso da zero .

Se iè il numero intero più vicino alla radice quadrata di n, stai cercando il primo ndove 0 < |i - sqrt(n)| <= k.

Regole

  • Non è possibile utilizzare l'implementazione insufficiente di una lingua di numeri non interi per banalizzare il problema.
  • Altrimenti, si può presumere che kciò non causerà problemi, ad esempio con arrotondamenti a virgola mobile.

Casi test

.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

Ingressi del test case separati da virgola:

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

Questo è , quindi vince la risposta più breve in byte.

Risposte:


18

Wolfram Language (Mathematica) , 34 byte

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

Provalo online!

Spiegazione

Il risultato deve essere della forma m2±1 per qualche mN . Risolvere le disequazioni m2+1mkemm21k, otteniamom1k22k em1+k22k rispettivamente. Quindi il risultato èmin(1k22k2+1,1+k22k21).


8

Python , 42 byte

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

Provalo online!

Basato sulla formula di alephalpha , controllando esplicitamente se siamo nel caso m21 o m2+1 tramite la condizione k<1/k%2<2-k.

Python 3.8 può salvare un byte con un'assegnazione in linea.

Python 3.8 , 41 byte

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

Provalo online!

Questi hanno battuto la mia soluzione ricorsiva:

50 byte

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

Provalo online!


4

05AB1E , 16 byte

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

Porto di @alephalpha 's Mathematica risposta , con ispirazione da @Sok ' s Pyth risposta , quindi assicuratevi di upvote due!

Provalo online o verifica tutti i casi di test .

Spiegazione:

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)

Bene, grazie per aver collegato la risposta che ha la formula utilizzata. Stavo facendo ginnastica mentale cercando di capire la formula dalla sintassi sempre strana di 05AB1E.
Magic Octopus Urn,

3

JavaScript (ES7),  51  50 byte

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

Provalo online!

(fallisce per i casi di test che richiedono troppa ricorsione)


Versione non ricorsiva,  57  56 byte

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

Provalo online!

O per 55 byte :

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

Provalo online!

(ma questo è significativamente più lento)


3

J , 39 29 byte

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

NB. Questa versione più breve usa semplicemente la formula di @ alephalpha.

Provalo online!

39 byte, originale, forza bruta

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

Provalo online!

Gestisce tutti i casi di test


3

Japt , 18 16 byte

-2 byte da Shaggy

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

Provalo online!


Potrebbe essere più breve usando la soluzione di Arnauld
ASCII, solo il


Oh ... certo che avrei potuto invertire questo: |. Anche questo %1 &&è brutto, non sono sicuro se l'utilizzo della soluzione di Arnauld sarebbe più breve (forse no)
ASCII il

16 byte riassegnando Z¬u1al Zall'inizio della funzione.
Shaggy,

L'altro metodo sembra essere 26:[1,-1]®*U²Ä /U/2 c ²-Z} rm
ASCII il

3

Pyth, 22 21 byte

hSm-^.Ech*d^Q2yQ2d_B1

Provalo online qui o verifica tutti i casi di test contemporaneamente qui .

Un altro porto dell'eccellente risposta di alephalpha , assicurati di dare loro un voto!

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

Modifica: salvato un byte, grazie a Kevin Cruijssen


1
Non conosco Pyth, ma è possibile creare anche [-1,1]in 3 byte o è necessario un ulteriore inverso in modo che diventi 4 byte? Se è possibile in 3 byte, è possibile farlo, quindi modificare *_din *de +din -d. Inoltre, Pyth non ha un minimo incorporato, invece di ordinare e prendere prima?
Kevin Cruijssen,

1
@KevinCruijssen L'ordine dei due elementi non è importante in quanto stiamo prendendo il minimo, anche se non riesco a pensare a un modo per creare la coppia in 3 byte. Una buona cattura per cambiarlo in - ... dperò, che mi fa risparmiare un byte! Grazie
Ho

@KevinCruijssen Inoltre, purtroppo, non esiste una funzione minima o massima a un byte: o (
Visto il

1
Ah certo. Si mappa sopra i valori, quindi non importa se è [1,-1]o [-1,1]. Stavo confrontando la *de -dcon la mia risposta 05AB1E, dove non uso una mappa, ma posso sottrarre / moltiplicare un array 2D da / con un altro array 2D, quindi non ho bisogno di una mappa. Sono contento di poter aiutare a salvare un byte in quel caso. :) E grazie per l'ispirazione per la mia risposta 05AB1E.
Kevin Cruijssen,

3

Perl 6 , 34 33 29 byte

-1 byte grazie a Grimy

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

Provalo online!


-1 byte sostituendo >=con >. Le radici quadrate di numeri interi sono interi o irrazionali, quindi il caso di uguaglianza non può essere dimostrato.
Grimmy,

1
@Grimy Grazie, questo sembra essere consentito secondo le regole della sfida. (Sebbene i numeri in virgola mobile siano sempre razionali, ovviamente.)
nwellnhof,

2

APL (Dyalog Unicode) , 27 byte SBCS

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

Provalo online!

Treno monadico prendendo una discussione. Questa è una porta della risposta di alephalpha .

Come:

⌊/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

2

C # (compilatore interattivo Visual C #) , 89 85 71 byte

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

Provalo online!

-4 byte grazie a Kevin Cruijssen!


È possibile salvare un byte inserendo il n++ciclo, quindi è -1possibile rimuoverlo dal ritorno: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,

Inoltre, 0d+può essere rimosso, no?
Kevin Cruijssen,

@KevinCruijssen Sì, ho dimenticato che nera già un doppio
Incarnazione dell'ignoranza,



1

MathGolf , 16 byte

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

Provalo online!

Non è un grande fan di questa soluzione. È una porta della soluzione 05AB1E, che si basa sulla stessa formula utilizzata dalla maggior parte delle risposte.

Spiegazione

²                  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

Ogni simbolo è considerato un bytegolf nel codice? Perché alcuni dei tuoi personaggi richiedono più di un singolo byte. Non intendo fare il pignolo, mi chiedo sinceramente :)
schroffl,

Buona domanda! Un "byte" nel golf si riferisce alla dimensione minima del file richiesta per memorizzare un programma. Il testo utilizzato per visualizzare tali byte può essere qualsiasi byte. Ho scelto il codice pagina per visualizzare i miei script, ma la parte importante sono i byte effettivi che definiscono il codice sorgente.
massimo

Un buon esempio del numero di caratteri e del numero di byte diversi è questa risposta. Qui, il 'ԓ'personaggio è in realtà 2 byte, ma il resto sono 1 byte.
massimo

1

Forth (gforth) , 76 byte

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

Provalo online!

Spiegazione

Inizia un segnalino a 1 e lo incrementa in un ciclo. Ogni iterazione controlla se il valore assoluto della radice quadrata del contatore - il numero intero più vicino è inferiore a k

Spiegazione del codice

: 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

1

Gelatina , 13 byte

Non sono riuscito a ottenere qualcosa di più teso dello stesso approccio di alephalpha
- vota la sua risposta Mathematica !

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

Provalo online!

Come?

²;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) 

1

Japt , 14 byte

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

Provalo

_=¬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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.