Thực hiện Lazy Drop Sắp xếp


26

Thách thức này đã mô tả giọt nước. Tuy nhiên, tôi hơi lười biếng và tôi thực sự chỉ cần mảng của mình được sắp xếp nhiều hơn một chút so với trước đây, nó không cần phải được sắp xếp theo mọi cách .

Trong Drop Sort, chúng tôi thả mọi phần tử ít hơn bất kỳ phần tử nào trước nó. Trong Lazy Drop Sort, chúng tôi bỏ mọi phần tử ít hơn phần tử trước nó.

Đây là một ví dụ. Hãy xem xét các mảng sau:

8 6 9 9 7 2 3 8 1 3

Hãy đánh dấu mọi yếu tố ít hơn yếu tố trước nó.

8 6 9 9 7 2 3 8 1 3
  ^     ^ ^     ^

Chú ý cách không 3được đánh dấu, cũng không phải cuối cùng 8. Chúng đều lớn hơn phần tử đơn ở bên trái của chúng.

Hoàn thành thuật toán, loại bỏ các yếu tố được đánh dấu, chúng tôi nhận được:

8 9 9 3 8 3

Điều đó về cơ bản trông sắp xếp hơn. Kinda. Tôi lười.

Nhiệm vụ của bạn, như bạn có thể đã suy ra, là thực hiện thuật toán này.

Đầu vào là một mảng có ít nhất 1 số nguyên dương trong khoảng từ 1 đến 9, vì vậy bạn cũng có thể lấy một chuỗi các chữ số.

Đây là , ít byte thắng nhất!

Các trường hợp kiểm tra bổ sung:

1
1

1 2 3
1 2 3

5 3 1
5

1 2 3 2 1
1 2 3

1 1 1 9 9 9 1 1 1 9 9 9 1 1 1
1 1 1 9 9 9 1 1 9 9 9 1 1

9 9
9 9

5 2 4 2 3
5 4 3

Nó có thể là một chức năng hoặc nó phải là một chương trình hoàn chỉnh?
rafa11111

@ rafa11111 Hoặc là tốt
Pavel

Trong trường hợp nó là một hàm, mảng đầu vào có thể được mã hóa cứng trong chương trình chính không? Và độ dài của mảng có thể được chuyển qua làm đầu vào cho hàm không?
rafa11111

@ rafa11111 Đầu vào không thể được mã hóa cứng trong chính chức năng. Không quan trọng làm thế nào chức năng có được đầu vào này trong chương trình thử nghiệm của bạn. Bạn chỉ có thể lấy độ dài mảng nếu bạn đang sử dụng C / C ++ hoặc ngôn ngữ khác trong đó đó là cách duy nhất để xác định độ dài của mảng.
Pavel

Câu trả lời:



15

JavaScript (ES6), 28 25 byte

Đã lưu 3 byte nhờ @Shaggy

a=>a.filter(n=>~-a<(a=n))

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


2
n=>p<=nsẽ trông tuyệt vời ;-)
ETHproductions 22/03/18

4
@ETHproductions Đối với +4 byte, (n=p)=>p<=(p=n)hoạt động tốt;)
Arnauld

Câu trả lời này đang thổi bay tâm trí của tôi, tại sao điều này không bùng nổ khi cố gắng truy cập plần đầu tiên, khi nó chưa được xác định?
Brian H.

1
@Shaggy Trông có vẻ an toàn. Sẽ cập nhật khi tôi quay lại trước máy tính. Cảm ơn!
Arnauld

2
@Pavel aban đầu được đặt thành mảng đầu vào và a-1sẽ dẫn đến NaN(trừ khi nó chứa một số nguyên duy nhất, trong trường hợp đó, nó bị ép buộc với số nguyên này).
Arnauld


6

MATL , 9 8 byte

Đã lưu một byte nhờ Giuseppe.

0yd0<h~)

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


Giải trình:

0                 % Push a zero
 y                % Implicitly grab the input and duplicate it.
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [8 6 9 9 7 2 3 8 1 3]
  d               % The difference between each number of the last element:
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [-2, 3, 0, -2, -5, 1, 5, -7, 2]
   0<             % Which are negative?
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [1 0 0 1 1 0 0 1 0]
     h            % Concatenate. Stack: [8 6 9 9 7 2 3 8 1 3], [0 1 0 0 1 1 0 0 1 0] 
      ~           % Negate. Stack: [8 6 9 9 7 2 3 8 1 3], [1 0 1 1 0 0 1 1 0 1]
       )          % Index. Stack: [8 9 9 3 8 3]

5

Perl 5 .10.0 + -nl, 16 byte

$f>$_||say;$f=$_

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


1
Bản dịch sang Perl 6perl6 -ne '$/>$_||.say;$/=$_'
Brad Gilbert b2gills 22/03/18

@Brad perl6 là một ngôn ngữ khác (thậm chí không tương thích ngược) Đăng nó!
lãng phí

Tôi đã viết một cái có nhiều thành ngữ Perl 6, nhưng nó dài hơn. Ngoài ra một trong những lý do tôi đăng ở đây là để thể hiện ngôn ngữ, và để giải thích nó. Đăng bản dịch đó không có gì ngoài việc cho thấy rằng đó là một phiên bản dài hơn một chút của Perl. Về cơ bản nó đáp ứng không có lý do tại sao tôi đăng trên trang web này.
Brad Gilbert b2gills



4

Stax , 5 byte

âÿ╠╦░

Chạy và gỡ lỗi này trực tuyến

Giải nén, giải mã và nhận xét mã, chúng tôi nhận được điều này.

Z   Push a zero under the input
f   Use the rest of the program as a filter on the input.  Output passing elements.
>   Current element is greater than previous?
_~  Push current element to the input stack; when the main stack is empty, pops fall back to this
!   Logical not; applies to the result of the greater-than

Chạy cái này

Việc sắp xếp các hướng dẫn là khó xử nhưng có một lý do cho nó. Đóng gói mã nguồn không phải lúc nào cũng mang lại đầu ra kích thước giống nhau cho đầu vào cùng kích thước. Về cơ bản, bạn có cơ hội lưu một byte nếu ký tự cuối cùng của nguồn có mã ký tự thấp hơn. Chà, !có một trong những mã thấp nhất bạn có thể nhận được cho một ký tự có thể in được. (33 cụ thể) Nhiều chương trình stax ASCII 6 byte không thể đóng gói nhỏ hơn. Nhưng nếu họ kết thúc bằng một !, thì họ có thể. Vì vậy, lý do cho thứ tự hướng dẫn cụ thể này là để đảm bảo rằng logic không kết thúc vào cuối chương trình.


4

J, 12 byte

#~1,2&(<:/\)

Giải trình:

#~1,2&(<:/\)    | Whole function, executed as a hook
       <:/      | Distribute <: (greater or equal) over an array
    2&(   \)    | Apply to each sub array of length 2
  1,            | Append a 1 to the front
#~              | Choose elements from the original array

Ví dụ:

    2&(<:/\) 8 6 9 9 7 2 3 8 1 3
0 1 1 0 0 1 1 0 1
    1,2&(<:/\) 8 6 9 9 7 2 3 8 1 3
1 0 1 1 0 0 1 1 0 1
    (1 0 1 1 0 0 1 1 0 1) # 8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3
    f =: #~1,2&(<:/\)
    f 8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3

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


Giải pháp tốt đẹp! Tôi đã thêm một liên kết TIO cho mã của bạn.
Galen Ivanov

4

Thạch , 6 byte

>Ɲ0;¬×

I / O là trên chuỗi.

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


Tôi tò mò, tại sao hoạt động trên chuỗi và không phải mảng? Tôi đã nói với Jelly là xấu về chuỗi.
Pavel

2
Nó là. ×không nên làm việc cho sự lặp lại nhân vật, nhưng nó làm.
Dennis

4

Java 8, 66 55 48 byte

l->{for(int i=0;;)if(i>(i=l.next()))l.remove();}

-11 byte sau một mẹo từ @ OlivierGrégoire .
-7 byte nhiều hơn nhờ @ OlivierGrégoire .

Giải trình:

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

l->{                     // Method with Integer-ListIterator parameter and no return-type
  for(int i=0;;)         //  Loop over all items
    if(i>(i=l.next()))   //   If the current item is larger than the next
      l.remove();}       //    Remove this next item

Tại sao mọi người bắt đầu sử dụng ~0khi cơ bản -1. Cá nhân tôi sẽ chọn giải pháp trực quan hơn nếu số byte có cùng độ dài (ngoại trừ while(...)vs for(;...;), trong trường hợp đó tôi thích for. Tuy nhiên, cảm ơn vì -7 byte khác. :)
Kevin Cruijssen 22/03/18

Đó là bởi vì tôi xấu với 2 bổ sung ... Tôi rất tệ, tôi muốn nói Integer.MIN_VALUE(đó là 1<<31, tôi đoán vậy ...) ;-)
Olivier Grégoire

4

Octave , 21 byte

@(x)x(~[0,diff(x)<0])

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

Giải trình:

Lấy một vectơ xlàm đầu vào và tạo một vectơ [0, diff(x)<0], trong đó diff(x)một vectơ có sự khác biệt giữa tất cả các phần tử liền kề. Chỉ giữ lại những số âm bằng cách so sánh nó với 0, cung cấp cho chúng tôi danh sách tất cả các yếu tố chúng tôi muốn loại bỏ.

Sau đó chúng tôi chọn các phần tử từ vector đầu vào mà chúng tôi muốn giữ.


4

V , 25 byte

òjälá k$yl+@"òç-/d
ç /dw

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

Hexdump:

00000000: f26a e46c e120 6b24 796c 2b40 2218 f2e7  .j.l. k$yl+@"...
00000010: 2d2f 640a e720 2f64 77                   -/d.. /dw

Ngôn ngữ tồi tệ nhất cho công việc. Nhưng tôi đã làm điều đó cho một dám .


6
Lưu ý bên: ojalá là tiếng Tây Ban Nha để hy vọng .
Dennis

2
@dennis Thật tuyệt. Là những gì k$yl+@"òç-/dTây Ban Nha cho?
DJMcMayhem

7
k$yl+@"òç-/dcó thể được dịch tự do là Ouch, ai đã để cánh cửa tủ đó mở?
Luis Mendo

3

Hình tam giác , 71 byte

.....).....
....IEL....
...)rFD)...
..2+)IE)w..
.+h)2_stDO.
={M)IEm}...

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

Làm thế nào nó hoạt động?

) Classified) rFD) 2+) IE) w + h) 2_stDO = {M) IEm} - Chương trình đầy đủ.
) IE - Nhận đầu vào thứ 0 và đánh giá nó.
   L) r - Và đẩy phạm vi [0 ... chiều dài của I).
      F {- Lọc các số nguyên trong phạm vi này thỏa mãn:
       D) 2+) IE) w + h) 2_stDO = - Điều kiện này. Chạy từng phần tử E trên một riêng biệt
                                    xếp chồng và loại bỏ những thứ không đáp ứng tiêu chí.
       D) 2+ - Sao y và thêm 2 vào bản sao thứ hai.
           ) IE - Truy xuất tôi một lần nữa.
              ) - Đẩy 0 lên ngăn xếp.
               w - Gói 0 trong danh sách. [0]
                + - Chuẩn bị nó cho tôi.
                 h - Đầu. Cắt các phần tử sau chỉ số E + 2.
                  ) 2_ - Nghĩa đen -2.
                     st - Đuôi.
                       DO = - Kiểm tra xem kết quả có bất biến khi sắp xếp không.
                           M) IEm} - Phần cuối: lập chỉ mục vào đầu vào.
                           M} - Đối với mỗi chỉ số thỏa mãn các điều kiện:
                            ) IEm - Lấy phần tử của I tại vị trí đó.

2
Vì tò mò (vì bạn là người tạo ra Tam giác): tại sao không làm điều gì đó tương tự như Hexagony / Cubally, nơi một đoạn mã được tự động điền vào các dấu chấm không? Vì vậy, chương trình này sẽ được )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}mở rộng để trả lời hiện tại của bạn?
Kevin Cruijssen 22/03/18

@KevinCruijssen Bởi vì tôi thực sự có kế hoạch biến Triangularity thành một esolang 2D, nhưng tôi đã từ bỏ ý tưởng nên tôi chỉ bám vào mẫu trước đây của mình. Tôi nghĩ rằng tôi sẽ sớm thực hiện một số thay đổi lớn khi tôi phát hành Triangularity v2. (Ngoài ra, thật thú vị khi chơi golf ở dạng hiện tại, bởi vì một dòng lưu 1 byte đơn giản thay vào đó có thể giúp bạn tiết kiệm 20: D ... Nó cũng áp dụng hồi tố khi sửa chữa mọi thứ: C)
Ông Xcoder

Chà, ngay cả khi bạn có kế hoạch phát hành nó dưới dạng esolang 2D, bình luận của tôi vẫn đứng vững (phần nào). )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}sẽ là mã của bạn, nó sẽ mở rộng sang mẫu hiện tại của bạn và sau đó thực hiện các lệnh 2D trên mẫu được mở rộng đó. EDIT: .....).....\n....IEL....\n...)rFD)...\n..2+)IE)w..\n.+h)2_stDO.\n={M)IEm}........).........IEL.......)rFD).....2+)IE)w...+h)2_stDO.={M)IEm}...)IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}cả ba sẽ cùng chương trình chính xác.
Kevin Cruijssen 22/03/18


3

Ngôn ngữ Wolfram (Mathicala) , 33 byte

Pick[#,Arg[#-{0}~Join~Most@#],0]&

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

Làm thế nào nó hoạt động

# - {0}~Join~Most@#biến một mảng {a,b,c,d,e,f}thành {a,b-a,c-b,d-c,e-d,f-e}. Áp dụng Argcho điều này đặt các số âm thành Pivà số không âm cho 0.

Pick[#, ..., 0]&chọn ra các mục trong #đó ...có một 0: trong trường hợp của chúng tôi, chính xác các phần tử mang lại một số không âm khi bạn trừ phần tử trước đó. Nói cách khác, đây chính xác là những mục chúng tôi muốn giữ khi lazydropsorting.


3

Kỳ quan , 27 byte

-> ':1.!> 'sS#<=.cns2.++[0]

Ví dụ sử dụng:

(-> ':1.!> 'sS#<=.cns2.++[0])[8 6 9 9 7 2 3 8 1 3]

Giải trình

Phiên bản bị đánh cắp:

(map get 1).(fltr sS <=).(cns 2).(++ [0])

Chuẩn bị 0, nhận danh sách các cặp liên tiếp, giữ danh sách các mục trong đó số thứ nhất <= số thứ hai, nhận số thứ hai của mỗi cặp.


3

Ngôn ngữ Wolfram (Mathicala) , 20 byte

#&@@@Split[#,##>0&]&
(* or *)
Max/@Split[#,##>0&]&

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

Giải trình

Input = {8, 6, 9, 9, 7, 2, 3, 8, 1, 3}

Split[#,##>0&]

Nhóm yếu tố liên tiếp được giải mã nghiêm ngặt: {{8, 6}, {9}, {9, 7, 2}, {3}, {8, 1}, {3}}

#&@@@

Lấy yếu tố đầu tiên của mỗi: {8, 9, 9, 3, 8, 3}


##>0là thú vị và tất cả mọi thứ, nhưng nó không thực sự tiết kiệm bất cứ điều gì #>#2ở đây;) (điều này sẽ làm cho chương trình của bạn hoạt động với các số nguyên tùy ý, mặc dù không phải là điều bắt buộc).
Martin Ender


3

SWI-Prolog, 44 byte

[A,B|C]-[A|E]:-B<A,[B|C]-[B|E];[B|C]-E. L-L.

Cách sử dụng: Gọi " Danh sách -X" trong đó Danh sáchdanh sách được bao quanh bằng dấu phẩy, được phân tách bằng dấu phẩy, ví dụ [1,4,5,1,11,6,7].


1
Chào mừng đến với trang web! :)
DJMcMayhem

2

APL + THẮNG, 14 byte

Nhắc nhở đầu vào màn hình của một vectơ số nguyên.

(1,1>2-/v)/v←⎕


2

Kotlin , 39 byte

a->a.filterIndexed{i,v->i<1||v>=a[i-1]}

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

Các mục lọc là mục đầu tiên (index == 0 hoặc thậm chí chỉ mục ngắn hơn <1) HOẶC Giá trị hiện tại lớn hơn hoặc bằng mục trước (a [i-1]).



2

K4 , 10 byte

Dung dịch:

x_/|&<':x:

Thí dụ:

q)k)x_/|&<':x:8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3

Giải trình:

Tìm các chỉ mục có phần tử nhỏ hơn trước, loại bỏ các chỉ mục này khỏi đầu vào

x_/|&<':x: / the solution
        x: / store input as x
     <':   / less-than each-previous
    &      / indices where true
   |       / reverse
 _/        / drop-over
x          / the input

2

Tùy viên , 24 byte

{Mask[1'(Delta!_>=0),_]}

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

Giải trình

Maskchọn tất cả các phần tử từ đối số thứ hai tương ứng với các phần tử trung thực trong đối số thứ nhất. 1'(Delta!_>=0)tính toán các chỉ số tương ứng với các phần tử được cho là nằm trong mảng cuối cùng.

Những nỗ lực khác

28 byte (không có điểm): ~Mask#(1&`'##Delta#`>=#C[0])

32 byte: {Mask[1'(&`<= =>Slices[_,2]),_]}


2

C # (.NET Core) , 33 + 18 = 51byte

x=>x.Where((a,n)=>n<1||x[n-1]<=a)

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

về cơ bản câu lệnh là trong đó x là int đầu tiên trong mảng hoặc lớn hơn hoặc bằng số trước đó, hãy giữ nó. Khác bỏ nó.


1
Bạn có thể trả lại một IEnumerable. Không ToArray()cần thiết.
Pavel

@Pavel Tôi sẽ cần thêm một tham chiếu bổ sung System.Collectionsvà điều đó sẽ phủ nhận tất cả các byte được lưu để xóa ToArray().
Dennis.Verweij

Không, vì bạn sẽ không tham khảo IEnumerabletrong câu trả lời, chỉ sử dụng nó làm kiểu trả về.
Pavel

@Pavel được rồi, cảm ơn, đôi khi tôi hơi không chắc chắn khi đếm byte hay không ... xin lỗi
Dennis.Verweij 23/03/18

1

Swift 4 , 56 55 byte

{var l=0;print($0.filter{($0>=l,l=$0).0})}as([Int])->()

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

Giải trình

{var l=0;           // Declare variable l
print($0.filter{(   // Print every element e in the input
  $0>=l,            //   where e >= l
  l=$0).0})         //   And set l to e
}as([Int])->()      // Set the input type to integer array

1

Thạch , 9 byte

0;>ƝżµḢÐṂ

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

Điều này cảm thấy khá cồng kềnh, sẽ không ngạc nhiên nếu có một cách tốt hơn.

0;>ƝżµḢÐṂ
   Ɲ       For each adjacent pair in the input...
  >        ...is the first element greater than the second? (yields a list of 0/1)
0;         prepend a zero to this list (always keep the first element)
    ż      zip with the input
     µ     new monadic link
       ÐṂ  keep elements of the list with minimal value of... (Ðḟ would have worked here and been slightly more clear but I'll leave it as it is)
      Ḣ    ...their first element

1

Brain-Flak , 136 , 120 byte

((())){{}([{}]({}))([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}{{}(({})<>)(())(<>)}{}([][()])}{}{}<>{{}({}<>)<>}<>

Ở đây nó được định dạng và "có thể đọc được" .

((()))
{
    {}

    ([{}]({}))

    ([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}

    {
        {}(({})<>)(())(<>)
    }

    {}

    ([][()])

}{}{}<>

{
    {}
    ({}<>)<>
}<>

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

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.