Nombre de valeurs entre l'entrée et le carré le plus haut suivant

9

Étant donné un nombre carré positif en entrée. Affiche le nombre de valeurs entre l'entrée et le carré supérieur suivant.

Exemple

Entrée: 1

Sortie: 2

Raison: les nombres 2 et 3 sont compris entre 1 et 4, le carré le plus haut suivant

Entrée: 4

Sortie: 4

Raison: les nombres 5, 6, 7, 8 sont compris entre 4 et 9

Shayne03
la source
1
Quelle plage de valeurs d'entrée devons-nous prendre en charge?
Martin Ender
16
Je pense que cela aurait été plus intéressant si l'entrée n'avait pas dû être un carré.
xnor
1
@xnor Hindsight, je suis définitivement d'accord.
Shayne03

Réponses:

8

Gelée , 2 octets

½Ḥ

Essayez-le en ligne!

Port de ma réponse Mathematica (prenez la racine carrée, puis doublez). Ceci est limité aux entrées qui peuvent être représentées exactement comme un nombre à virgule flottante. Si c'est un problème, la solution à trois octets ƽḤfonctionne pour les carrés arbitraires (que Dennis a publiés en premier, puis supprimés).

Martin Ender
la source
1
Oh, j'ai raté l'ensemble "l'entrée sera un carré" oups.
Jonathan Allan
1
@JonathanAllan Moi aussi. OMI spec bizarre.
Digital Trauma
Y a-t-il des carrés qui ne peuvent pas être représentés exactement en virgule flottante?
scatter
@Christian Bien sûr, les nombres à virgule flottante sont de taille fixe, il n'y a donc qu'un nombre fini de valeurs qu'ils peuvent représenter.
Martin Ender
@MartinEnder Dans ce cas, étant donné la prise en charge de Jelly pour les entiers de précision arbitraire et l'absence de limite supérieure dans la spécification, je vote qu'il devrait prendre en charge toutes les entrées valides.
scatter
12

Brain-Flak , 38 , 22 octets

{([[]](({})))}{}([]<>)

Essayez-le en ligne!

Je suis très fier de cette réponse. IMO, l'un de mes meilleurs golfs de cerveau-flak.

Comment ça marche?

Comme de nombreux autres utilisateurs l'ont souligné, la réponse est simplement sqrt (n) * 2 . Cependant, le calcul de la racine carrée dans brain-flak n'est pas très trivial. Comme nous savons que l'entrée sera toujours un carré, nous pouvons l'optimiser. Nous écrivons donc une boucle qui soustrait

1, 3, 5, 7, 9...

à partir de l'entrée et suivez le nombre de fois qu'il s'exécute. Une fois qu'il atteint 0, la réponse est simplement le dernier nombre que nous avons soustrait moins un.

À l'origine, j'avais poussé un compteur sur l'autre pile. Cependant, nous pouvons utiliser la pile principale elle-même comme compteur, en augmentant la hauteur de la pile.

#While TOS (top of stack, e.g. input) != 0:
{

    #Push:
    (

      #The negative of the height of the stack (since we're subtracting)
      [[]]

      #Plus the TOS pushed twice. This is like incrementing a counter by two
      (({}))
    )

#Endwhile
}

#Pop one value off the main stack (or in other words, decrement our stack-counter)
{}

#And push the height of the stack onto the alternate stack
([]<>)

En pseudocode python-y, il s'agit essentiellement de l'algorithme suivant:

l = [input]
while l[-1] != 0:   #While the back of the list is nonzero
    old_len = len(l)
    l.append(l[-1])
    l.append(l[-1] - old_len)

l.pop()

print(len(l))
James
la source
2
Mon cerveau a littéralement été ébranlé par ce beau travail.
Magic Octopus Urn
9

Mathematica, 8 octets

2Sqrt@#&

Essayez-le en ligne! (Utilisation des mathématiques.)

La différence entre n 2 et (n + 1) 2 est toujours 2n + 1 mais nous voulons juste les valeurs entre elles excluant les deux extrémités, ce qui est 2n .

Cela peut potentiellement être raccourci en 2#^.5&fonction des exigences de précision.

Martin Ender
la source
1
Que diriez-vous de 2√ # &?
chyanog
2

dc, 5

?2*vp

Essayez-le en ligne .


Auparavant, j'ai mal lu la question. Cette version fonctionne pour toute entrée entière positive, pas seulement pour les carrés parfaits:

dc, 12

?dv1+d*1-r-p

Essayez-le en ligne .

Traumatisme numérique
la source
2

Brain-Flak , 20 octets

Shout out to DJMcMayhem's amazing (albiet légèrement plus long) answer here

{({}()[({}()())])}{}

Essayez-le en ligne!

Explication

Ce code fonctionne en décomptant à partir du nombre carré par incréments impairs. Puisque chaque carré est la somme de nombres impairs consécutifs, cela atteindra 0 en n 1/2 étapes. L'astuce ici est que nous gardons une trace de nos étapes dans un nombre pair et utilisons un statique ()pour le compenser au nombre impair approprié. Puisque la réponse est 2n 1/2 , ce nombre pair sera notre réponse. Ainsi, lorsque nous atteignons 0, nous supprimons le zéro et notre réponse se trouve là, sur la pile.

Ad Hoc Garf Hunter
la source
1

Octave , 25 10 octets

@(n)2*n^.5

Essayez-le en ligne!

Enregistré 15 octets en utilisant l'approche bien meilleure de Martin. La gamme se compose d' 2*sqrt(n)éléments. La fonction fait exactement cela: Multiplie 2par la racine de l'entrée.

Stewie Griffin
la source
1

Gelée , 7 octets

½‘R²Ṫ_‘

Essayez-le en ligne!

Explication:

½‘R²Ṫ_    Input:              40
½         Square root         6.32455532...
 ‘        Increment           7.32455532...
  R       Range               [1, 2, 3, 4, 5, 6, 7]
   ²      Square              [1, 4, 9, 16, 25, 36, 49]
    Ṫ     Tail                49
     _‘   Subtract input+1    8
dispersion
la source
Btw, l'entrée sera toujours un carré lui-même.
Martin Ender
1
@JonathanAllan Fixed
scatter
@MartinEnder J'ai totalement mal lu le défi, alors ... dans l'intérêt de ne pas copier votre réponse (car il est évident maintenant pourquoi cela fonctionne), je vais laisser celle-ci en place.
scatter
1

JavaScript ES6, 10 octets

n=>n**.5*2

Essayez-le en ligne! Math.sqrtest assez long, c'est pourquoi nous utilisons**.5

Downgoat
la source
2
Alors c'est ES7 plutôt que ES6 ...
Neil
1

TI-Basic, 3 octets

2√(Ans

Approche la plus simple ...

Timtech
la source
1

05AB1E , 2 octets

Essayez-le en ligne!

Un autre port de la soumission de Martin Ender ...

débris spatiaux
la source
Bienvenue chez PPCG!
Erik the Outgolfer le
1

Ajouter ++ , 22 20 octets

+?
_
S
+1
^2
-1
-G
O

Essayez-le en ligne!

Voulez-vous savoir comment cela fonctionne? Eh bien, n'ayez crainte! Je suis là pour vous éduquer!

+?   Add the input to x (the accumulator)
_    Store the input in the input list
S    Square root
+1   Add 1
^2   Square
-1   Subtract 1
-G   Subtract the input
O    Output as number
caird coinheringaahing
la source
J'avais la même logique pour ma réponse QBIC d'origine, mais il y a un moyen plus court .
steenbergh
1

MATL ( 8 7 octets)

Je suis sûr que cela peut être réduit de manière significative (éditer: merci Luis), mais une solution naïve est:

X^QUG-q

Essayez-le en ligne!

Explication:

X^   % Take the square root of the input (an integer)
QU  % Square the next integer to find the next square
G-   % Subtract the input to find the difference
q    % Decrement solution by 1 to count only "in between" values.
DrQuarius
la source
1
Vous pouvez remplacer 2^ par U(et cela fonctionnait dans la version 20.1.1 , qui était la plus récente au moment du défi, donc la réponse serait éligible même selon notre ancienne norme)
Luis Mendo
1
Merci Luis! Je suis surpris que mon approche naïve n'ait gaspillé qu'un seul caractère par rapport au maître MATL. :)
DrQuarius
0

PHP , 44 octets

<?=count(range($argn,(sqrt($argn)+1)**2))-2;

Essayez-le en ligne!

Jörg Hülsermann
la source
0

Alice , 10 octets

2/*<ER
o@i

Essayez-le en ligne!

Explication

Encore une fois, calcule 2 sqrt (n) . La disposition économise deux octets sur la solution standard:

/o
\i@/2RE2*

Répartition du code, hors redirection de l'IP:

2    Push 2 for later.
i    Read all input.
i    Try reading more input, pushes "".
2    Push 2.
R    Negate to get -2.
E    Implicitly discard the empty string and convert the input to an integer.
     Then take the square root of the input. E is usually exponentiation, but
     negative exponents are fairly useless in a language that only understands
     integers, so negative exponents are interpreted as roots instead.
*    Multiply the square root by 2.
o    Output the result.
@    Terminate the program.
Martin Ender
la source
0

Aller , 56 octets

import."math"
func f(n float64)float64{return 2*Sqrt(n)}

Essayez-le en ligne!

totalement humain
la source
0

QBIC , 19 9 octets

?sqr(:)*2

Sauvegardé un tas en copiant l'approche de @ MartinEnder.

Pas de lien TIO pour QBIC, malheureusement.

Explication

?          PRINT
 sqr( )    The square root of
     :     the input
        *2 doubled
steenbergh
la source
0

Rétine , 21 octets

.+
$*
(^1?|11\1)+
$1

Essayez-le en ligne! Explication: fonctionne en prenant la racine carrée du nombre basé sur le solveur de nombres triangulaires de @ MartinEnder. Après avoir fait correspondre le nombre carré, $1est la différence entre le nombre carré et le nombre carré précédent, en unaire. Nous voulons la prochaine différence, mais exclusive, qui est juste 1 de plus. Pour ce faire, nous comptons le nombre de chaînes nulles dans $1.

Neil
la source
0

T-SQL, 22 octets

SELECT 2*SQRT(a)FROM t

L'entrée se fait via une table préexistante, selon nos normes .

BradC
la source
0

Java (OpenJDK 9) / JShell, 17 octets

n->2*Math.sqrt(n)

Essayez-le en ligne!

Remarque: Cela nécessiterait import java.util.function.*;d'obtenir IntFunction<T>en Java 8 ou Java 9, mais le java.util.functionpackage est importé par défaut dans JShell.

David Conrad
la source
0

Haskell, 9 octets

(*2).sqrt

Essayez-le en ligne

L'entrée et la sortie seront traitées comme des valeurs flottantes.

Antisthènes
la source
0

Noether, 7 octets

I.5^2*P

Essayez-le ici!

Exactement comme toutes les autres réponses: génère deux fois la racine carrée.

Beta Decay
la source