| Bytes | Lang | Time | Link |
|---|---|---|---|
| 008 | CASIO BASIC CASIO fx9750GIII | 250507T195318Z | madeforl |
| 013 | Excel | 240814T041602Z | Taylor R |
| 090 | Regex .NET | 210422T092809Z | Deadcode |
| 040 | Python 3.8 prerelease | 231204T231521Z | Stef |
| 031 | JavaScript Node.js | 231205T021912Z | l4m2 |
| 003 | Thunno 2 | 230624T174721Z | The Thon |
| 035 | Brainlove | 230409T210305Z | Kosatka |
| 459 | Nibbles | 230416T192659Z | Dominic |
| 014 | FRACTRAN | 230411T144753Z | Kosatka |
| 017 | Arturo | 230410T204802Z | chunes |
| 041 | Trilangle | 230410T152613Z | Bbrk24 |
| 016 | Lua | 230409T213040Z | bluswimm |
| 009 | J | 230409T022251Z | south |
| nan | 230407T134743Z | The Thon | |
| 046 | Charcoal | 200125T165223Z | Neil |
| 033 | Dart | 220820T065521Z | user1142 |
| 020 | Desmos | 220501T190758Z | naffetS |
| 058 | Clarion | 220501T132549Z | DylanG |
| 013 | Perl 5 p | 220428T053152Z | Xcali |
| 011 | Raku | 220428T060725Z | Jo King |
| 003 | Vyxal | 220428T014717Z | naffetS |
| 369 | MMIX | 210419T224219Z | NoLonger |
| 708 | Regex ECMAScript+?* | 200124T060321Z | Deadcode |
| 062 | Scratch | 210413T145249Z | Nolan |
| 004 | Canvas | 210225T235254Z | hakr14 |
| 024 | AppleSoft BASIC | 201130T110150Z | roblogic |
| 017 | Zsh | 201130T032755Z | roblogic |
| 027 | C gcc lm | 200124T163451Z | Noodle9 |
| 036 | Scratch 3.0 | 200124T082255Z | lyxal |
| 017 | AWK | 200128T035914Z | rootbeer |
| 003 | Husk | 200128T124723Z | user8505 |
| 011 | 8087 FPU machine code | 200124T190116Z | 640KB |
| 020 | Ruby | 200127T183447Z | G B |
| 032 | Haskell | 200127T153235Z | Potato44 |
| 017 | PHP | 200124T105333Z | Kaddath |
| 017 | Pari/GP | 200127T051205Z | alephalp |
| 015 | Jelly | 200124T083153Z | Nick Ken |
| 018 | Java 8 | 200124T083147Z | Kevin Cr |
| 003 | wx | 200124T104147Z | user8505 |
| 036 | C gcc | 200124T213253Z | S.S. Ann |
| 019 | R | 200125T193648Z | niko |
| 058 | JavaScript Node.js arbitraryprecision | 200124T162957Z | James |
| 007 | Mathematica | 200124T071922Z | RGS |
| 003 | 05AB1E | 200124T065903Z | lyxal |
| 008 | Burlesque | 200124T235008Z | DeathInc |
| 011 | cQuents | 200124T201215Z | Stephen |
| 017 | Python 3 | 200124T073243Z | RGS |
| 003 | Japt | 200124T085901Z | Shaggy |
| 067 | PowerShell | 200124T162329Z | AdmBorkB |
| 005 | dc | 200124T142348Z | user4180 |
| 103 | Whitespace | 200124T121039Z | Kevin Cr |
| 009 | CJam | 200124T103611Z | user8505 |
| 006 | Pyth | 200124T101820Z | user8505 |
| 005 | TIBASIC | 200124T095146Z | absolute |
| 012 | JavaScript ES6 | 200124T084535Z | Niphram |
| 004 | MathGolf | 200124T080707Z | Kevin Cr |
| 005 | APL Dyalog Extended | 200124T075120Z | Adá |
| 021 | Python 3 | 200124T064321Z | lyxal |
| 020 | Haskell | 200124T072514Z | RGS |
| 006 | Keg | 200124T062127Z | lyxal |
CASIO BASIC (CASIO fx-9750GIII), 8 bytes
?→N
Int N⌟√2
splendid
Excel, 13 Bytes
An anonymous function that takes input from A1 and outputs to the calling cell
=Int(A1/2^.5)
Excel VBA (32-bit), 12 Bytes
A golfed VBA version of the above excel solution which outputs uses integer division rather than typecasting to an integer.
?[A1]/2^.5\1
Regex (.NET), 106 90 bytes
(?=(x*)(\1x?))(x*).*$(?<=(?=(?<-5>x)*\1(?<=\3))^\2((?<=(?=\6?(\3)*(?<=(?=\3$)(x*))).*)x)*)
Takes its input in unary, as a sequence of x characters whose length represents the number. Returns its output in group \3.
By the very nature of this solution, its best-golfed form rounds arbitrarily – sometimes up, sometimes down. As such, it's more complicated to explain why it works, so I suggest reading the explanation of the 99 byte always-round-down solution below first. (This is oddly appropriate, given the order of operations in regexes that use right-to-left evaluated variable-length lookbehind.)
Compared to the always-round-down solution, this regex takes a shortcut. Instead of counting the number of times the anti-remainder was subtracted, it uses \$\lfloor{N\over 2}\rfloor\$ in place of that count. For even values of \$N\$ this is \$1\$ greater than the actual number of times the anti-remainder was subtracted (since it's never subtracted on the first iteration, and always subtracted on each subsequent iteration). As such, sometimes it doesn't change the resulting returned value \$M\$, but sometimes it results in finding an \$M\$ that is \$1\$ greater than the value it would otherwise have, i.e. \$\lceil{N\over\sqrt 2}\rceil\$ instead of \$\lfloor{N\over\sqrt 2}\rfloor\$.
For odd values of \$N\$, adding \$1\$ to that count effectively simulates the extra loop iteration done on \$\lfloor{N\over 2}\rfloor\$ in the always-round-down regex. The thing is, without actually doing that, we don't know whether the final value of the anti-remainder was greater than \$\lfloor{N\over 2}\rfloor\$ or not. Iff it was greater, then the anti-remainder subtraction count wouldn't have been incremented by \$1\$. Thus, by unconditionally effectively adding that \$1\$, we're doing the same thing for odd \$N\$ as we are for even \$N\$ – giving a return value of \$M\$ that is arbitrarily rounded up or down.
# tail = N = input number
(?=
(x*) # \1 = floor(N / 2)
(\1x?) # \2 = ceil(N / 2)
)
(x*) # \3 = guessed value of round(sqrt(N*N/2)) - may be rounded up or down
.*$ # tail = 0; head = N
(?<=
# head = 0
(?=
(?<-5>x)* # head += \5.capture_count
\1 # head += \1; this is 1 more than the actual number of times
# \6 was subtracted, which will change the \3 result for some
# even values of N from rounded-down to rounded-up. But for
# odd values of N, it simulates subtracting \6 from the last
# half-chunk, which is not covered in the loop we did. Note
# that depending on the final value of \6, it may be <= \1,
# in which case we'll get a rounded-down \3, or > \1, in which
# case we'll get a rounded-up \3.
(?<=\3) # assert head ≥ \3
)
^\2 # force the loop below to iterate \1 times; head = 0
(
(?<=
# tail = N
(?=
\6? # tail -= \6, if \6 is set
(\3)* # X = floor(tail / \3); tail -= \3*X; \5.capture_count += X;
# note that in practice, 0 ≤ X ≤ 1;
# Y = tail = remainder
(?<=
(?=\3$) # assert tail == \3
(x*) # \6 = \3 - Y
)
)
.* # tail = N
)
x # head -= 1; tail += 1
)*
)
Regex (.NET), 166 104 99 bytes
(?=(x*)(\1x?))(x*).*$(?<=(?=(?<-5>x)*(?<=\3))^\1(x(?<=(?=(\6)?(?<5>\3)*(?<=(?=\3$)(x*)))(.+\2)?))*)
Takes its input in unary, as a sequence of x characters whose length represents the number. Returns its output in group \3.
This solution always rounds down, returning \$M=\lfloor{N\over\sqrt 2}\rfloor\$. It accomplishes this by calculating \$M=\lfloor\sqrt{N^2\over 2}\rfloor\$, which is done by searching for the largest value of \$M\$ for which \$\lfloor{{N^2\over 2}/M}\rfloor\ge M\$. A regex can't directly operate on values larger than the input, so this must be done by looping multiple times over \$N\$ instead of directly operating on \$N^2\$.
For even values of \$N\$ this is straightforward enough; we just loop over \$N/2\$ copies of \$N\$, subtracting \$M\$ from it as many times as will fit (which will be \$0\$ or \$1\$), taking note of the remainder, and then subtracting the corresponding "anti-remainder" (the remainder's difference from \$M\$) at the beginning of the next loop iteration. Then the value of \$\lfloor{{N^2\over 2}/M}\rfloor\$ is the sum of the number of times \$M\$ was subtracted and the number of times the anti-remainder was subtracted. This works because for even \$N\$, we have \$\lfloor{N^2\over 2}\rfloor = \lfloor{N\over 2}\rfloor N\$.
For odd values of \$N\$, we do the above, but then do \$1\$ extra loop iteration, subtracting from \$\lfloor{N\over 2}\rfloor\$ instead of \$N\$. This works because for odd \$N\$, we have \$\lfloor{N^2\over 2}\rfloor = \lfloor{N\over 2}\rfloor N + \lfloor{N\over 2}\rfloor\$.
The number of times \$M\$ and the anti-remainder were subtracted are counted using the .NET feature of balanced groups, with (?<-5>x)* below.
# tail = N = input number
(?=
(x*) # \1 = floor(N / 2)
(\1x?) # \2 = ceil(N / 2)
)
(x*) # \3 = guessed value of floor(sqrt(N*N/2))
.*$ # tail = 0; head = N
(?<=
# head = 0
(?=
(?<-5>x)* # head += \5.capture_count
(?<=\3) # assert head ≥ \3
)
^\1 # force the loop below to iterate \2 times; head = 0
(
x # head -= 1; tail += 1
(?<=
# tail = \1 if N is odd and this is the last iteration, or N otherwise
(?=
(\6)? # if \6 is set: tail -= \6; \5.capture_count += 1
(?<5>\3)* # X = floor(tail / \3); tail -= \3*X; \5.capture_count += X;
# note that in practice, 0 ≤ X ≤ 1;
# Y = tail = remainder
(?<=
(?=\3$) # assert tail == \3
(x*) # \6 = \3 - Y
)
)
(.+\2)? # unless N is odd and this is the last iteration: head = 0; tail = N;
# else: head = \2; tail = \1
)
)*
)
This algorithm would not work on a regex flavor lacking variable-length lookbehind (and lookinto), because to loop more than once with a count that scales with \$N\$, the regex needs to subtract at least \$1\$ from \$tail\$ on each iteration (a zero-width loop iteration would result in terminating the loop). Without lookbehind/lookinto, it would be impossible to operate directly on \$N\$ after the first iteration. And once the current value of \$tail\$ went below the currently tested value of \$M\$, it would no longer be possible to operate on the value of \$M\$ in any way. Thus forward-declared backreferences, while required by this algorithm, aren't enough on their own.
So, a regex flavor with forward-declared backreferences but no variable-length lookbehind (or lookinto) could probably use an algorithm based on this one, but additional tricks would have to be used to emulate operating on larger numbers. I'm pretty sure it would not have to use the full-fledged algorithm of my ECMAScript solution, but I haven't worked out the details yet.
Regex (PCRE+(?^=)RME), 81 bytes
(?=(x*)(\1x?))(x*)(?^1=(x(?^=\8?(\3(?^=(\6?x)))*(x*)(?^3=\7(x*))))*)(?^3!\6?+\1x)
This is a port of the 90 byte .NET regex that rounds arbitrarily. It uses features available in PCRE, in addition to lookinto, a feature just added to RegexMathEngine. The fact that even after converting the use of .NET balancing groups to group-building, this regex is still 9 bytes smaller than the .NET version, demonstrates just how much expressibility is available with lookinto. The regex is also much easier understand in this form. (Lookinto is equal in power to variable-length lookbehind, i.e. there's nothing one can do that the other can't.)
# tail = N = input number
(?=
(x*) # \1 = floor(N / 2)
(\1x?) # \2 = ceil(N / 2)
)
(x*) # \3 = guess for round(sqrt(N*N/2)) - may be rounded up or down
(?^1= # Lookinto: tail = \1
(
x # tail -= 1
(?^= # Atomic lookinto: tail = N
\8? # tail -= \8, if \8 is set
# X = floor(tail / \3); tail -= \3*X; \6 += X;
# Note that in practice, 0 ≤ X ≤ 1
(
\3 # Assert tail ≥ \3; tail -= \3
(?^=
( # \6 = sum of the following:
\6? # previous value of \6 if set, 0 otherwise
x # 1
)
)
)* # Match the above as many times as possible, minimum 0
(x*) # \7 = tail = remainder = dividend % \3
(?^3= # Atomic lookinto: tail = \3
\7 # tail -= \7
(x*) # \8 = tail = \3 - \7
)
)
)* # Iterate as many times as possible, which will be exactly \1
)
(?^3! # Negative lookinto: tail = \3
# Assert \3 ≤ \6 + \1 (outside the negative lookinto), by asserting here
# that tail ≥ \6 + \1 + 1.
\6?+ # Take advantage of the fact that it is guaranteed \6 ≤ \3,
# meaning we don't have to use "(?(6)\6)".
\1x
# Note that \6 + \1 is 1 more than the actual number of times \8 was
# subtracted, which will change the \3 result for some even values of N
# from rounded-down to rounded-up. But for odd values of N, it simulates
# subtracting \8 from the last half-chunk, which is not covered in the loop
# we did. Note that depending on the final value of \8, it may be ≤ \1, in
# which case we'll get a rounded-down \3, or > \1, in which case we'll get
# a rounded-up \3.
)
Regex (PCRE+(?^=)RME), 123 113 96 95 bytes
(?=(x*)(\1x?))(x*)(?^=((?=(\2$|))x(?^=((?^=(\7?x))(^\10|\3))*\5(x*)(?^3=\9(x*))))*\1(?^7=\3)|$)
This is a port of the 99 byte .NET regex that rounds down.
# tail = N = input number
(?=
(x*) # \1 = floor(N / 2)
(\1x?) # \2 = ceil(N / 2)
)
(x*) # \3 = guess for floor(sqrt(N*N/2))
(?^= # Atomic lookinto: tail = N
(
(?=(\2$|)) # \5 = \2 if tail == \2, 0 otherwise;
# Note that if tail==\2, it means this is the last iteration
# if N is odd – but if N is even, this iteration will fail to
# match, as the last iteration will have already finished.
x # tail -= 1
(?^= # Atomic lookinto: tail = N
# if \10 is set: tail -= \10; \7 += 1;
# X = floor((tail - \5) / \3); tail -= \3*X; \7 += X;
# Note that in practice, 0 ≤ X ≤ 1
(
(?^=
( # \7 = sum of the following:
\7? # previous value of \7 if set, 0 otherwise
x # 1
)
)
(
^\10 # On the first iteration, if \10 is set, tail -= \10
|
\3 # Assert tail ≥ \3; tail -= \3
)
)* # Match the above as many times as possible, minimum 0
\5 # tail -= \5
(x*) # \9 = tail = remainder = dividend % \3
(?^3= # Atomic lookinto: tail = \3
\9 # tail -= \9
(x*) # \10 = tail = \3 - \9
)
)
)*
\1 # Assert tail ≥ \1, forcing the loop above to iterate \2 times
(?^7= # Lookinto: tail = \7
\3 # Assert \3 ≤ tail, i.e. \3 ≤ \7
)
|
$ # or N == 0, in which case the output = the input; this needs to be
# a special case because "(?^7=...)" cannot match if \7 is unset.
)
Python 3.8 (pre-release), 40 bytes
All other python answers are limited to integers smaller than about 10**16.
Here is one that works with all python integers, giving the correct result even for arbitrarily large integers. Always rounds down.
lambda x:isqrt(x*x//2)
from math import*
JavaScript (Node.js), 31 bytes
n=>(g=i=>i*i*2<n*n?g(++i):i)(0)
or BigInt version, anyway really large values impractical to run
Brute-force i till reach
Thunno 2, 3 bytes
2ƭ÷
Explanation
2ƭ÷ # Implicit input
# n
÷ # //
ƭ # sqrt( )
2 # 2
# Implicit output
Brainlove, 73 70 74 61 35 bytes
Because brainfuck is too hard
-3 bytes by myself, rearranging the memory and fixing some bugs
+4 bytes by myself, fixing an error
-13 bytes by myself
-26 bytes by myself, actually using the Brainlove features properly.
[$[->+<]!-]+>[<$[>[-~]<-]!++>>+<]>-
First computes the sum $$ S = \sum_{i=1}^n i = \frac{n(n+1)}{2} $$ and then the square root by finding the largest n for which $$ \sum_{i=1}^n 2i-1 = n^2 < S $$ The error is always $$ E= \sqrt{\frac{n(n+1)}{2}}- \frac{n}{\sqrt{2}} < \sqrt{\frac{(n+\frac{1}{2})^2}{2}} - \frac{n}{\sqrt{2}} = \frac{n+\frac{1}{2}-n}{\sqrt{2}} = \frac{\sqrt{2}}{4} $$ and it is counteracted by rounding down. It is not very golfed, since I'm not very familiar with golfing in Brainlove/brainfuck, any improvements welcome (or a bf version). It should theoretically work for unbound cells (arbitrary precision), but I didn't have an option to test that. The input and output are on position 0 and 2 on tape, respectively.
Nibbles, 4.5 bytes (9 nibbles)
^/*$$~-2
* # multiply
$ # input
$ # by itself,
/ # divide by
~ # 2,
^ -2 # and get the square-root
FRACTRAN, 15 14 fractions
-1 fraction thanks to my stupidity
22/35 14/55 1/14 1/22 15/2 14/5 143/119 91/187 3211/11 17/39 143/17 13/3 1/13 1/7
A port of my Brainlove answer. Accepts input as 2^n, returns as 19^n.
Trilangle, 41 bytes
<2?:2'L0'*<....'~~*22.L(-Sj2,7>~,!@..._.^
Outputs the larger number for even inputs, and the smaller number for odd inputs. Doesn't work for numbers larger than 4096 due to the integer limit, and for 4096 exactly it invokes UB but still outputs a valid result on my machine.
Try it in the online interpreter!
For the lack of floating-point numbers or a sqrt builtin, this computes the smallest nonnegative integer \$m\$ for which \$m^2 \ge n\left\lfloor\frac{n}{2}\right\rfloor\$. It turns out to be slightly more compact to add some bitwise complement instructions, replacing ++m with m = ~m; --m; m = ~m.
Thunno, \$ 3 \log_{256}(96) \approx \$ 2.47 bytes
2t,
2 pushes 2; t square roots it; , does integer division.
Charcoal, 46 bytes
≔⁰θ≔⁰ηF↨÷XN²¦²¦⁴«≔⁺×θ⁴ιθ≦⊗η¿›θ⊗η«≧⁻⊕⊗ηθ≦⊕η»»Iη
Try it online! Link is to verbose version of code. Performs an arbitrary-precision floored integer square root of n²/2 using the binary square root algorithm as demonstrated e.g. by Dr. Math. Explanation:
≔⁰θ≔⁰η
Set the accumulator and result to zero.
F↨÷XN²¦²¦⁴«
Loop over the base 4 digits of n²/2.
≔⁺×θ⁴ιθ
Multiply the accumulator by 4 and add the next digit.
≦⊗η
Double the result.
¿›θ⊗η«
If the accumulator is greater than double the doubled result, ...
≧⁻⊕⊗ηθ≦⊕η
... then subtract the incremented doubled result from the accumulator and increment the result.
»»Iη
Print the result once all of the digits have been processed.
Clarion, 58 bytes
Takes an integer input as the first command-line parameter, and displays the result in a Win32 MessageBox
Program
Map.
Code
Stop(Round((Command(1)/Sqrt(2)),1))
MMIX, 36 bytes (9 instrs)
3FFF0001 F60100FF 3B00003F
E0FFB5D4 E5FFF333 E6FFF9DE
E7FF6484 1E0000FF F8010000
Explanation
3FFF0001: SRU $255,$0,1
F60100FF: PUT rD,$255 Put input / 2 in hidiv register.
3B00003F: SLU $0,$0,1 Multiply input by \$2^{63}\$ (mod \$2^{64}\$).
E0FFB5D4: SETH $255,#B5D4
E5FFF333: INCMH $255,#F333
E6FFF9DE: INCML $255,#F9DE
E7FF6484: INCL $255,#6484 Set temp to \$\lfloor\sqrt2\mathop\cdot2^{63}\rfloor\$.
1E0000FF: DIVU $0,$0,$255 Divide \$2^{63}\$ times input by temp.¹
F8010000: POP 1,0 Return one register
The value of 0xb5d4f333f9de6484 I used for \$\sqrt2\mathop\cdot2^{63}\$ was hand-calculated by bisecting search.
DIVU $X,$Y,$Zsets$Xto the quotient ofrD * 2^64 + $Ydivided by$Z, rounding down (andrRto the remainder, though it isn't used).
Regex (ECMAScript+(?*)), 1169 929 887 853 849 708 bytes
-141 bytes by using the second form of shortened division, where \$A^2 > C\$
Regex was never designed to do mathematics. It has no concept of arithmetic. However, when input is taken in the form of bijective unary, as a sequence of identical characters in which the length represents a natural number, it is possible to do a wide range of operations, building up from the simple primitives available, which basically amount to addition, comparison, multiplication by a constant, and modulo. Everything must fit inside the input; it isn't possible to directly operate on numbers larger than that.
In ECMAScript regex, it's especially difficult (and therefore interesting) to do even some of the simplest of operations, because of the limitation that all backrefs captured in a loop are reset to empty at the beginning of each iteration – which makes it impossible to count anything directly. It's nevertheless possible to match prime numbers, powers of N, Nth powers, arbitrary multiplication and exponentiation, Fibonacci numbers, factorial numbers, abundant numbers, and more, much of which is demonstrated in my other answers.
One of the operations that turns out to be far more verbose than the rest is to "calculate an irrational number". I initially discussed this with teukon back in 2014. The only known way to do this is to emulate operations on numbers larger than the input, and probably the simplest way to do this is by working in a number base chosen based on what can fit into the input.
It wasn't until late 2018 that I finally set about to implementing the theory I had sketched in 2014. Implementing it involved adapting the multiplication algorithm to work with factors of 0, which turned out to golf rather elegantly. (The underlying multiplication algorithm is explained in this post.) The basic algorithm is this:
For input \$N\$, we want to calculate \$M=\lfloor{N\over\sqrt2}\rfloor\$. So we want the largest \$M\$ such that \$2M^2\le N^2\$.
If we take the "number base" to be \$k=\lceil\sqrt N\rceil\$ or \$\lfloor\sqrt N\rfloor\!+\!1\$, all multiplication operations \$m\cdot n\$ on \$0\leq m,n<k\$ are guaranteed to fit in the available space.
So if \$N=A k+B\$, where \$0\leq A,B\lt k\$, we can calculate \$N^2\$:
$$N^2=(A k+B)^2=A^2 k^2+2 A B k+B^2$$
We must then do division, modulo, and carry to bring \$A^2\$, \$2 A B\$, and \$B^2\$ back into the range of a base \$k\$ "digit". A similar operation is then done to calculate \$2 M^2\$ iterated over the decreasing consecutive possible values of \$M\$, using digit-by-digit comparison to test for \$2M^2\le N^2\$, until the first \$M\$ is found that passes the test.
So while the basic concept is simple enough, it adds up to a lot of calculations, and the regex is huge! And this is probably the simplest calculation of an irrational number that can be done in ECMAScript regex. (It is still unknown whether it's possible to calculate a transcendental number to arbitrary precision in regex.)
This regex uses molecular lookahead, a.k.a. non-atomic lookahead, represented as (?*...). Without this feature, it would be much harder (or at least much more verbose) to implement.
A choice I made early on, to depart from pure code golf by going for mathematical aesthetics, turned out to be a very interesting. I chose to use \$k=\lceil\sqrt N\rceil\$ because it has the very neat property of making the calculations fit perfectly into \$N\$ if \$N\$ is a perfect square, whereas \$k=\lfloor\sqrt N\rfloor\!+\!1\$ is basically chaotic for all inputs. They both yield the same final outputs, but the former is just cleaner. A few golfs later, this choice ended up net increasing the total length of the regex by 8 bytes, so I figured it was worth it. (This change is in the git version history.) But another golf later that day, unbeknownst to me, was actually dependent on that decision! The skipping of a divisibility check in a division calculation makes \$N=25\$ return the incorrect output of \$M=11\$ instead of \$M=17\$ if \$k=\lfloor\sqrt N\rfloor\!+\!1\$, but works perfectly for all inputs if \$k=\lceil\sqrt N\rceil\$. So the actual net change in byte length was zero! It was a purely aesthetic decision for over two years.
At the time I did not understand why that division optimization worked, but this is now fully explained thanks to H.PWiz. The shortened form of division used at the beginning of the calculation of \$M^2\$ gives the correct quotient \$B\$ when \$A+2 < 4B\$, where \$C\$ is the dividend and \$A\$ is the divisor. Previously I believed that it was only guaranteed to work when \$A \le B\$. [This is no longer used, due to the number base switch.]
And now, with the discovery of a second shortened form of division that gives the correct quotient when \$A^2 > C\$, I found a major opportunity to use it in this regex! It only works when \$k=\lfloor\sqrt N\rfloor\!+\!1\$, so now I've switched back to that number base. It's saving 141 bytes! It's oddly convenient that this just happened to exist and works perfectly for this exact use.
(?=(x(x*)).*(?=\1*$)\2+$)(?=(x\1)+(x?(x*)))(?=\4(x(x*?))\1+$)(?=.*(?=(?=\4*$)\4\5+$)(x*?)(?=\3*$)(x?(x*?))(\1+$|$\9))(?=.*(?=(?=\4*$)(?=\6*$)(?=\4\7+$)\6\5+$|$\4)(x*?)(?=\3*$)(x?(x*?))(\1+$|$\13))(?=.*(?=\12\12\9$)(x*?)(?=\3*$)(x?(x*?))(\1+$|$\17))(?*.*?(?=((?=\3*(x?(x*)))\21(x(x*?))\1+$)))(?=.*(?=\23*$)(\23\24+$))(?=.*(?=(?=\21*$)\21\22+$)(x*?)(?=\3*$)(x?(x*?))(\1+$|$\27))(?=.*(?=(?=\21*$)(?=\23*$)(?=\21\24+$)\23\22+$|$\21)(x*?)(?=\3*$)(x?(x*?))(\1+$|$\31))(?=.*(?=\30\30\27$)(x*?)(?=\3*$)(x?(x*?))(\1+$|$\35))(?=.*(?=\26\26)(?=\3*(x*))(\1(x)|))(?=.*(?=\34\34\40)(?=\3*(x*))(\1(x)|))(?=(?=(.*)\13\13\17(?=\6*$)\6\7+$)\44(x+|(?=.*(?!\16)\41|(?!.*(?!\38)\8).*(?=\16$)\41$))(\25\31\31\35){2}\43$)\20|xx?\B|
This regex is on GitHub with a full version history.
# Given an input number N in the domain ^x*$, this regex returns floor(N / sqrt(2))
(?=
(x(x*)) # \1 = will be the square root of the main number, rounded down; \2 = \1 - 1
.*(?=\1*$)
\2+$
)
# Step 1: Calculate N*N in base floor(sqrt(N))+1. Thanks to this choice of number base to work in, we'll be able to use the
# second shortened form of division in all places where the number base is the divisor, because it's guaranteed to give the
# correct quotient when the dividend is less than the squared divisor, and N itself is less than this. This form of division
# can be recognized by its lazy rather than greedy matching of the quotient, and only one divisibility test following that.
(?=(x\1)+(x?(x*))) # \3 = \1+1 = floor(sqrt(N))+1, the number base to work in; \4 = N % \3; \5 = \4-1, or 0 if \4==0
(?=
\4
(x(x*?)) # \6 = floor(N / \3); \7 = \6-1
\1+$
)
(?=
.*
(?=
(?=\4*$) # tail = \4 * \4
\4\5+$
)
(x*?)(?=\3*$) # \8 = (\4 * \4) % \3, the base-\3 digit in place 0 of the result for N*N
(x?(x*?)) # \9 = floor((\4 * \4) / \3); \10 = \9-1, or 0 if \9==0
(
\1+$
|
$\9 # must make a special case for \9==0, because \1 is nonzero
)
)
(?=
.*
(?=
(?=\4*$) # tail = \4 * \6; must do symmetric multiplication, because \4 is occasionally 1 larger than \6
(?=\6*$)
(?=\4\7+$)
\6\5+$
|
$\4 # must make a special case for \4==0, because \6 might not be 0
)
(x*?)(?=\3*$) # \12 = (\4 * \6) % \3
(x?(x*?)) # \13 = floor((\4 * \6) / \3); \14 = \13-1, or 0 if \13==0
(
\1+$
|
$\13 # must make a special case for \13==0, because \1 is nonzero
)
)
(?=
.*(?=\12\12\9$) # tail = 2 * \12 + \9
(x*?)(?=\3*$) # \16 = (2 * \12 + \9) % \3, the base-\3 digit in place 1 of the result for N*N
(x?(x*?)) # \17 = floor((2 * \12 + \9) / \3); \18 = \17-1, or 0 if \17==0
(
\1+$
|
$\17 # must make a special case for \17==0, because \1 is nonzero
)
) # {\6*\6 + 2*\13 + \17} = the base-\3 digit in place 2 of the result for N*N, which is allowed to exceed \3 and will always do so;
# Note that it will be equal to N iff N is a perfect square, because of the choice of number base.
# Step 2: Find the largest M such that 2*M*M is not greater than N*N
# Step 2a: Calculate M*M in base \3
(?*
.*? # Determine value of M with backtracking, starting with largest values first
(?=
( # \20 = M
(?=\3*(x?(x*)))\21 # \21 = M % \3; \22 = \21-1, or 0 if \21==0
(x(x*?)) # \23 = floor(M / \3); \24 = \23-1
\1+$
)
)
)
(?=
.*
(?=\23*$)
(\23\24+$) # \25 = \23 * \23
)
(?=
.*
(?=
(?=\21*$) # tail = \21 * \21
\21\22+$
)
(x*?)(?=\3*$) # \26 = (\21 * \21) % \3, the base-\3 digit in place 0 of the result for M*M
(x?(x*?)) # \27 = floor((\21 * \21) / \3); \28 = \27-1, or 0 if \27==0
(
\1+$
|
$\27 # must make a special case for \27==0, because \1 is nonzero
)
)
(?=
.*
(?=
(?=\21*$) # tail = \21 * \23; must do symmetric multiplication, because \21 is occasionally 1 larger than \23
(?=\23*$)
(?=\21\24+$)
\23\22+$
|
$\21 # must make a special case for \21==0, because \23 might not be 0
)
(x*?)(?=\3*$) # \30 = (\21 * \23) % \3
(x?(x*?)) # \31 = floor((\21 * \23) / \3); \32 = \31-1, or 0 if \31==0
(
\1+$
|
$\31 # must make a special case for \31==0, because \1 is nonzero
)
)
(?=
.*(?=\30\30\27$) # tail = 2 * \30 + \27
(x*?)(?=\3*$) # \34 = (2 * \30 + \27) % \3, the base-\3 digit in place 1 of the result for M*M
(x?(x*?)) # \35 = floor((2 * \30 + \27) / \3); \36 = \35-1, or 0 if \35==0
(
\1+$
|
$\35 # must make a special case for \35==0, because \1 is nonzero
)
) # {\25 + 2*\31 + \35} = the base-\3 digit in place 2 of the result for M*M, which is allowed to exceed \3 and will always do so
# Step 2b: Calculate 2*M*M in base \3
(?=
.*
(?=\26\26) # tail = 2*\26
(?=\3*(x*)) # \38 = (2*\26) % \3, the base-\3 digit in place 0 of the result for 2*M*M
(\1(x)|) # \40 = floor((2*\26) / \3) == +1 carry if {2*\26} does not fit in a base \3 digit
)
(?=
.*
(?=\34\34\40) # tail = 2*\34 + \40
(?=\3*(x*)) # \41 = (2*\34 + \40) % \3, the base-\3 digit in place 1 of the result for 2*M*M
(\1(x)|) # \43 = floor((2*\34 + \40) / \3) == +1 carry if {2*\34 + \40} does not fit in a base \3 digit
) # 2*(\25 + 2*\31 + \35) + \43 = the base-\3 digit in place 2 of the result for 2*M*M, which is allowed to exceed \3 and will always do so
# Step 2c: Require that 2*M*M <= N*N
(?=
(?=
(.*) # \44
\13\13\17
(?=\6*$) # tail = \6 * \6
\6\7+$
)
\44 # tail = {\6*\6 + 2*\13 + \17}; we can do this unconditionally because our digits in place 2 are always greater than those in places 0..1
(
x+
|
(?=
.*(?!\16)\41 # \41 < \16
|
(?!.*(?!\38)\8) # \38 <= \8
.*(?=\16$)\41$ # \41 == \16
)
)
(\25\31\31\35){2}\43$ # 2*(\25 + 2*\31 + \35) + \43
)
\20
|xx?\B| # handle inputs in the domain ^x{0,4}$
Regex (ECMAScript 2018), 861 720 bytes
This is a direct port of the 849 708 byte molecular lookahead version, using variable length lookbehind.
(?=(x(x*)).*(?=\1*$)\2+$)(?=(x\1)+(x?(x*)))(?=\4(x(x*?))\1+$)(?=.*(?=(?=\4*$)\4\5+$)(x*?)(?=\3*$)(x?(x*?))(\1+$|$\9))(?=.*(?=(?=\4*$)(?=\6*$)(?=\4\7+$)\6\5+$|$\4)(x*?)(?=\3*$)(x?(x*?))(\1+$|$\13))(?=.*(?=\12\12\9$)(x*?)(?=\3*$)(x?(x*?))(\1+$|$\17))(?=.*?(?=((?=\3*(x?(x*)))\21(x(x*?))\1+$))(?<=(?=(?=.*(?=\23*$)(\23\24+$))(?=.*(?=(?=\21*$)\21\22+$)(x*?)(?=\3*$)(x?(x*?))(\1+$|$\27))(?=.*(?=(?=\21*$)(?=\23*$)(?=\21\24+$)\23\22+$|$\21)(x*?)(?=\3*$)(x?(x*?))(\1+$|$\31))(?=.*(?=\30\30\27$)(x*?)(?=\3*$)(x?(x*?))(\1+$|$\35))(?=.*(?=\26\26)(?=\3*(x*))(\1(x)|))(?=.*(?=\34\34\40)(?=\3*(x*))(\1(x)|))(?=(?=(.*)\13\13\17(?=\6*$)\6\7+$)\44(x+|(?=.*(?!\16)\41|(?!.*(?!\38)\8).*(?=\16$)\41$))(\25\31\31\35){2}\43$))^.*))\20|xx?\B|
This regex is on GitHub.
# Given an input number N in the domain ^x*$, this regex returns floor(N / sqrt(2))
(?=
(x(x*)) # \1 = will be the square root of the main number, rounded down; \2 = \1 - 1
.*(?=\1*$)
\2+$
)
# Step 1: Calculate N*N in base floor(sqrt(N))+1. Thanks to this choice of number base to work in, we'll be able to use the
# second shortened form of division in all places where the number base is the divisor, because it's guaranteed to give the
# correct quotient when the dividend is less than the squared divisor, and N itself is less than this. This form of division
# can be recognized by its lazy rather than greedy matching of the quotient, and only one divisibility test following that.
(?=(x\1)+(x?(x*))) # \3 = \1+1 = floor(sqrt(N))+1, the number base to work in; \4 = N % \3; \5 = \4-1, or 0 if \4==0
(?=
\4
(x(x*?)) # \6 = floor(N / \3); \7 = \6-1
\1+$
)
(?=
.*
(?=
(?=\4*$) # tail = \4 * \4
\4\5+$
)
(x*?)(?=\3*$) # \8 = (\4 * \4) % \3, the base-\3 digit in place 0 of the result for N*N
(x?(x*?)) # \9 = floor((\4 * \4) / \3); \10 = \9-1, or 0 if \9==0
(
\1+$
|
$\9 # must make a special case for \9==0, because \1 is nonzero
)
)
(?=
.*
(?=
(?=\4*$) # tail = \4 * \6; must do symmetric multiplication, because \4 is occasionally 1 larger than \6
(?=\6*$)
(?=\4\7+$)
\6\5+$
|
$\4 # must make a special case for \4==0, because \6 might not be 0
)
(x*?)(?=\3*$) # \12 = (\4 * \6) % \3
(x?(x*?)) # \13 = floor((\4 * \6) / \3); \14 = \13-1, or 0 if \13==0
(
\1+$
|
$\13 # must make a special case for \13==0, because \1 is nonzero
)
)
(?=
.*(?=\12\12\9$) # tail = 2 * \12 + \9
(x*?)(?=\3*$) # \16 = (2 * \12 + \9) % \3, the base-\3 digit in place 1 of the result for N*N
(x?(x*?)) # \17 = floor((2 * \12 + \9) / \3); \18 = \17-1, or 0 if \17==0
(
\1+$
|
$\17 # must make a special case for \17==0, because \1 is nonzero
)
) # {\6*\6 + 2*\13 + \17} = the base-\3 digit in place 2 of the result for N*N, which is allowed to exceed \3 and will always do so;
# Note that it will be equal to N iff N is a perfect square, because of the choice of number base.
# Step 2: Find the largest M such that 2*M*M is not greater than N*N
# Step 2a: Calculate M*M in base \3
(?=
.*? # Determine value of M with backtracking, starting with largest values first
(?=
( # \20 = M
(?=\3*(x?(x*)))\21 # \21 = M % \3; \22 = \21-1, or 0 if \21==0
(x(x*?)) # \23 = floor(M / \3); \24 = \23-1
\1+$
)
)
(?<=
(?=
(?=
.*
(?=\23*$)
(\23\24+$) # \25 = \23 * \23
)
(?=
.*
(?=
(?=\21*$) # tail = \21 * \21
\21\22+$
)
(x*?)(?=\3*$) # \26 = (\21 * \21) % \3, the base-\3 digit in place 0 of the result for M*M
(x?(x*?)) # \27 = floor((\21 * \21) / \3); \28 = \27-1, or 0 if \27==0
(
\1+$
|
$\27 # must make a special case for \27==0, because \1 is nonzero
)
)
(?=
.*
(?=
(?=\21*$) # tail = \21 * \23; must do symmetric multiplication, because \21 is occasionally 1 larger than \23
(?=\23*$)
(?=\21\24+$)
\23\22+$
|
$\21 # must make a special case for \21==0, because \23 might not be 0
)
(x*?)(?=\3*$) # \30 = (\21 * \23) % \3
(x?(x*?)) # \31 = floor((\21 * \23) / \3); \32 = \31-1, or 0 if \31==0
(
\1+$
|
$\31 # must make a special case for \31==0, because \1 is nonzero
)
)
(?=
.*(?=\30\30\27$) # tail = 2 * \30 + \27
(x*?)(?=\3*$) # \34 = (2 * \30 + \27) % \3, the base-\3 digit in place 1 of the result for M*M
(x?(x*?)) # \35 = floor((2 * \30 + \27) / \3); \36 = \35-1, or 0 if \35==0
(
\1+$
|
$\35 # must make a special case for \35==0, because \1 is nonzero
)
) # {\25 + 2*\31 + \35} = the base-\3 digit in place 2 of the result for M*M, which is allowed to exceed \3 and will always do so
# Step 2b: Calculate 2*M*M in base \3
(?=
.*
(?=\26\26) # tail = 2*\26
(?=\3*(x*)) # \38 = (2*\26) % \3, the base-\3 digit in place 0 of the result for 2*M*M
(\1(x)|) # \40 = floor((2*\26) / \3) == +1 carry if {2*\26} does not fit in a base \3 digit
)
(?=
.*
(?=\34\34\40) # tail = 2*\34 + \40
(?=\3*(x*)) # \41 = (2*\34 + \40) % \3, the base-\3 digit in place 1 of the result for 2*M*M
(\1(x)|) # \43 = floor((2*\34 + \40) / \3) == +1 carry if {2*\34 + \40} does not fit in a base \3 digit
) # 2*(\25 + 2*\31 + \35) + \43 = the base-\3 digit in place 2 of the result for 2*M*M, which is allowed to exceed \3 and will always do so
# Step 2c: Require that 2*M*M <= N*N
(?=
(?=
(.*) # \44
\13\13\17
(?=\6*$) # tail = \6 * \6
\6\7+$
)
\44 # tail = {\6*\6 + 2*\13 + \17}; we can do this unconditionally because our digits in place 2 are always greater than those in places 0..1
(
x+
|
(?=
.*(?!\16)\41 # \41 < \16
|
(?!.*(?!\38)\8) # \38 <= \8
.*(?=\16$)\41$ # \41 == \16
)
)
(\25\31\31\35){2}\43$ # 2*(\25 + 2*\31 + \35) + \43
)
)
^.*
)
)
\20
|xx?\B| # handle inputs in the domain ^x{0,4}$
Regex (ECMAScript)
I have not yet ported this algorithm to basic ECMAScript. One way to do it would be to use \$k=\lceil\sqrt[\uproot{1}3]N\rceil\$ as the number base, and calculate:
$$N^2=(A k^2+B k+C)^2=A^2 k^4 + 2 A B k^3 + (2 A C + B^2)k^2 + 2 B C k + C^2$$
Another way would be to stick with \$k=\lceil\sqrt N\rceil\$, capture \$M\$ encoded into two or more backrefs, and emulate the existing calculations within the smaller available space. I'm not sure which way would be more concise. Either way, I expect the regex would roughly double in length.
Scratch, 62 bytes
when gf clicked
ask()and wait
say(round((answer)/([sqrt v]of(2
AppleSoft BASIC, 24 bytes
The (js) emulator allows for huge integers (and is way too fast), but a real Apple II would have overflowed at 1000000. Integer values have a fixed range of -32767 to 32767.
The 24-byte "function":
9?INT(N/SQR(2)):RETURN
The full test program:
0DATA0,1,2,3,4,5,10,32,500,1000,1000000,186444716,1000000000,2147483647,3037000499
1FORI=1TO15:READN:GOSUB9:NEXT:END
9?INT(N/SQR(2)):RETURN
Zsh, 17 bytes
Built-ins only. No need to use zmodload zsh/mathfunc as basic math capabilities of zsh are pretty decent. Correct up to 4503599627370496, after that it overflows. Try it Online!
<<<$[(n/2**.5)^0]
C (gcc) -lm, 23 \$\cdots\$ 50 27 bytes
Saved 6 bytes thanks to a'_'!!!
Added 38 bytes to fix type error kindly pointed out by S.S. Anne.
Saved 3 bytes thanks to rtpax!!!
Saved a whopping 23 bytes thanks to an idea from ErikF!!!
#define f(n)ceil(n/sqrt(2))
Scratch 3.0, 7 5 blocks/62 36 bytes
As SB Syntax:
define(n
say(round((n)/([sqrt v]of(2
It's always fun to usual visual languages! At least I have built-ins this time.
-26 bytes thanks to @att
Husk, 3 bytes
÷√2
Explanation
√2 Find the square root of 2 (pretty straightforward).
÷ ⁰ Floor division with the input.
Note that the numerator is the input, NOT the square root of 2.
8087 FPU machine code, 11 bytes
Unassembled listing:
D9 E8 FLD1 ; load a 1 constant (need to make a 2)
D8 C0 FADD ST, ST(0) ; ST = 1+1 = 2
D9 FA FSQRT ; ST = SQRT(2)
DE F9 FDIVP ST(1), ST ; ST = N / ST
DF 1F FISTP QWORD PTR [BX] ; *BX = ROUND(ST)
C3 RET ; return to caller
Input in ST0, as a 80-bit extended precision value, output to QWORD PTR [BX].
Floating point operations done in x87 math coprocessor hardware with 80-bit extended precision. Correctly calculates values of N up to 13043817825332782211, after which the result will exceed \$2^{63}-1\$ (overflowing a 64-bit signed integer return variable).
Example test program with I/O:
(Test program now with 64 bit I/O routines thx to suggestions from @PeterCordes)
Thanks to @PeterCordes for the suggestion take input in ST(0), saving 2 bytes.
Haskell, 32 bytes
h n=last[x|x<-[0..n],2*x^2<=n^2]
This submission works for arbitrary precision integers, but is very slow because it checks every number \$x\$ below \$n\$ for whether it satisfies the equation \$ 2x^2\leq n^2\$, then takes the last one. Thus the runtime is exponential in the bit length of the input number.
Haskell, 64 bytes
g n|n<2=n|s<-g(n`div`4)*2=last$s+1:[s|(s+1)^2>n]
f n=g$n*n`div`2
This submission also works for arbitrary precision integer and is much faster (all test cases instantaneous). It is based on the digit-by-digit integer square root listed on Wikipedia.
PHP, 17 bytes
<?=$argn/2**.5|0;
Uses @Niphram's truncate method (which in PHP also has the ability to convert the float to an int)
I know it's trendy to say PHP is to be hated, but I kinda came to like its oddities, and it gives me a chance to add an original answer
EDIT: saved 4 bytes using <?= php tag (no need to echo)
EDIT2: basically it's just a port of @Niphram's answer now
Jelly, 15 bytes
³²:2_²:Ẹ¡:2+µƬṪ
An arbitrary precision Jelly answer that uses the Newton-Raphson method to find the correct answer. Uses only integer arithmetic operations so the intermediate values are all Python big ints rather than getting cast as floats which would lose precision. The integer result equates to the floor of what would be the floating point answer.
A full program that takes a (possibly negative) integer as its argument and returns an integer.
Now correctly handles inputs of 0 and 1; previously threw an error because of division of 0 by 0 being impermissible for integers.
Useful comment from @PeterCordes about efficiency of this method and some detail on Python’s big integer implementation:
Newton-Raphson converges quickly, like twice as many correct bits per iteration, given a decent first estimate. e.g. one step refines a 12-bit-precision rsqrtps(x) FP result into nearly 24-bit. (In this case apparently the original input is close enough). You only pay Python interpreter overhead per operation, not per limb (aka chunk) of a very long number; extended-precision division is not cheap but it is implemented in C on chunks of 2^30 stored in an array of 32-bit integers. (I forget if Python uses 64-bit on 64-bit machines.)
Explanation
µƬ | Do the following as a monad until no new values seen, collecting up the intermediate values:
³ | - Original argument to program
² | - Squared
:2 | - Integer divide by 2
_² | - Subtract current estimate squared
Ẹ¡ | - If non-zero:
: | - Integer divide by current estimate
:2 | - Integer divide by 2
+ | - Add to current estimate
Ṫ | Finally, take the tail of the list of estimates
Note Ẹ¡ is literally repeat the number of times indicated by applying the any function to current value, but it is effectively used here to mean if non-zero.
A much shorter answer that is only accurate to float precision is:
Jelly, 4 bytes
2½:@
Java 8, 18 bytes
n->n/=Math.sqrt(2)
Limited to a maximum of \$9{,}223{,}372{,}036{,}854{,}775{,}807\$ (signed 64-bit integer).
Explanation:
n-> // Method with long as both parameter and return-type
n/= // Divide the input by:
Math.sqrt(2) // The square-root of 2
// The `/=` sets the divided result back to `n`, which implicitly casts the resulting double
// back to long. This saves bytes in comparison to `n->(long)(n/Math.sqrt(2))`
Java 9, 76 74 bytes
n->n.divide(n.valueOf(2).sqrt(new java.math.MathContext(n.precision())),4)
-2 bytes thanks to @OlivierGrégoire.
Arbitrary I/O and precision.
Explanation:
n-> // Method with BigDecimal as both parameter and return-type
n.divide( // Divide the input by:
n.valueOf(2) // Push a BigDecimal with value 2
.sqrt( // Take the square-root of that
new java.math.MathContext(n.precision())),
// with the same precision as the input
4) // With rounding mode HALF_UP
wx, 3 bytes
It's W, with just one instruction added: square root. Turns out that this is very useful! (P.S. the built-in was added before the challenge.)
2Q/
Explanation
2Q % Find the square root of 2
a / % Divide the input by it
% If one operand is an integer,
% the program will automatically
% try to trunctuate to an integer
C (gcc), Precision limited by built-in types, 42 36 bytes
__int128 f(__int128 n){n/=sqrtl(2);}
Floor for the most part but the last output is ceiling.
Uses GCC's __int128 type: shorter in text length than unsigned long, can represent every value in unsigned long, and determined to not be a builtin type. Stay tuned for 6-8 weeks to get arbitrary precision.
-6 bytes thanks to Peter Cordes!
JavaScript (Node.js) arbitrary-precision, 62 58 bytes
Thanks to Arnauld saving 4 bytes
(n,v=n*n/2n,m=x=>x-(y=v/x+x>>1n)>>1n?m(y):y)=>v<2n?v:m(1n)
This is sqrt(n*n/2) after golfing the iterative Newton method sqrt() from https://stackoverflow.com/a/53684036.
Mathematica, 17 14 13 bytes / 12 7 characters
⌊#/√2⌋&
-3 bytes because Mathematica accepts the char √, which I copied from this MathGolf answer.
-1 byte, -5 characters, as per @Mark S. suggestion, by using ⌊⌋.
For just one more byte (but 5 more characters) I can always round to the nearest integer with
Round[#/√2]&
05AB1E, 3 bytes
2t÷
-1 byte thanks to @Grimmy
Yet another port of my Keg answer for the sake of completion.
Explained
2t÷
2t # Push the square root of two
÷ # Integer division
🍟🍅
Still no ketchup.
Burlesque, 8 bytes
@2r@|/R_
@2 # Push 2.0
r@ # Sqrt it
|/ # Cast input to number, divide input by 2
R_ # Round to nearest
cQuents, 11 bytes
#|1:A_/2^.5
Explanation
#|1 output the first term
: mode: sequence
each term equals:
A input
_/ //
2 2
^ **
.5 .5
Python 3, 19 17 bytes
A different python answer
lambda x:x//2**.5
-2 bytes thanks to @Mukundan
Japt, 3 bytes
z2q
z is the floor division method and q is the nth-root method, defaulting to square root when it's not passed an argument.
PowerShell, 67 bytes
param([uint64]$n)($n/[math]::Sqrt(2)).ToString("G17")-replace'\..*'
.NET (and thus, by extension, PowerShell) doesn't have a BigDecimal, so we're limited to Double or Decimal. However, the [math]::Sqrt() function only works on Double, so there we're stuck. So far, so standard. We then specify precision with G17, which successfully round-trips to give us 17 digits of precision on our Double, so we can pass everything but the last three test cases. We finish that off with a simple truncation -replace.
dc, 5 bytes
d*2/v
Takes input and leaves output on the stack.
dc automatically uses arbitrary-precision integers, and supports a precision of 0 decimal places by default, thus automatically "rounding". So taking the square-root of 2 will yield 1. Instead, this solution squares the input, by duplicating it and * multiplying both the items at the top of the stack, / dividing it by 2 (reverse-polish) and takes the v square root of that.
Whitespace, 122 103 bytes
[S S T T N
_Push_-1][S S S N
_Push_0][S N
S _Dupe_0][T N
T T _Read_STDIN_as_integer][T T T _Retrieve_input][S N
S _Dupe_input][N
T S T N
_If_0_Jump_to_Label_ZERO][N
S S N
_Create_Label_LOOP][S N
T _Swap_top_two][S S S T N
_Push_1][T S S S _Add][S N
T _Swap_top_two][S N
S _Dupe_input][S N
S _Dupe_input][T S S N
_Multiply][S T S S T S N
_Copy_0-based_2nd_n][S N
S _Dupe_n][T S S N
_Multiply][S S S T S N
_Push_2][T S S N
_Multiply][S N
T _Swap_top_two][T S S T _Subtract][N
T T N
_If_neg_Jump_to_Label_LOOP][S N
T _Swap_top_two][N
S S T N
_Create_Label_ZERO][T N
S T _Print_as_integer]
Letters S (space), T (tab), and N (new-line) added as highlighting only.
[..._some_action] added as explanation only.
Try it online (with raw spaces, tabs and new-lines only).
Output is rounded up.
Inspired by the following mentioned in @Deadcode's Regex answer:
For input \$N\$, we want to calculate \$M=\left\lfloor\frac{N}{\sqrt2}\right\rfloor\$. So we want the largest \$M\$ such that \$2M^2<N^2\$.
EDIT: My program now implements \$2M^2\leq N^2\$ instead to save 19 bytes (\$\lt\$ vs \$\leq\$ is irrelevant, otherwise \$\sqrt{2}\$ would be rational). Although I see @Deadcode edited his Regex answer and he's actually using \$\leq\$ as well.
Explanation in pseudo-code:
Integer n = -1
Integer input = STDIN as integer
Start LOOP:
n = n + 1
If(n*n*2 - input*input < 0):
Go to next iteration of LOOP
Print n
(exit program with error since no exit is defined)
Example program flow (input 4):
Command Explanation Stack Heap STDIN STDOUT STDERR
SSTTN Push -1 [-1]
SSSN Push 0 [-1,0]
SNS Duplicate 0 [-1,0,0]
TNTT Read STDIN as integer [-1,0] [{0:4}] 4
TTT Retrieve from heap #0 [-1,4] [{0:4}]
SNS Duplicate 4 [-1,4,4] [{0:4}]
NTSTN If 0: Jump to Label ZERO [-1,4,4] [{0:4}]
(^ workaround for input=0, since it would otherwise output -1)
NSSSN Create Label LOOP [-1,4] [{0:4}]
SNT Swap top two [4,-1] [{0:4}]
SSSTN Push 1 [4,-1,1] [{0:4}]
TSSS Add top two: -1+1 [4,0] [{0:4}]
SNT Swap top two [0,4] [{0:4}]
SNS Duplicate 4 [0,4,4] [{0:4}]
SNS Duplicate 4 [0,4,4,4] [{0:4}]
TSSN Multiply top two: 4*4 [0,4,16] [{0:4}]
STSSTSN Copy 0-based 2nd [0,4,16,0] [{0:4}]
SNS Duplicate 0 [0,4,16,0,0] [{0:4}]
TSSN Multiply top two: 0*0 [0,4,16,0] [{0:4}]
SSSTSN Push 2 [0,4,16,0,2] [{0:4}]
TSSN Multiply top two: 0*2 [0,4,16,0] [{0:4}]
SNT Swap top two [0,4,0,16] [{0:4}]
TSST Subtract top two: 0-16 [0,4,-16] [{0:4}]
NTTN If neg: Jump to label LOOP [0,4] [{0:4}]
SNT Swap top two [4,0] [{0:4}]
SSSTN Push 1 [4,0,1] [{0:4}]
TSSS Add top two: 0+1 [4,1] [{0:4}]
SNT Swap top two [1,4] [{0:4}]
SNS Duplicate 4 [1,4,4] [{0:4}]
SNS Duplicate 4 [1,4,4,4] [{0:4}]
TSSN Multiply top two: 4*4 [1,4,16] [{0:4}]
STSSTSN Copy 0-based 2nd [1,4,16,1] [{0:4}]
SNS Duplicate 1 [1,4,16,1,1] [{0:4}]
TSSN Multiply top two: 1*1 [1,4,16,1] [{0:4}]
SSSTSN Push 2 [1,4,16,1,2] [{0:4}]
TSSN Multiply top two: 1*2 [1,4,16,2] [{0:4}]
SNT Swap top two [1,4,2,16] [{0:4}]
TSST Subtract top two: 2-16 [1,4,-14] [{0:4}]
NTTN If neg: Jump to label LOOP [1,4] [{0:4}]
SNT Swap top two [4,1] [{0:4}]
SSSTN Push 1 [4,1,1] [{0:4}]
TSSS Add top two: 1+1 [4,2] [{0:4}]
SNT Swap top two [2,4] [{0:4}]
SNS Duplicate 4 [2,4,4] [{0:4}]
SNS Duplicate 4 [2,4,4,4] [{0:4}]
TSSN Multiply top two: 4*4 [2,4,16] [{0:4}]
STSSTSN Copy 0-based 2nd [2,4,16,2] [{0:4}]
SNS Duplicate 2 [2,4,16,2,2] [{0:4}]
TSSN Multiply top two: 2*2 [2,4,16,4] [{0:4}]
SSSTSN Push 2 [2,4,16,4,2] [{0:4}]
TSSN Multiply top two: 4*2 [2,4,16,8] [{0:4}]
SNT Swap top two [2,4,8,16] [{0:4}]
TSST Subtract top two: 8-16 [2,4,-8] [{0:4}]
NTTN If neg: Jump to label LOOP [2,4] [{0:4}]
SNT Swap top two [4,2] [{0:4}]
SSSTN Push 1 [4,2,1] [{0:4}]
TSSS Add top two: 2+1 [4,3] [{0:4}]
SNT Swap top two [3,4] [{0:4}]
SNS Duplicate 4 [3,4,4] [{0:4}]
SNS Duplicate 4 [3,4,4,4] [{0:4}]
TSSN Multiply top two: 4*4 [3,4,16] [{0:4}]
STSSTSN Copy 0-based 2nd [3,4,16,3] [{0:4}]
SNS Duplicate 3 [3,4,16,3,3] [{0:4}]
TSSN Multiply top two: 3*3 [3,4,16,9] [{0:4}]
SSSTSN Push 2 [3,4,16,9,2] [{0:4}]
TSSN Multiply top two: 9*2 [3,4,16,18] [{0:4}]
SNT Swap top two [3,4,18,16] [{0:4}]
TSST Subtract top two: 18-16 [3,4,2] [{0:4}]
NTTN If neg: Jump to label LOOP [3,4] [{0:4}]
SNT Swap top two [4,3] [{0:4}]
NSSTN Create Label ZERO [4,3] [{0:4}]
TNST Print as integer to STDOUT [4] [{0:4}] 3
error
Program stops with an error because no exit is defined.
CJam, 9 bytes
CJam has mQ, but unfortunately it trunctuates to an integer ... Another port of Lyxal's answer.
q~2 .5#/i
Explanation
q~ e# Take input & evaluate
2 e# Take 2 to the power of ...
.5# e# ... 0.5 (equal to square root)
/ e# Divide the input by it
i e# Convert to integer
Pyth, 6 bytes
The division auto-casts the number to a decimal!? (In seriousness, is there a square root function in Pyth?)
/Q@2 2
Explanation
@2 2 to the power of
2 1/2 (effectively calculates math.sqrt(2))
/Q Divide the (evaluated) input by that number
TI-BASIC, 5 bytes
int(Ans√(2⁻¹
Built-ins are great.
Input is a number in Ans.
Output is what is specified in the challenge.
Explanation:
√(2⁻¹ ;get the square root of 1/2
Ans ;get the input (Ans)
;implicit multiplication
int( ;truncate
;implicit print of Ans
Note: TI-BASIC is a tokenized language. Character count does not equal byte count.
MathGolf, 4 bytes
2√/i
Explanation:
2√ # Take the square-root of 2
/ # Divide the (implicit) input-integer by this
i # Cast it to an integer, truncating any decimal values
# (after which the entire stack joined together is output implicitly as result)
APL (Dyalog Extended), 5 bytesSBCS
Full program. Prompts stdin for zero or more numbers.
⌈⎕÷√2
⌈ ceiling of
⎕ console input
÷ divided by
√ the square root of
2 two
Python 3, 22 21 bytes
lambda x:int(x/2**.5)
-1 byte thanks to @RGS. Thanks for reminding me that implicit decimals exist
Just a port of my Keg answer. Nothing special here.
Keg, 6 bytes
21½Ë/ℤ
This defines the function f as:
- Taking a single parameter, then
- Calculating the square root of 2 by raising it to the power of 0.5, then
- Dividing the parameter by root 2, then
- Casting the result to an integer (truncating / flooring the result) and returning it.
The footer is to define the test cases in a nice way.
Explained in a usual way
21½Ë/ℤ
2 # Push 2 to the stack
1½ # Push 1 and halve it to get 0.5
Ë # Push 2 ** 0.5 (x ** 1/2 = sqrt(x))
/ℤ # Divide and cast to integer (floor)
🍟🍅
Sorry, we're all out of ketchup. You'll have to squeeze your own.


