ใช้ Lazy Drop Sort


26

ความท้าทายนี้ได้อธิบายเกี่ยวกับ dropsort แล้ว แต่ฉันขี้เกียจครับและผมจะต้องอาร์เรย์ของฉันจะเป็นบิตเรียงขึ้นกว่า แต่ก่อนก็ไม่ได้จะต้องมีการจัดเรียงทุกทาง

ใน Drop Sort เราปล่อยทุกองค์ประกอบน้อยกว่าองค์ประกอบใด ๆก่อนหน้านี้ ใน Lazy วางเรียงเราวางทุกองค์ประกอบน้อยกว่าหนึ่งอย่างเคร่งครัดก่อนหน้ามัน

นี่คือตัวอย่าง พิจารณาอาร์เรย์ต่อไปนี้:

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

นั่นโดยทั่วไปแล้วดูเรียงมากขึ้น Kinda ฉันขี้เกียจ.

งานของคุณตามที่คุณอาจอนุมานแล้วคือการใช้อัลกอริทึมนี้

อินพุตเป็นอาร์เรย์ที่มีจำนวนเต็มบวกอย่างน้อย 1 ค่าระหว่าง 1 ถึง 9 ดังนั้นคุณสามารถใช้ตัวเลขเป็นตัวเลขได้เช่นกัน

นี่คือไบต์ที่น้อยที่สุดชนะ!

กรณีทดสอบเพิ่มเติม:

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 Either is fine
Pavel

ในกรณีที่เป็นฟังก์ชั่นสามารถใส่อาเรย์เข้าในโปรแกรมหลักได้หรือไม่? และความยาวของอาร์เรย์สามารถส่งผ่านเป็นอินพุตไปยังฟังก์ชันได้หรือไม่?
rafa11111

@ rafa11111 อินพุตไม่สามารถฮาร์ดโค้ดในฟังก์ชันได้ มันไม่สำคัญว่าฟังก์ชั่นรับอินพุตนี้ในโปรแกรมทดสอบของคุณอย่างไร คุณสามารถกำหนดความยาวของอาร์เรย์ได้ก็ต่อเมื่อคุณใช้ C / C ++ หรือภาษาอื่นซึ่งเป็นวิธีเดียวที่จะกำหนดความยาวของอาร์เรย์
Pavel

คำตอบ:



15

JavaScript (ES6), 28 25 ไบต์

บันทึก 3 ไบต์ด้วย @Shaggy

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

ลองออนไลน์!



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 ไบต์

บันทึกหนึ่งไบต์ด้วย Giuseppe

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 6perl6 -ne '$/>$_||.say;$/=$_'
แบรดกิลเบิร์ต b2gills

@Brad perl6 เป็นภาษาที่แตกต่างกัน (มันไม่รองรับแม้แต่ย้อนหลัง) โพสต์มัน!
ทำลาย

ฉันเขียนอันที่เป็น Perl 6 สำนวนมากกว่า แต่มันก็นานกว่า อีกเหตุผลหนึ่งที่ฉันโพสต์ที่นี่คือการอวดภาษาและอธิบายมัน การโพสต์การแปลนั้นไม่ได้ทำอะไรนอกจากแสดงว่ามันเป็น Perl เวอร์ชั่น verbose มากกว่า โดยพื้นฐานแล้วมันไม่เป็นไปตามเหตุผลที่ฉันโพสต์บนเว็บไซต์นี้
แบรดกิลเบิร์ต b2gills



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 โดยเฉพาะ) โปรแกรมสแต็กซ์ ASCII 6 ไบต์จำนวนมากไม่สามารถแพ็คขนาดเล็กได้ แต่ถ้าพวกเขาลงท้ายด้วย a !แล้วพวกเขาก็สามารถ ดังนั้นเหตุผลสำหรับการสั่งซื้อโดยเฉพาะของคำสั่งนี้คือเพื่อให้แน่ใจว่าตรรกะไม่สิ้นสุดในตอนท้ายของโปรแกรม


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

เยลลี่ 6 ไบต์

>Ɲ0;¬×

I / O ใช้กับสตริง

ลองออนไลน์!


ฉันอยากรู้ว่าทำไมทำงานกับสายและไม่ได้อาร์เรย์? ฉันบอกว่าเยลลี่แย่มาก
Pavel

2
มันคือ. ×ไม่ควรใช้เพื่อซ้ำซ้อนอักขระ แต่ทำได้
Dennis

4

Java 8, 66 55 48 ไบต์

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

-11 ไบต์หลังจากปลายจาก@ OlivierGrégoire
-7 เพิ่มเติมไบต์ขอบคุณที่@ OlivierGrégoire

คำอธิบาย:

ลองออนไลน์

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โดยส่วนตัวแล้วฉันจะเลือกวิธีแก้ปัญหาที่ใช้งานง่ายขึ้นถ้า byte-count มีความยาวเท่ากัน (ยกเว้นwhile(...)vs for(;...;)ซึ่งในกรณีนี้ฉันชอบมากกว่าforนี้ขอบคุณอีก -7 ไบต์ :) :)
Cruijssen

มันเป็นเพราะฉันไม่ดีกับ 2-complement ... ฉันแย่มากฉันต้องการที่จะหมายถึงInteger.MIN_VALUE(ซึ่งก็คือตอน1<<31นี้ฉันเดา ... ) ;-)
Olivier Grégoire

4

อ็อกเทฟ 21 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

ใช้เวกเตอร์xเป็นอินพุตและสร้างเวกเตอร์[0, diff(x)<0]โดยที่diff(x)เวกเตอร์มีความแตกต่างระหว่างองค์ประกอบที่อยู่ติดกันทั้งหมด เก็บเฉพาะสิ่งที่เป็นลบโดยเปรียบเทียบกับศูนย์ทำให้เรามีรายการองค์ประกอบทั้งหมดที่เราต้องการจะวาง

จากนั้นเราเลือกองค์ประกอบจากเวกเตอร์อินพุตที่เราต้องการเก็บไว้


4

V , 25 ไบต์

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

ลองออนไลน์!

hexdump:

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

ภาษาที่แย่ที่สุดสำหรับงาน แต่ฉันไม่ได้สำหรับกล้า


6
บันทึก Side: Ojalaเป็นภาษาสเปนหวังว่า
Dennis

2
@dennis ที่ยอดเยี่ยม อะไรคือk$yl+@"òç-/dภาษาสเปน?
DJMcMayhem

7
k$yl+@"òç-/dอาจได้รับการแปลอย่างเสรีว่าOuch ใครกันที่เปิดประตูตู้?
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 และประเมินผล
   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 - หาง
                       ทำ = - ตรวจสอบว่าผลลัพธ์นั้นไม่แปรเปลี่ยนมากกว่าการเรียงลำดับหรือไม่
                           M) IEm} - ส่วนสุดท้าย: การจัดทำดัชนีลงในอินพุต
                           M} - สำหรับแต่ละดัชนีที่ตรงตามเงื่อนไข:
                            ) IEm - ดึงองค์ประกอบของฉันที่ตำแหน่งนั้น

2
หมดความอยากรู้ (เนื่องจากคุณเป็นผู้สร้าง Triangularity): ทำไมคุณไม่ทำอะไรที่คล้ายกันกับ Hexagony / Cubically โดยที่โค้ดชิ้นหนึ่งถูกเติมเต็มโดยอัตโนมัติด้วยจุดที่ไม่มี op? ดังนั้นโปรแกรมนี้)IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}จะขยายไปสู่คำตอบปัจจุบันของคุณหรือไม่?
Kevin Cruijssen

@KevinCruijssen เพราะจริง ๆ แล้วฉันวางแผนที่จะทำให้สามเหลี่ยมสามมิติเป็น esolang 2D แต่ฉันก็เลิกคิดดังนั้นฉันเลยติดกับแม่แบบก่อนหน้านี้ ฉันคิดว่าฉันจะทำการเปลี่ยนแปลงที่สำคัญบางอย่างในไม่ช้าเมื่อฉันปล่อย Triangularity v2 (นอกจากนี้ยังสนุกกับการเล่นกอล์ฟในรูปแบบปัจจุบันเนื่องจากการบันทึกแบบอินไลน์ 1 ไบต์แบบง่ายอาจช่วยให้คุณประหยัด 20: D ... มันยังใช้ย้อนหลังเมื่อแก้ไขสิ่งต่าง ๆ เช่น: C)
Mr. 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}ทั้งสามจะเป็นโปรแกรมเดียวกันแน่นอน
Kevin Cruijssen

3

Pythonขนาด 40 ไบต์

f=lambda h,*t:t and h+f(*t)[h>t[0]:]or h

ลองออนไลน์!

ป้อนเป็น tuple ของตัวละคร


Python 3 , 41 ไบต์

p=''
for x in input():x<p or print(x);p=x

ลองออนไลน์!

การป้อนสตริง


Python 2 , 41 ไบต์

for x in input():
 if x>=id:print x
 id=x

ลองออนไลน์!

อินพุตสตริงเนื่องจากสตริงมีค่ามากกว่าidแต่ตัวเลขมีขนาดเล็กกว่า


3

ภาษา Wolfram (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ชุดนี้ในเชิงลบหมายเลขและหมายเลขที่ไม่เป็นลบไปPi0

Pick[#, ..., 0]&เลือกรายการ#ที่...มี0: ในกรณีของเราองค์ประกอบที่ให้ผลเป็นจำนวนที่ไม่ติดลบเมื่อคุณลบองค์ประกอบก่อนหน้า นั่นคือรายการที่เราต้องการเก็บไว้เมื่อ lazydropsorting


3

สงสัย , 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 (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-Prolog ขนาด 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

Kotlin , 39 ไบต์

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

ลองออนไลน์!

กรองรายการที่เป็นรายการแรก (ดัชนี == 0 หรือแม้แต่ดัชนีที่สั้นกว่า <1) หรือมูลค่าปัจจุบันมากกว่าหรือเท่ากับรายการก่อนหน้า (a [1-1])



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 ไบต์ (pointfree): ~Mask#(1&`'##Delta#`>=#C[0])

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


2

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

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

เยลลี่ขนาด 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 bytes

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

นี่มันมีรูปแบบและ"อ่าน"

((()))
{
    {}

    ([{}]({}))

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

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

    {}

    ([][()])

}{}{}<>

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

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.