Shorter way to assign a default value to the standard output stream

5

I have this code :

tr ' ' '\n'|sort -n|head -1

The code is pretty simple, it takes a list of integer in the standard input stream (like 5 9 8 7 5 2 -12 -30), it sort the integers and display only the first integer. But i need to ouput 0 if the given list is empty. And i can't find a short way to that. I have a solution with a ternary operator and a echo 0, but i feel i can do far better. I just need to replace the input stream by 0 if this stream is empty.

Sidenote : I don't need to call read to get the user input. The program is called with the input stream directly like cmd < 1 5 6 -20 45

Here my current code :

read l
[ -n "$l" ]&&echo $l|tr ' ' '\n'|sort -n|head -1||echo 0

Magus

Posted 2016-02-15T12:18:35.773

Reputation: 153

@Pietu1998 i added my current code – Magus – 2016-02-15T13:16:29.067

In this case you can cheat by always outputting a 0 first, if leading zeroes are allowed. – orlp – 2016-02-15T13:47:13.893

@orlp nice thinking but sadly leading zeroes are not allowed – Magus – 2016-02-15T13:59:49.723

This looks like a programming problem to go on Stack Overflow. I'm not sure though; I haven't done any action on the question in terms of close/up/down voting. – HyperNeutrino – 2016-02-15T19:40:13.213

@AlexL. Make code X shorter will be very poorly received on Stack Overflow. – Dennis – 2016-02-15T19:41:36.340

@Dennis That's for sure. But for one thing, this question isn't marked with the tag code-golf. Also, language-specific code-golf problems are generally not advised. – HyperNeutrino – 2016-02-15T19:43:33.023

@AlexL. This isn't a code golf contest, it's a tips question, which is one of the con-challenges that are considered on topic.

– Dennis – 2016-02-15T19:47:33.803

@Dennis Whoops. Sorry for the confusion. I'm relatively new to the PPCG community and how it works. Thanks! – HyperNeutrino – 2016-02-15T19:50:52.650

Answers

4

37 33 32 bytes

tr \  \\n|sort -n|sed s/^$/0/\;q

Edit: Saved 4 bytes thanks to @DigitalTrauma.

Neil

Posted 2016-02-15T12:18:35.773

Reputation: 95 035

sed 1q is one shorter than head -1. Then you can combine the sed expressions to get 33 bytes: tr \ \\n|sort -n|sed s/^$/0/\;1q – Digital Trauma – 2016-02-15T17:57:30.937

1@DigitalTrauma Am I overlooking something or does sed q work? – Neil – 2016-02-15T19:24:07.740

yes - even better! – Digital Trauma – 2016-02-15T19:25:45.083

@DigitalTrauma @Neil The sed script can be shortened by 1 byte further using /./q\;c\0 as long as the empty list doesn't contain white spaces. – seshoumara – 2016-08-29T14:48:16.477

4

34 bytes

a=($(tr \  \\n|sort -n))
echo $[a]

The first line saves the sorted input values in an array a.

This avoids using head -1, since referencing the array as $a will yield its first value.

The second line uses a in the arithmetic expansion $[a]. In this context, an empty string is interpreted as 0.

For a different default value, parameter substitution could be used instead. For example, the last line could become

echo ${a:-puppies}

Dennis

Posted 2016-02-15T12:18:35.773

Reputation: 196 637

1

42 bytes

Two different ways that have the same byte-count Use awk as the last command

tr ' ' '\n'|sort -n|awk 'NR==1{print $1+0}'

Or do all the computations in awk

awk -v RS=" " '{m=m>$1?m:$1}END{print m+0}'

Robert Benson

Posted 2016-02-15T12:18:35.773

Reputation: 1 339

1I could shrink the all in awk version by a couple bytes using awk -v RS=" " '$1>m{m=$1}END{print m+0}', but then the two versions would have different byte-counts. :p – Robert Benson – 2016-02-15T15:08:02.737