Porozumienie 465

24

Oto wyzwanie. Napisz kod, aby wyprowadzić wszystkie liczby całkowite z zakresu. Brzmi łatwo, ale oto podstępna część. Zacznie się od najniższej liczby, a następnie najwyższej. Następnie najniższa liczba, która nie jest jeszcze w tablicy. Zatem najwyższy, którego jeszcze nie ma.

Przykład:

Weźmy od 1 do 5 jako nasz początek

Liczby to [1, 2, 3, 4, 5].

Bierzemy pierwszy, więc [1]. Pozostałe liczby to [2, 3, 4, 5]. Bierzemy ostatnią, nową tablicę to [1, 5]. Pozostałe liczby to [2, 3, 4]. Przyjmujemy pierwszą, nową tablicę to [1, 5, 2]. Pozostałe liczby to [3, 4]. Bierzemy ostatnią, nową tablicę to [1, 5, 2, 4]. Pozostałe liczby to [3]. Przyjmujemy pierwszą, nową tablicę to [1, 5, 2, 4, 3]. Nie ma już żadnych liczb, gotowe. Wyjście [1, 5, 2, 4, 3]

Zasady:

  • To jest kod golfowy, napisz go w jak najmniejszej liczbie bajtów, w dowolnym języku.
  • Brak standardowych luk.
  • Proszę podać linki do tłumacza online? (Np. Https://tio.run/ )
  • Dwa wejścia, obie liczby całkowite. Niski koniec zakresu i wysoki koniec zakresu.
  • Nie przeszkadza mi, jaki jest typ danych wyjściowych, ale musi pokazywać liczby we właściwej kolejności.

Przykłady

Niski: 4 Wysoki: 6 Wynik: 4 6 5


Niski: 1 Wysoki: 5 Wynik: 1 5 2 4 3


Niski: -1 High: 1 Wynik: -1 1 0


Niski: -1 wysoki: 2 Wynik: -1 2 0 1


Niski: -50 Wysoki: 50 Wynik: -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


Miłej gry w golfa!

AJFaraday
źródło
2
Prawie duplikat (różnica polega na tym, że ta wymaga odwrócenia drugiej połowy przed połączeniem).
Peter Taylor
czy dane wejściowe zawsze będą w porządku od najniższego do najwyższego poziomu?
Sumner18
1
@ Sumner18 tak. Społeczność tutaj jest ustawiona w stosunku do sprawdzania poprawności danych wejściowych, a ja nie prosiłem o dane wejściowe w odwrotnej kolejności, więc możemy założyć, że zawsze będzie niski - wysoki.
AJFaraday
1
@ Sumner18 Jak zwykle działają te wyzwania, nie obchodzi nas, w jaki sposób obsługiwane są nieprawidłowe dane wejściowe. Twój kod jest uznawany za udany tylko na podstawie tego, jak
radzi sobie
1
@AJFaraday: należy dodać notatkę do głównego postu wskazującą, że X będzie zawsze dokładnie niższa niż Y (tj. X! = Y), brakowało mi tego komentarza;)
digEmAll

Odpowiedzi:

15

R , 38 37 36 bajtów

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

Wypróbuj online!

  • -1 bajt dzięki @ user2390246
  • -1 bajt dzięki @Kirill L.

Wykorzystanie faktu, że R przechowuje macierze według kolumn

digEmAll
źródło
Używanie rbindjest znacznie lepsze niż moje podejście, ale możesz zaoszczędzić 1 bajt, używając [seq(a:b)]zamiast unique.
user2390246
Masz rację, brakowało mi komentarza, w którym podano <b (nigdy równe), więc możemy użyćseq(a:b)
digEmAll
@digEmAll Moje rozwiązanie było dosłownie interpretacją układanki, nigdy bym nawet nie pomyślał o zrobieniu czegoś takiego. Imponujące, z entuzjazmem!
Sumner18
1
-1 więcej
Kirill L.
11

Haskell , 30 bajtów

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

Wypróbuj online!

xnor
źródło
Cholera! Właśnie znalazłem dokładnie to samo rozwiązanie. No cóż
dumny haskeller
8

R , 65 64 61 60 bajtów

-1 bajt dzięki Robert S.

-4 więcej dzięki digEmAll

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

Wypróbuj online!

Sumner18
źródło
Można wymienić length(z)ze sum(z|1)aby zapisać 1 bajt :)
Robert S.
Nie rozumiem, jak to działa, ale chyba tak. suma (z | 1) wydaje się, że zawsze miałaby wartość co najmniej 1, co spowodowałoby, że pętla while zapętlałaby się bez końca. ale najwyraźniej nie
Sumner18,
4
z jest wektorem. każdy element tego wektora jest |edytowany za pomocą 1. Co jest zawsze równe 1. Kiedy bierzesz sumę, masz wektor wypełniony TRUEs, więc wynik jest równy długości wektora. Jeśli wektor jest pusty, to nie ma |z czym, więc wektor wyjściowy jest logical(0). Gdy weźmiesz tę sumę, będzie to 0
OganM
5

PowerShell , 59 48 bajtów

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

Wypróbuj online!

(Wydaje się długi ...)

Pobiera dane wejściowe $ai $bkonstruuje zakres 0 .. ($b-$a), zapisuje go $z, a następnie zapętla ten zakres. Pętla w tym zakresie służy tylko jako licznik, aby zapewnić wystarczającą liczbę iteracji. Każda iteracja, stawiamy $ai $bna rurociągu z dodawaniem / odejmowaniem. To daje nam coś takiego 1,5,2,4,3,3,4,2,5,1, więc musimy się że kawałek od 0przygotowań do $b-$a(tj liczą) oryginalnej tablicy, tak my zostajemy tylko z odpowiednimi elementami. Pozostaje to w potoku, a wyniki są niejawne.

-11 bajtów dzięki mazzy.

AdmBorkBork
źródło
48 bajtów
mazzy
@mazzy Ah, podoba mi się ta $b-$asztuczka - to sprytne!
AdmBorkBork
5

05AB1E , 6 bajtów

ŸDvć,R

Wypróbuj online!

Wyjaśnienie

Ÿ        # 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
źródło
Ÿ2ä`R.ι nie iteruje za pomocą przeplotu, ale jest to o wiele lepsze.
Magic Octopus Urn
1
@MagicOctopusUrn: Najpierw wypróbowałem nie iteracyjne rozwiązanie, ale było jeszcze gorzej, ponieważ nie wiedziałem o ;)
Emigna
Podobnie jak to, co miałem na myśli, tak oczywiste +1 ode mnie. Podoba mi się również twój alternatywny 7-bajtowy @MagicOctopusUrn. :)
Kevin Cruijssen
1
@KristianWilliams: Wydaje się, że dla mnie pracuje .
Emigna
1
@KevinCruijssen: Zamiast tego przestawiłem się na parę, ponieważ i tak czułem się bardziej intuicyjnie :)
Emigna
4

Japt , 14 bajtów

òV
íUs w)c vUl

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
13 bajtów , przy użyciu tego samego podejścia.
Kudłaty
4

R , 51 bajtów

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

Wypróbuj online!

Objaśnienie: Dla sekwencji x:ydługości Nutwórz macierz dwa na N składającą się z sekwencji x: y w górnym rzędzie i y: x w dolnym rzędzie matrix(c(z,rev(z)),2,,T). Jeśli wybierzemy pierwszyN elementy macierzy [seq(z)], zostaną one wybrane według kolumny, dając wymagany wynik.

Outgolfed by digEmAll

użytkownik2390246
źródło
1
Właśnie opublikowałem bardzo podobne podejście 30 sekund przed tobą: D
digEmAll
@digEmAll Tak, ale twój jest o wiele lepszy!
user2390246
4

cQuents , 19 bajtów

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

Wypróbuj online!

Pamiętaj, że obecnie nie działa w TIO, ponieważ interpreter TIO nie jest aktualny.

Wyjaśnienie

#|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
źródło
4

Haskell, 39 bajtów

f(a:b)=a:f(reverse b)
f x=x
a#b=f[a..b]

Wypróbuj online!

nimi
źródło
4

Kod bajtowy JVM (OpenJDK asmtools JASM), 449 bajtów

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

Niegolfowany (i nieco czystszy)

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

Funkcja samodzielna, należy wywołać z Java as b.a(num1,num2).

Wyjaśnienie

Ten kod wykorzystuje parametry metody jako zmienne, a także wartość logiczną w lokalnym numerze 3 decydującym o tym, którą liczbę wyprowadzić. Każda iteracja pętli, albo w lewo, albo w prawo, jest wyprowadzana, a liczba ta jest zwiększana dla lewej lub zmniejszana dla prawej. Pętla trwa do momentu, aż obie liczby będą równe, a następnie ta liczba jest wyprowadzana.

... Mam wyraźne przeczucie, że jestem ogromnie oszołomiony pod względem liczby bajtów

Kotek
źródło
4

Wolfram Language (Mathematica) , 56 54 bajtów

To mój pierwszy raz w golfa!

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

Wypróbuj online!

Zapisano 2 bajty za pomocą notacji infix.

Wyjaśnienie:

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)

Alternatywnie możemy użyć Take[...,b-a+1]tego samego rezultatu.

Testy:

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

Ouput:

{4, 6, 5}
{1, 5, 2, 4, 3}
{-1, 1, 0}
{-1, 2, 0, 1}
Kai
źródło
Link „Wypróbuj online” zwraca wartość 403. „Niestety nie masz uprawnień dostępu do tego elementu”.
Rohit Namjoshi
@RohitNamjoshi Zaktualizowałem link
Kai
zwróć uwagę, że w TIO możesz umieścić kod nagłówka i stopki w polach tekstowych powyżej i poniżej rzeczywistego pola kodu. Dzięki temu kod wygląda na bardziej przejrzysty, a także pozwala skorzystać z formatyzatora odpowiedzi PPCG (esc-sg). Wypróbuj online!
Jo King
@JoKing bardzo doceniam, nigdy wcześniej go nie używałem!
Kai
3

Japt, 7 bajtów

Pobiera dane wejściowe jako tablicę.

rõ
ÊÆÔv

Wypróbuj lub uruchom wszystkie przypadki testowe

         :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
Kudłaty
źródło
3

MATL , 8 bajtów

&:t"1&)P

Wypróbuj online!

Wyjaśnienie

&:      % 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
źródło
3

Dalej (gforth) , 52 bajty

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

Wypróbuj online!

Wyjaśnienie

Pętla od 0 do (End - Start). Umieść End i Start na wierzchu stosu.

Każda iteracja:

  • Podaj aktualny numer
  • Dodaj (lub odejmij) 1 od bieżącego numeru
  • Przełącz bieżący numer na inny numer

Objaśnienie kodu

: 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
źródło
3

Haskell, 30 bajtów

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

Użycie: 3%7daje „[3,7,4,6,5]

W przypadku danych wejściowych l, hfunkcja wywołuje rekurencyjnie dane wejściowe l+1, h-1i dodaje l,hdo początku. Zamiast warunków zatrzymania, kod używa take(h-l)do skrócenia sekwencji do odpowiedniej długości (co w innym przypadku byłoby nieskończoną sekwencją rosnących i malejących liczb).

dumny haskeller
źródło
3

Brachylog , 15 bajtów

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

Dane wejściowe to lista 2-elementowa [lo, hi]. Zauważ, że dla liczb ujemnych używany jest znak podkreślenia.Wypróbuj online!

Wyjaśnienie

⟦₂               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
źródło
3

MathGolf , 6 bajtów

↨_x^─▀

Wypróbuj online!

Wyjaśnienie za pomocą (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]

Powodem, dla którego to działa, jest fakt, że wszystkie elementy na wyjściu powinny być unikalne, więc operator elementów unikatowych odfiltruje drugą połowę tablicy, wytwarzając prawidłowe dane wyjściowe.

maxb
źródło
2

Cubix, 16 bajtów

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

Wypróbuj tutaj

Cubified

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

Wyjaśnienie

Zasadniczo przesuwa to dwie granice bliżej siebie o krok, aż się spotkają. Za każdym razem, gdy pętla, wapujemy sgranice, Output, bierzemy różnicę i zwiększamy )lub zmniejszamy za (pomocą znaku.


źródło
2

Pyth, 10 8 bajtów

{.iF_B}F

Wypróbuj tutaj

Wyjaśnienie

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

źródło