Pierwszy, ostatni i wszystko pomiędzy


33

Biorąc pod uwagę dwie liczby całkowite, wypisz dwie liczby całkowite, a następnie zakres między nimi (z wyłączeniem obu).

Kolejność zakresu musi być taka sama jak na wejściu.

Przykłady:

 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]

Chyba nie możemy pobrać danych wejściowych w zamówieniu zamówionym w przedsprzedaży?
Kevin Cruijssen

@KevinCruijssen, nie, kolejność wyjściowa zależy od kolejności wejściowej
TFeld

@StewieGriffin, kolejność wyjściowa musi być taka sama jak na wejściu
TFeld

Czy ten format wyjściowy jest akceptowalny? Zwróć uwagę na nowy wiersz
Luis Mendo

2
@KevinCruijssen Wszelkie uzasadnione operacje we / wy są dopuszczalne.
TFeld

Odpowiedzi:


14

R , 39 33 30 bajtów

c(a<-scan(),setdiff(a:a[2],a))

Wypróbuj online!

Dzięki za zapisane bajty dla użytkownika 2390246 i J.Doe.


Możesz zapisać kilka bajtów , przyjmując dane wejściowe jako wektor, a nie dwie osobne liczby całkowite.
user2390246

Tak, to rozsądne i faktycznie staje się jeszcze krótsze jako pełny program, a nie funkcja.
Kirill L.,

Możesz nadużyć faktu, że :operator używa pierwszego elementu obu argumentów przez 30 bajtów
J.Doe



10

Python 2 (Cython) , 36 35 bajtów

lambda x:x+range(*x,-cmp(*x)|1)[1:]

Dzięki @nwellnhof za grę w golfa na 1 bajcie!

Wypróbuj online!


Python 2 , 37 bajtów

lambda x:x+range(*x+[-cmp(*x)|1])[1:]

Dzięki @JonasAusevicius za port do CPython!

Wypróbuj online!


2
To może być stosowana do standardowej Pythona 2 na 37 bajtów, co czyni go jeszcze najkrótsza odpowiedź: lambda x:x+range(*x+[-cmp(*x)|1])[1:]. Dobre rozwiązanie
Jonas Ausevicius

8

Perl 6 , 26 22 bajtów

{|@_,|[...^](@_).skip}

Wypróbuj online!

Wyjaśnienie

{                    }
 |@_,   # Slip args a,b into result
      [...^](@_)  # Reduce args a,b with ...^ operator, same as a...^b
                .skip  # Skip first element
     |  # Slip into result

7

Python 2 , 40 bajtów

lambda x,y:[x,y]+range(x,y,-(y<x)|1)[1:]

Wypróbuj online!


Naprawdę lubię -(y<x)|1. bardzo fajnie, ale nie mogę zrozumieć, dlaczego to działa! Czy masz szansę to wyjaśnić?
ElPedro,

2
@ElPedro Zasadniczo y<xsprawdza, czy yjest mniej niż x, i zwraca, Truejeśli tak, w Falseprzeciwnym razie. Następnie -stosuje się do niej jednoargumentowy , który konwertuje Truena -1i Falsena 0. Ostatnim krokiem jest bitowa LUB ta liczba za pomocą 1. To oczywiście liście 1( 0b1) nienaruszone, a także liści -1( -0b1) zmianie (bit znaku -1jest ustawiona, więc jest utrzymywane jako takie). Jednak to nie konwertuje 0do 1, tak, że rangenie narzekają mnie przy użyciu stepod 0.
Erik the Outgolfer

That is seriously cool and very clever. If I could upvote twice I would. Many thanks for the explanation.
ElPedro

6

Python 3, 64 62 51 bytes

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

Try it online!

Python 2, 58 45 bytes

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

Try it online!


2
Because an empty list is falsey, you can remove the a<=b and from both answers
TFeld

You could also use + instead of or
TFeld

@TFeld thank you
Jonas Ausevicius

Python 3 down to 47 bytes: lambda a,b:[a,b,*range(a+1,b),*range(a-1,b,-1)]
mypetlion

6

Japt, 8 bytes

cUr!õ kU

Try it here

             :Implicit input of array U
c            :Concatenate
 Ur          :  Reduce U by
   !õ        :   Inclusive range
      kU     :  Remove all elements in original U

6

JavaScript (ES6), 51 bytes

Takes input as (a)(b).

a=>g=(b,c=b)=>(b+=b<a|-(b>a))-a?[...g(b,c),b]:[a,c]

Try it online!

Commented

a =>                // main function, taking a
  g = (             // g = recursive function
    b,              //     taking b
    c = b           // we save a backup of the original value of b into c
  ) =>              //
    (b +=           // add to b:
      b < a |       //   +1 if b is less than a
      -(b > a)      //   -1 if b is greater than a
    )               //   (or 0 if b = a)
    - a ?           // if the updated value of b is not equal to a:
      [             //   generate a new array:
        ...g(b, c), //     prepend all values generated by a recursive call
        b           //     append the current value of b
      ]             //
    :               // else:
      [a, c]        //   stop recursion and return the first 2 values: a and c

6

Python 2, 47 41 40 bytes

lambda a,b:[a,b]+range(a,b,a<b or-1)[1:]

Try it online!

Here's mine, now that a lot of other Python answers have been posted

-6 bytes, thanks to G B


Taking advantage of the empty range when it's invalid is a smart way to deal with forward or backwards lists. I could see that being very useful and is a nice trick to know exists.
akozi

2
41 bytes using a single range: range(a,b,(a<b)*2-1)
G B

a<b or-1 is shorter for the 3rd range parameter. The shortest I got was lambda x,y:[x,y]+range(x+(x<y or-1),y,x<y or-1)
mbomb007

5

Java 10, 109 108 104 102 93 62 bytes

Using a space-delimited String:

b->a->{var r=a+" "+b;for(;a<b?++a<b:--a>b;)r+=" "+a;return r;}

Try it online.

Using a List:

b->a->{var r=new java.util.Stack();for(r.add(a),r.add(b);a<b?++a<b:--a>b;)r.add(a);return r;}

Try it online.

(a<b?++a<b:--a>b can be ++a<b||(a-=2)>b for the same byte-count: Try it online for the String or Try it online for the List.)


Old (109 108 104 102 101 bytes) answer using an array:

a->b->{int s=a<b?1:-1,i=a!=b?(b-a)*s+1:2,r[]=new int[i];for(r[0]=a,r[1]=b;i>2;)r[--i]=b-=s;return r;}

-7 bytes thanks to @nwellnhof.

Try it online.

Explanation:

a->b->{                // Method with 2 int parameters & int-array return-type
  int s=               //  Step integer, starting at:
        a<b?1          //   1 if the first input is smaller than the second
        :-1;           //   -1 otherwise
      i=               //  Array-index integer, starting at:
        a!=b?          //   If the inputs aren't equal:
         (b-a)*s+1     //    Set it to the absolute difference + 1
        :              //   Else:
         2,            //    Set it to 2
      r[]=new int[i];  //  Result-array of that size
  for(r[0]=a,          //  Fill the first value with the first input
      r[1]=b;          //  And the second value with the second input
      i>2;)            //  Loop `i` downwards in the range [`i`,2):
    r[--i]=            //   Decrease `i` by 1 first with `--i`
                       //   Set the `i`'th array-value to:
           b-=s;       //    If the step integer is 1: decrease `b` by 1
                       //    If the step integer is -1: increase `b` by 1
                       //    And set the array-value to this modified `b`
  return r;}           //  Return the result-array

Isn't there anything in Java's standard library for making ranges of integers? Or it is just too verbose to use?
Οurous

@Οurous It's indeed too verbose: a->b->{var L=java.util.stream.IntStream.range(a,b).boxed().collect(java.util.Collectors.toList());L.add(0,b);L.add(0,a);return L;} (130 bytes)
Kevin Cruijssen

Is it Java 8 or Java 10 ? Because of "var" ^^'
Neyt

1
@Neyt Ah, fixed. My initial version with the array below didn't use var, which is why I usually put those at 8, and the ones that does use var as 10 (and the ones using String.repeat as 11). :) Forgot to update it after adding the List and String answers, should be corrected now. Thanks.
Kevin Cruijssen

5

APL (Dyalog Extended), 5 bytes

Anonymous infix function.

,,…~,

Try it online!

, the first and last (lit. the concatenation of the arguments)

, and (lit. concatenated to)

 the range

~ without

, the first and last (lit. the concatenation of the arguments)


Nice, so I assume you're going to be using this for all of your golfing from now on?
Zacharý

@Zacharý Probably only if the code is significantly shorter or simpler.
Adám


4

Jelly, 4 bytes

,œ|r

Try it online!

How it works

,œ|r  Main link. Left argument: a. Right argument: b

,     Pair; yield [a, b].
   r  Range; yield [a, ..., b].
 œ|   Perform multiset union.

4

J, 26 bytes

,,[|.@]^:(>{.)<.+1}.i.@|@-

Try it online!

Explanation:

A dyadic verb (takes left and right argument)

                         -    subtracts the arguments
                       |@     and finds the absolute value
                    i.@       and makes a list 0..absolute difference
                 1}.          drops the fist element
                +             adds to the entire list
              <.              the smaller of the arguments
   |.@]                       reverses the list
       ^:                     only if
  [                           the left argument
         (>{.)                is greater than the first item of the list
 ,                            appends the list to
,                             the right argument appended to the left one

1
,,[:}.@}:<.+i.@-@(+*)@- for 23 bytes and no special casing on relative argument ordering (rather: it's hidden inside the signum *). i feel like this could get down under 20 but i'm tired.
Jonah

@Jonah Thank you! Btw FrownyFrog's solution is way better than mine, so I 'm not going to golf it any further.
Galen Ivanov


4

J, 13 bytes

,,<.+i.@-~-.=

Try it online!

     i.@-~       range [0 .. |difference|-1], reverse if the difference is positive
          -.=    remove the zero (either "=" is 0 or there’s nothing to remove)
  <.+            to each element add the smaller of the args
,,               prepend args

Nice solution! I totally forgot abouti. with negative argument.
Galen Ivanov

1
this is gorgeous!
Jonah

3

Batch, 107 bytes

@echo %1
@echo %2
@for %%s in (1 -1)do @for /l %%i in (%1,%%s,%2)do @if %1 neq %%i if %%i neq %2 echo %%i

Takes input as command-line arguments. Explanation:

@echo %1
@echo %2

Output the two integers.

@for %%s in (1 -1)do

Try both ascending and descending ranges.

@for /l %%i in (%1,%%s,%2)do

Loop over the inclusive range.

@if %1 neq %%i if %%i neq %2

Exclude the two integers.

echo %%i

Output the current value.


3

Pyth, 5 bytes

+QtrF

Input is a two-element list, [input 1, input 2]. Try it online here, or verify all the test cases at once here.

+QtrFQ   Implicit: Q=eval(input())
         Trailing Q inferred
   rFQ   Generate range [input 1 - input 2)
  t      Discard first element
+Q       Prepend Q

Using F instead of .* on 2-element lists is a brilliant trick that I will absolutely be using from here on.
hakr14




3

Python 2, 52 47 41 bytes

lambda i,j:[i,j]+range(i,j,(i<j)*2-1)[1:]

Try it online!

-5 with thanks to @JoKing

-6 by slicing the first element from the range (idea stolen from and with credit to @TFeld)

Non-lambda version...

Python 2, 51 49 47 bytes

i,j=input();print[i,j]+range(i,j,(i<j)*2-1)[1:]

Try it online!

-2 with thanks to @JoKing



3

PHP (102 bytes)

function t($a,$b){count($r=range($a,$b))>1?array_splice($r,1,0,array_pop($r)):$r=[$a,$b];print_r($r);}

Sandbox

Unfortunately (for golf) PHP has rather verbose function names, which contribute a lot to the length. But the basic idea is to create a range, then pop off the last element and stitch it back in at offset 1. For the 4,4 example I had to add count($r=range($a,$b))>1?...:$r=[$a,$b]; which adds quite a bit, and unfortunately array_splice() is by reference which hit me for a few more bytes ($r= and a ;). All because of that "edge case", lol.

Well anyway enjoy!


I dont think that this is a right approach for code golf. Check this one function t($a,$b){$o=array($a,$b);for($i=$a+1;$i<$b;$i++)$o[]=$i;print_r($o);}
th3pirat3

Or something like this function t($a,$b){echo $a.$b;for($i=$a+1;$i<$b;$i++)echo $i};
th3pirat3

1
It has to be a function and it has to output an array. If you have a better answer your more then welcome to post it.
ArtisticPhoenix

I edited it, is that a valid submission now? Shall I put it as a new answer or what?
th3pirat3

That is entirely up to you, I just wanted to do it without a loop ... lol
ArtisticPhoenix

3

Clojure, 61 bytes

(fn[[a b]](def s(if(> a b)-1 1))(list* a b(range(+ a s)b s)))

An anonymous function that takes a 2-vector as input and returns a list.

Try it online!

Explanation

(fn [[a b]] ; An anonymous function that accepts a 2-vector as input, and destructures it to a and b
  (def s (if (> a b) -1 1)) ; If a > b assigns -1 to s and assigns 1 to s otherwise. This determines the order of the elements of the output list.
  (list* a b ; Creates a list with a and b as the first two elements. The remaining elements will be appended from the following range:
    (range (+ a s) b s))) ; A range starting at a+s and ending at b with step s

3

D, 85 bytes

T[]f(T)(T a,T b){T[]v=[a,b];T c=2*(b>a)-1;for(T i=a+c;a!=b&&b!=i;i+=c)v~=i;return v;}

Try it online!

A port of @HatsuPointerKun's C++ answer into D.


3

TI-BASIC, 35 34 bytes

-1 byte from Misha Lavrov

Prompt A,B
Disp A,B
cos(π(A>B
For(I,A+Ans,B-Ans,Ans
Disp I
End

2
And one more byte by replacing 1-2(A>B with cos(π(A>B.
Misha Lavrov

@MishaLavrov seq( wouldn't work for inputs where A and B are the same, unfortunately :(
kamoroso94

True - also, I left out an argument of seq(, so I'm no longer convinced it even is smaller. Still, the cos( trick should help.
Misha Lavrov

2

Charcoal, 15 bytes

IE²NI…⊕θηI⮌…⊕ηθ

Try it online! Link is to verbose version of code. Explanation:

IE²N

Print the inputs on separate lines.

I…⊕θη

Print the ascending range, if any.

I⮌…⊕ηθ

Print the reverse ascending reverse range, if any.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.