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]

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.


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



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!


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

7

Python 2 , 40 byte

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

Cobalah online!


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!


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

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

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


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

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)


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

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.

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

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

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

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.


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

Menggunakan Fbukan.* pada daftar 2-elemen adalah trik brilian yang saya benar-benar akan gunakan mulai dari sini.
hakr14



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


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



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!


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

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.


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

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.


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>

  • Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
    Licensed under cc by-sa 3.0 with attribution required.