Yang pertama, yang terakhir, dan semuanya di antara

33

Diberikan dua bilangan bulat, hasilkan dua bilangan bulat, dan kemudian rentang di antara keduanya (tidak termasuk keduanya).

Urutan kisaran harus sama dengan input.

Contoh:

 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
sumber
Saya kira kita tidak bisa mengambil input dalam urutan yang sudah dipesan sebelumnya?
Kevin Cruijssen
@KevinCruijssen, tidak, urutan output tergantung pada urutan input
TFeld
@StewieGriffin, urutan output harus sama dengan input
TFeld
Apakah format output ini dapat diterima? Perhatikan baris baru
Luis Mendo
2
@KevinCruijssen I / O yang masuk akal dapat diterima.
TFeld

Jawaban:

14

R , 39 33 30 byte

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

Cobalah online!

Terima kasih untuk byte yang disimpan ke user2390246 dan J.Doe.

Kirill L.
sumber
Anda bisa menyimpan beberapa byte dengan mengambil input sebagai vektor daripada sebagai dua integer terpisah.
user2390246
Ya, itu masuk akal, dan itu bahkan kemudian menjadi lebih pendek sebagai program penuh daripada fungsi.
Kirill L.
Anda dapat menyalahgunakan fakta bahwa :operator menggunakan elemen pertama dari kedua args untuk 30 byte
J.Doe
12

05AB1E , 4 byte

Ÿ¦¨«

Cobalah online!

Penjelasan

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

Python 3 , 52 48 47 42 41 byte

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

Cobalah online!


Gabungan implementasi sebelumnya.

cobaltp
sumber
2
Anda dapat menghapus spasi di or-1untuk menghemat satu byte.
Kevin Cruijssen
10

Python 2 (Cython) , 36 35 byte

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

Terima kasih kepada @nwellnhof karena bermain golf 1 byte!

Cobalah online!


Python 2 , 37 byte

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

Terima kasih kepada @JonasAusevicius untuk port ke CPython!

Cobalah online!

Dennis
sumber
2
Ini dapat diterapkan ke standar Python 2 pada 37 byte, menjadikannya jawaban terpendek: lambda x:x+range(*x+[-cmp(*x)|1])[1:] . Solusi yang bagus
Jonas Ausevicius
8

Perl 6 , 26 22 byte

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

Cobalah online!

Penjelasan

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

Python 2 , 40 byte

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

Cobalah online!

Erik the Outgolfer
sumber
Sangat suka -(y<x)|1. sangat keren tapi saya tidak tahu mengapa itu berhasil! Apakah ada kesempatan untuk menjelaskannya?
ElPedro
2
@ ElPedro Pada dasarnya, y<xperiksa apakah ybenar-benar kurang dari x, dan kembali Truejika ya, Falsejika tidak. Setelah itu, unary -diterapkan padanya, yang mengkonversi Trueke -1dan Falseke 0. Langkah terakhir adalah bitwise ATAU nomor ini dengan 1. Ini jelas meninggalkan 1( 0b1) tidak terpengaruh, dan juga meninggalkan -1( -0b1) tidak terpengaruh (sedikit tanda -1diatur, jadi disimpan seperti itu). Namun, itu tidak mengkonversi 0ke 1, sehingga rangetidak mengeluh tentang saya menggunakan stepdari 0.
Erik the Outgolfer
Itu benar-benar keren dan sangat pintar. Jika saya dapat membesarkan dua kali saya akan. Terima kasih banyak atas penjelasannya.
ElPedro
6

Python 3, 64 62 51 byte

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

Cobalah online!

Python 2, 58 45 byte

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

Cobalah online!

Jonas Ausevicius
sumber
2
Karena daftar kosong adalah falsey, Anda dapat menghapus a<=b and dari kedua jawaban
TFeld
Anda juga dapat menggunakan +sebagai gantinyaor
TFeld
@TFeld terima kasih
Jonas Ausevicius
Python 3 hingga 47 byte:lambda a,b:[a,b,*range(a+1,b),*range(a-1,b,-1)]
mypetlion
6

Japt, 8 byte

cUr!õ kU

Coba di sini

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

JavaScript (ES6), 51 byte

Mengambil input sebagai (a)(b).

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

Cobalah online!

Berkomentar

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
sumber
6

Python 2 , 47 41 40 byte

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

Cobalah online!

Ini milik saya, sekarang banyak jawaban Python lainnya telah diposting

-6 byte, terima kasih kepada GB

TFeld
sumber
Mengambil keuntungan dari rentang kosong ketika tidak valid adalah cara cerdas untuk berurusan dengan daftar maju atau mundur. Saya bisa melihat bahwa menjadi sangat berguna dan merupakan trik yang bagus untuk diketahui ada.
akozi
2
41 byte menggunakan rentang tunggal: rentang (a, b, (a <b) * 2-1)
GB
a<b or-1lebih pendek untuk parameter rentang ke-3. Terpendek yang saya dapatkan adalahlambda 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 byte

Menggunakan String yang dibatasi ruang:

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

Cobalah online.

Menggunakan Daftar:

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

Cobalah online.

( a<b?++a<b:--a>bbisa ++a<b||(a-=2)>buntuk byte-count yang sama: Coba online untuk String atau Coba online untuk Daftar .)


Jawaban lama ( 109 108 104 102 101 byte) menggunakan 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 byte terima kasih kepada @nwellnhof .

Cobalah online.

Penjelasan:

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
sumber
Apakah tidak ada sesuatu di perpustakaan standar Java untuk membuat rentang bilangan bulat? Atau terlalu verbose untuk digunakan?
Surous
@ Οurous Ini memang terlalu bertele-tele: 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
Apakah Java 8 atau Java 10? Karena "var" ^^ '
Neyt
1
@Tidak Ah, sudah diperbaiki. Versi awal saya dengan array di bawah ini tidak digunakan var, itulah sebabnya saya biasanya meletakkannya di 8, dan yang menggunakan var10 (dan yang menggunakan String.repeat11). :) Lupa memperbaruinya setelah menambahkan jawaban List dan String, harus diperbaiki sekarang. Terima kasih.
Kevin Cruijssen
5

APL (Dyalog Extended) , 5 byte

Fungsi infiks anonim.

,,…~,

Cobalah online!

, yang pertama dan terakhir (lit. rangkuman argumen)

, dan (lit. disatukan ke)

 jangkauan

~ tanpa

, yang pertama dan terakhir (lit. rangkuman argumen)

Adm
sumber
Bagus, jadi saya menganggap Anda akan menggunakan ini untuk semua golf Anda mulai sekarang?
Zacharý
@ Zacharý Mungkin hanya jika kode secara signifikan lebih pendek atau lebih sederhana.
Adám
4

Haskell, 34 byte

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

Cobalah online!

nimi
sumber
Ini tidak bekerja. GHC mengartikan b-1sebagai b $ (-1). Gunakan b- 1sebagai gantinya.
schuelermine
@ MarkNeu: itu berhasil. Lihat tautan TIO.
nimi
Oh maaf! Saya sudah NegativeLiterals.
schuelermine
4

Jelly , 4 byte

,œ|r

Cobalah online!

Bagaimana itu bekerja

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

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

J , 26 byte

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

Cobalah online!

Penjelasan:

Kata kerja diad (mengambil argumen kiri dan kanan)

                         -    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
sumber
1
,,[:}.@}:<.+i.@-@(+*)@-untuk 23 byte dan tidak ada casing khusus pada pemesanan argumen relatif (lebih tepatnya: itu tersembunyi di dalam signum *). saya merasa seperti ini bisa turun di bawah 20 tetapi saya lelah.
Jonah
@Jonah Terima kasih! Solusi Btw FrownyFrog jauh lebih baik daripada solusi saya, jadi saya tidak akan bermain golf lebih jauh.
Galen Ivanov
4

Oktaf , 45 byte

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

Cobalah online!

Luis Mendo
sumber
JIKA yang pertama lebih besar dari yang kedua, kisaran harus turun
TFeld
Ya ampun, saya tidak bisa membaca
Luis Mendo
Saya akhirnya mengubah bahasa
Luis Mendo
4

J , 13 byte

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

Cobalah 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
sumber
Solusi bagus! Saya benar-benar lupa i.dengan argumen negatif.
Galen Ivanov
1
ini cantik!
Jonah
3

Batch, 107 byte

@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

Mengambil input sebagai argumen baris perintah. Penjelasan:

@echo %1
@echo %2

Keluarkan dua bilangan bulat.

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

Cobalah rentang naik dan turun.

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

Ulangi rentang inklusif.

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

Kecualikan dua bilangan bulat.

echo %%i

Keluarkan nilai saat ini.

Neil
sumber
3

Pyth , 5 byte

+QtrF

Input adalah daftar dua elemen [input 1, input 2],. Coba online di sini , atau verifikasi semua uji sekaligus di sini .

+QtrFQ   Implicit: Q=eval(input())
         Trailing Q inferred
   rFQ   Generate range [input 1 - input 2)
  t      Discard first element
+Q       Prepend Q
Sok
sumber
Menggunakan Fbukan.* pada daftar 2-elemen adalah trik brilian yang saya benar-benar akan gunakan mulai dari sini.
hakr14
3

Merah , 75 byte

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

Cobalah online!

Galen Ivanov
sumber
3

Ruby , 33 40 byte

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

Cobalah online!

Perbaikan sementara, berusaha menemukan ide yang lebih baik

GB
sumber
3
Untuk [4,4]ini hanya memberikan satu[4]
Kirill L.
Anda benar, saya memperbaikinya.
GB
3

Python 2 , 52 47 41 byte

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

Cobalah online!

-5 dengan terima kasih kepada @ JoKing

-6 dengan memotong elemen pertama dari jangkauan (ide dicuri dari dan dengan kredit ke @TFeld)

Versi non-lambda ...

Python 2 , 51 49 47 byte

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

Cobalah online!

-2 dengan terima kasih kepada @ JoKing

ElPedro
sumber
3

APL (Dyalog Classic) , 29 byte

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

Cobalah online!

Port Jsolusi saya

Galen Ivanov
sumber
Wow, saya terkejut ini begitu lama untuk tugas yang tampaknya sederhana.
Quintec
@ Quintec Mungkin itu bisa golf, atau mungkin algoritma lain akan menghasilkan solusi yang jauh lebih pendek.
Galen Ivanov
3

PHP (102 byte)

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

Bak pasir

Sayangnya (untuk golf) PHP memiliki nama fungsi yang agak verbose, yang berkontribusi banyak pada panjangnya. Tapi ide dasarnya adalah membuat rentang, lalu lepas elemen terakhir dan menjahitnya kembali di offset 1. Untuk4,4 contoh saya harus menambahkan count($r=range($a,$b))>1?...:$r=[$a,$b];yang menambahkan sedikit, dan sayangnya array_splice()adalah dengan referensi yang membuat saya lebih bersemangat. byte ($r= and a ; ). Semua karena "kasus tepi", lol.

Selamat menikmati!

ArtisticPhoenix
sumber
Saya tidak berpikir bahwa ini adalah pendekatan yang tepat untuk golf kode. Periksa ini function t($a,$b){$o=array($a,$b);for($i=$a+1;$i<$b;$i++)$o[]=$i;print_r($o);}
th3pirat3
Atau sesuatu seperti inifunction t($a,$b){echo $a.$b;for($i=$a+1;$i<$b;$i++)echo $i};
th3pirat3
1
Itu harus menjadi fungsi dan harus menampilkan array. Jika Anda memiliki jawaban yang lebih baik maka Anda dapat mengirimkannya.
ArtisticPhoenix
Saya mengeditnya, apakah itu pengiriman yang valid sekarang? Haruskah saya mengatakannya sebagai jawaban baru atau apa?
th3pirat3
Itu sepenuhnya terserah Anda, saya hanya ingin melakukannya tanpa loop ... lol
ArtisticPhoenix
3

Clojure , 61 byte

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

Fungsi anonim yang mengambil 2-vektor sebagai input dan mengembalikan daftar.

Cobalah online!

Penjelasan

(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
sumber
3

D , 85 byte

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

Cobalah online!

Port jawaban C ++ @ HatsuPointerKun ke D.

Zacharý
sumber
3

TI-BASIC, 35 34 byte

-1 byte dari Misha Lavrov

Prompt A,B
Disp A,B
cos(π(A>B
For(I,A+Ans,B-Ans,Ans
Disp I
End
kamoroso94
sumber
2
Dan satu byte lagi dengan mengganti 1-2(A>Bdengan cos(π(A>B.
Misha Lavrov
@MishaLavrov seq(tidak akan bekerja untuk input di mana Adan Bitu sama, sayangnya :(
kamoroso94
Benar - juga, saya mengabaikan argumen seq(, jadi saya tidak lagi yakin itu bahkan lebih kecil. Tetap saja, cos(triknya akan membantu.
Misha Lavrov
2

Arang , 15 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

IE²N

Cetak input pada baris yang berbeda.

I…⊕θη

Cetak rentang naik, jika ada.

I⮌…⊕ηθ

Cetak reverse reverse ascending reverse, jika ada.

Neil
sumber
2

Dart , 85 84 byte

f(a,b)=>[a,b]+((a-b).abs()>1?List.generate((a-b).abs()-1,(i)=>(a>b?-i-1:i+1)+a):[]);

Cobalah online!

  • -1 dengan beralih dari >=ke>

  • Elcan
    sumber