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]

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.


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




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

7

Python 2 , 40 Bytes

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

Probieren Sie es online!


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

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

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


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

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)


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

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.

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

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

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

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.


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

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

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ß!


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


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

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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.