Sự sắp xếp thứ 465


24

Đây là thử thách. Viết một số mã để xuất tất cả các số nguyên trong một phạm vi. Nghe có vẻ dễ, nhưng đây là phần khó khăn. Nó sẽ bắt đầu với số thấp nhất, sau đó cao nhất. Sau đó, số thấp nhất chưa có trong mảng. Sau đó, mức cao nhất chưa có trong đó.

Thí dụ:

Hãy bắt đầu từ 1 đến 5

Các số là [1, 2, 3, 4, 5].

Chúng tôi lấy đầu tiên, vì vậy [1]. Các số còn lại là [2, 3, 4, 5]. Chúng tôi lấy mảng cuối cùng, mới là [1, 5]. Các số còn lại là [2, 3, 4]. Chúng tôi lấy mảng đầu tiên, mới là [1, 5, 2]. Các số còn lại là [3, 4]. Chúng tôi lấy mảng cuối cùng, mới là [1, 5, 2, 4]. Số còn lại là [3]. Chúng tôi lấy mảng đầu tiên, mới là [1, 5, 2, 4, 3]. Không còn số nào, chúng tôi đã hoàn thành. Đầu ra [1, 5, 2, 4, 3]

Quy tắc:

  • Đây là mã golf, viết nó bằng ít byte nhất, bất kỳ ngôn ngữ nào.
  • Không có sơ hở tiêu chuẩn.
  • Liên kết đến một thông dịch viên trực tuyến, xin vui lòng? (Ví dụ: https://tio.run/ )
  • Hai đầu vào, cả hai số nguyên. Kết thúc thấp của phạm vi, và cao cấp của phạm vi.
  • Tôi không quan tâm kiểu dữ liệu của đầu ra là gì, nhưng nó phải hiển thị các số theo đúng thứ tự.

Ví dụ

Thấp: 4 Cao: 6 Kết quả: 4 6 5


Thấp: 1 Cao: 5 Kết quả: 1 5 2 4 3


Thấp: -1 Cao: 1 Kết quả: -1 1 0


Thấp: -1 cao: 2 Kết quả: -1 2 0 1


Thấp: -50 Cao: 50 Kết quả: -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


Chúc bạn chơi golf vui vẻ!


2
Gần như trùng lặp (sự khác biệt là cái này yêu cầu đảo ngược nửa sau trước khi hợp nhất).
Peter Taylor

đầu vào luôn luôn theo thứ tự cấp thấp, cấp cao?
Sumner18

1
@ Sumner18 có. Cộng đồng ở đây được thiết lập để chống lại xác thực đầu vào và tôi đã không yêu cầu đầu vào theo thứ tự ngược lại, vì vậy chúng tôi có thể cho rằng nó sẽ luôn ở mức thấp - cao.
AJFaraday

1
@ Sumner18 Làm thế nào những thách thức này thường hoạt động là chúng tôi không quan tâm đến cách xử lý đầu vào không hợp lệ. Mã của bạn chỉ được đánh giá là thành công bằng cách nó xử lý các đầu vào hợp lệ (nghĩa là cả hai đều là số nguyên, số đầu tiên thấp hơn số thứ hai)
AJFaraday

1
@AJFaraday: bạn nên thêm một ghi chú vào bài đăng chính cho biết X sẽ luôn luôn thấp hơn Y (tức là X! = Y), tôi đã bỏ lỡ nhận xét này;)
digEmAll

Câu trả lời:


15

R , 38 37 36 byte

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

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

  • -1 byte nhờ @ user2390246
  • -1 byte nhờ @Kirill L

Khai thác thực tế rằng R lưu trữ ma trận cột khôn ngoan


Sử dụng rbindtốt hơn nhiều so với cách tiếp cận của tôi, nhưng bạn có thể tiết kiệm 1 byte bằng cách sử dụng [seq(a:b)]thay vì unique.
dùng2390246

Bạn nói đúng, tôi đã bỏ lỡ nhận xét đã được chỉ định rằng <b (không bao giờ bằng nhau), vì vậy chúng tôi có thể sử dụngseq(a:b)
digEmAll

@digEmAll Giải pháp của tôi về cơ bản là một cách giải thích theo nghĩa đen của câu đố, tôi thậm chí không bao giờ nghĩ sẽ làm một việc như thế này. Ấn tượng, có một upvote!
Sumner18



8

R , 65 64 61 60 byte

-1 byte nhờ Robert S.

-4 thêm nhờ vào digEmAll

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

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


Bạn có thể thay thế length(z)bằng sum(z|1)để tiết kiệm 1 byte :)
Robert S.

Tôi không hiểu làm thế nào nó hoạt động nhưng tôi đoán nó làm. sum (z | 1) có vẻ như nó sẽ luôn ước tính ít nhất là 1, điều này sẽ khiến vòng lặp while lặp vô tận. nhưng dường như không phải
Sumner18

4
z là một vectơ. mỗi phần tử của vectơ đó là |ed với 1. Luôn luôn bằng 1. Khi bạn lấy tổng, bạn có một vectơ chứa đầy TRUEs để kết quả bằng với độ dài của vectơ. Nếu vectơ trống, bạn không có gì |với vectơ đầu ra logical(0). Khi bạn lấy số tiền đó, nó là 0
OganM



5

PowerShell , 59 48 byte

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

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

(Có vẻ dài ...)

Đưa đầu vào $a$b, xây dựng phạm vi 0 .. ($b-$a), lưu trữ vào $zđó, sau đó lặp qua phạm vi đó. Việc lặp qua phạm vi đó chỉ được sử dụng như một bộ đếm để đảm bảo chúng ta có đủ số lần lặp. Mỗi lần lặp, chúng tôi đặt $a$btrên đường ống có phép cộng / trừ. Cung cấp cho chúng tôi một cái gì đó như 1,5,2,4,3,3,4,2,5,1vì vậy chúng tôi cần phải lát vào đó từ 0đến$b-$a (ví dụ: số đếm) của mảng ban đầu để chúng ta chỉ còn lại các yếu tố thích hợp. Đó là còn lại trên đường ống và đầu ra là ẩn.

-11 byte nhờ mazzy.



@mazzy Ah, tôi thích $b-$amánh khóe đó - thật thông minh!
admBorkBork

5

05AB1E , 6 byte

ŸDvć,R

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

Giải trình

Ÿ        # 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

Ÿ2ä`R.ι không lặp lại sử dụng xen kẽ, nhưng điều này vẫn tốt hơn nhiều.
Bạch tuộc ma thuật Urn

1
@MagicOctopusUrn: Trước tiên tôi đã thử một giải pháp không lặp lại, nhưng nó thậm chí còn tệ hơn kể từ khi tôi không biết về ;)
Emigna

Tương tự như những gì tôi đã nghĩ, +1 rõ ràng từ tôi. Tôi cũng thích 7 -terter thay thế của bạn thông qua, @MagicOctopusUrn. :)
Kevin Cruijssen

1
@KristianWilliams: Có vẻ như đang làm việc cho tôi.
Emigna

1
@KevinCruijssen: Tôi đã chuyển sang một cặp thay vì cảm thấy dù sao trực quan hơn :)
Emigna



4

R , 51 byte

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

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

Giải thích: Đối với một chuỗi x:yđộ dài N, tạo ma trận hai nhân N bao gồm chuỗi x: y ở hàng trên cùng và y: x ở hàng dưới cùng matrix(c(z,rev(z)),2,,T). Nếu chúng ta chọn các Nphần tử đầu tiên của ma trận [seq(z)], chúng sẽ được chọn theo cột, đưa ra đầu ra cần thiết.

Vượt trội bởi digEmAll


1
Tôi vừa đăng một cách tiếp cận rất giống 30 giây trước bạn: D
digEmAll

@digEmAll Có, nhưng của bạn tốt hơn rất nhiều!
dùng2390246

4

cQuents , 19 byte

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

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

Lưu ý rằng nó không hoạt động trên TIO ngay bây giờ vì trình thông dịch của TIO không cập nhật.

Giải trình

#|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



4

Mã byte JVM (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 (và hơi sạch hơn)

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

Hàm độc lập, cần được gọi từ Java như b.a(num1,num2) .

Giải trình

Mã này sử dụng các tham số phương thức làm biến, cũng như boolean ở địa phương # 3 quyết định số nào sẽ xuất. Mỗi vòng lặp lặp lại bên trái hoặc bên phải là đầu ra và số đó được tăng cho bên trái hoặc giảm cho bên phải. Vòng lặp tiếp tục cho đến khi cả hai số bằng nhau, thì số đó là đầu ra.

... Tôi có một cảm giác khác biệt Tôi đang ồ ạt về số lượng byte


4

Ngôn ngữ Wolfram (Mathicala) , 56 54 byte

Đây là lần đầu tiên tôi chơi golf!

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

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

Đã lưu 2 byte bằng cách sử dụng ký hiệu infix.

Giải trình:

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)

Ngoài ra, chúng ta có thể sử dụng Take[...,b-a+1]cho cùng một kết quả.

Các xét nghiệm:

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}

Liên kết "Dùng thử trực tuyến" trả về 403. "Xin lỗi, bạn không có quyền truy cập mục này."
Rohit Namjoshi

@RohitNamjoshi Tôi đã cập nhật liên kết
Kai

lưu ý rằng trên TIO bạn có thể đặt mã tiêu đề và chân trang trong các hộp văn bản ở trên và bên dưới hộp mã thực tế. Điều này làm cho mã trông gọn gàng hơn, cũng như cho phép bạn tận dụng công cụ định dạng câu trả lời PPCG (esc-sg). Hãy thử trực tuyến!
Jo King

@JoKing đánh giá cao, tôi chưa bao giờ sử dụng nó trước đây!
Kai



3

MATL , 8 byte

&:t"1&)P

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

Giải trình

&:      % 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)


3

Forth (gforth) , 52 byte

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

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

Giải trình

Lặp lại từ 0 đến (Kết thúc - Bắt đầu). Đặt Kết thúc và Bắt đầu trên đầu ngăn xếp.

Mỗi lần lặp:

  • Xuất số hiện tại
  • Thêm (hoặc trừ) 1 từ số hiện tại
  • Chuyển số hiện tại với số khác

Giải thích mã

: 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


3

Haskell, 30 byte

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

Sử dụng: 3%7 cho `[3,7,4,6,5]

Đối với các đầu vào l, h, hàm gọi đệ quy với các đầu vào l+1, h-1và thêm l,hvào việc cầu xin. Thay vì bất kỳ điều kiện tạm dừng nào, mã sử dụng take(h-l)để rút ngắn chuỗi theo đúng độ dài (nếu không sẽ là một chuỗi vô hạn của các số tăng và giảm).


3

Brachylog , 15 byte

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

Đầu vào là danh sách 2 yếu tố [lo, hi]. Lưu ý rằng dấu gạch dưới được sử dụng cho số âm.Hãy thử trực tuyến!

Giải trình

⟦₂               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]

3

MathGolf , 6 byte

↨_x^─▀

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

Giải thích với (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]

Lý do tại sao điều này hoạt động là do thực tế là tất cả các phần tử trong đầu ra phải là duy nhất, do đó toán tử phần tử duy nhất sẽ lọc ra nửa sau của mảng, tạo ra đầu ra chính xác.






2

Hình khối, 16 byte

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

Hãy thử nó ở đây

Tạo khối

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

Giải trình

Về cơ bản, điều này di chuyển hai giới hạn gần nhau hơn một bước cho đến khi họ gặp nhau. Mỗi lần qua vòng lặp, chúng tôi swap các giới hạn, Othông số, lấy sự khác biệt và tăng dần theo )hoặc giảm (dựa trên dấu hiệu.


2

Bình thường, 10 8 byte

{.iF_B}F

Hãy thử nó ở đây

Giải trình

{.iF_B}F
      }FQ  Generate the range between the (implicit) inputs.
 .iF_B     Interleave it with its reverse.
{          Deduplicate.
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.