Đầu tiên, cuối cùng, và tất cả mọi thứ giữa


33

Cho hai số nguyên, xuất hai số nguyên và sau đó là phạm vi giữa chúng (không bao gồm cả hai).

Thứ tự của phạm vi phải giống như đầu vào.

Ví dụ:

 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]

Tôi đoán chúng ta không thể lấy đầu vào theo thứ tự đặt hàng trước?
Kevin Cruijssen

@KevinCruijssen, không, thứ tự đầu ra phụ thuộc vào thứ tự đầu vào
TFeld

@StewieGriffin, thứ tự đầu ra phải giống với đầu vào
TFeld

này dạng đầu ra có thể chấp nhận? Lưu ý dòng mới
Luis Mendo

2
@KevinCruijssen Bất kỳ I / O hợp lý nào cũng được chấp nhận.
TFeld

Câu trả lời:


14

R , 39 33 30 byte

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

Hãy thử trực tuyến!

Cảm ơn đã lưu byte cho user2390246 và J.Doe.


Bạn có thể lưu một vài byte bằng cách lấy đầu vào dưới dạng vectơ thay vì hai số nguyên riêng biệt.
dùng2390246

Vâng, điều đó hợp lý, và nó thực sự trở nên ngắn hơn như một chương trình đầy đủ hơn là chức năng.
Kirill L.

Bạn có thể lạm dụng thực tế :toán tử sử dụng phần tử đầu tiên của cả hai đối số cho 30 byte
J.Doe



10

Python 2 (Cython) , 36 35 byte

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

Cảm ơn @nwellnhof đã chơi golf 1 byte!

Hãy thử trực tuyến!


Python 2 , 37 byte

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

Cảm ơn @JonasAusevicius đã chuyển sang CPython!

Hãy thử trực tuyến!


2
Điều này có thể được áp dụng cho Python 2 tiêu chuẩn ở mức 37 byte, làm cho nó trở thành câu trả lời ngắn nhất : lambda x:x+range(*x+[-cmp(*x)|1])[1:]. Giải pháp tốt đẹp
Jonas Ausevicius

8

Perl 6 , 26 22 byte

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

Hãy thử trực tuyến!

Giải trình

{                    }
 |@_,   # 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:]

Hãy thử trực tuyến!


Thực sự thích -(y<x)|1. rất tuyệt nhưng tôi không thể hiểu tại sao nó hoạt động! Bất kỳ cơ hội bạn có thể giải thích nó?
ElPedro

2
@ElPedro Về cơ bản, y<xkiểm tra nếu yhoàn toàn nhỏ hơn xvà trả về Truenếu có, Falsenếu không. Sau đó, unary -được áp dụng cho nó, chuyển đổi Truethành -1Falsethành 0. Bước cuối cùng là bitwise HOẶC số này với 1. Điều này rõ ràng làm cho 1( 0b1) không bị ảnh hưởng, và cũng để lại -1( -0b1) không bị ảnh hưởng (bit dấu của -1được đặt, vì vậy nó được giữ như vậy). Tuy nhiên, nó không chuyển đổi 0để 1, do đó rangekhông phàn nàn về tôi sử dụng một stepsố 0.
Erik the Outgolfer

Đó là nghiêm túc mát mẻ và rất thông minh. Nếu tôi có thể upvote hai lần tôi sẽ. Rất cám ơn đã giải thích.
ElPedro

6

Python 3, 64 62 51 byte

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

Hãy thử trực tuyến!

Python 2, 58 45 byte

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

Hãy thử trực tuyến!


2
Vì danh sách trống là falsey, bạn có thể xóa a<=b and câu trả lời khỏi cả hai câu trả lời
TFeld

Bạn cũng có thể sử dụng +thay vìor
TFeld

@TFeld cảm ơn bạn
Jonas Ausevicius

Python 3 xuống còn 47 byte:lambda a,b:[a,b,*range(a+1,b),*range(a-1,b,-1)]
mypetlion 14/11/18


6

JavaScript (ES6), 51 byte

Đưa đầu vào là (a)(b).

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

Hãy thử trực tuyến!

Đã bình luận

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:]

Hãy thử trực tuyến!

Đây là của tôi, bây giờ có rất nhiều câu trả lời Python khác đã được đăng

-6 byte, nhờ GB


Tận dụng phạm vi trống khi nó không hợp lệ là một cách thông minh để xử lý các danh sách tiến hoặc lùi. Tôi có thể thấy rằng rất hữu ích và là một mẹo hay để biết tồn tại.
akozi

2
41 byte sử dụng một phạm vi duy nhất: phạm vi (a, b, (a <b) * 2-1)
GB

a<b or-1là ngắn hơn cho tham số phạm vi thứ 3. Thời gian ngắn nhất tôi nhận được làlambda 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

Sử dụng Chuỗi phân cách bằng dấu cách:

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

Hãy thử trực tuyến.

Sử dụng danh sách:

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

Hãy thử trực tuyến.

( a<b?++a<b:--a>bcó thể ++a<b||(a-=2)>bcho cùng một số đếm byte: Dùng thử trực tuyến cho Chuỗi hoặc Thử trực tuyến cho Danh sách .)


Câu trả lời cũ ( 109 108 104 102 101 byte) sử dụng một mảng:

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 nhờ @nwellnhof .

Hãy thử trực tuyến.

Giải trình:

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

Không có gì trong thư viện chuẩn của Java để tạo phạm vi số nguyên? Hoặc nó chỉ là quá dài để sử dụng?
Οurous

@ Οurous Thật sự quá dài dòng: 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 byte)
Kevin Cruijssen

Đó là Java 8 hay Java 10? Vì "var" ^^ '
Neyt

1
@Neyt Ah, đã sửa. Phiên bản ban đầu của tôi với mảng bên dưới không sử dụng var, đó là lý do tại sao tôi thường đặt các số ở mức 8 và các phiên bản sử dụng varlà 10 (và các phiên bản sử dụng String.repeatlà 11). :) Quên cập nhật nó sau khi thêm câu trả lời Danh sách và Chuỗi, nên được sửa ngay bây giờ. Cảm ơn.
Kevin Cruijssen

5

APL (Dyalog mở rộng) , 5 byte

Hàm infix ẩn danh.

,,…~,

Hãy thử trực tuyến!

, đầu tiên và cuối cùng (nghĩa là sự kết hợp của các đối số)

, và (được nối với)

 phạm vi

~ không có

, đầu tiên và cuối cùng (nghĩa là sự kết hợp của các đối số)


Thật tuyệt, vì vậy tôi cho rằng bạn sẽ sử dụng cái này cho tất cả việc chơi golf của bạn kể từ bây giờ?
Zacharý

@ Zacharý Có lẽ chỉ khi mã ngắn hơn hoặc đơn giản hơn đáng kể .
Adám



4

J , 26 byte

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

Hãy thử trực tuyến!

Giải trình:

Một động từ dyadic (lấy đối số trái và phải)

                         -    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.@-@(+*)@-cho 23 byte và không có vỏ bọc đặc biệt theo thứ tự đối số tương đối (thay vào đó: nó ẩn bên trong dấu hiệu *). tôi cảm thấy như thế này có thể xuống dưới 20 nhưng tôi mệt mỏi.
Giô-na

@Jonah Cảm ơn bạn! Giải pháp của Btw FrownyFrog tốt hơn tôi rất nhiều, vì vậy tôi sẽ không chơi golf thêm nữa.
Galen Ivanov


4

J , 13 byte

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

Hãy thử trực tuyến!

     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

Giải pháp tốt đẹp! Tôi hoàn toàn quên mất i.với lập luận tiêu cực.
Galen Ivanov

1
thật là tuyệt đẹp
Giô-na

3

Mẻ, 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

Lấy đầu vào làm đối số dòng lệnh. Giải trình:

@echo %1
@echo %2

Đầu ra hai số nguyên.

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

Hãy thử cả phạm vi tăng dần và giảm dần.

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

Vòng qua phạm vi bao gồm.

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

Loại trừ hai số nguyên.

echo %%i

Xuất giá trị hiện tại.


3

Bình thường , 5 byte

+QtrF

Đầu vào là một danh sách hai yếu tố , [input 1, input 2]. Dùng thử trực tuyến tại đây hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc tại đây .

+QtrFQ   Implicit: Q=eval(input())
         Trailing Q inferred
   rFQ   Generate range [input 1 - input 2)
  t      Discard first element
+Q       Prepend Q

Sử dụng Fthay vì .*trên danh sách 2 yếu tố là một mẹo hay mà tôi hoàn toàn sẽ sử dụng từ đây trở đi.
hakr14



3

Ruby , 33 40 byte

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

Hãy thử trực tuyến!

Khắc phục tạm thời, cố gắng tìm một ý tưởng tốt hơn


3
Đối với [4,4]điều này chỉ cung cấp cho một[4]
Kirill L.

Bạn nói đúng, tôi đã sửa nó.
GB

3

Python 2 , 52 47 41 byte

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

Hãy thử trực tuyến!

-5 cảm ơn @JoKing

-6 bằng cách cắt phần tử đầu tiên trong phạm vi (ý tưởng bị đánh cắp từ và có tín dụng cho @TFeld)

Phiên bản không phải lambda ...

Python 2 , 51 49 47 byte

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

Hãy thử trực tuyến!

-2 cảm ơn @JoKing


3

APL (Dyalog Classic) , 29 byte

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

Hãy thử trực tuyến!

Một cổng Jgiải pháp của tôi


Wow, tôi ngạc nhiên rằng điều này quá dài cho một nhiệm vụ có vẻ đơn giản.
Quintec

@Quintec Có lẽ nó có thể được đánh gôn, hoặc có thể một thuật toán khác sẽ dẫn đến giải pháp ngắn hơn nhiều.
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);}

Hộp cát

Thật không may (đối với golf) PHP có các tên hàm khá dài dòng, đóng góp rất nhiều vào chiều dài. Nhưng ý tưởng cơ bản là tạo ra một phạm vi, sau đó bật ra phần tử cuối cùng và đưa nó trở lại ở phần bù 1. Ví 4,4dụ tôi phải thêm count($r=range($a,$b))>1?...:$r=[$a,$b];phần bổ sung khá nhiều, và thật không may array_splice()là do tham chiếu đã đánh tôi thêm một vài lần nữa byte ($r= and a ; ). Tất cả chỉ vì "trường hợp cạnh" đó, lol.

Dù sao cũng được hưởng!


Tôi không nghĩ rằng đây là một cách tiếp cận đúng cho môn đánh gôn. Kiểm tra cái này function t($a,$b){$o=array($a,$b);for($i=$a+1;$i<$b;$i++)$o[]=$i;print_r($o);}
th3pirat3

Hoặc một cái gì đó như thế nàyfunction t($a,$b){echo $a.$b;for($i=$a+1;$i<$b;$i++)echo $i};
th3pirat3

1
Nó phải là một hàm và nó phải xuất ra một mảng. Nếu bạn có câu trả lời tốt hơn của bạn nhiều hơn thì hoan nghênh đăng nó.
ArtisticPhoenix

Tôi đã chỉnh sửa nó, đó là một đệ trình hợp lệ bây giờ? Tôi sẽ đặt nó như một câu trả lời mới hay sao?
th3pirat3

Điều đó hoàn toàn phụ thuộc vào bạn, tôi chỉ muốn làm điều đó mà không cần vòng lặp ... lol
ArtisticPhoenix

3

Clojure , 61 byte

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

Một hàm ẩn danh lấy 2 vectơ làm đầu vào và trả về một danh sách.

Hãy thử trực tuyến!

Giải trình

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

Hãy thử trực tuyến!

Một cổng của câu trả lời C ++ của @ HatsuPulumKun vào D.


3

TI-BASIC, 35 34 byte

-1 byte từ Misha Lavrov

Prompt A,B
Disp A,B
cos(π(A>B
For(I,A+Ans,B-Ans,Ans
Disp I
End

2
Và thêm một byte bằng cách thay thế 1-2(A>Bbằng cos(π(A>B.
Misha Lavrov

@MishaLavrov seq(sẽ không hoạt động cho các đầu vào ở đâu ABgiống nhau, thật không may :(
kamoroso94

Đúng - ngoài ra, tôi đã bỏ qua một cuộc tranh luận seq(, vì vậy tôi không còn tin rằng nó thậm chí còn nhỏ hơn. Tuy nhiên, cos(mẹo sẽ giúp.
Misha Lavrov

2

than củi , 15 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

IE²N

In các đầu vào trên các dòng riêng biệt.

I…⊕θη

In phạm vi tăng dần, nếu có.

I⮌…⊕ηθ

In phạm vi đảo ngược tăng dần, nếu có.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.