Das 465-Arrangement

24

Hier ist die Herausforderung. Schreiben Sie Code, um alle Ganzzahlen in einem Bereich auszugeben. Klingt einfach, aber hier ist der schwierige Teil. Es beginnt mit der niedrigsten und dann mit der höchsten Zahl. Dann die niedrigste Zahl, die noch nicht im Array ist. Dann das Höchste, was noch nicht drin ist.

Beispiel:

Nehmen wir als Start 1 bis 5

Die Zahlen sind [1, 2, 3, 4, 5].

Wir nehmen den ersten, also [1]. Die verbleibenden Zahlen sind [2, 3, 4, 5]. Wir nehmen das letzte, neue Array ist [1, 5]. Die verbleibenden Zahlen sind [2, 3, 4]. Wir nehmen das erste, neue Array [1, 5, 2]. Die verbleibenden Zahlen sind [3, 4]. Wir nehmen das letzte neue Array [1, 5, 2, 4]. Die restlichen Zahlen sind [3]. Wir nehmen das erste, neue Array [1, 5, 2, 4, 3]. Keine Nummern übrig, wir sind fertig. Ausgang [1, 5, 2, 4, 3]

Regeln:

  • Dies ist Code Golf, schreiben Sie es in den wenigsten Bytes, in jeder Sprache.
  • Keine Standardlücken.
  • Links zu einem Online-Dolmetscher, bitte? (ZB https://tio.run/ )
  • Zwei Eingänge, beide Ganzzahlen. Niedriges Ende der Reichweite und hohes Ende der Reichweite.
  • Ich habe nichts dagegen, was der Datentyp der Ausgabe ist, aber es müssen die Zahlen in der richtigen Reihenfolge angezeigt werden.

Beispiele

Niedrig: 4 Hoch: 6 Ergebnis: 4 6 5


Niedrig: 1 Hoch: 5 Ergebnis: 1 5 2 4 3


Niedrig: -1 Hoch: 1 Ergebnis: -1 1 0


Niedrig: -1 Hoch: 2 Ergebnis: -1 2 0 1


Niedrig: -50 Hoch: 50 Ergebnis: -50 50 -49 49 -48 48 -47 47 -46 46 -45 45 -44 44 -43 43 -42 42 -41 41 -40 40 -39 39 -38 38 -37 37 -36 36 -35 35 -34 34 -33 33 -32 32 -31 31 -30 30 -29 29 -28 28 -27 27 -26 26 -25 25 -24 24 -23 23 -22 22 -21 21 - 20 20 -19 19 -18 18 -17 17 -16 16 -15 15 -14 14 -13 13 -12 12 -11 11 -10 10 -9 9 -8 8 -7 7 -6 6 -5 5 -4 4 -3 3 -2 2 -1 1 0


Viel Spaß beim Golfen!

AJFaraday
quelle
2
Fast doppelt (der Unterschied besteht darin, dass die zweite Hälfte vor dem Zusammenführen umgekehrt werden muss).
Peter Taylor
Wird der Eingang immer in der Größenordnung von Low-End und High-End sein?
Sumner18,
1
@ Sumner18 ja. Die Community hier ist absolut gegen die Eingabeüberprüfung eingestellt, und ich habe nicht um eine Eingabe in umgekehrter Reihenfolge gebeten, sodass wir davon ausgehen können, dass sie immer niedrig - hoch sein wird.
AJFaraday,
1
@ Sumner18 Normalerweise funktionieren diese Herausforderungen, da es uns egal ist, wie ungültige Eingaben behandelt werden. Ihr Code wird nur dann als erfolgreich beurteilt, wenn er mit gültigen Eingaben
umgeht
1
@AJFaraday: Sie sollten dem Hauptbeitrag einen Hinweis hinzufügen, dass X immer strikt niedriger als Y ist (dh X! = Y), ich habe diesen Kommentar verpasst;)
digEmAll

Antworten:

15

R , 38 37 36 Bytes

function(a,b)rbind(a:b,b:a)[a:b-a+1]

Probieren Sie es online!

  • -1 Byte danke an @ user2390246
  • -1 Byte danke an @Kirill L.

Ausnutzen der Tatsache, dass R Matrizen spaltenweise speichert

digEmAll
quelle
Verwenden rbindist viel besser als mein Ansatz, aber Sie können 1 Byte sparen, indem Sie [seq(a:b)]anstelle von verwenden unique.
user2390246
Du hast recht, ich habe den Kommentar verpasst, in dem angegeben wurde, dass a <b (nie gleich), damit wir verwenden könnenseq(a:b)
digEmAll
@digEmAll Meine Lösung war im Wesentlichen eine wörtliche Interpretation des Puzzles, ich hätte nie gedacht, etwas wie dieses zu tun. Beeindruckend, habe eine positive Bewertung!
Sumner,
1
-1 mehr
Kirill L.
11

Haskell , 30 Bytes

a%b=a:take(b-a)(b:(a+1)%(b-1))

Probieren Sie es online!

xnor
quelle
Teufel noch mal! Ich habe gerade genau die gleiche Lösung gefunden. Na
ja
8

R , 65 64 61 60 Bytes

-1 Byte dank Robert S.

-4 mehr dank digEmAll

x=scan();z=x:x[2];while(sum(z|1)){cat(z[1],"");z=rev(z[-1])}

Probieren Sie es online!

Sumner18
quelle
Sie können ersetzen length(z)mit sum(z|1)zu speichern 1 Byte :)
Robert S.
Ich verstehe nicht, wie das funktioniert, aber ich denke, es funktioniert. sum (z | 1) scheint immer mindestens 1 zu ergeben, was dazu führen würde, dass die while-Schleife eine Endlosschleife bildet. aber anscheinend nicht
Sumner18
4
z ist ein Vektor. Jedes Element dieses Vektors wird |mit 1 versehen. Dies ist immer gleich 1. Wenn Sie die Summe nehmen, haben Sie einen Vektor, der mit TRUEs gefüllt ist, sodass das Ergebnis der Länge des Vektors entspricht. Wenn der Vektor leer ist, haben Sie nichts damit zu tun, |sodass der Ausgabevektor leer ist logical(0). Wenn Sie diese Summe nehmen, ist es 0
OganM
5

PowerShell , 59 48 Bytes

param($a,$b)(($z=0..($b-$a))|%{$a+$_;$b-$_})[$z]

Probieren Sie es online!

(Scheint lang ...)

Nimmt Eingaben auf $aund erstellt $bden Bereich 0 .. ($b-$a), speichert diesen in $zund durchläuft dann diesen Bereich in einer Schleife. Die Schleife durch diesen Bereich wird nur als Zähler verwendet, um sicherzustellen, dass genügend Iterationen vorliegen. Bei jeder Iteration setzen wir $aund $bauf die Pipeline mit Addition / Subtraktion. Das gibt uns so etwas, 1,5,2,4,3,3,4,2,5,1dass wir uns von der Anzahl 0bis zur $b-$aAnzahl des ursprünglichen Arrays darauf aufteilen müssen, damit wir nur noch die entsprechenden Elemente haben. Das bleibt in der Pipeline und die Ausgabe ist implizit.

-11 bytes dank mazzy.

AdmBorkBork
quelle
48 Bytes
mazzy
@mazzy Ah, ich mag diesen $b-$aTrick - das ist klug!
AdmBorkBork
5

05AB1E , 6 Bytes

ŸDvć,R

Probieren Sie es online!

Erläuterung

Ÿ        # push range [min ... max]
 D       # duplicate
  v      # for each element in the copy
   ć,    # extract and print the head of the original list
     R   # and then reverse it
Emigna
quelle
Ÿ2ä`R.ι nicht iterativ mit Interleave, aber das ist immer noch viel besser.
Magic Octopus Urn
1
@MagicOctopusUrn: Ich habe zuerst eine nicht iterative Lösung ausprobiert, aber es war noch schlimmer, da ich nichts davon wusste ;)
Emigna
Ähnlich wie ich es mir vorgestellt hatte, also offensichtlich +1 von mir. Ich mag Ihre Alternative 7-byter auch durch, @MagicOctopusUrn. :)
Kevin Cruijssen
1
@KristianWilliams: Scheint für mich zu arbeiten .
Emigna
1
@ KevinCruijssen: Ich wechselte stattdessen zu einem Paar, da das sowieso intuitiver war :)
Emigna
4

R , 51 Bytes

function(x,y,z=x:y)matrix(c(z,rev(z)),2,,T)[seq(z)]

Probieren Sie es online!

Erläuterung: Erstellen Sie für eine Folge x:yvon Längen Neine Zwei-mal-N-Matrix, die aus der Folge x: y in der oberen Zeile und y: x in der unteren Zeile besteht matrix(c(z,rev(z)),2,,T). Wenn wir die ersten NElemente der Matrix auswählen [seq(z)], werden sie spaltenweise ausgewählt und ergeben die gewünschte Ausgabe.

Von digEmAll überfordert

user2390246
quelle
1
Ich habe gerade einen sehr ähnlichen Ansatz 30 Sekunden vor Ihnen gepostet: D
digEmAll
@digEmAll Ja, aber deins ist viel besser!
user2390246
4

cQuents , 19 Bytes

#|B-A+1&A+k-1,B-k+1

Probieren Sie es online!

Beachten Sie, dass es momentan nicht mit TIO funktioniert, da der Interpreter von TIO nicht auf dem neuesten Stand ist.

Erläuterung

#|B-A+1&A+k-1,B-k+1
                      A is the first input, B is the second input
#|B-A+1               n = B - A + 1
       &              Print the first n terms of the sequence
                      k starts at 1 and increments whenever we return to the first term
        A+k-1,         Terms alternate between A + k - 1 and
              B-k+1     B - k + 1
                       increment k
Stephen
quelle
4

JVM-Bytecode (OpenJDK asmtools JASM), 449 Byte

enum b{const #1=Method java/io/PrintStream.print:(I)V;static Method a:(II)V stack 2 locals 4{getstatic java/lang/System.out:"Ljava/io/PrintStream;";astore 3;ldc 0;istore 2;l:iload 2;ldc 1;if_icmpeq t;aload 3;iload 0;invokevirtual #1;iinc 0,1;iinc 2,1;goto c;t:aload 3;iload 1;invokevirtual #1;iinc 1,-1;iinc 2,-1;c:aload 3;ldc 32;i2c;invokevirtual java/io/PrintStream.print:(C)V;iload 0;iload 1;if_icmpne l;aload 3;iload 0;invokevirtual #1;return;}}

Ungolfed (und etwas sauberer)

 enum b {    
    public static Method "a":(II)V stack 5 locals 4 {
        getstatic "java/lang/System"."out":"Ljava/io/PrintStream;";
        astore 3;
        ldc 0;
        istore 2;
    loop:
        iload 2;
        ldc 1;
        if_icmpeq true;
    false:
        aload 3;
        iload 0;
        invokevirtual "java/io/PrintStream"."print":"(I)V";
        iinc 0,1;
        iinc 2,1;
        goto cond;
    true:
        aload 3;
        iload 1;
        invokevirtual "java/io/PrintStream"."print":"(I)V";
        iinc 1,-1;
        iinc 2,-1;
        goto cond;
    cond:
        iload 0;
        iload 1;
        if_icmpne loop;
        aload 3;
        iload 0;
        invokevirtual "java/io/PrintStream"."print":"(I)V";
        return;
    }
}

Standalone-Funktion, muss von Java als aufgerufen werden b.a(num1,num2).

Erläuterung

In diesem Code werden die Methodenparameter als Variablen sowie ein Boolescher Wert in der lokalen Nummer 3 verwendet, der über die auszugebende Zahl entscheidet. Bei jeder Schleifeniteration wird entweder links oder rechts ausgegeben, und diese Zahl wird für links inkrementiert oder für rechts dekrementiert. Die Schleife wird fortgesetzt, bis beide Zahlen gleich sind, und dann wird diese Zahl ausgegeben.

... Ich habe ein ausgeprägtes Gefühl, bei der Anzahl der Bytes massiv überfordert zu sein

Kätzchen
quelle
4

Wolfram Language (Mathematica) , 56 54 Bytes

Dies ist mein erstes Mal Golf!

f[a_,b_]:=(c=a~Range~b;Drop[c~Riffle~Reverse@c,a-b-1])

Probieren Sie es online!

2 Bytes unter Verwendung der Infixnotation gespeichert.

Erläuterung:

f[a_,b_]:=                                   \function of two variables
c=a~Range~b;                                 \list of integers from a to b 
                           Reverse@c         \same list in reverse
                  c~Riffle~Reverse@c         \interleave the two lists
             Drop[c~Riffle~Reverse@c,a-b-1]  \drop last |a-b-1| elements (note a-b-1 < 0)

Alternativ könnten wir Take[...,b-a+1]für das gleiche Ergebnis verwenden.

Tests:

f[4, 6]
f[1, 5]
f[-1, 1]
f[-1, 2]

Ausgang:

{4, 6, 5}
{1, 5, 2, 4, 3}
{-1, 1, 0}
{-1, 2, 0, 1}
Kai
quelle
Der Link "Online testen" gibt eine 403 zurück. "Sie haben leider keine Berechtigung, auf diesen Artikel zuzugreifen."
Rohit Namjoshi
@RohitNamjoshi Ich habe den Link aktualisiert
Kai
Beachten Sie, dass Sie in TIO Kopf- und Fußzeilencode in den Textfeldern über und unter dem eigentlichen Codefeld platzieren können. Dadurch sieht der Code sauberer aus und Sie können den PPCG-Antwortformatierer (esc-sg) nutzen. Probieren Sie es online!
Jo King
@JoKing sehr geschätzt, ich hatte es noch nie zuvor benutzt!
Kai
3

Japt, 7 Bytes

Übernimmt die Eingabe als Array.

rõ
ÊÆÔv

Probieren Sie es aus oder führen Sie alle Testfälle aus

         :Implicit input of array U=[low,high]
r        :Reduce by
 õ       :  Inclusive, reversed range (giving the range [high,low])
\n       :Reassign to U
Ê        :Length
 Æ       :Map the range [0,Ê)
  Ô      :  Reverse U
   v     :  Remove the first element
Zottelig
quelle
3

MATL , 8 Bytes

&:t"1&)P

Probieren Sie es online!

Erläuterung

&:      % Take two inputs (implicit). Two-input range
t       % Duplicate
"       % For each
  1&)   %   Push first element, then an array with the rest
  P     %   Reverse array
        % End (implicit). Display (implicit)
Luis Mendo
quelle
3

Viertens (gviertens) , 52 Bytes

: f 2dup - 1+ 0 do dup . i 2 mod 2* 1- - swap loop ;

Probieren Sie es online!

Erläuterung

Schleife von 0 bis (Ende - Start). Legen Sie End und Start auf den Stapel.

Jede Iteration:

  • Aktuelle Nummer ausgeben
  • Addiere (oder subtrahiere) 1 von der aktuellen Zahl
  • Wechseln Sie die aktuelle Nummer mit der anderen Nummer

Code-Erklärung

: f           \ start new word definition
  2dup -      \ get the size of the range (total number of integers)
  1+ 0        \ add 1 to the size because forth loops are [Inclusive, Exclusive) 
  do          \ start counted loop from 0 to size+1
    dup .     \ output the current top of the stack
    i 2 mod   \ get the index of the loop modulus 2
    2* 1-     \ convert from 0,1 to -1,1
    -         \ subtract result from top of stack (adds 1 to lower bound and subtracts 1 from upper)
    swap      \ swap the top two stack numbers 
  loop        \ end the counted loop
;             \ end the word definition
reffu
quelle
3

Haskell, 30 Bytes

l%h=l:take(h-l)(h:(l+1)%(h-1))

Verbrauch: 3%7gibt `[3,7,4,6,5]

Für die Eingaben l, hruft die Funktion die Eingaben rekursiv auf l+1, h-1und fügt l,hsie dem Anfang hinzu. Anstelle einer Haltebedingung wird im Code take(h-l)die Sequenz auf die richtige Länge gekürzt (andernfalls wäre dies eine unendliche Folge von auf- und absteigenden Zahlen).

stolzer haskeller
quelle
3

Brachylog , 15 Bytes

⟦₂{∅|b↔↰T&hg,T}

Die Eingabe ist eine Liste mit 2 Elementen [lo, hi]. Beachten Sie, dass der Unterstrich für negative Zahlen verwendet wird. Probieren Sie es online!

Erläuterung

⟦₂               2-argument inclusive range: [1,5] -> [1,2,3,4,5]
  {           }  Call this recursive predicate to calculate the output:
   ∅               Base case: the input is empty list; nothing to do
    |              Otherwise (recursive case):      [1,2,3,4,5]
     b             Behead the input list            [2,3,4,5]
      ↔            Reverse                          [5,4,3,2]
       ↰           Call the predicate recursively   [5,2,4,3]
        T          Label the result T
         &         Also, with the input list,
          h        Take the head                    1
           g       Wrap it in a list                [1]
            ,T     Append T from earlier            [1,5,2,4,3]
DLosc
quelle
3

MathGolf , 6 Bytes

↨_x^─▀

Probieren Sie es online!

Erklärung mit (1, 5)

↨        inclusive range from a to b    [1, 2, 3, 4, 5]
 _       duplicate TOS                  [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]
  x      reverse int/array/string       [1, 2, 3, 4, 5], [5, 4, 3, 2, 1]
   ^     zip top two elements on stack  [[1, 5], [2, 4], [3, 3], [4, 2], [5, 1]]
    ─    flatten array                  [1, 5, 2, 4, 3, 3, 4, 2, 5, 1]
     ▀   unique elements of string/list [1, 5, 2, 4, 3]

Der Grund, warum dies funktioniert, ist die Tatsache, dass alle Elemente in der Ausgabe eindeutig sein sollten, sodass der Operator für eindeutige Elemente die zweite Hälfte des Arrays herausfiltert und die richtige Ausgabe erzeugt.

maxb
quelle
2

Cubix, 16 Bytes

;w(.II>sO-?@;)^/

Probieren Sie es hier aus

Cubified

    ; w
    ( .
I I > s O - ? @
; ) ^ / . . . .
    . .
    . .

Erläuterung

Grundsätzlich rücken die beiden Grenzen so lange schrittweise näher zusammen, bis sie sich treffen. Jedes Mal s, Owenn wir die Schleife durchlaufen , tauschen wir die Grenzen aus, geben aus, nehmen die Differenz und erhöhen mit )oder verringern mit, (basierend auf dem Vorzeichen.


quelle
2

Pyth, 10 8 Bytes

{.iF_B}F

Probieren Sie es hier aus

Erläuterung

{.iF_B}F
      }FQ  Generate the range between the (implicit) inputs.
 .iF_B     Interleave it with its reverse.
{          Deduplicate.

quelle