게으른 드롭 정렬 구현


26

이 도전은 이미 dropsort를 설명합니다. 그러나, 나는 다소 게으르고 실제로 배열을 이전보다 조금 더 정렬해야하기 때문에 완전히 정렬 할 필요는 없습니다 .

Drop Sort에서는 모든 요소를 그 이전의 요소보다 작게 삭제 합니다. Lazy Drop Sort에서는 모든 요소를 엄격하게 선행 요소보다 작게 삭제 합니다.

다음은 예입니다. 다음 배열을 고려하십시오.

8 6 9 9 7 2 3 8 1 3

모든 요소를 ​​이전보다 작은 요소로 표시합시다.

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

어느 쪽 3도 표시 되지 않았는지 또는 마지막 표시 되었는지 확인 하십시오 8. 그것들은 모두 왼쪽의 단일 요소보다 큽니다.

알고리즘을 완성하고 표시된 요소를 제거하면 다음과 같은 이점이 있습니다.

8 9 9 3 8 3

기본적으로 더 분류 보인다. 킨다 내가 게으른.

이미 추론했을 수 있듯이 귀하의 작업은이 알고리즘을 구현하는 것입니다.

입력은 1과 9 사이의 양의 정수가 1 이상인 배열이므로 숫자 문자열도 사용할 수 있습니다.

이것은 이며 가장 적은 바이트 수입니다!

추가 테스트 사례 :

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

기능 일 수도 있고 완전한 프로그램이어야합니까?
rafa11111

@ rafa11111 어느 쪽이든 괜찮습니다
Pavel

함수 인 경우 메인 프로그램에서 입력 배열을 하드 코딩 할 수 있습니까? 그리고 배열의 길이를 함수의 입력으로 전달할 수 있습니까?
rafa11111

@ rafa11111 함수 자체에서 입력을 하드 코딩 할 수 없습니다. 함수가 테스트 프로그램에서이 입력을 얻는 방법은 중요하지 않습니다. C / C ++ 또는 배열 길이를 결정하는 유일한 방법 인 다른 언어를 사용하는 경우에만 배열 길이를 사용할 수 있습니다.
Pavel

답변:



15

자바 스크립트 (ES6), 28 25 바이트

@Shaggy 덕분에 3 바이트 절약

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

온라인으로 사용해보십시오!


2
n=>p<=n멋진 ;-) 보았다 것
ETHproductions

4
@ETHproductions +4 바이트의 경우 (n=p)=>p<=(p=n)잘 작동합니다.)
Arnauld

이 답변은 내 마음을 불고 있습니다. 왜 p아직 정의되지 않았을 때 처음으로 액세스하려고 할 때 폭발 하지 않습니까?
Brian H.

1
@Shaggy 안전 해 보입니다. 컴퓨터 앞에 다시 오면 업데이트됩니다. 감사!
Arnauld

2
@Pavel은 a초기 입력 배열로 설정되어 있고 a-1초래 NaN(이것은 하나의 정수이고,이 경우에이 정수로 강제된다 포함하지 않은 경우).
Arnauld


6

MATL , 9 8 바이트

주세페 덕분에 1 바이트를 절약했습니다.

0yd0<h~)

온라인으로 사용해보십시오!


설명:

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 바이트

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

온라인으로 사용해보십시오!


1
Perl 6로 번역perl6 -ne '$/>$_||.say;$/=$_'
Brad Gilbert b2gills

@Brad perl6은 다른 언어입니다 (이전 버전과도 호환되지 않습니다). 게시하십시오!
wastl

나는 관용적 인 Perl 6 인 것을 썼지 만 더 길었습니다. 또한 내가 여기에 게시하는 이유 중 하나는 언어를 과시하고 설명하는 것입니다. 해당 번역을 게시하면 Perl의 약간 더 장황한 버전임을 알 수 있습니다. 기본적으로이 사이트에 게시 한 이유는 전혀 없습니다.
브래드 길버트 b2gills 15시 58 분



4

Stax , 5 바이트

âÿ╠╦░

온라인으로 실행 및 디버깅

코드 풀기, 풀기 및 주석 달기, 우리는 이것을 얻습니다.

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

이것을 실행

지침의 순서는 어색하지만 그 이유가 있습니다. Stax 소스 코드 패킹은 항상 동일한 크기 입력에 대해 동일한 크기 출력을 생성하지는 않습니다. 기본적으로 소스의 마지막 문자에 더 낮은 문자 코드가 있으면 바이트를 절약 할 수 있습니다. 글쎄, !인쇄 가능한 문자를 얻을 수있는 가장 낮은 코드 중 하나가 있습니다. (특히 33 개) 많은 6 바이트 ASCII 스탁스 프로그램은 더 작은 팩을 만들 수 없습니다. 그러나로 끝나는 경우 !가능합니다. 따라서 이러한 특정 명령 순서의 이유는 프로그램 끝에서 논리가 끝나지 않도록하기위한 것입니다.


4

J, 12 바이트

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

설명:

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

예 :

    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

온라인으로 사용해보십시오!


좋은 해결책! 코드에 대한 TIO 링크를 추가했습니다.
Galen Ivanov


4

자바 8, 66 55 48 바이트

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

@ OlivierGrégoire 의 팁 후 -11 바이트 . @ OlivierGrégoire
덕분에 -7 바이트 더 .

설명:

온라인으로 사용해보십시오.

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

~0기본적으로 모든 사람들이 왜 사용하기 시작합니까 -1? 바이트 수의 길이가 같은 경우 개인적으로보다 직관적 인 솔루션을 선택합니다 ( while(...)vs 제외 for(;...;), for다른 경우에는 7 바이트를 선호합니다 . :)
Kevin Cruijssen

그것은 내가 2-보수에 나쁘기 때문에 ... 나는 너무 나쁘다 나는 의미하고 싶었다 Integer.MIN_VALUE(그런 다음 1<<31, 나는 추측 ...) ;-)
Olivier Grégoire

4

옥타브 , 21 바이트

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

온라인으로 사용해보십시오!

설명:

벡터 x를 입력으로 받아서 vector 를 만듭니다. [0, diff(x)<0]여기서 diff(x)모든 인접한 요소 간의 차이가있는 벡터입니다. 0과 비교하여 부정적 요소 만 유지하고 삭제하려는 모든 요소 목록을 제공하십시오.

그런 다음 유지하려는 입력 벡터에서 요소를 선택합니다.


4

V , 25 바이트

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

온라인으로 사용해보십시오!

16 진 덤프 :

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

직업에 가장 나쁜 언어. 하지만 감히 해냈습니다 .


6
사이드 노트 : ojalá는 스페인어로 희망 .
Dennis

2
@dennis 멋지다. k$yl+@"òç-/d스페인어 란 무엇입니까 ?
DJMcMayhem

7
k$yl+@"òç-/d자유롭게로 번역 될 수 지옥은 찬장 문을 열어 왼쪽 아야?
Luis Mendo

3

삼각 , 71 바이트

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

온라인으로 사용해보십시오!

어떻게 작동합니까?

) IEL) rFD) 2+) IE) w + h) 2_stDO = {M) IEm} – 전체 프로그램.
) IE – 0 번째 입력 I를 받아서 평가합니다.
   L) r – 범위 [0 ... 길이 I)를 누릅니다.
      F {– 다음을 만족하는이 범위의 정수를 필터링합니다.
       D) 2+) IE) w + h) 2_stDO = –이 조건. 각 요소 E를 개별적으로 실행합니다.
                                    기준에 맞지 않는 것을 쌓아 버립니다.
       D) 2+ – 두 번째 사본에 2를 복제하고 추가합니다.
           ) IE – 다시 검색합니다.
              ) – 스택에 0을 넣습니다.
               w – 목록에 0을 감습니다. [0]
                + – I 앞에 붙입니다.
                 h – 머리. 인덱스 E + 2 다음에 요소를 자릅니다.
                  ) 2_ – 리터럴 -2.
                     st – 꼬리.
                       DO = – 결과가 정렬에 대해 변하지 않는지 확인하십시오.
                           M) IEm} – 마지막 부분 : 입력으로 인덱싱.
                           M} – 조건을 만족하는 각 인덱스에 대해 :
                            ) IEm – 해당 위치에서 I의 요소를 검색합니다.

2
호기심에서 (삼각형을 만든 사람이므로) : 코드 조각이 자동으로 점이없는 점으로 채워지는 Hexagony / Cubically와 비슷한 작업을 수행해보십시오. 그래서이 프로그램은 )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}현재 답변으로 확장 될 것입니까?
Kevin Cruijssen

@KevinCruijssen 실제로 Triangularity를 ​​2D esolang으로 만들 계획 이었지만 아이디어를 포기했기 때문에 이전 템플릿을 그대로 사용했습니다. Triangularity v2를 출시하면 곧 몇 가지 주요 변경 사항을 적용 할 것으로 생각합니다. (인라인 저장하는 간단한 1 바이트 대신 저장 (20) 수 있기 때문에 또한 그것은, 현재의 형태로 그 안에 좀 골프에 재미 있어요 : D ... 그것은 또한 소급 물건을 고정 할 때 적용하지만 : C)
씨 Xcoder

글쎄, 2D esolang으로 출시 할 계획이더라도 내 의견은 여전히 ​​약간 있습니다. )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}코드가되고 현재 템플릿으로 확장 된 다음 확장 된 템플릿에서 2D 명령을 수행합니다. 편집 : .....).....\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}세 가지 모두 동일한 프로그램이 될 것입니다.
케빈 크루이 센


3

Wolfram Language (Mathematica) , 33 바이트

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

온라인으로 사용해보십시오!

작동 원리

이 코드 # - {0}~Join~Most@#는 배열을 {a,b,c,d,e,f}로 바꿉니다 {a,b-a,c-b,d-c,e-d,f-e}. 적용 Arg에 음수이 세트 Pi와에 음이 아닌 숫자 0.

Pick[#, ..., 0]&우리의 경우 : 가있는 #곳 의 항목을 선택합니다 . 이전 요소를 빼면 음수가 아닌 숫자를 산출하는 요소입니다. 다시 말해, 이들은 게으른 분류시 우리가 유지하고자하는 항목들입니다....0


3

Wonder , 27 바이트

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

사용 예 :

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

설명

언 골프 버전 :

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

접두사 0, 연속 쌍 목록을 가져 오고 첫 번째 숫자 <= 두 번째 숫자 인 목록 항목을 유지하고 각 쌍의 두 번째 숫자를 가져옵니다.


3

Wolfram Language (Mathematica) , 20 바이트

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

온라인으로 사용해보십시오!

설명

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

Split[#,##>0&]

엄격하게 감소하는 연속 요소를 그룹화하십시오. {{8, 6}, {9}, {9, 7, 2}, {3}, {8, 1}, {3}}

#&@@@

각각의 첫 번째 요소를 취하십시오. {8, 9, 9, 3, 8, 3}


##>0훌륭하고 모든 것이지만 실제로는 #>#2여기에 아무것도 저장하지 않습니다 .
Martin Ender


3

SWI- 프롤로그, 44 바이트

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

사용법 : " List -X"를 호출하십시오. 여기서 List 는 괄호로 묶고 쉼표로 구분 된 목록입니다 (예 : [1,4,5,1,11,6,7]).


1
사이트에 오신 것을 환영합니다! :)
DJMcMayhem

2

APL + WIN, 14 바이트

정수 벡터로 화면을 입력하라는 메시지가 표시됩니다.

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




2

K4 , 10 바이트

해결책:

x_/|&<':x:

예:

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

설명:

요소가 이전보다 작은 색인을 찾아 입력에서 이러한 색인을 제거하십시오.

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

2

첨부 , 24 바이트

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

온라인으로 사용해보십시오!

설명

Mask첫 번째 인수에서 진실한 요소에 해당하는 두 번째 인수에서 모든 요소를 ​​선택합니다. 1'(Delta!_>=0)최종 배열에있는 요소에 해당하는 인덱스를 계산합니다.

다른 시도

28 바이트 (포인트 프리) : ~Mask#(1&`'##Delta#`>=#C[0])

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


2

C # (. NET 코어) , 33 + 18 = 51 바이트

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

온라인으로 사용해보십시오!

기본적으로 명령문은 x가 배열의 첫 번째 int이거나 이전 숫자보다 크거나 같은 경우입니다. 그렇지 않으면 떨어 뜨립니다.


1
을 반환 할 수 있습니다 IEnumerable. 아니 ToArray()필요가 없습니다.
Pavel

@Pavel 추가 참조를 추가해야하며을 System.Collections제거하기 위해 저장된 모든 바이트를 무효화합니다 ToArray().
Dennis.Verweij

아니요, IEnumerable답변에서 참조하지 않으므로 반환 유형으로 사용하십시오.
Pavel

@Pavel 알았어 고마워, 때로는 바이트 수를 계산할 때 확실하지 않은 경우가 있습니다 ... 죄송합니다
Dennis.Verweij

1

스위프트 4 , 56 55 바이트

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

온라인으로 사용해보십시오!

설명

{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

젤리 , 9 바이트

0;>ƝżµḢÐṂ

온라인으로 사용해보십시오!

이것은 꽤 부피가 크며 더 좋은 방법이 있다면 놀라지 않을 것입니다.

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 바이트

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

여기에서 형식화되고 "읽기 가능" 합니다.

((()))
{
    {}

    ([{}]({}))

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

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

    {}

    ([][()])

}{}{}<>

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

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.