Find the temperature closest to 0

In this exercise, you have to analyze records of temperature to find the closest to zero.

Write a program that prints the temperature closest to 0 among input data.

Input

• N, the number of temperatures to analyse (optional). This will be nonzero.
• The N temperatures expressed as integers ranging from -273 to 5526.

Output

Output the temperature closest to 0. If two temperatures are equally close, take the positive one. For instance, if the temperatures are -5 and 5, output 5.

Example

Input

5
1 -2 -8 4 5

Output

1

This challenge is similar to this one on CodinGame, you can view the problem statement source here. Some modifications have been made to the text.

• Mirror of CodinGame problem statement. The site might not appreciate having solutions be made publicly available. I'm not sure what our current consensus is on problems taken from elsewhere. The problem isn't copy-pasted but some of your text is taken verbatim. – xnor Mar 4 '17 at 17:27
• I've edited in most of the original problem statement, it's probably best to include as much of the original text as possible. Also, if you could link directly to the problem (the interactive part), that would be great. – Rɪᴋᴇʀ Mar 4 '17 at 19:11
• @Riker that edit has changed the problem being asked. The input formats are stricter and there is a special case for no input – Blue Mar 4 '17 at 19:13
• I made the count input optional. – xnor Mar 4 '17 at 22:20

Python, 35 bytes

lambda l:max((-x*x,x)for x in l)

Try it online!

Narrowly beats:

lambda l:min(l,key=lambda x:2*x*x-x)
lambda l:min(sorted(l)[::-1],key=abs)

JavaScript (ES6), 33 bytes

a=>a.reduce((m,n)=>n*n-n<m*m?n:m)

Demo

let f =

a=>a.reduce((m,n)=>n*n-n<m*m?n:m)

console.log(f([1, -2, -8, 4, 5]))

Jelly, 4 bytes

AÐṂṀ

Try it online!

How it works

AÐṂṀ  Main link. Argument: A (array)

AÐṂ   Take all elements with minimal absolute value.
Ṁ  Take the maximum. Yields 0 for an empty list.
• You called ???? – Adám Mar 5 '17 at 23:18
• And ADMM once again solves an minimization problem. – NoSeatbelts Mar 6 '17 at 4:35

Brachylog (2), 5 or 2 bytes

~{≜∈}

Try it online!

It wouldn't surprise me if there were a shorter solution along the lines of the Jelly or Pyke, but I like this one because it's so weird.

This is simply Brachylog's "find a list containing the input" operator , with an evaluation strategy that simply tries explicit values for integers until it finds one that works (and it happens to try in the order 0, 1, -1, 2, -2, 3, etc., which is surprisingly handy for this problem!), and inverted ~ (so that instead of trying to find an output list containing the input, it's trying to find an output contained in the input list). Unfortunately, inverting an evaluation strategy along with the value itself costs 2 bytes, so this doesn't beat the Jelly or Pyke solutions.

There's also a dubious 2-byte solution ≜∈. All Brachylog predicates take exactly two arguments, which can each be inputs or outputs; by convention, the first is used as an input and the second is used as an output, but nothing actually enforces this, as the caller has complete control over the argument pattern used (and in Prolog, which Brachylog compiles to, there's no real convention about argument order). If a solution which takes input through its second argument and produces output through its first argument is acceptable, there's no requirement to do the inversion.

• I had written a meta posted about using Input as Output and vice-versa. My view is that it's kinda cheaty because ? and . are not exactly symetrical in the code (notably, one is available on the left and one on the right). Though in a Prolog sense there is really nothing wrong with it. – Fatalize Mar 7 '17 at 7:42

R, 31 bytes

(l=scan())[order(abs(l),-l)]

Try it online!

Pyke, 4 bytes

S_0^

Try it online!

S_   - reversed(sorted(input))
0^ - closest_to(^, 0)

Mathematica, 21 19 bytes

Max@*MinimalBy[Abs]

Composition of functions. Takes a list of integers as input and returns an integer as output.

MATL, 9 6 bytes

0iSPYk

Try it online!

Thanks to Luis Mendo for pointing out there's actually a built-in for this in MATL, which is not present in MATLAB.

i     % Take input
S    % Sort
P   % Reverse to have largest value first.
0   Yk % Closest value to zero, prioritizing the first match found

If you wish to follow the spec and also provide the number of temperatures to be read, this should be given as the second input, and will be silently discarded.

• I think OiSPYk works for 6 bytes – Luis Mendo Mar 5 '17 at 4:24
• @LuisMendo Yes of course - no idea there was a built-in for that. I should really check the function table more often, perhaps highlight the things that ordinary MATLAB doesn't have. – Sanchises Mar 5 '17 at 6:51
• Most MATL functions actually are taken from Matlab. There are only a few that don't correspond to Matlab functions – Luis Mendo Mar 5 '17 at 12:09
• @LuisMendo I know - I usually write my MATL programs in MATLAB first because I find it more readable. But this is the second time I could have saved a lot with a built-in MATL-only function, so I should be careful not to write my programs too MATLAB-centric. Thanks for the tip, nonetheless. – Sanchises Mar 5 '17 at 17:35

C++14, 64 bytes

As unnamed lambda, expecting first argument to be like vector<int> and returing via reference parameter.

[](auto L,int&r){r=L;for(int x:L)r=x*x<=r*r?r+x?x:x>r?x:r:r;}

Ungolfed and usage:

#include<iostream>
#include<vector>

auto f=
[](auto L,int&r){
r=L;
for(int x:L)
r = x*x<=r*r ?   //x is absolute less or equal
r+x ?          //r==-x?
x :          //no, just take x
x>r ?        //take the positive one
x :
r      :
r              //x was absolute greater, so keep r
;
}
;

int main(){
std::vector<int> v = {5, 2, -2, -8, 4, -1, 1};
int r;
f(v,r);
std::cout << r << std::endl;
}
• That might be the most beautiful C++ one-liner I've ever seen – osuka_ Apr 12 '18 at 16:34

ña¼

Try it online!

Japt, 5 bytes

ña¼ v

Try it online!

• Shouldn't the flag be added to the byte count? Especially since the answer doesn't work correctly without it? – Nit Apr 12 '18 at 22:36
• @Nit The recent consensus on Meta is that each invocation of a flag is considered a separate language. Thus, it is not counted towards the byte count. My submission is technically considered a Japt -g answer, not Japt. – Oliver Apr 12 '18 at 23:30
• You don't need the 1. – Shaggy Apr 13 '18 at 14:25
• @Shaggy Actually I don't think it's correct with or without the 1: with, it fails on [1, 0] (giving 1), without, it fails on [-1, 1] (giving -1). I believe ña¼ may be the most correct way to do it. – ETHproductions Apr 13 '18 at 14:31
• @ETHproductions, I'd missed the part about outputting a postive integer in the case of a tie. – Shaggy Apr 13 '18 at 14:41

05AB1E, 16 bytes

Îåà_Di¹{RDÄßs\kè

Explanation:

Î                 Push 0 and [implicit] input array
å                For each element in the array, is it a 0?
à               Find the greatest value (1 if there was a 0 in it, 0 otherwise)
_              Negate boolean (0 -> 1, 1 -> 0)
D             Duplicate
i            If true, continue
¹           Push input
R          Reversed
D         Duplicated
Ä        Absolute value
ß       Greatest element
s      Swap top two values in stack
\     Delete topmost value in stack
k    Index of greatest element in the array
è   Value of the index in the input array

Try it online!

Not at short as I'd like, but at least it works.

Ruby, 20 bytes

->n{n.min{|x|x.abs}}

Pretty straightforward solution. :)

• You can even remove two bytes : ->n{n.min{|x|x*x}} – Faibbus Oct 28 '18 at 21:30

snd.maximum.map(\x->(-x^2,x))

Usage example: snd.maximum.map(\x->(-x^2,x)) $[1,-2,-8,4,5]-> 1. Map each element x to a pair (-x^2,x). Find the maximum and pick the 2nd element from the pair. PHP, 81 bytes two solutions: the first one requires an upper bound; both require all temperatures nonzero. for($r=9e9;$t=$argv[++$i];)abs($t)>abs($r)|abs($t)==abs($r)&&$t<$r?:$r=$t;echo$r;
for(;$t=$argv[++$i];)$r&&(abs($t)>abs($r)|abs($t)==abs($r)&&$t<$r)?:$r=$t;echo$r; Run with -r, provide temperatures as command line arguments. A lazy solution for 92 bytes:$a=array_slice($argv,1);usort($a,function($a,$b){return abs($a)-abs($b)?:$b-$a;});echo$a; defines a callback function for usort and uses it on a slice of$argv.

Java 8, 63 39 bytes

s->s.reduce(1<<15,(r,i)->r*r-r<i*i?r:i)

Port from @Arnauld's JavaScript answer. I couldn't find anything shorter..

-10 bytes converting Java 7 to 8,
and another -24 bytes thanks to @OlivierGrégoire.

Explanation:

Try it online.

s->                   // Method with IntStream parameter and int return-type
s.reduce(1<<15,     //  Start r at 32768 (32768^2 still fits inside a 32-bit integer)
(r,i)->r*r-r<i*i?//  If r^2 - r is smaller than i^2:
r              //   Leave r the same
:               //  Else:
i)             //   Replace the current r with i
//  Implicitly return the resulting r
• Given that there was a dupe of this question recently, time to undust this one with 39 bytes: s->s.reduce(1<<15,(a,b)->a*a-a<b*b?a:b) – Olivier Grégoire Apr 12 '18 at 13:04
• @OlivierGrégoire Thanks. Was looking at this answer myself after it was closed as a dupe and noticed the reduce in Arnauld's JS answer, but you beat me to it (and I forgot about it again after come colleagues came asking questions ;) ). – Kevin Cruijssen Apr 12 '18 at 13:18

JavaScript (Node.js), 30 bytes

a=>a.sort((a,b)=>a*a-a>b*b)

Try it online!

• Why -a is there? – Qwertiy Oct 17 at 16:11

Octave, 28 bytes

@(x)max(x(min(a=abs(x))==a))

Try it online!

Finds the smallest absolute value (min(a=abs(x))), then maps it back to which elements have that smallest absolute value in case of a tie (x(...==a)). Finally takes the maximum value of the results (max(...)) to ensure that in the event of a tie we get one result which is the positive one.

PHP, 209 Bytes

Not really golfed, but wanted to try to use mostly array functions, avoiding loops

Try it Online!!

Code

function f($a){$a[]=0;sort($a);$k=array_search(0,$a);$o=array_slice($a,$k+1);$u=array_reverse(array_diff($a,$o));if($u&&$o){$r=(abs($u)<abs($o))?$u:$o;}else{$r=($u)?$u:$o;}return$r;} Explanation function f($a){
$a[]=0; #As all nonzero values, 0 is pushed sort($a);                              #Sorting the array
$k=array_search(0,$a);                 #Search where zero is
$o=array_slice($a,$k+1); #Array with all values >0$u=array_reverse(array_diff($a,$o));   #Array with all smaller than zero values
#Array has ascending order so it gets reversed
if($u&&$o){                      #if both are set we just compare the abs value
$r=(abs($u)<abs($o))?$u:$o; }else{$r=($u)?$u:$o; #al least one of them will allways be set #the first value is always returned #the 0 value on$u is not usetted that why $u } return$r;
}

Python, 62 bytes

def f(n):
r=min(map(abs,n))
return r if r in n else -r

It feels like there is a much simpler/shorter solution.

• Can be shortened to: def f(n):r=min(map(abs,n));return r if r in n else -r – Mr. Xcoder Apr 18 '17 at 9:21

Try it online!

SmileBASIC, 56 bytes

DEF Z N,T
RSORT T
DIM V[N]ARYOP 2,V,T,T
SORT V,T?TEND

First, the input list is sorted, so the positive temperature will be chosen if there's a tie. Then each temperature is squared and stored in another array. The original array is sorted by this array, and the first item is printed.

Julia 0.6, 29 bytes

x->sort(x,by=x->abs(x-.1))

Sort by the absolute value of the temperature, but subtract .1 first to ensure positive temperatures always win.

Try it online!

Octave, 19 bytes

@(x)min(complex(x))

Try it online!

This exploits the fact that min with complex input compares by absolute value, then by angle:

For complex arguments, the magnitude of the elements are used for comparison. If the magnitudes are identical, then the results are ordered by phase angle in the range (-pi, pi].