Kayıplı Sıralama (Uygulama Dropsort)


61

David Morgan-Mar tarafından tasarlanan Dropsort , aslında, sıralanan, ancak orijinal öğelerin yalnızca bazılarını içeren bir liste üreten doğrusal zamanlı bir "sıralama algoritması" örneğidir . En azından ondan önceki öğelerin maksimum büyüklüğü kadar büyük olmayan herhangi bir öğe listeden çıkarılır ve atılır.

Bu görevde, girdi olarak bir tam sayı listesi verilecektir (STDIN veya function argümanı, en az 8 bit işaretli tam sayı aralığını desteklemeniz gerekir.) sipariş.

Listenin boş olmadığını varsayabilirsiniz.

Bu kod golf, bu yüzden en kısa program kazanır.

Test Kılıfları

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

Liderler Sıralaması

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
Çek highest < currentmi? Ya da highest <= current?
Morgan Thrapp

7
Geçerli elemanı saklarsanız highest (so far)<=current.
SuperJedi224

Listede en az bir unsur olacağını varsayabilir miyiz?
lirtosiast

@ThomasKwa: Evet.
SuperJedi224

19
Dropsorts, verimlilik artışı, bir şirketin bordro sisteminde kullanılması durumunda çok para kazandırabilir.
PyRulez

Yanıtlar:


42

APL, 9 bayt

⊢(/⍨)⊢=⌈\

Bu şema ile monadik bir fonksiyon trenidir:

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

Tren dışı sürüm

{⍵/⍨⍵=⌈\⍵}

Bu, temel olarak, her bir elemanın çalışan maksimum değere eşit olup olmadığını kontrol eder.

Martin Büttner'ın J çözümünün bununla aynı uzunlukta olduğunu ve ilk yayınlandığını unutmayın.


41
Bonus puan çünkü sevimli görünüyor.
Sammitch

22
Kod, bir kedi kanadı için
çirkin

2
Bayt sayımı ve hangi kodlamanın kullanılması gerektiği hakkında çok fazla bilgim yok, ancak mothereff.in/byte-counter ve meta.codegolf.stackexchange.com/questions/4944/… 'e göre bu 17 bayttır ve bayt izleyicileridir . com 13.
DLeh

3
@DLeh Bu UTF-8'de. APL, unicode olmadan önce APL karakteri başına 1 bayt olan kendi eski kodlamasına sahiptir.
isaacg

3
@DLeh bytesizematters, baytları saymak için gerçek bir kodlamaya karşılık gelen (ve edemeyen ) bir telafi algoritması kullanır .
Dennis

21

J, 10 9 bayt

#~(=>./\)

CJam fikrimin çalışma sürümü (daha az bayt cinsinden). Örneğin:

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

açıklama

Öncelikle, her ön ekin azami miktarını alıyoruz:

    >./\

(Burada, >.maksimum işleç, /bu işleci bir listeye katlar \ve girişin tüm öneklerini alır.)

Sonra ilk listeyi eşitlik için bu maksimumlarla karşılaştırırız:

  (=>./\)

Ve son olarak, bu mantıksal sonuç listesinin 1şunları verdiği tüm unsurları seçiyoruz :

#~(=>./\)

16

Haskell, 28

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

Anonim bir işlev. Gibi ara

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

Özyinelemeye eşdeğer

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

Yinelemeyle çevrilir, öğeler üzerinde yineleniriz ve gördüğümüz her biri için, yinelemekte olduğumuz listenin geri kalanından küçük olanları kaldırırız. Antisthenes sayesinde kaydedilen bir bayt için (x<).


Neden lambda köri değil? Birkaç karakter kaydetmeli ...
MathematicalOrchid

@MathematicalOrchid Yani foldr(\x->(x:).filter(>=x))[], aynı uzunluk olduğu ortaya çıkıyor.
xnor

Ah. Sonunda filtreyi gördüm ve düşündüm ki "hey, köri yapabilirsin!" Bana öyle gelmedi ki, x:sizi nokta operatörünü eklemeye zorlar. Oh iyi ...
Matematiksel

1
öyle O(n^2)olsa. gereksiz karşılaştırmalar çok. ;-(
proud haskeller

Neden değişmiyor (> = x) (x <)? 1 byte kazandıracak
Antisthenes

10

Python 2, 49

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

1
Bu harika.
Morgan Thrapp

1
@ThomasKwa Sorun, özyinelemeli aramaları nasıl durdurduğunuzdur. Giriş, bu durumu kapsamazsa bile, boş duruma ihtiyacınız vardır.
Bakuriu

Bununla ilgili sorun şu ki, çünkü doğrusal değilmax(a)
njzk2

1
@ njzk2 Zorluk, uygulamaların doğrusal zamanda çalışmasını gerektirmez.
feersum

3
@ Njzk2 Güzel kodlar sonuncu!
feersum

10

JavaScript (ES6), 29

Javascript'te standart tür dönüştürmenin kötüye kullanılması, dizinin numaraya dizilmesi

  • sadece 1 sayı dizisi => bu sayı
  • başka bir dizi => 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>


Vay. 38 bayt yaklaşık olarak en iyi olduğunu düşündüm; görünüşe göre çok yanılmışım. +1
ETHProductions

Masa bazlı testler. Güzel!
slebetman


7

Pyth, 12 bayt

eMfqeTeST._Q

Tüm test durumlarını bir kerede doğrulayın.

Nasıl çalışır

         ._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 bayt

⊇ᶠ↔ᵒt

Çevrimiçi deneyin!

Jöle , 5 bayt

ŒPUÞṪ

Çevrimiçi deneyin!

açıklama

⊇ᶠ↔ᵒ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)

Bu nadir bir durumdur: hiç kimsenin kullanmadığı bir algoritmayı kullanıyorum (hızlı bir şekilde kaybedebildiğim kadarıyla) şimdiye kadar hiç kimsenin kullanmadığı bir algoritma kullanıyorum ve bir şekilde aynı uzunluğu çok farklı sözdizimi olan iki farklı golf diliyle bitiyor. Yerleşik ayarlar, programlar arasında bire bir yazışmalar (komutlar aynı sırada!). Bu yüzden, onları birleştirmek daha mantıklı görünüyordu - bir şekilde, bunlar aynı programdı ve her iki dilde de hangisinin daha kısa olduğunu görmek için yazdım - ayrı ayrı sunmaktan daha.

Buradaki temel fikir, bir listenin terkedilmesinin sözlükbilimsel olarak en fazla tersine sahip olması gerektiğidir. İşin garibi, ne Brachylog ne de Jelly belirli bir işleve göre maksimum değeri bulan bir yapıya sahip değil (Jelly, tüm maksimumları belirli bir işleve döndürmek için bir yapıya sahip, ancak sonucun kendisinden ziyade sonucu içeren tek bir liste döndürüyordu ve Ayrıca bu şekilde yapmaktan daha kısa değildir). Öyleyse, geriye doğru sıralanan tüm olası alt ekleri üretiriz.

"Sözlükbilimsel olarak en fazla geri dönüş" çalışmasının nedeni, seçilen çıktının, giriş listesindeki en yüksek sayı ile bitmesi (bu nedenle geri dönüşünün başlaması gerekir) (damla damlası çıktısının her zaman bununla biteceğini görmek kolaydır) ve böylece ondan sonra hiçbir şey içermez (çünkü emir almak sırayı korur). İndüktif olarak tekrarlayın ve damlaların tanımıyla bitiyoruz.


6

Mathematica, 26 Bayt

DeleteDuplicates[#,#>#2&]&

2
Mathematica'yı tanımıyorum, ama çağrı yapan bir giriş için DeleteDuplicatesgeri dönecek gibi görünmüyor{10, 10, 10, 10}{10, 10, 10, 9, 10}
Dennis

2
@Dennis: Yaptı, test ettim. İşin püf noktası benim "aldığım" "eşdeğerlik" testinden daha büyük. Evet, bu fonksiyonun kötüye kullanılması, ancak işe yarıyor ve golf kodu tam olarak en iyi programlama uygulamaları ile ilgili değil.
celtschk

2
Tamam, adının önerdiğine rağmen, DeleteDuplicatesiki argümanla basit bir filtre gibi görünüyor.
Dennis,

5

R, 29 26 bayt

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

Bu, bir vektörü kabul eden xve xen az kümülatif maksimum değer kadar büyük olmayan tüm öğeleri çıkardıktan sonra geri dönen bir işlev nesnesi oluşturur x.

Flodel sayesinde 3 bayt kurtarıldı!


İşlev formu daha kısa olacaktır.
flodel

@ flodel Kesinlikle haklısın. Teşekkürler!
Alex A.

4

K, 11 bayt

{x@&~x<|\x}

Eylemde:

  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}bayt daha kısa.
kirbyfan64sos

@ kirbyfan64sos: Her bir oyuncuyu kullanmak doğru sonucu vermez. Giriş durumunu düşünün 3 4 2 2 5.
JohnE

Ah, anlıyorum. Bir düzeltme olurdu {x@&~<':x}/, ama aynı uzunluk.
kirbyfan64sos

3

Java, 82 bayt

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

İşte basit bir çıktı döngüsü. Sadece maksimum değeri tutar mve her elemanı karşılaştırır.


1
Bir lambda kullanarak kısaltabilirsiniz:a->{int m=a[0]...
Daniel M.

Evet, genellikle yapabilirsin. Yine de Java Golf'lerini kıpırdatmam.
Geobits 27:15

3

Perl, 33 bayt

32 bayt kodu + -p

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

Ek yerleri çıkış kabul edilebilir, kaldırarak 31 bayt olabilir ve ?. Bir dize (veya yeni ayrılmış satır sayısı) dizelerini şu yollarla kabul eder 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

Python 3, 67

Oldukça kaba kuvvet. Bir işleve değiştirildi, çünkü geçerli bir cevap olduğunu özledim.

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

Ungolfed versiyonu:

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

Haskell, 38 37 bayt

JArkinstall sayesinde 1 bayt kaydedildi .

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

1
Parantez kümelerinizden $birini bir tam bayt kesmek için a ile değiştirebilirsiniz! f(x:y:s)|x>y=f$x:s|1>0=x:f(y:s);f s=s (Yarı
sütun,

3

C # - 6864 veya 132127 Karakterler

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

WhereBu durumda listeyi yineleme ve her element için vendeksinde ilistesinde, boolean ifadeyi değerlendirir. İfade doğru olarak değerlendirilirse, öğe sonuca eklenir. Boolean ifadesinin tek hilesi, bir koşulun doğru olarak değerlendirildiği anda C # kısa devrelerinin veya değerlendirmesinin olmasıdır. Bu IndexOutOfRangeExceptionistisnayı önler ve listedeki ilk elemanı tutar.

Girdi ve çıktının karakter dizileri olması gerekiyorsa (Kesin olarak söyleyemem, o yüzden onu OP'ye ve karar vermene bırakacağım)

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

Bir parçaya dekompresyon yapılması:

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

Bu durumda, fonksiyonun ikinci satırı yukarıdaki ile aynı mantığı kullanıyor. SelectKepçeler listesinin elemanları ve onları dönüştürür int. Çağrısı ToList1'e değerlendirilecek seçme zorlar ve döner varbir içine List<int>böylece derleme zamanında Wheretamsayılar yapan bir dizi faaliyet göstermektedir.

C # Pad üzerinde deneyin

Sayesinde VisualMelon sırasıyla 4 bayt ve 5 bayt Döşeme yardımcı olduğunuz için. :)

1 tutu listesi?


Yanlış saydıysam veya açıklamamın açıklamaya ihtiyacı olursa, lütfen bana bildirin. :)
15

1
İyi iş - bazı yaygın hileleri kullanarak birkaç bayttan tasarruf edebilirsiniz - dizi bildirimleri tamamlandıktan sonra boşluklara ihtiyacınız yoktur int[]f(int[]b)ve bu kontrolü biraz kısaltmak i<1yerine kullanabilirsiniz i==0. (Örneğin dize sürümü için, ayrıca bir lambda tek argüman etrafında parantez bırakabilirsiniz (d)=>int.Parse(d)olabilir d=>int.Parse(d);. Senin orignal içinde, ben de sadece 67 bayt değil, 68 sayım)
VisualMelon

@VisualMelon - Teşekkürler! Herhangi bir yanlış saymanın toplamı daha büyük hale getireceğini düşünmüştüm. ;)
29'da

3

CJam, 15 bayt

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

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

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 bayt

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

veya

C: 49 bayt

( Codegolf yarışmaları için yapılan gümrük başlığına izin verilirse)

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

Hala CJam’ı yenemezsin, ama en azından bu birkaç dilin de geçmesine izin veriyor.


4
Maalesef, özel başlığa izin verilmiyor; farklı bir dil olarak sayılır.
lirtosiast

4
Özel başlıklarınızla ilgili temel sorun, bu yarışma başladıktan sonra yayınlamanızdır.
Dennis,

Tabii ki anladım, ama sonra gelecekteki yarışmalarda da kullanamıyorum?
GameDeveloper 27:15

@DarioOO Yapabilirsiniz, ancak alma ifadesini bayt sayınıza eklemeniz gerekir.
SuperJedi224,

Ya da sadece yeni bir dil olarak adlandırın.
Hesap MakinesiFeline

2

Burlesque, 13 bayt

Test vakalarından geçen 11 baytlık çözüm:

-.2CO:so)[~

Burada çevrimiçi deneyin .

Açıklama:

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

Ancak, bu sürüm yalnızca iki sayı arasında iki küçük sayının olmaması gerçeğini kullanarak çalışır. Aksi takdirde aşağıdaki sürümü kullanın (bu 13B'dir):

Eski versiyonlar:

J-]{cm-1.>}LO

Burada çevrimiçi deneyin. Açıklama:

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

Eşit sayıları da düşürürseniz .>, kullanmak yerine gidebilirsiniz cm. Ayrıca, listelerde yalnızca pozitif sayılar varsa, ya 0da -1yerine kullanabilirsiniz J-].


Evet, ama sonra köprü kuramam :).
mroman

sabit. Sadece "burada çevrimiçi dene" satırı ekleyeceğim.
mroman

2

Minkolang 0.9 , 18 bayt

ndN(nd1R`2&dN$I$).

Burada dene.

açıklama

ndN                Take first integer from input
(         $I$).    Repeat until the input is empty and then stop.
 nd1R`             Is the next integer less than the previous one?
      2&dN         If not (i.e., it's greater than or equal to), print it.

2

Ruby, 41 37 karakter

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

Örnek çalışma:

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]daha kısadır.compact
Charles 17

Hata. Tabii ki. Teşekkür ederim. (Kendime dikkat: Ruby [/ link] 'te golf oynamak için sadece [link codegolf.stackexchange.com/questions/363/…' i yenmek için yeterli değil , aynı zamanda onları ezberlemeliyim.)
manatwork

2

NARS2000 APL, 13 bayt

NARS2000, Windows için ücretsiz bir APL tercümanıdır; operatöre erişilen çoklu ayar özelliklerini içerir .

(+⍦∩⌈\)

Bu, ⍦∩( +) * girişinin çoklu ayar kesişimini ( ) ve çalışma maksimumlarının ( ⌈\) listesini alan monadik bir çataldır .

Yana tek baytlık APL eski kodlamaları standart APL karakter değil, biz yapma UTF-8 kullanmalıdır ⍦∩⌈karakterleri üç bayt her. İki bayt kaydetmek +yerine seçtim .

NARS2000, parantezsiz trenlere yerleştirilebilen çatalları destekler, ancak Dyalog'dan farklı olarak, işlevi parantez içinde sarmadan bir işleve atanmasına izin vermez.

* +teknik olarak karmaşık birleşiktir, ancak girdi gerçektir.


Peki, neden codegolf.stackexchange.com/questions/61808/… burada da geçerli değil ?
kedi,

NARS2000, eski APL kodlamalarını kullanamaz - ve kodlamaların tercümanlar tarafından gerçekten kullanılanlar olması gerektiği kuralından önce bile, bu, 7 bayt olamaz, çünkü psi, eski APL kodlamanın bir parçası değildir.
lirtosiast

2

> <> -v bayrağıyla, 36 31 + 2 = 33 bayt

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

Yığındaki listeyi -v ile girin, böylece listenin ilk elemanı yığının tepesinde olur. Bırakılan listeyi sondaki boşlukla yazdıracaktır.

Test sürüşü :

$ 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

Düzenleme: Fongoid sayesinde 5 bayt kaydedildi


Satır 1'i :&\o" "&n:~& <ve satır 2'yi yeniden ~ >l?!;:&:&(?!^
takarak

@Fongoid teşekkürler, güncellendi!
Aaron,

2

Python, 102 99 94 + 5 6 dosya finali olmayan yeni satırlar = 107 105 100 bayt

(Girinti için sekmeler kullandım)

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

Dışarıdaki en iyi yer değil ama bu benim golf kodundaki ilk şansım. Liste, satır içi kaldırma ile ilgili hatalara girmeden sıralamanın bir yolunu bulamadım, bu yüzden sipariş edilen öğeleri geçici bir listeye taşıdım.

EDIT: list.append () çirkin bir şekilde yapmaktan daha kısa

r + = [i] list.append () işlevinden daha kısaydı; teşekkürler njzk2 !


r + = [i], r.append 'den kısa.
njzk2

Bunu daha önce yapmayı denedim, ancak bir hata oluştu çünkü bunu parantez içinde yapmak zorunda olduğunuzu bilmiyordum. Teşekkürler!
James Murphy

2

Scala: 232 126 120 bayt

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
İçin bir "uzatma yöntemi" eklemek List[Int], gereksinimleri karşılamıyorsa, girişi STDIN aracılığıyla veya bir argüman olarak almalısınız. Artı, cevabını şişiriyor ... Neden olmasın ki def dropSort(s:Seq[Int]):Seq[Int]?
Jacob,

Fantezi olacağını düşündüm, ama haklısın, çok fazla bayt ...
Martin Seeler

1
Kat kullanarak çok güzel bir gelişme! Yine de bazı alanları tıraş edebilirsiniz ve ayrıca düzgün bir içe aktarma olmadan derleme uyarısı veren _> = y yerine y> = kullanabilirsiniz, ancak aynı zamanda Scala'nın ne kadar harika olduğunu gösterir (oh, ve başka bir karakteri tıraş ediyor).
Jacob

İpucu için teşekkürler!
Martin Seeler

2

Scala, 54 bayt

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

Ungolfed:

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

2

Küçük Lisp, 107 bayt

( Bu dil yalnızca bu sorudan sonra yayınlandı , bu nedenle bu cevap rekabetten çıktı. Kazanma şansı olmadı. Daha sonra dil , burada kullandıklarımdan daha fazla yapıya sahip olmak için daha da gelişti. Versiyona ilk olarak 2015 yılında uyguladım. Bu cevap hala yeni resmi tercüman ile çalışıyor , ancak bazı uyarılar veriyor çünkü ayeni ayapıyı gölgeleyen bir parametre tanımladım (eklemek için). TIO bağlantısı için DLosc sayesinde. )

(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)))()))))

Bu, tam sayıların bir listesi olması gereken argümanını sıralayan bir işlevi ds(ve özyinelemeli yardımcı işlevini r) tanımlar .

r kuyruk özyinelemeli bir işlev değildir; bu nedenle, çok uzun listeler için bu bir yığın taşmasına neden olabilir.

Ungolfed:

(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))
         )
        ()
       )
   ) )
 )

İşte bunun nasıl kullanılacağıyla ilgili bazı örnekler:

(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))

(Evet, -7bir tamsayı değil, bu yüzden onları temsil edecek bir işlev tanımlamamız gerekir.) Çıktı:

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

"-7 bir tamsayı değil" Ben hala gülüyorum, +1
kedi,

Yerleşikler için her bir karakteri gerçekten mi kullandın? (Hariç r, sanırım ..)
CalculatorFeline

@CatsAreFluffy Üzgünüz, yorumunuzu anlamada sorun yaşıyorum. Tiny Lisp 7 tane yerleşik fonksiyona ve üç tane dahili makroya sahiptir, hepsinde tek karakter isimleri vardır (sanırım dili golf oynamak için daha kolay hale getirir), parantez ve boşluklar özel sözdizimidir. Minik Lisp'in benim buluşum olmadığını unutmayın.
Paŭlo Ebermann

Ah, sanırım şimdi anlıyorum ... yerine tek karakterli bir isim kullanmayı dsmı düşünüyorsun? Sanırım bu yapılabilir, başka bir bayt kurtarırdı. Sanırım dsdamla sıralama için bir kısaltma seçtim .
Paŭlo Ebermann

Hey, bunu daha yeni farkettim. İyi iş! Meta fikir birliğine göre, isimlendirilmemiş lambda fonksiyonları geçerli bir başvuru şeklidir, böylece kurtulup (d dsve )sonunda eşleştirmeden 6 bayt tasarruf edebilirsiniz . Şu anki tercümanımı kullanmak istersen başka golf oynamak da mümkün , fakat orijinal sorudaki spesifikasyona uymak istersen, sorun değil. :)
DLosc

2

Jöle, 5 bayt

=»\Tị

Mücadelenin Jelly'in yaratılmasından önce geldiğine dikkat edin.

Çevrimiçi deneyin!

Nasıl çalışır

=»\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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.