| Bytes | Lang | Time | Link |
|---|---|---|---|
| 032 | Retina | 241221T192441Z | Unrelate |
| 064 | Zsh +sed | 241221T123034Z | roblogic |
| 057 | Wolfram Language Mathematica | 241221T094019Z | att |
| 150 | Red | 241218T092503Z | Galen Iv |
| 105 | Kotlin | 241218T031753Z | Joon Yor |
| 017 | Pyth | 241218T011143Z | ErikDaPa |
| 059 | JavaScript | 241218T005430Z | l4m2 |
| 108 | Wolfram Language Mathematica | 241217T140353Z | Introduc |
| 010 | 05AB1E | 241217T121037Z | Kevin Cr |
| 009 | Vyxal | 241217T100121Z | lyxal |
| 126 | Lua | 210121T035404Z | J. А. de |
| 011 | Husk | 210121T032247Z | Razetime |
| 090 | Python 2 | 190722T200333Z | Chas Bro |
| 031 | K oK | 190719T211900Z | mkst |
| 012 | Japt | 190719T172817Z | Shaggy |
| 033 | Ruby p | 190625T214723Z | Value In |
| 112 | Python 2 | 190625T145517Z | mbomb007 |
| 110 | Clojure | 190625T132328Z | NikoNyrh |
| 044 | R | 190624T211417Z | Robin Ry |
| 071 | PowerShell | 151125T134923Z | AdmBorkB |
| 009 | Jelly | 190624T190103Z | Unrelate |
| 036 | Perl 6 | 151128T191201Z | Brad Gil |
| 047 | MATLAB | 151127T092241Z | slvrbld |
| 138 | Python 2.7 | 151126T012422Z | Alex |
| 173 | Hassium | 151125T154121Z | Jacob Mi |
| 024 | GolfScript | 121003T224613Z | Peter Ta |
| 025 | Perl | 121003T184953Z | ardnew |
| 045 | golfscript | 121003T203442Z | shiona |
| 047 | K | 121003T200119Z | tmartin |
| 038 | J | 121003T165647Z | Gareth |
| 037 | Perl | 121003T164846Z | marinus |
Retina, 32 bytes
\d+
*
vr`(?<!\1)-(_+)
,$1
_+
$.0
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`
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["{"<>#<>"}"]&
"{"<>#<>"}" 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]
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(",")}}}
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\,
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
Wolfram Language (Mathematica), 108 bytes
Flatten[If[StringContainsQ[#,"-"],Range@@ToExpression@StringSplit[#,"-"],FromDigits@#]&/@StringSplit[s,","]]
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)
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))
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(',')]),[])
K (oK), 40 31 bytes
Solution
,/{{x+!1+y-x}. 2#.:'"-"\x}'","\
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
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
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(,""),")")))
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','
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
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.
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