Der erste, der letzte und alles dazwischen

33

Geben Sie bei zwei gegebenen Ganzzahlen die beiden Ganzzahlen und dann den Bereich zwischen ihnen aus (ohne beide).

Die Reihenfolge des Bereichs muss mit der Eingabe übereinstimmen.

Beispiele:

 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]
TFeld
quelle
Ich vermute, wir können die Eingaben nicht in vorbestellter Reihenfolge übernehmen.
Kevin Cruijssen
@ KevinCruijssen, nein, die Ausgabereihenfolge hängt von der Eingabereihenfolge ab
TFeld
@StewieGriffin, die Ausgabereihenfolge muss mit der Eingabereihenfolge
übereinstimmen
Ist dieses Ausgabeformat akzeptabel? Beachten Sie die neue Zeile
Luis Mendo
2
@ KevinCruijssen Jede vernünftige E / A ist akzeptabel.
TFeld

Antworten:

14

R , 39 33 30 Bytes

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

Probieren Sie es online!

Vielen Dank für die gespeicherten Bytes an User2390246 und J.Doe.

Kirill L.
quelle
Sie können einige Bytes einsparen, indem Sie die Eingabe als Vektor und nicht als zwei separate Ganzzahlen verwenden.
user2390246
Ja, das ist vernünftig und wird dann als vollständiges Programm sogar noch kürzer als die Funktion.
Kirill L.
Sie können die Tatsache missbrauchen, dass der :Operator das erste Element beider Argumente für 30 Bytes verwendet
J.Doe
12

05AB1E , 4 Bytes

Ÿ¦¨«

Probieren Sie es online!

Erläuterung

    Ÿ      # inclusive range [a ... b]
     ¦¨    # remove the first and last element
       «   # append to input
Emigna
quelle
12

Python 3 , 52 48 47 42 41 Bytes

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

Probieren Sie es online!


Kombinierte frühere Implementierungen.

Cobaltp
quelle
2
Sie können den Speicherplatz um entfernen or-1, um ein Byte zu speichern.
Kevin Cruijssen
10

Python 2 (Cython) , 36-35 Bytes

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

Vielen Dank an @nwellnhof für das Golfen ab 1 Byte!

Probieren Sie es online!


Python 2 , 37 Bytes

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

Vielen Dank an @JonasAusevicius für den Port zu CPython!

Probieren Sie es online!

Dennis
quelle
2
Dies kann zu einem Standard - Python - 2 bei 37 Bytes angewandt werden, es ist die kürzeste Antwort macht noch: lambda x:x+range(*x+[-cmp(*x)|1])[1:]. Schöne Lösung
Jonas Ausevicius
8

Perl 6 , 26 22 Bytes

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

Probieren Sie es online!

Erläuterung

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

Python 2 , 40 Bytes

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

Probieren Sie es online!

Erik der Outgolfer
quelle
Wirklich gerne -(y<x)|1. sehr cool, aber ich kann nicht herausfinden, warum es funktioniert! Kannst du das erklären?
ElPedro
2
@ElPedro y<xÜberprüft grundsätzlich, ob der Wert ykleiner als ist x, und gibt Trueihn Falseansonsten zurück, wenn dies der Fall ist . Danach wird unary darauf -angewendet, was Truezu -1und Falsezu konvertiert 0. Der letzte Schritt ist das bitweise ODER dieser Nummer mit 1. Dies lässt offensichtlich 1( 0b1) unberührt und lässt auch -1( -0b1) unberührt (das Vorzeichenbit von -1wird gesetzt, so dass es als solches beibehalten wird). Es konvertiert jedoch 0zu 1, sodass rangeich mich nicht über die Verwendung von a stepvon beschwere 0.
Erik der Outgolfer
Das ist echt cool und sehr clever. Wenn ich zweimal stimmen könnte, würde ich. Vielen Dank für die Erklärung.
ElPedro
6

Python 3, 64 62 51 Bytes

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

Probieren Sie es online!

Python 2, 58 45 Bytes

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

Probieren Sie es online!

Jonas Ausevicius
quelle
2
Da eine leere Liste falsch ist, können Sie die a<=b and beiden Antworten entfernen
TFeld
Sie können auch +anstelle vonor
TFeld
@TFeld danke
Jonas Ausevicius
Python 3 auf 47 Bytes:lambda a,b:[a,b,*range(a+1,b),*range(a-1,b,-1)]
mypetlion
6

Japt, 8 Bytes

cUr!õ kU

Probieren Sie es hier aus

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

JavaScript (ES6), 51 Byte

Übernimmt die Eingabe als (a)(b).

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

Probieren Sie es online!

Kommentiert

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
Arnauld
quelle
6

Python 2 , 47 41 40 Bytes

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

Probieren Sie es online!

Hier ist meine, jetzt wo viele andere Python-Antworten gepostet wurden

-6 Bytes dank GB

TFeld
quelle
Den leeren Bereich zu nutzen, wenn er ungültig ist, ist eine clevere Möglichkeit, mit Listen vorwärts oder rückwärts umzugehen. Ich konnte sehen, dass es sehr nützlich ist und ein guter Trick ist, um zu wissen, dass es ihn gibt.
Akozi
2
41 Bytes unter Verwendung eines einzelnen Bereichs: Bereich (a, b, (a <b) * 2-1)
GB
a<b or-1ist kürzer für den 3. Bereichsparameter. Der kürzeste, den ich bekommen habe, warlambda 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

Verwenden einer durch Leerzeichen getrennten Zeichenfolge:

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

Probieren Sie es online aus.

Verwenden einer Liste:

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;}

Probieren Sie es online aus.

( a<b?++a<b:--a>bKann ++a<b||(a-=2)>bfür die gleiche Byteanzahl gelten: Online für die Zeichenfolge oder Online für die Liste .)


Alte ( 109 108 104 102 101 Bytes) Antwort unter Verwendung eines Arrays:

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 dank @nwellnhof .

Probieren Sie es online aus.

Erläuterung:

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
Kevin Cruijssen
quelle
Gibt es in Javas Standardbibliothek nichts, um ganze Zahlenbereiche zu erstellen? Oder ist es einfach zu ausführlich?
Οurous
@ Οurous Es ist in der Tat zu wortreich: 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
Ist es Java 8 oder Java 10? Wegen "var" ^^ '
Neyt
1
@Neyt Ah, behoben. Meine anfängliche Version mit dem Array unten hat nicht verwendet var, weshalb ich diese normalerweise auf 8 gesetzt habe und diejenigen, die varals 10 verwendet werden (und diejenigen, die String.repeatals 11 verwenden). :) Ich habe vergessen, es zu aktualisieren, nachdem ich die Antworten "Liste" und "Zeichenfolge" hinzugefügt habe. Es sollte jetzt korrigiert werden. Vielen Dank.
Kevin Cruijssen
5

APL (Dyalog Extended) , 5 Bytes

Anonyme Infix-Funktion.

,,…~,

Probieren Sie es online!

, die erste und letzte (lit. die Verkettung der Argumente)

, und (lit. verkettet an)

 die Reichweite

~ ohne

, die erste und letzte (lit. die Verkettung der Argumente)

Adam
quelle
Schön, also nehme ich an, dass Sie dies von nun an für all Ihr Golfen verwenden werden?
Zacharý
@ Zacharý Wahrscheinlich nur, wenn der Code deutlich kürzer oder einfacher ist.
Adám
4

Haskell, 34 Bytes

a#b=a:b:[a+1..b-1]++[a-1,a-2..b+1]

Probieren Sie es online!

nimi
quelle
Das funktioniert nicht. GHC interpretiert b-1als b $ (-1). Verwenden Sie b- 1stattdessen.
Schuelermine
@ MarkNeu: es funktioniert. Siehe TIO-Link.
nimi
Oh, Entschuldigung! Ich hatte NegativeLiteralsan.
Schuelermine
4

Gelee , 4 Bytes

,œ|r

Probieren Sie es online!

Wie es funktioniert

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

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

J , 26 Bytes

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

Probieren Sie es online!

Erläuterung:

Ein dyadisches Verb (nimmt linkes und rechtes 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
Galen Ivanov
quelle
1
,,[:}.@}:<.+i.@-@(+*)@-für 23 Bytes und keine spezielle Groß- und Kleinschreibung bei der relativen Reihenfolge der Argumente (eher: es ist im Signum versteckt *). Ich glaube, das könnte unter 20 werden, aber ich bin müde.
Jonah
@Jonah Danke! Btw FrownyFrogs Lösung ist viel besser als meine, also werde ich nicht weiter Golf spielen.
Galen Ivanov
4

Oktave , 45 Bytes

@(a,b)[a b linspace(a,b,(t=abs(a-b))+1)(2:t)]

Probieren Sie es online!

Luis Mendo
quelle
WENN die erste größer ist als die zweite, muss die Reichweite absteigend sein
TFeld
Oh Mann, ich kann nicht lesen
Luis Mendo
Luis Mendo
4

J , 13 Bytes

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

Probieren Sie es 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
FrownyFrog
quelle
Schöne lösung! Ich habe es total vergessen i.mit negativen Argumenten.
Galen Ivanov
1
das ist herrlich!
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

Übernimmt Eingaben als Befehlszeilenargumente. Erläuterung:

@echo %1
@echo %2

Geben Sie die zwei Ganzzahlen aus.

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

Probieren Sie sowohl aufsteigende als auch absteigende Bereiche aus.

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

Schleife über den Inklusivbereich.

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

Schließen Sie die zwei Ganzzahlen aus.

echo %%i

Den aktuellen Wert ausgeben.

Neil
quelle
3

Pyth , 5 Bytes

+QtrF

Die Eingabe ist eine Liste mit zwei Elementen [input 1, input 2]. Versuchen Sie es online hier oder überprüfen alle Testfälle auf einmal hier .

+QtrFQ   Implicit: Q=eval(input())
         Trailing Q inferred
   rFQ   Generate range [input 1 - input 2)
  t      Discard first element
+Q       Prepend Q
Sok
quelle
Die Verwendung Fvon .*Listen mit 2 Elementen anstelle von Listen mit 2 Elementen ist ein brillanter Trick, den ich von nun an unbedingt anwenden werde.
Hakr14
3

Rot , 75 Bytes

func[a b][s: sign? d: b - a prin[a b]loop absolute d - s[prin[""a: a + s]]]

Probieren Sie es online!

Galen Ivanov
quelle
3

Ruby , 33 bis 40 Bytes

->a,b{[a,b]+[*a..b,*a.downto(b)][1..-2]}

Probieren Sie es online!

Temporärer Fix, um eine bessere Idee zu finden

GB
quelle
3
Dafür [4,4]gibt es nur einen[4]
Kirill L.
Du hast recht, ich habe es behoben.
GB
3

Python 2 , 52 47 41 Bytes

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

Probieren Sie es online!

-5 danke an @JoKing

-6 durch Schneiden des ersten Elements aus dem Bereich (Idee von und mit Gutschrift auf @TFeld gestohlen)

Nicht-Lambda-Version ...

Python 2 , 51 49 47 Bytes

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

Probieren Sie es online!

-2 mit Dank an @JoKing

ElPedro
quelle
3

APL (Dyalog Classic) , 29 Byte

{⍺,⍵,(⌽⍣(⍺>⍵))(⍺⌊⍵)+¯1↓⍳|⍺-⍵}

Probieren Sie es online!

Ein Port meiner JLösung

Galen Ivanov
quelle
Wow, ich bin überrascht, dass das für eine scheinbar einfache Aufgabe so lang ist.
Quintec
@Quintec Möglicherweise kann Golf gespielt werden, oder ein anderer Algorithmus führt zu einer viel kürzeren Lösung.
Galen Ivanov
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);}

Sandkasten

Leider hat PHP (für Golf) ziemlich ausführliche Funktionsnamen, die viel zur Länge beitragen. Die Grundidee ist jedoch, einen Bereich zu erstellen, dann das letzte Element abzuspringen und es an der Stelle 1 wieder einzunähen. Für das 4,4Beispiel musste ich hinzufügencount($r=range($a,$b))>1?...:$r=[$a,$b]; was einiges hinzufügt, und leider array_splice()ist es ein Hinweis, der mich für ein paar mehr getroffen hat Bytes ( $r= and a ;). Alles wegen diesem "Randfall", lol.

Na sowieso viel Spaß!

ArtisticPhoenix
quelle
Ich denke nicht, dass dies ein richtiger Ansatz für Codegolf ist. Überprüfe dies function t($a,$b){$o=array($a,$b);for($i=$a+1;$i<$b;$i++)$o[]=$i;print_r($o);}
th3pirat3
Oder so ähnlichfunction t($a,$b){echo $a.$b;for($i=$a+1;$i<$b;$i++)echo $i};
th3pirat3
1
Es muss eine Funktion sein und ein Array ausgeben. Wenn Sie eine bessere Antwort haben, können Sie sie gerne posten.
ArtisticPhoenix
Ich habe es bearbeitet. Ist das jetzt eine gültige Einsendung? Soll ich es als neue Antwort setzen oder was?
th3pirat3
Das liegt ganz bei Ihnen, ich wollte es nur ohne Schleife machen ... lol
ArtisticPhoenix
3

Clojure , 61 Bytes

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

Eine anonyme Funktion, die einen 2-Vektor als Eingabe verwendet und eine Liste zurückgibt.

Probieren Sie es online!

Erläuterung

(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
TheGreatGeek
quelle
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;}

Probieren Sie es online!

Ein Port von @ HatsuPointerKuns C ++ Antwort in D.

Zacharý
quelle
3

TI-BASIC, 35 34 Bytes

-1 Byte von Mischa Lawrow

Prompt A,B
Disp A,B
cos(π(A>B
For(I,A+Ans,B-Ans,Ans
Disp I
End
kamoroso94
quelle
2
Und noch ein Byte durch Ersetzen 1-2(A>Bdurch cos(π(A>B.
Mischa Lawrow
@ Mischa Lawrow seq(würde nicht für Eingaben funktionieren, bei denen Aund Bsind leider die gleichen :(
kamoroso94
Stimmt - außerdem habe ich ein Argument von weggelassen seq(, daher bin ich nicht mehr davon überzeugt, dass es sogar kleiner ist. Trotzdem sollte der cos(Trick helfen.
Mischa Lawrow
2

Kohle , 15 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

IE²N

Drucken Sie die Eingaben in separaten Zeilen.

I…⊕θη

Geben Sie den aufsteigenden Bereich aus, falls vorhanden.

I⮌…⊕ηθ

Drucken Sie den umgekehrten aufsteigenden umgekehrten Bereich, falls vorhanden.

Neil
quelle