g | x | w | all
Bytes Lang Time Link
032Retina241221T192441ZUnrelate
064Zsh +sed241221T123034Zroblogic
057Wolfram Language Mathematica241221T094019Zatt
150Red241218T092503ZGalen Iv
105Kotlin241218T031753ZJoon Yor
017Pyth241218T011143ZErikDaPa
059JavaScript241218T005430Zl4m2
108Wolfram Language Mathematica241217T140353ZIntroduc
01005AB1E241217T121037ZKevin Cr
009Vyxal241217T100121Zlyxal
126Lua210121T035404ZJ. А. de
011Husk210121T032247ZRazetime
090Python 2190722T200333ZChas Bro
031K oK190719T211900Zmkst
012Japt190719T172817ZShaggy
033Ruby p190625T214723ZValue In
112Python 2190625T145517Zmbomb007
110Clojure190625T132328ZNikoNyrh
044R190624T211417ZRobin Ry
071PowerShell151125T134923ZAdmBorkB
009Jelly190624T190103ZUnrelate
036Perl 6151128T191201ZBrad Gil
047MATLAB151127T092241Zslvrbld
138Python 2.7151126T012422ZAlex
173Hassium151125T154121ZJacob Mi
024GolfScript121003T224613ZPeter Ta
025Perl121003T184953Zardnew
045golfscript121003T203442Zshiona
047K121003T200119Ztmartin
038J121003T165647ZGareth
037Perl121003T164846Zmarinus

Retina, 32 bytes

\d+
*
vr`(?<!\1)-(_+)
,$1
_+
$.0

Try it online!

Don't really feel good about this, but after spinning my wheels on it on and off basically all morning I'd feel even worse not posting...

Explanation:

\d+
*

Convert each run of digits to unary with underscores as the digit.

vr`(?<!\1)-(_+)
,$1

Take overlapping RtL matches of a hyphen and a run of underscores (possibly non-maximal--overlapping RtL tries matching leftwards from each position, such that e.g. vr`.+ matches every prefix), provided that the hyphen is NOT directly preceded by that many or more underscores (not part of the match), and substitute the underscores after a comma. Overlapping matches are weird and I'm not entirely sure how to describe the behavior here, but the way I understand it is more or less anything that none of them match is a "separator" and the match substitutions and separators just get smushed back together in the order of their starting positions.

_+
$.0

Convert each run of underscores to its length in decimal.

Zsh +sed, 64 bytes

eval echo `sed -E 's/,/ /g;s/([0-9]+)-([0-9]+)/{\1..\2}/g'<<<$1`

Try it online!

sed -E converts string 1,3-5,9,16,18-23 into 1 {3..5} 9 16 {18..23} so that Zsh can apply brace expansion.

Wolfram Language (Mathematica), 57 bytes

{Plus=##&@@#~Range~-#2&}~Block~ToExpression["{"<>#<>"}"]&

Try it online!

                                            "{"<>#<>"}"     wrap in {}
{Plus=##&@@#~Range~-#2&}~Block~                             interpret - as spliced range:
                               ToExpression[           ]      parse

Red, 150 bytes

func[s][replace/all s","" "replace/all s"-"" - "b: make bitset! t: to[]load s
u: copy""repeat n v: last t[if b/:n[append u n if n < v[append u","]]]u]

Try it online!

The input is very close to the way Red constructs bitset!datatype - the difference is that the numbers must be separated by spaces and not commas, and the hyphen also must be enclosed in spaces - for example [1 - 4 6]. When this is done we can simply make bitset! from the loaded block. Then we need to iterate over the range from 1 to the last numebr and check if the current value is set in our bitset!. The last thing is to format the output - a siginficant part of the program is dealing with joining the values with commas :)

Kotlin, 105 bytes

{it.split(",").joinToString(","){it.split("-").run{(first().toInt()..last().toInt()).joinToString(",")}}}

Try it online!

val f:(String)->String= is the header. Just splits the string with the , delimiter, and for every element it can only be 1 or 2 elements after it's split by -

After that, it creates the range of numbers, using first() and last() allows it to work whether it has one or two elements, and then just joins the characters again with , and joined again by , after all ranges are processed

Pyth, 17 bytes

.nm.U}bZvcd\-cz\,

Try this online!

Explanation:

.nm.U}bZvcd\-cz\,
             cz\, => split on commas
  m               => map
        vcd\-     => split on hypens and parse each
   .U             => reduce
     }bZ          => [A, A+1, ..., B]
.n                => flatten list

JavaScript, 59 bytes

f=x=>x.replace(/(\d+)-(\d+)/g,(_,a,b)=>a-b?[f(a+-~-b),b]:a)

Try it online!

Wolfram Language (Mathematica), 108 bytes

Flatten[If[StringContainsQ[#,"-"],Range@@ToExpression@StringSplit[#,"-"],FromDigits@#]&/@StringSplit[s,","]]

Try it online!

05AB1E, 10 bytes

',¡ε'-¡Ÿ}˜

Input as a string; output as a list of integers.

Try it online or verify all test cases.

Explanation:

',¡      '# Split the (implicit) input-string on ","
   ε      # Map over each substring:
    '-¡  '#  Split the substring on "-"
       Ÿ  #  Convert the pair to a list in that range
          #  (if it's a singleton, it'll remain as is)
   }˜     # After the map: flatten the list of lists
          # (after which the result is output implicitly)

Vyxal, 9 bytes

⌐\-/Evƒṡf

Try it Online!

Lua (126 bytes)

Just for fun:

(("1,3-5,9,16,18-23"):gsub("(%d+)-(%d+)",function(a,b)t={}for i=a,b do t[#t+1]=math.ceil(i)end return table.concat(t,",")end))

Husk, 11 bytes

ṁȯ…mix'-x',

Try it online!

Python 2, 90 bytes

lambda s:sum((range(u[0],u[-1]+1)for u in[map(int,t.split('-'))for t in s.split(',')]),[])

Try it online!

K (oK), 40 31 bytes

Solution

,/{{x+!1+y-x}. 2#.:'"-"\x}'","\

Try it online!

Explanation:

Managed more golfing whilst adding the explanation...

,/{{x+!1+y-x}. 2#.:'"-"\x}'","\ / the solution
                           ","\ / split input on ","
  {                      }'     / apply lambda to each
                    "-"\x       / split x on "-"
                 .:'            / value (.:) each (')
               2#               / 2 take (dupe if only 1 element)
   {        }.                  / diadic lambda, 2 args x and y
         y-x                    / y subtract x
       1+                       / add 1
      !                         / range 0..n
    x+                          / add x
,/                              / flatten

Japt, 12 bytes

q, c@OvXr-'ò

Try it

Ruby -p, 33 bytes

gsub(/(\d+)-(\d+)/){[*$1..$2]*?,}

Try it online!

Python 2, 112 bytes

Pretty simple and straightforward answer.

L=[]
for s in input().split(','):
 if'-'in s:a,b=map(int,s.split('-'));L+=range(a,b+1)
 else:L+=[int(s)]
print L

Try it online!

Clojure, 110 bytes

#(clojure.string/join","(for[s(.split %",")[a b][(map read-string(.split s"-"))]r(if b(range a(inc b))[a])]r))

Dealing with strings isn't much fun :(

R, 44 bytes

`-`=seq;eval(parse(t=c("c(",scan(,""),")")))

Try it online!

Redefine - to mean seq (i.e. :), surround the input with c() and evaluate the corresponding expression.

PowerShell, 79 71 bytes

('('+($args[0]-replace'-','..'-replace',','),(')+')'|iex|%{$_})-join','

Try it online!

The inner part changes "1,5-9,12" into a "(1),(5..9),(12)" format that PowerShell understands, then executes that with iex, which creates an array of arrays. Then iterate through each inner array, then finally join all outer array elements together

Borrows code from my "Help Me Manage My Time" answer

Usage

PS C:\Tools\Scripts\golfing> .\return-each-number-from-a-group-of-numbers.ps1 '1,3-5,9,16,18-23'
1,3,4,5,9,16,18,19,20,21,22,23

-8 bytes thanks to Veskah

Jelly, 9 bytes

⁾-ryṣ”,VF

Try it online!

   y         Replace
⁾-r          hyphens with the letter r,
    ṣ”,      split on commas,
       V     evaluate every element,
        F    and flatten.

The range dyad r takes two arguments on either side of it and produces an inclusive range between them.

Perl 6, 36 bytes

$_=get;say join ',',EVAL S:g/\-/../
1,3,4,5,9,16,18,19,20,21,22,23

MATLAB, 47 bytes

disp(eval(['[',strrep(input(''),'-',':'),']']))

This snippet reads a string input from the command window, replaces '-' by ':', adds square brackets to the string and then evaluates it, so that the input will be expanded to a full array of numbers.

Example input:

'1,3-5,9,16,18-23'

Example output:

1     3     4     5     9    16    18    19    20    21    22    23

I believe this output is allowed, as the challenge only say that all numbers in a group should be displayed.

Python 2.7, 147 138 Bytes

z,f=input().split(','),[]
for i in z:
 x=i.split('-')
 if len(x)>1:f+=range(int(x[0]),int(x[1])+1)
 else:f+=[int(x[0])]
print str(f)[1:-1]

Usage:

>>>python nums.py
"1,3-5,9,16,18-23"
1, 3, 4, 5, 9, 16, 18, 19, 20, 21, 22, 23

Not the best program...

Hassium, 173 Bytes

This was pretty long and might not be competing since there is a trailing , at the end.

 func main(){p="1,2,3,5-8".split(",")for(c=0;c<p.length;c++){e=p[c]if(e.contains("-")){p=e.split("-")for(x=p[0].toInt();x<=p[1].toInt()print(x++ +",")){}}else print(e+",")}}

Run online and see expanded here

GolfScript (24 chars)

','/{~.,!{~)),>~}*}%','*

E.g.

$ golfscript.rb expand.gs <<<"1,3-5,9,16,18-23"
1,3,4,5,9,16,18,19,20,21,22,23

I actually have four 24-char solutions, but I chose this one because it doesn't have any alphanumeric characters.

How it works

# On the stack: a string such as "1,3-5,9,16,18-23"
','/
# Split on commas to get ["1" "3-5" "9" "16" "18-23"]
{
    # This is executed for each of those strings in a map
    # So stack holds e.g. "1" or "3-5"

    # Evaluate the string.
    # If it's a single number, this puts the number on the stack.
    # Otherwise it's parsed as a positive number followed by a negative number.
    ~
    # Stack holds e.g. 1 or 3 -5
    # Duplicate the last element on the stack and make a list of that length.
    # If it's negative or zero, the list will be empty
    .,
    # Negate. An empty list => 1; a non-empty list => 0
    !
    # If the string was a single number "n", the stack now holds n 0
    # If the string was a range "m-n", the stack now holds m -n 1
    # The following block will be executed 0 times for "n" and once for "m-n"
    {
        # Here we rely on twos-complement numbers satisfying ~n = -n -1
        # Stack: m -n
        ~))
        # Stack: m -(-n)-1+2  =  m n+1
        ,
        # Stack: m [0 1 2 ... n]
        >
        # Stack: [m m+1 ... n]
        ~
        # Stack: m m+1 ... n
    }*
}%
# On the stack: e.g. [1 3 4 5 9 16 18 19 20 21 22 23]
','*
# Joined by , to give the desired output

Perl 25 26 25

$_ is the sequence string

s/-/../g;$_=join",",eval

Sample session:

[~/] $ perl -M5.010 -pe 's/-/../g;$_=join",",eval' <<< "1,3-5,9,16,18-23"
1,3,4,5,9,16,18,19,20,21,22,23

Added 1 character to the character count for the -n-p option (thanks Gareth, ..kinda).

golfscript, 46 45

My first ever golf script program, took hours to complete.

{','/{'-'/{~}%.,1-{))+{,}/\-~}{~}if}%","*}:r; 

# call:
"1,3-5,9,16,18-23"r

# return:
1,3,4,5,9,16,18,19,20,21,22,23

You can try it at http://golfscript.apphb.com/

My best throw at explaining this atrocity:

{...}:r;     # makes a function block ... and names it r

','/         # slices the top element of stack from each ','
             # so we get ["1" "3-5" "9" "16" "18-23"]

{...}%       # makes a function block ... and calls it for 
             # each element in the list

'-'/{~}%     # slices the list by '-' and evals each element 
             # from string to int. ["1"] becomes [1], 
             # ["3-5"] becomes [3 5]

.,1-         # adds the length of the list -1 on top of the stack
             # so for [1] the stack becomes [1] 0, for [3 5]
             # it becomes [3 5] 1

# next we add two function blocks, they, like the 0/1 just before
# are used by an if clause a tiny bit later. First block is for 
# lists that have a 1 on top of them, the latter for ones with 0.

# First block, we have something like [3 5]

))+          # pops the top element of the array, increments 
             # it and puts back. [3 6]

## It seems {...}%~ is same as {...}/
## this is why these two are not in the code any more

{,}%         # , makes a list from 0 to n-1, where n is the parameter
             # so we get [[0 1 2] [0 1 2 3 4 5]]

~            # Dumps the outer array, [0 1 2] [0 1 2 3 4 5]

\            # swaps the two arrays

-            # set complement [3 4 5]

~            # dumps the array, so the elements are left in the stack

# Second block, we have something like [16]

~            # just dumps the array, 16

# Blocks end

if           # takes the top three elements of the stack, evaluates the 
             # first (0 or 1), runs second if true (anything but 
             # [], "", 0 or {} ), otherwise the third.

","*         # joins an array with ","

edit 1: changed the last {}%~ to {}/, also my description was likely wrong.

K, 47

","/:,/${x+!1+y-x}.'2#'a,'a:"I"$'"-"\:'","\:0:0

Test case

k)","/:,/${x+!1+y-x}.'2#'a,'a:"I"$'"-"\:'","\:0:0
1,3-5,9,16,18-23
"1,3,4,5,9,16,18,19,20,21,22,23"

J, 53 43 41 39 38 characters

;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1

Takes input from the keyboard:

   ;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1
1-4,8-11
1 2 3 4 8 9 10 11

Output for the requested test case:

   ;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1
1,3-5,9,16,18-23
1 3 4 5 9 16 18 19 20 21 22 23

Perl (37)

$_=<>;s/^/say join',',/;s/-/../g;eval