손실 정렬 (구현 드롭 정렬)


61

David Morgan-Mar이 디자인 한 Dropsort 는 실제로 정렬되어 있지만 일부 원래 요소 만 포함하는 목록을 생성하는 선형 시간 "정렬 알고리즘"의 예입니다 . 그 앞에있는 요소의 최대 값보다 크지 않은 요소는 목록에서 제거되어 삭제됩니다.

이 작업에서는 정수 목록을 입력으로 받게됩니다 (STDIN 또는 함수 인수, 최소한 8 비트 부호있는 정수 범위를 지원해야합니다). 주문.

목록이 비어 있지 않은 것으로 가정 할 수 있습니다.

이것은 코드 골프이므로 가장 짧은 프로그램이 승리합니다.

테스트 사례

Input             Output
1 2 5 4 3 7       1 2 5 7
10 -1 12          10 12
-7 -8 -5 0 -1 1   -7 -5 0 1
9 8 7 6 5         9
10 13 17 21       10 13 17 21
10 10 10 9 10     10 10 10 10

리더 보드

var QUESTION_ID=61808,OVERRIDE_USER=39022;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


1
수표 highest < current입니까? 아니면 highest <= current?
Morgan Thrapp 13:26에

7
if 현재 요소를 유지하십시오 highest (so far)<=current.
SuperJedi224

목록에 하나 이상의 요소가 있다고 가정 할 수 있습니까?
lirtosiast

@ThomasKwa : 예.
SuperJedi224

19
Dropsorts의 효율성 향상은 급여 시스템에 활용된다면 회사에 많은 돈을 절약 할 수 있습니다.
PyRulez 2016 년

답변:


42

APL, 9 바이트

⊢(/⍨)⊢=⌈\

이것은 다이어그램이있는 모나 딕 기능 열차입니다.

┌─┼───┐  
⊢ ⍨ ┌─┼─┐
┌─┘ ⊢ = \
/     ┌─┘
      ⌈  

비 열차 버전은

{⍵/⍨⍵=⌈\⍵}

기본적으로 각 요소가 실행 최대 값과 같은지 확인합니다.

참고 마틴 있음 Büttner의 J 솔루션은 이 같은 길이이며, 처음 게시했습니다.


41
귀여워 보이기 때문에 보너스 포인트.
Sammitch

22
코드는 고양이 플랩에서 촬영하는 불만족
스러운

2
바이트 수와 사용되는 인코딩에 대해 잘 모르지만 mothereff.in/byte-countermeta.codegolf.stackexchange.com/questions/4944/…에 따르면 이것은 17 바이트이고 바이트 크기는 중요합니다. com 그것은 13입니다.
DLeh

3
@DLeh UTF-8입니다. APL에는 유니 코드가 존재하기 전부터 APL 문자 당 1 바이트 인 자체 레거시 인코딩이 있습니다.
isaacg 2016 년

3
@DLeh bytesizematters는 구성된 알고리즘을 사용하여 바이트 수를 계산합니다 . 이는 실제 인코딩과 일치 하지 않습니다 (및 불가능합니다 ).
Dennis

21

J, 10 9 바이트

#~(=>./\)

내 CJam 아이디어의 작업 버전 (더 적은 바이트). 예 :

   f =: #~(=>./\)
   f 10 10 10 9 10
10 10 10 10
   f 1 2 5 4 3 7
1 2 5 7

설명

먼저 다음과 같이 각 접두어의 최대 값을 얻습니다.

    >./\

(여기서는 >.최대 연산자이며 /해당 연산자를 목록에 접어 \입력의 모든 접두사를 가져옵니다.)

그런 다음 초기 목록과 그 최대 값을 비교합니다.

  (=>./\)

마지막으로,이 부울 결과 목록에 다음과 같은 모든 요소를 ​​선택합니다 1.

#~(=>./\)

16

하스켈, 28

foldr(\x l->x:filter(x<)l)[] 

익명의 기능. 처럼 불러

foldr(\x l->x:filter(x<)l)[] [-7, -8, -5, 0, -1, 1] 
[-7,-5,0,1]

재귀에 해당

f[]=[]
f(x:l)=x:filter(x<)(f l)

반복적으로 번역하면 요소를 반복하고 우리가 보는 각 요소마다 반복하는 목록의 나머지 부분에서보다 작은 요소를 제거합니다. 로 저장된 바이트에 대한 Antisthenes에게 감사합니다 (x<).


왜 람다를 카레하지 않습니까? 몇 문자를 저장해야합니다 ...
MathematicalOrchid

@MathematicalOrchid 의미 foldr(\x->(x:).filter(>=x))[]하는 경우 길이가 같습니다.
xnor

아 방금 끝에 필터를보고 "이봐, 카레 할 수있어!" x:도트 연산자를 추가하도록 강요 하는 일은 없었습니다 . 잘 ..
MathematicalOrchid

1
그건 O(n^2)생각. 불필요한 비교가 많습니다. ;-(
자랑스러운 Haskeller

왜 (> = x)를 (x <)로 바꾸지 않습니까? 그것은 1 바이트를 절약 할 것이다
Antisthenes

10

파이썬 2, 49

f=lambda a:a and f(a[:-1])+a[-1:]*(a[-1]==max(a))

1
이것은 놀랍다.
Morgan Thrapp 17.46.

1
@ThomasKwa 문제는 재귀 호출을 중지하는 방법입니다. 입력에서 해당 케이스를 제외하더라도 빈 케이스가 필요합니다.
Bakuriu

문제는 그것이 선형 적이 지 않다는 것입니다.max(a)
njzk2

1
@ njzk2 도전 과제는 구현을 선형 시간으로 실행할 필요가 없습니다.
feersum

3
@ njzk2 멋진 코드가 마지막에 완성되었습니다!
feersum

10

자바 스크립트 (ES6), 29

자바 스크립트에서 표준 유형 변환을 사용하지 않고 배열을 숫자로 변환합니다.

  • 단지 1 숫자의 배열 => 그 숫자
  • 다른 배열 => NaN

d=l=>l.filter(v=>l>v?0:[l=v])

// TEST
console.log=x=>O.innerHTML+=x+'\n'

;[
  [[1,2,5,4,3,7], [1,2,5,7]]
, [[10,-1,12], [10,12]]
, [[-7,-8,-5,0,-1,1], [-7,-5,0,1]]
, [[9,8,7,6,5], [9]]
, [[10,13,17,21], [10,13,17,21]]
, [[10,10,10,9,10], [10,10,10,10]]
].forEach(t=>( i=t[0],r=d(i),x=t[1],              
  console.log('Test '+i+' -> '+r+(r+''==x+''?' OK':' Fail (expected '+x+')')))
)
<pre id=O></pre>


와. 38 바이트가 거의 최고라고 생각했습니다. 분명히 나는 ​​매우 틀렸다. +1
ETHproductions

테이블 기반 테스트. 좋은!
slebetman


7

Pyth, 12 바이트

eMfqeTeST._Q

모든 테스트 사례를 한 번에 확인하십시오.

작동 원리

         ._Q  Compute all prefixes of the input.
  f           Filter; for each T in the prefixes:
    eT          Retrieve the last element of T.
      eST       Sort T and retrieve its last element.
   q            Check for equality.
              Keep T if q returned True.
eM            Select the last element of each kept T.

7

Brachylog , 5 바이트

⊇ᶠ↔ᵒt

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

젤리 , 5 바이트

ŒPUÞṪ

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

설명

⊇ᶠ↔ᵒt    ŒPUÞṪ
⊇ᶠ       ŒP       On all subsequences of {the input}
   ᵒ        Þ     sort by
  ↔        U      their reverse
    t        Ṫ    then take the last element (i.e. the maximum as given by the sort)

이것은 드문 상황입니다. 아무도 지금까지 사용하지 않는 알고리즘을 사용합니다 (빠른 탈지로 말할 수있는 한), 어쨌든 매우 다른 구문을 가진 두 개의 매우 다른 골프 언어에서 동일한 길이를 얻습니다. 프로그램간에 일대일로 대응되는 내장 세트 (명령은 동일한 순서로도 제공됨). 그래서 그것들을 결합하는 것이 더 의미가있는 것처럼 보였습니다 – 어떤 방식으로, 이것들은 같은 프로그램이며, 그것들을 따로 제출하는 것보다 더 짧은 것을보기 위해 두 언어로 작성했습니다.

여기서 기본적인 아이디어는리스트의 드롭 정렬이 사전 식으로 최대 역수의 하위 시퀀스라는 것입니다. 이상하게도 Brachylog 나 Jelly 모두 특정 함수로 최대 값을 찾는 내장 기능이 없습니다 (Jelly에는 특정 함수로 모든 최대 값 을 반환하는 내장 기능이 있지만 결과 자체가 아닌 결과가 포함 된 단일 목록을 반환합니다. 이 방법으로 수행하는 것보다 짧지는 않습니다). 대신, 우리는 가능한 모든 하위 시퀀스를 생성하고 역순으로 정렬하여 마지막을 취합니다.

"사 전적으로 최대 역전"이 작동하는 이유는 선택한 출력이 입력 목록에서 가장 높은 숫자로 끝나야하므로 (반전이 시작되어야 함), Dropsort 출력이 항상 그 결과로 끝나는 것을 쉽게 알 수 있기 때문입니다. 하위 시퀀스를 사용하면 순서가 유지되므로 그 이후에는 아무것도 포함하지 않습니다. 귀납적으로 반복하고 우리는 dropsort의 정의로 끝납니다.


6

수학, 26 바이트

DeleteDuplicates[#,#>#2&]&

2
나는 Mathematica를 모른다. 그러나 호출 DeleteDuplicates하는 것이 {10, 10, 10, 10}입력을 위해 리턴 되는 것처럼 보이지 않는다{10, 10, 10, 9, 10}
Dennis

2
@ 데니스 : 그것은, 나는 그것을 테스트했다. 비결은 "동등성"테스트로 "보다 큼"을 통과한다는 것입니다. 예, 그것은 그 기능의 오용이지만 작동하지만 코드 골프는 어쨌든 최고의 프로그래밍 관행에 관한 것이 아닙니다.
celtschk

2
이름에서 알 수 있듯이 DeleteDuplicates두 가지 인수로 간단한 필터 인 것 같습니다.
Dennis

5

R, 29 26 바이트

function(x)x[x>=cummax(x)]

이 함수는 벡터를 받아들이고 누적 최대 값보다 크지 않은 모든 요소를 ​​제거한 후 x반환 하는 함수 객체를 만듭니다 .xx

flodel 덕분에 3 바이트를 절약했습니다!


함수 형식이 더 짧을 것입니다.
flodel

@flodel 당신은 절대적으로 맞습니다. 감사!
Alex A.

4

K, 11 바이트

{x@&~x<|\x}

실제로 :

  f: {x@&~x<|\x}
  f'(1 2 5 4 3 7
     10 -1 12
     -7 -8 -5 0 -1 1
     9 8 7 6 5
     10 13 17 21
     10 10 10 9 10)

(1 2 5 7
 10 12
 -7 -5 0 1
 ,9
 10 13 17 21
 10 10 10 10)

{x@&~<':x}바이트가 짧습니다.
kirbyfan64sos

@ kirbyfan64sos : 각 우선 순위를 사용하면 올바른 결과가 생성되지 않습니다. 입력 사례를 고려하십시오 3 4 2 2 5.
JohnE

아, 알겠습니다 수정은 {x@&~<':x}/이지만 길이는 같습니다.
kirbyfan64sos 2016 년

3

자바, 82 바이트

void f(int[]a){int m=a[0];for(int n:a){System.out.print(m>n?"":n+" ");m=n>m?n:m;}}

다음은 간단한 출력 루프입니다. 최대 값을 유지하고 m각 요소를 비교합니다.


1
람다를 사용하여 단축 할 수 있습니다.a->{int m=a[0]...
Daniel M.

예, 보통 가능합니다. 그래도 자바 골프는 람다 화하지 않습니다.
Geobits

3

펄, 33 바이트

32 바이트 코드 + -p

$p=$_;s/\S+ ?/$&>=$p&&($p=$&)/ge

추가 공간의 출력에 허용되는 경우, 제거하여 31 바이트 수 ?. 다음을 통해 문자열 (또는 개행 문자로 구분 된) 문자열을 허용합니다 STDIN.

perl -pe'$p=$_;s/\S+ ?/$&>=$p&&($p=$&)/ge' <<< '-7 -8 -5 0 -1 1'
-7 -5 0 1
perl -pe'$p=$_;s/\S+ ?/$&>=$p&&($p=$&)/ge' <<< '10 10 10 9 10'
10 10 10 10

3

파이썬 3, 67

꽤 무차별 한 힘. 올바른 답변이라고 생각하지 못했기 때문에 함수로 변경했습니다.

def f(i):
 s=[i[0]]
 for n in i[1:]:
  if s[-1]<=n:s+=[n]
 return s

언 골프 버전 :

input_numbers = input().split()
sorted_numbers = []
previous_number = int(input_numbers[0])
for number in map(int, input_numbers):
    if previous_number <= number:
        sorted_numbers.append(number)
        previous_number = number
print(sorted_numbers)


3

하스켈, 38 37 바이트

JArkinstall 덕분에 1 바이트가 절약되었습니다 .

f(x:y:s)|x>y=f$x:s|1>0=x:f(y:s)
f s=s

1
괄호 세트 $중 하나를 1 바이트로 줄이려면 a 로 바꿀 수 있습니다 ! f(x:y:s)|x>y=f$x:s|1>0=x:f(y:s);f s=s (설명은 개행을 허용하지 않기 때문에 세미콜론이 사용됨)
JArkinstall

3

씨# - 6864 또는 132127 자

int[]f(int[]b){return b.Where((v,i)=>i<1||b[i-1]<=v).ToArray();}

Where이 경우 목록을 반복하고 목록의 v색인 i에있는 각 요소 에 대해 부울 표현식을 평가합니다. 표현식이 true로 평가되면 항목이 결과에 추가됩니다. 부울 식에 대한 유일한 실제 트릭은 조건이 true로 평가되는 즉시 C # 단락 또는 평가입니다. 이는 IndexOutOfRangeException예외를 방지하고 목록의 첫 번째 요소를 유지합니다.

입력과 출력이 문자열이어야하는 경우 (확실히 알 수 없으므로 OP와 나머지에게 맡겨 결정해야합니다.)

string t(string b){var c=b.Split(' ').Select(d=>int.Parse(d)).ToList();return String.Join(" ",c.Where((v,i)=>i<1||c[i-1]<=v));}

압축을 풀면 다음이 제공됩니다.

string t(string b) 
{
    var c=b.Split(' ').Select(d=>int.Parse(d)).ToList();
    return String.Join(" ",c.Where((v, i)=>i<1||c[i-1]<=v));
}

이 경우 함수의 두 번째 줄은 위와 동일한 논리를 사용합니다. Select챙기고하여 목록의 요소와 그들에 변환합니다 int. ToList1 에 대한 호출 은 선택을 강제로 평가 하고 컴파일 타임에 var로 변환하여 정수 컬렉션에서 작동 List<int>하도록합니다 Where.

C # 패드에서 사용해보십시오

4 바이트와 5 바이트를 각각 트리밍하는 데 도움을 준 VisualMelon 덕분 입니다. :)

투투리스트 1 개?


계산이 잘못되었거나 설명에 설명이 필요한 경우 알려주십시오. :)
theB

1
좋은 작업-몇 가지 일반적인 트릭을 사용하여 몇 바이트를 절약 할 수 있습니다-배열 선언 int[]f(int[]b)이 잘 된 후에 공백이 필요하지 않으며 검사를 약간 단축하는 i<1대신 사용할 수 있습니다 i==0. (예 : 문자열 버전, 당신은 또한 람다의 단일 인수 주위에 괄호를 제거 할 수 (d)=>int.Parse(d)할 수 있습니다 d=>int.Parse(d);. 귀하는 오리지널에, 나는 또한 단지 67 바이트가 아닌 68 카운트)
VisualMelon

@VisualMelon-감사합니다! 나는 잘못된 계산으로 인해 총계가 더 커질 것이라고 생각했습니다. ;)
theB

3

CJam, 15 바이트

q~{_2$<{;}&}*]p

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

q~               Read an evaluate all input.
  {        }*    Reduce; push the first element; or each remaining element:
   _2$           Copy the topmost and second topmost element from the stack.
      <          Check if the topmost is smaller than the second topmost.
       {;}&      If it is, remove it from the stack.
             ]   Wrap the stack i an array.
              p  Print.


2

C : 73 바이트

int i,j;i=j=INT_MIN;while(scanf("%d",&j)!=EOF)if(j>=i)printf("%d",j),i=j;

또는

C : 49 바이트

( 코드 골프 대회를 위해 만들어진 세관 헤더 가 허용되는 경우)

I z,y;z=y=INT_MIN;w(s(D,&y)!=E)i(y>z)p(D,y),z=y;}

여전히 CJam을 이길 수는 없지만 적어도 다른 언어를 이길 수는 있습니다.


4
맞춤 헤더는 허용되지 않습니다. 다른 언어로 계산됩니다.
lirtosiast

4
사용자 지정 헤더의 주요 문제는이 경쟁이 시작된 후에 게시 한 것입니다.
Dennis

물론 이해하지만 앞으로의 경쟁에서도 사용할 수 없습니까?
GameDeveloper

@DarioOO 가능하지만 바이트 수에 import 문을 포함해야합니다.
SuperJedi224

아니면 그냥 새로운 언어로 부르십시오.
CalculatorFeline

2

해 학적 인, 13 바이트

테스트 사례를 통과하는 11 바이트 솔루션 :

-.2CO:so)[~

여기에서 온라인으로 시도하십시오 .

설명:

-. -- prepend head of list to list
2CO -- n-grams (sliding window) of size 2
:so -- filter sorted lists
)[~ -- map last

그러나이 버전은 두 숫자 사이에 작은 숫자 두 개가 없다는 사실 만 사용하여 작동합니다. 그렇지 않으면 아래 버전 (13B)을 사용하십시오.

이전 버전 :

J-]{cm-1.>}LO

여기에서 온라인으로 시도하십시오. 설명:

J -- duplicate
-] -- head
{
  cm -- compare (returning -1,0 or 1)
  -1.> -- greater than -1
}LO -- Loop

같은 숫자를 삭제하면 .>대신을 사용할 수 cm있습니다. 또한 목록에 양수 만 포함 된 경우 0또는 -1대신 사용할 수 있습니다 J-].


예, 그러나 하이퍼 링크로 연결할 수 없습니다 :).
mroman

결정된. 그냥 "여기에서 온라인으로 시도"줄을 추가하겠습니다.
mroman


2

루비, 41

->a{m=a[0];a.map{|n|m>n ?p: m=n}-[p]}

샘플 실행 :

2.1.5 :001 > [
2.1.5 :002 >     [1, 2, 5, 4, 3, 7],
2.1.5 :003 >     [10, -1, 12],
2.1.5 :004 >     [-7, -8, -5, 0, -1, 1],
2.1.5 :005 >     [9, 8, 7, 6, 5],
2.1.5 :006 >     [10, 13, 17, 21],
2.1.5 :007 >     [10, 10, 10, 9, 10],
2.1.5 :008 > ].each{ |test| p ->a{m=a[0];a.map{|n|m>n ?p: m=n}-[p]}[test] }
[1, 2, 5, 7]
[10, 12]
[-7, -5, 0, 1]
[9]
[10, 13, 17, 21]
[10, 10, 10, 10]

1
-[p]보다 짧습니다.compact
Charles Charles

죄송합니다. 물론이야. 감사합니다. (나 자신에 대한 참고 : 루비에서의 골프를위한 [link codegolf.stackexchange.com/questions/363/…찬성 하기에 충분하지 않다 [/ link], 나는 또한 그것들을 기억해야한다.)
manatwork

2

NARS2000 APL, 13 바이트

NARS2000은 Windows 용 무료 APL 인터프리터입니다. 운영자가 액세스 하는 다중 세트 기능을 포함 합니다 .

(+⍦∩⌈\)

이것은 ⍦∩입력 ( +) * 의 다중 집합 교차점 ( ) *과 실행 최대 값 목록 ( ) 을 취하는 모나 딕 포크입니다 ⌈\.

1 바이트 APL 레거시 인코딩에서는 표준 APL 문자가 아니기 때문에 UTF-8을 사용하여 ⍦∩⌈문자를 각각 3 바이트로 만들어야합니다. 두 바이트를 저장하는 +대신 선택했습니다 .

NARS2000은 괄호없이 열차에 내장 할 수있는 포크를 지원하지만 Dyalog와 달리 괄호로 묶지 않고 함수에 할당 할 수는 없습니다.

* +기술적으로 복잡한 켤레이지만 입력은 실제입니다.


그렇다면 왜 codegolf.stackexchange.com/questions/61808/… 도 여기에 적용 되지 않습니까 ?
고양이

NARS2000은 레거시 APL 인코딩을 사용할 수 없으며 인코딩이 인터프리터가 실제로 사용해야하는 규칙 이전에도 psi는 레거시 APL 인코딩의 일부가 아니기 때문에 7 바이트 일 수 없습니다.
lirtosiast

2

-v 플래그를 가진 > <> , 36 31 + 2 = 33 바이트

:&\o " "&n:~& <
~ >l?!;:&:&(?!^

-v를 사용하여 스택의 목록을 입력하여 목록의 첫 번째 요소가 스택의 맨 위에 오도록하십시오. 후행 공백이있는 분류 된 목록을 인쇄합니다.

시운전 :

$ for input in "1 2 5 4 3 7" "10 -1 12" "-7 -8 -5 0 -1 1" "9 8 7 6 5" "10 13 17 21" "10 10 10 9 10"; do echo $input '-> ' $(python fish.py dropsort.fsh -v $(echo $input | tac -s ' ')); done

1 2 5 4 3 7 ->  1 2 5 7

10 -1 12 ->  10 12

-7 -8 -5 0 -1 1 ->  -7 -5 0 1

9 8 7 6 5 ->  9

10 13 17 21 ->  10 13 17 21

10 10 10 9 10 ->  10 10 10 10

편집 : Fongoid 덕분에 5 바이트 저장


1 :&\o" "&n:~& <행을 2 행으로 리팩토링하여 5 바이트를 절약 할 수 있습니다.~ >l?!;:&:&(?!^
Fongoid

@ Fongoid 감사합니다!
Aaron

2

파이썬 102 99 94 + 5 6 비 파일 최종 바꿈 = 107 105 100 바이트

(들여 쓰기에 탭을 사용했습니다)

def d(l):
    j=b=0;m=l[j];r=[]
    for i in l:
        (m,b)=[(m,0),(i,1)][i>=m]
        if b>0:r+=[i]
        j+=1
    l[:]=r

가장 좋은 것은 아니지만 이것은 코드 골프에서의 첫 번째 장면입니다. 제거 관련 버그가 발생하지 않고 목록을 인라인으로 정렬하는 방법을 알 수 없으므로 정렬 된 요소를 임시 목록으로 옮겼습니다.

편집 : list.append ()는 못생긴 방법보다 짧습니다.

r + = [i]는 list.append ()보다 짧았습니다. 감사합니다 njzk2 !


r + = [i] is r.append
njzk2

나는 전에 그것을 시도했지만 대괄호로해야한다는 것을 몰랐기 때문에 오류가 발생했습니다. 감사!
James Murphy

2

스칼라 : 232 126 120 바이트

def f(x:Int*)=(Seq[Int]()/:x)((r,y)=>r.headOption.filter(y>=).map(_=>y+:r).getOrElse(if(r.isEmpty) y+:r else r)).reverse

2
"확장 방법"을 추가하는 List[Int]것이 요구 사항을 충족하지 않으면 STDIN을 통해 또는 인수로 입력을 가져와야합니다. 게다가, 그것은 당신의 대답을 부풀립니다 ... 왜 간단하지 def dropSort(s:Seq[Int]):Seq[Int]않습니까?
Jacob

나는 그것이 멋질 것이라고 생각했지만 너무 많은 바이트가 맞습니다 ...
Martin Seeler

1
접기를 사용하여 아주 좋은 개선! 여전히 일부 공백을 제거 할 수 있으며 _ <= y 대신 y> =를 사용하여 적절한 가져 오기없이 컴파일 경고를 생성 할 수 있지만 스칼라가 얼마나 멋진지를 보여줍니다 (오, 다른 캐릭터를 면도 함).
Jacob

tipp를위한 Thx!
Martin Seeler

2

스칼라, 54 바이트

def f(x:Int*)=(x:\Seq[Int]())((y,r)=>y+:r.filter(y<=))

언 골프 드 :

def dropSort(xs: Seq[Int]): Seq[Int] =
  xs.foldRight(Seq.empty[Int]) { (x, result) =>
    x +: result.filter(r => r >= x)
  }

2

작은 리스프, 107 바이트

( 이 언어는 단지 출판 되었음 이 질문 후, 그래서이 답변이 경쟁에서 실행됩니다.이 승리 할 기회가 없었있다. 언어가 나중에 내가 여기에 사용 된 것보다 더 buildins을 가지고 더 진화,하지만 난과 함께있을거야 버전은 원래는 2015 년에 구현 이 대답은 여전히 새로운 공식 통역사와 함께 작동 내가 매개 변수 정의하기 때문에 몇 가지 경고를 제공하지만, 새로운 buildin 그림자 (추가하는). 산화 티타늄 링크에 대한 DLosc에 감사합니다. )aa

(d r(q((m a)(i a(i(l(h a)m)(r m(t a))(c(h a)(r(h a)(t a))))()))))(d ds(q((b)(i b(c(h b)(r(h b)(t b)))()))))

이것은 인수를 정렬 하는 함수 ds(및 재귀 도우미 함수 r)를 정의하며 정수 목록이어야합니다.

r 꼬리 재귀 함수가 아니므로 매우 긴 목록의 경우 스택 오버플로가 발생할 수 있습니다.

언 골프 드 :

(d r
   (q((m a)
      (i a
         (i (l (h a) m)
            (r m (t a))
            (c (h a)
               (r (h a) (t a))
             )
          )
         ()
       )
   ) )
 )
(d ds
  (q(
      (b)
      (i b
        (c (h b)
           (r (h b) (t b))
         )
        ()
       )
   ) )
 )

다음은 이것을 사용하는 방법에 대한 몇 가지 예입니다 (문제의 테스트 사례와 함께).

(d list (q (args args)))
(d -
   (q( (n)
       (s 0 n)
    ) )
 ) 

(ds (list 1 2 5 4 3 7))
(ds (list 10 (- 1) 12))
(ds (list (- 7) (- 8) (- 5) 0 (- 1) 1))
(ds (list 9 8 7 6 5))
(ds (list 10 13 17 21))
(ds (list 10 10 10 9 10))

(예, -7정수 리터럴이 아니므로이를 나타내는 함수를 정의해야합니다.) 출력 :

list
-
(1 2 5 7)
(10 12)
(-7 -5 0 1)
(9)
(10 13 17 21)
(10 10 10 10)

"-7은 정수 리터럴이 아닙니다"저는 여전히 웃고 있습니다. +1
cat

내장을 위해 모든 문자를 모두 사용 했습니까? (를 제외하고 r는 ..)
CalculatorFeline

@CatsAreFluffy 죄송합니다. 귀하의 의견을 이해하는 데 문제가 있습니다. Tiny Lisp에는 7 개의 내장 함수와 3 개의 내장 매크로가 있으며 모두 괄호와 공백이 특수 구문 인 단일 문자 이름 (골프에 사용하기 쉬운 언어)을 가지고 있습니다. Tiny Lisp는 저의 발명품이 아닙니다.
Paŭlo Ebermann

아, 나는 지금 그것을 얻는 것 같아 ... 당신은 대신 단일 문자 이름을 사용하도록 제안하고 ds있습니까? 나는 이것을 할 수 있다고 생각하고 다른 바이트를 절약 할 것입니다. ds드롭 정렬의 약어로 선택한 것 같습니다 .
Paŭlo Ebermann

이봐, 나는 이것을 알아 차렸다. 좋은 작업! 메타 합의에 따르면, 명명되지 않은 람다 함수는 유효한 제출 형식이므로 끝에 제거 (d ds하고 일치 )시켜 6 바이트를 절약 할 수 있습니다 . 현재 통역사 를 사용하고 싶다면 다른 골프도 가능 하지만 원래 질문의 사양을 고수하고 싶다면 괜찮습니다. :)
DLosc

2

젤리, 5 바이트

=»\Tị

도전은 젤리의 생성보다 우선합니다.

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

작동 원리

=»\Tị  Main link. Argument: A (list)

 »\    Yield the cumulative maxima of A.
=      Perform element-by-element comparison.
       Yields 1 iff A[n] = max(A[1], ..., A[n]).
   T   Get all indices of truthy elements.
    ị  Retrieve the items of A at those indices.

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