33
\$\begingroup\$

Given two integers, output the two integers, and then the range between them (excluding both).

The order of the range must be the same as the input.

Examples:

 Input        Output
 0,  5   ->   [0, 5, 1, 2, 3, 4]
-3,  8   ->   [-3, 8, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7]
 4,  4   ->   [4, 4]
 4,  5   ->   [4, 5]
 8,  2   ->   [8, 2, 7, 6, 5, 4, 3]
-2, -7   ->   [-2, -7, -3, -4, -5, -6]
\$\endgroup\$
  • \$\begingroup\$ I guess we can't take the inputs in pre-ordered order? \$\endgroup\$ – Kevin Cruijssen Nov 8 '18 at 9:55
  • \$\begingroup\$ @KevinCruijssen, no, the output order depends on the input order \$\endgroup\$ – TFeld Nov 8 '18 at 9:58
  • \$\begingroup\$ @StewieGriffin, the output order has to be the same as the input \$\endgroup\$ – TFeld Nov 8 '18 at 9:58
  • \$\begingroup\$ Is this output format acceptable? Note the newline \$\endgroup\$ – Luis Mendo Nov 8 '18 at 10:48
  • 2
    \$\begingroup\$ @KevinCruijssen Any reasonable I/O is acceptable. \$\endgroup\$ – TFeld Nov 8 '18 at 13:08

53 Answers 53

2
\$\begingroup\$

QBASIC, 39 53 bytes

INPUT a,b
?a
?b
FOR q=a+1TO b-1 STEP SGN(b-a)
?q
NEXT

Added the STEP parameter to account for a>b, and that uses the SGN() function to get a -1 or a +1 as increment. This however breaks the REPL because the SGN() function isn't implemented there...

Try it (the old answer) online!

\$\endgroup\$
2
\$\begingroup\$

C (gcc), 65 bytes

f(a,b){for(printf("%d %d",a,b);a<b?++a<b:--a>b;)printf(" %d",a);}

Try it online!

Not very exciting. The loop increment is borrowed from an early version of Kevin Cruijssen's Java answer.

\$\endgroup\$
2
\$\begingroup\$

Powershell, 41 bytes

param($a,$b)$a;$b;$a..$b|?{$_-notin$a,$b}

Less golfed test script:

$f = {

param($a,$b)
$a                # push $a to a pipe
$b                # push $b to a pipe
$a..$b|?{         # push to pipe all integers from $a to $b
    $_-notin$a,$b # ...except $a and $b itself
}

}

@(
    ,( 0,  5  ,   0, 5, 1, 2, 3, 4)
    ,(-3,  8  ,   -3, 8, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7)
    ,( 4,  4  ,   4, 4)
    ,( 4,  5  ,   4, 5)
    ,( 8,  2  ,   8, 2, 7, 6, 5, 4, 3)
    ,(-2, -7  ,   -2, -7, -3, -4, -5, -6)
) | % {
    $a,$b,$expected = $_
    $result = &$f $a $b
    "$("$result"-eq"$expected"): $result"
}

Output:

True: 0 5 1 2 3 4
True: -3 8 -2 -1 0 1 2 3 4 5 6 7
True: 4 4
True: 4 5
True: 8 2 7 6 5 4 3
True: -2 -7 -3 -4 -5 -6

Explanation:

The basic concept of Powershell is the pipe. Pipe is an array. All results that push into the pipe fall into the array. So we should just push the values into the pipe in the correct order.

\$\endgroup\$
2
\$\begingroup\$

Java, 739, 555 bytes

 public static List<Integer> firstLastAndEverythingBetween(final int a, final int b) { if (a == b) { return addAB(a, b); } final List<Integer> result = addAB(a, b); int initial = getInitial(a, b); for (int n = 1; n < Math.abs(b - a); n++) { result.add(initial); if (b > a) { initial++; } else { initial--; } } return result; } private static int getInitial(int a, int b) { return (b > a) ? (a + 1) : (a - 1); } private static List<Integer> addAB(int a, int b) { final List<Integer> result = new ArrayList<>(); result.add(a); result.add(b); return result; }
\$\endgroup\$
  • 1
    \$\begingroup\$ This reminds me of my first post on here (in LUA). You should really make an effort to atleast remove the white space. I'm no Java programmer, but even I can see some quicky areas for golfing. Consider taking a look at this before the negative votes start piling up. Also, there is a templated style for posting code with the language name and number of bytes as a heading. I'd incorporate that. Here is a link to an online byte counter mothereff.in/byte-counter \$\endgroup\$ – ouflak Nov 8 '18 at 17:00
  • \$\begingroup\$ Ok, learning about hte Code golf, I will do better with time \$\endgroup\$ – Marco Tulio Avila Cerón Nov 8 '18 at 17:02
  • \$\begingroup\$ Welcome to PPCG! Good to have you with us :) \$\endgroup\$ – Shaggy Nov 8 '18 at 17:27
  • \$\begingroup\$ Good first effort. You'll soon learn the tricks. First one is to delete all of the unneeded spaces and shorten all variable and function names to one letter. Just the kind of things you wouldn't do in "real life" (hopefully!). Welcome on board. \$\endgroup\$ – ElPedro Nov 8 '18 at 20:38
  • \$\begingroup\$ How do I compile this? Simply putting it in a main class doesn't seem to work. \$\endgroup\$ – Dennis Nov 9 '18 at 2:02
2
\$\begingroup\$

Python 3, 53 48 bytes

-5 bytes thanks to @mypetlion.

lambda a,b:[a,b,*range(a+1-2*(a>b),b,1-2*(a>b))]

Try it online!

\$\endgroup\$
  • \$\begingroup\$ Save 5 bytes with starred expression to unpack the range object lambda a,b:[a,b,*range(a+1-2*(a>b),b,1-2*(a>b))] \$\endgroup\$ – mypetlion Nov 8 '18 at 19:01
2
\$\begingroup\$

APL(NARS), 14 chars, 28 bytes

{⍺⍵,¯1↓1↓⍺..⍵}

test

  f←{⍺⍵,¯1↓1↓⍺..⍵}
  ¯3 f 8
¯3 8 ¯2 ¯1 0 1 2 3 4 5 6 7 
  0 f 5      
0 5 1 2 3 4 
\$\endgroup\$
2
\$\begingroup\$

C (clang), 60 bytes

f(a,b,c)int*c;{for(*c++=a,*c++=b;(a<b?++a<b:--a>b);*c++=a);}

Try it online!

\$\endgroup\$
  • \$\begingroup\$ Can ditch the parens in the middle argument of for() \$\endgroup\$ – ceilingcat Nov 17 '18 at 18:21
2
\$\begingroup\$

C++, 143 140 bytes

-3 bytes thanks to Zacharý

#define V std::vector<int
#include<vector>
V>f(int a,int b){V>v{a,b};int c=2*(b>a)-1;for(int i=a+c;a!=b&&b!=i;i+=c)v.push_back(i);return v;}

How to use :

In the main function :

std::cout << f(0, 5) << '\n';
std::cout << f(-3, 8) << '\n';
std::cout << f(4, 4) << '\n';
std::cout << f(4, 5) << '\n';
std::cout << f(8, 2) << '\n';
std::cout << f(-2, -7) << '\n';

also add :

template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& v) {
    os << "[ ";
    for (const auto& a : v) {
        os << a << ' ';
    }
    return os << ']';
}
\$\endgroup\$
  • 1
    \$\begingroup\$ You can chance the auto to int, as well as using a #define for std::vector<int> \$\endgroup\$ – Zacharý Nov 10 '18 at 2:39
  • \$\begingroup\$ #define V std::vector<int, and replace V f with V>f and V v with V>v for -1 byte. \$\endgroup\$ – Zacharý Nov 12 '18 at 15:26
  • \$\begingroup\$ Suggest c=b>a?1:-1 instead of c=2*(b>a)-1 and a-b&&b-i instead of a!=b&&b!=i \$\endgroup\$ – ceilingcat Nov 20 '18 at 17:20
2
\$\begingroup\$

Haskell, 18 34 bytes as function, 46 52 as an IO action, 56 62 as program

x!y=x:y:[x+1..y-1]++[x-1,x-2..y+1]

or, as an IO action to take input, there are these options (all the same length):

main=(\x y->x:y:[x+1..y-1]++[x-1,x-2..y+1])<$>readLn<*>readLn
--
x!y=x:y:[x+1..y-1]++[x-1,x-2..y+1]
main=(!)<$>readLn<*>readLn
--
f x y=x:y:[x+1..y-1]++[x-1,x-2..y+1]
main=f<$>readLn<*>readLn

or, as an IO action taking input and printing the result:

main=((\x y->x:y:[x+1..y-1]++[x-1,x-2..y+1])<$>readLn<*>readLn)>>=print
--
x!y=x:y:[x+1..y-1]++[x- 1,x-2..y+1]
main=((!)<$>readLn<*>readLn)>>=print
--
f x y=x:y:[x+1..y-1]++[x-1,x-2..y+1]
main=(f<$>readLn<*>readLn)>>=print

The last one is also available on Try It Online! (You can try it online there)
Please remember that TIO requires the input be entered beforehand in the "Input" box.

De-golfed:

enumerate' x y = x : y : [x + 1 .. x - 1] ++ [x - 1 , x - 2 .. y + 1]
main = do x <- readLn
          y <- readLn
          print (enumerate' x y)

Note: : is an operator to prefix an element to a list.

Note: a!b will not work if -XBangBatterns is enabled.
Use a#b instead.

Note: -XNegativeLiterals will break this. Insert a space between x- and 1.
This will parse as x + (negate 1) instead of x $ (-1).

\$\endgroup\$
  • \$\begingroup\$ I feel obligated to point out that your shortest solution is essentially the same as nimi's. \$\endgroup\$ – Ørjan Johansen Nov 11 '18 at 1:54
  • \$\begingroup\$ Oh, sorry. Should I remove this? \$\endgroup\$ – schuelermine Nov 11 '18 at 8:16
  • 2
    \$\begingroup\$ You don't need to. According to this consensus on Meta, duplicate answers are fine. \$\endgroup\$ – Laikoni Nov 11 '18 at 10:40
2
\$\begingroup\$

C# (Visual C# Interactive Compiler), 86 bytes

x=>y=>{var l=new List<int>{x,y};for(int s=x>y?-1:1;x!=y&(x+=s)!=y;)l.Add(x);return l;}

Try it online!

-1 thanks @auhmaan!

\$\endgroup\$
  • \$\begingroup\$ You can save a byte by replacing the && with a single &; Also, since your answer isn't for C# (Visual C# Interactive Compiler) you need to add to your byte count the usings - which is System.Collections.Generic for this solution, if I'm not mistaken. \$\endgroup\$ – auhmaan Nov 12 '18 at 17:21
  • \$\begingroup\$ Thanks for the tip - I've updated my answer. I kind of like this compiler better :) \$\endgroup\$ – dana Nov 12 '18 at 17:31
  • \$\begingroup\$ It also lowers your byte count a lot \$\endgroup\$ – auhmaan Nov 12 '18 at 17:53
2
\$\begingroup\$

JavaScript, 75 bytes

(a,b,n=-~(a>b?a-b:b-a)-2)=>[a,b,...[...Array(n<2?0:n)].map(_=>a<b?++a:--a)]

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Tcl, 85 bytes

proc R a\ b {puts $a\n$b
if $a>$b {lassign $a\ $b b a}
while {[incr a]<$b} {puts $a}}

Try it online!

\$\endgroup\$
1
\$\begingroup\$

JavaScript (ES6), 97 bytes

a=>b=>[a,b,...((c,d)=>c==d?[]:(s=(m=Math).min(a,b),Array(m.abs(a-b)-1).fill().map(n=>++s)))(a,b)]

Can probably be improved!!

\$\endgroup\$
1
\$\begingroup\$

Python 3, 57 bytes

def m(a,b):s=(1,-1)[a>b];return[a,b]+list(range(a+s,b,s))

Try it online!

\$\endgroup\$
  • 1
    \$\begingroup\$ Same approach down to 49 bytes: def m(a,b):s=1-2*(a>b);print(a,b,*range(a+s,b,s)) \$\endgroup\$ – mypetlion Nov 8 '18 at 19:04
1
\$\begingroup\$

JAVA 147 bytes

f(int a, int b){System.out.print(a+""+b);if(a<b){for(int i=a+1; i<b;i++){System.out.print(i);}}else{for(int i=a-1;i>b;i--){System.out.print(i);}}}
\$\endgroup\$
1
\$\begingroup\$

Racket, 68 bytes

(define(f a b)(let([s(if(> a b)-1 1)])(list* a b(range(+ a s)b s))))

Try it online!

The same as TheGreatGeek's Clojure solution

\$\endgroup\$
1
\$\begingroup\$

perl -M5.010 -alE, 58 bytes

@_=($F[0]..$F[1],reverse$F[1]..$F[0]);say"$_ @_[1..$#_-1]"

This reads two integers (on a single line, separated by whitespace) from STDIN and writes the result to STDOUT.

\$\endgroup\$
1
\$\begingroup\$

Bash, 62 bytes

a=($(seq $1 $2|tr $'\n' ' '))
echo $@ ${a[@]:1:((${#a[@]}-2))}

explanation

seq does we want but produces lines, tr turns the lines into space-delimited output, the outer parens make that into an array. $@ is the original input, and the rest of it slices the 0-indexed array from 1 and takes the next "array len - 2" chars.

Try it online!

(NOTE: not all test cases work on TIO for reasons i don't understand, but they do work on my local machine)

\$\endgroup\$
1
\$\begingroup\$

C# (.NET Core), 99 bytes

a=>b=>new[]{a,b}.Concat(b>a?Enumerable.Range(a+1,b+~a):Enumerable.Range(b+1,a!=b?a+~b:0).Reverse())

Try it online!

First (and probably last) time golfing in C#.

\$\endgroup\$
1
\$\begingroup\$

F# (Mono), 68 bytes

let f x y=
 let s=if x<y then 1 else-1
 Seq.append[x;y][x+s..s..y-s]

Try it online!

\$\endgroup\$
1
\$\begingroup\$

C# .NET Core, 56 441 bytes

Here is my corrected solution without predefined input variables and without string joining.

(a,b)=>n(a,b).c(k(a-b)>1?b>a?r(a+1,b-a-1):r(b+1,a-b-1).i():n());

Try it online!

n(a,b)               => returns new array with a and b in it
  c(                 => concat the following content
    k(a-b)>1         => when absolute value of a-b greater then one
      b>a            => when b bigger a
        r(a,b-a)     => range from a to b-a
        r(b,a-b).i() => else range from b to a-b reversed
      n()            => else empty array

I've created and used the following declarations. When I include those and the minimum code required to compile in the byte count I get 640 bytes.

public static class Extensions{
  public static IEnumerable<T> c<T>(this IEnumerable<T> a, IEnumerable<T> b) => a.Concat(b);
  public static IEnumerable<T> i<T>(this IEnumerable<T> a) => a.Reverse();
}

public static Func<int, int> k = Math.Abs;
public static Func<int, int, IEnumerable<int>> r = Enumerable.Range;
public static int[] n(params int[] a) => a;

using System.Linq;using System.Collections.Generic;using System;public static class E{public static IEnumerable<T> c<T>(this IEnumerable<T> a,IEnumerable<T> b)=>a.Concat(b);public static IEnumerable<T> i<T>(this IEnumerable<T> a)=>a.Reverse();}public class P{public static Func<int,int> k=Math.Abs;public static Func<int,int,IEnumerable<int>> r=Enumerable.Range;public static int[] n(params int[] a)=>a;public static void Main(string[] args){Console.WriteLine($"[ {string.Join(", ", f(int.Parse(args[0]), int.Parse(args[1])))} ]");}public static Func<int,int,IEnumerable<int>> f=(a,b)=>n(a,b).c(k(a-b)>1?b>a?r(a,b-a):r(b,a-b).i():n());}
\$\endgroup\$
  • \$\begingroup\$ What exactly are your "tricks"? \$\endgroup\$ – FireCubez Nov 8 '18 at 18:23
  • \$\begingroup\$ @FireCubez all the declarations which aren't in the body. Is that allowed? \$\endgroup\$ – NtFreX Nov 8 '18 at 18:35
  • \$\begingroup\$ Which body? Take a look at the standard loopholes. If it isn't there then it's allowed \$\endgroup\$ – FireCubez Nov 8 '18 at 19:01
  • \$\begingroup\$ @TFeld I've corrected it. It's just not that nice anymore^^ \$\endgroup\$ – NtFreX Nov 9 '18 at 8:41
  • 1
    \$\begingroup\$ You have to include it in the bytecount \$\endgroup\$ – Jo King Nov 9 '18 at 9:56
0
\$\begingroup\$

JavaScript (ES6), 76 bytes

(a,b,c=[a,b])=>{c[c.length]=a<b?++a:--a;return a==b?(c.pop()+1&&c):f(a,b,c)}

invocation should not pass the third argument: f(-9,9)

Try it online!

im still thinking...

\$\endgroup\$
  • \$\begingroup\$ Fails for input 4,4 \$\endgroup\$ – TFeld Nov 9 '18 at 8:34
  • \$\begingroup\$ Ah..thanks for noticing \$\endgroup\$ – Nikko Khresna Nov 9 '18 at 9:28
-1
\$\begingroup\$

APL(NARS), 125 char, 250 bytes

i←{⍵≥0:⍳⍵⋄0,⍨⌽-⍳∣⍵}
R←{0>⍵-⍺:⍬⋄⍺>0:(i⍵)∼i⍺-1⋄⍺=0:0,i⍵⋄⍵=¯1:(i⍺)∼0⋄1=×⍵×⍺:(i⍺)∼i⍵+1⋄(i⍺)∪i⍵}
f←{⍺≤⍵:⍺⍵,¯1↓1↓⍺R⍵⋄⍺⍵,⌽¯1↓1↓⍵R⍺}

i write this post for show one alternative 'resolution' of the problem using one exstension of iota ⍳ function that here I call as "i", and one alternative range function to NARS .. range that here I call "R".

Little test for the iota extension:

  o←⎕fmt
  o i 9
┌9─────────────────┐
│ 1 2 3 4 5 6 7 8 9│
└~─────────────────┘
  o i 1
┌1─┐
│ 1│
└~─┘
  o i ¯1
┌2────┐
│ ¯1 0│
└~────┘
  o i ¯9
┌10───────────────────────────┐
│ ¯9 ¯8 ¯7 ¯6 ¯5 ¯4 ¯3 ¯2 ¯1 0│
└~────────────────────────────┘
  o i 0
┌0─┐
│ 0│
└~─┘

because i 0 is zilde than could be →A×i 7>2 continue to work ok as with iota Little test for the range R alternative to NARS range:

  o ¯9 R ¯1
┌9──────────────────────────┐
│ ¯9 ¯8 ¯7 ¯6 ¯5 ¯4 ¯3 ¯2 ¯1│
└~──────────────────────────┘
  o ¯9 R 0
┌10───────────────────────────┐
│ ¯9 ¯8 ¯7 ¯6 ¯5 ¯4 ¯3 ¯2 ¯1 0│
└~────────────────────────────┘
  o ¯9 R 1
┌11─────────────────────────────┐
│ ¯9 ¯8 ¯7 ¯6 ¯5 ¯4 ¯3 ¯2 ¯1 0 1│
└~──────────────────────────────┘
  o 9 R 1
┌0─┐
│ 0│
└~─┘
  o 1 R 1
┌1─┐
│ 1│
└~─┘
  o 0 R 1
┌2───┐
│ 0 1│
└~───┘
  o 1 R 0
┌0─┐
│ 0│
└~─┘
  o 0 R 0
┌1─┐
│ 0│
└~─┘
  o ¯9 R ¯2
┌8───────────────────────┐
│ ¯9 ¯8 ¯7 ¯6 ¯5 ¯4 ¯3 ¯2│
└~───────────────────────┘
  5 R 10
5 6 7 8 9 10 

the function for above exercise:

  0 f 5
0 5 1 2 3 4 
  ¯3 f 8
¯3 8 ¯2 ¯1 0 1 2 3 4 5 6 7 
  4 f 4
4 4 
  4 f 5
4 5 
  8 f 2
8 2 7 6 5 4 3 
  ¯2 f ¯7
¯2 ¯7 ¯3 ¯4 ¯5 ¯6 
\$\endgroup\$
  • 1
    \$\begingroup\$ What is this? You already have a 28-byte solution in the same language. \$\endgroup\$ – Dennis Nov 10 '18 at 19:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.