ทำการจัดเรียงแรงโน้มถ่วง


29

ท้าทาย

รับรายการจำนวนเต็มแสดงวิธีจัดเรียงแรงโน้มถ่วง

เรียงลำดับแรงโน้มถ่วง

ในการจัดเรียงแรงโน้มถ่วงลองนึกภาพตัวเลขเป็นแถวของดอกจัน จากนั้นทุกอย่างจะตกและแถวใหม่จะถูกจัดเรียงอย่างชัดเจน ลองดูตัวอย่าง:

[2, 7, 4, 6]:

**
*******
****
******
-------
**
****
*******
******
-------
**      | 2
****    | 4
******  | 6
******* | 7

ขอให้สังเกตว่านี่เป็นเพียงการเรียงลำดับฟองคู่ขนาน

รายละเอียดที่แน่นอน

ในการวนซ้ำแต่ละครั้งเริ่มต้นจากแถวบนสุดให้ใช้เครื่องหมายดอกจันทุกอันจากแถวที่ไม่มีเครื่องหมายดอกจันอยู่ด้านล่างและเลื่อนลงมาเป็นแถว ทำต่อไปเรื่อย ๆ จนกว่าจะมีการเรียงลำดับรายการ

อินพุต

อินพุตจะเป็นรายการของจำนวนเต็มบวกอย่างเคร่งครัด

เอาท์พุต

สำหรับเอาต์พุตคุณต้องเอาต์พุตในแต่ละขั้นตอน คุณสามารถเลือกอักขระ ASCII ที่ไม่สามารถพิมพ์ได้ทั้งสองช่องว่างตัวใดตัวหนึ่งเป็น "เครื่องหมายดอกจัน" และอีกตัวหนึ่งเป็น "ขีด" แถวของเครื่องหมายดอกจันจะต้องคั่นด้วยบรรทัดใหม่มาตรฐานของการเรียงลำดับบางอย่าง (เช่น\nหรือ\r\f) แถวของเครื่องหมายขีดคั่นต้องมีความกว้างของแถวที่กว้างที่สุดเป็นอย่างน้อย (มิฉะนั้นเครื่องหมายดอกจันของคุณจะตกลงไปไกลเกินไป!) แถวของเครื่องหมายขีดคั่นที่ด้านล่างสุดเป็นตัวเลือก ขึ้นบรรทัดใหม่ที่ท้ายจะได้รับอนุญาต อนุญาตให้เว้นวรรคต่อท้ายในแต่ละบรรทัด

กรณีทดสอบ

อินพุตจะถูกแสดงเป็นรายการจากนั้นเอาต์พุตจะถูกแสดงทันทีด้านล่าง กรณีทดสอบถูกคั่นด้วยบรรทัดใหม่สองครั้ง

[4, 3, 2, 1]
****
***
**
*
----
***
** *
* *
**
----
**
* *
** *
***
----
*
**
***
****

[6, 4, 2, 5, 3, 1]
******
****
**
*****
***
*
------
****
**  **
****
***
*  **
***
------
**
****
*** **
*  *
***
*****
------
**
***
*  *
*** **
****
*****
------
**
*
***
****
******
*****
------
*
**
***
****
*****
******

[8, 4, 2, 1]
********
****
**
*
--------
****
**  ****
* **
**
--------
**
* **
**  ****
****
--------
*
**
****
********

โปรดแก้ไขกรณีทดสอบของฉันหากพวกเขาทำผิดฉันทำมันด้วยมือ :)

หมายเหตุ: อย่าส่งออกรายการที่เรียงลำดับในตอนท้าย :)

เกณฑ์การให้คะแนน

โปรแกรมทั้งหมดของคุณจะถูกเขียนทับกัน คุณไม่ต้องการให้โปรแกรมของคุณล้มลงดังนั้นโปรดแน่ใจว่าคุณมีรหัสที่สั้นที่สุด!


1
เราสามารถหลีกเลี่ยงการขีดกลางการพิมพ์ได้หรือไม่? และแทนที่จะพิมพ์เครื่องหมายดอกจันเราสามารถพิมพ์เมทริกซ์ที่ 0 และ 1 ได้หรือไม่ฉันคิดว่ารูปแบบการพิมพ์ไม่ได้เพิ่มความท้าทายอะไรเลย
rahnema1

@ rahnema1 1. คุณสามารถแทนที่เครื่องหมายขีดคั่นด้วยอักขระอื่นที่ไม่ใช่ช่องว่าง 2. หมายเลข
HyperNeutrino

ฉันเชื่อว่าคุณไม่มีเครื่องหมายดอกจันในการทำซ้ำครั้งที่ 2 ของกรณีทดสอบครั้งสุดท้ายของคุณ
MildlyMilquetoast

1
หากเราไม่ต้องการให้ส่วนของโปรแกรมหล่นลงนี่หมายความว่าเราไม่สามารถมีโค้ดที่ยาวกว่าด้านบนของโค้ดที่สั้นกว่าของเราหรือไม่ : o
Value Ink

1
เฮ้นั่นเป็นวิธีที่ฉันจัดเรียงหนังสือของฉัน!
Robert Fraser

คำตอบ:



4

Perl 5 , 118 ไบต์

115 ไบต์ของรหัส + -plaค่าสถานะ

\@X[$_]for@F;s%\d+ ?%Y x$&.$"x($#X-$&).$/%ge;while(/Y.{$#X} /s){print$_,_ x$#X;1while s/Y(.{$#X}) /X$1b/s;y/bX/Y /}

ลองออนไลน์!

ดูเหมือนนานเกินไป แต่การจัดการกับสตริงหลายบรรทัดด้วย regex นั้นไม่ใช่เรื่องง่าย

ฉันใช้Yแทน*และแทน_-


3

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

b=(1:max(L=input("")))<=L;do;disp(" *-"([b;max(b)+1]+1))until b==(b=imerode(b,k=[1;1])|imdilate(b,k)~=b)

* ต้องใช้แพ็คเกจภาพ

ลองออนไลน์!

คำอธิบาย:

input = [8 ;4 ;2 ;1]

L = input('');                    %input list
b=(1:max(L))<=L;                  % generate matrix of 0s and 1s as indexes of asterisks 

b =

  1  1  1  1  1  1  1  1
  1  1  1  1  0  0  0  0
  1  1  0  0  0  0  0  0
  1  0  0  0  0  0  0  0
do;
    disp(' *-'([b;max(b)+1]+1))  %display asterisks and dashes

    E = imerode(b,k=[1;1]);      %morphological erosion
    E =

      1  1  1  1  0  0  0  0
      1  1  0  0  0  0  0  0
      1  0  0  0  0  0  0  0
      1  0  0  0  0  0  0  0

    D = imdilate(b,k);           %morphological dilation
    D =

      1  1  1  1  1  1  1  1
      1  1  1  1  1  1  1  1
      1  1  1  1  0  0  0  0
      1  1  0  0  0  0  0  0

    b_temp = E | (D~=b)          %intermediate result
    b_temp =

      1  1  1  1  0  0  0  0
      1  1  0  0  1  1  1  1
      1  0  1  1  0  0  0  0
      1  1  0  0  0  0  0  0

until b==(b=b_temp)              %loop until no change

น่าเศร้าที่อาจไม่มีคะแนนโบนัสสำหรับการเคลื่อนไหวแบบเฟรมต่อเฟรม: |
quetzalcoatl

มีตอนนี้ - ขอโทษฉันแสดงความคิดเห็นหด
TessellatingHeckler

3

Python, 203 199 ไบต์

def k(x):
 m,j=max(x),''.join;d=[*map(lambda i:('*'*i).ljust(m),x)];f=sorted(d);print(*d,sep='\n')
 while d!=f:d=[*map(j,zip(*[x.replace('* ',' *')for x in map(j,zip(*d))]))];print('-'*m,*d,sep='\n')

1
ขีดกลางอยู่ที่ไหน
Leun Nun

@LeakyNun แก้ไขแล้ว
Uriel

ลองใช้ Python 2 แทน Python 3 ปัจจุบันของคุณโดยที่mapจะส่งคืนอาร์เรย์ทันทีเพื่อที่คุณจะได้ไม่ต้องทำอะไรเลย คุณต้องการกำหนดตัวแปรให้'\n'.joinเพื่อช่วยชดเชยการขาดsep='\n'แต่ก็อาจจะสั้นกว่านั้น
หมึกมูลค่า

@ValueInk คุณจะไปเกี่ยวกับรหัสไปรษณีย์ได้อย่างไร การขาดการแกะอาจมีค่าใช้จ่ายจำนวนมากไบต์
Uriel

Python 2 ช่วยให้คุณคลายฟังก์ชั่นได้ดี ฉันได้ยินเพียงว่าการเปิดออกในอาร์เรย์บางครั้งมีปัญหา ด้วยการเปลี่ยนแปลงที่แนะนำของฉันเท่านั้นโค้ด Python 2 คือ 194 ไบต์ลองออนไลน์
Value Ink

2

Japt , 69 62 ไบต์

-7 ไบต์ขอบคุณ @Shaggy


®ç'x +SpZnUrwÃpQpUrw¹·
V
l o ®V=z d" x""x " z3ÃuW
X¯XbXgJ)Ä ·

เรียนรู้ Japt และต้องการลองความท้าทายที่ซับซ้อนมากขึ้น เอาต์พุตด้วยxs และ"s แทนเครื่องหมายดอกจันและเครื่องหมายขีดกลาง รับอินพุตเป็นอาร์เรย์ของตัวเลข สมมติว่าการเรียงลำดับจะเสร็จสมบูรณ์ภายในไม่กี่input.lengthขั้นตอน แก้ไขให้ถูกต้องหากไม่เป็นเช่นนั้น

ลองออนไลน์!

คำอธิบาย

                              // implicit: U = input array
 ®   ç'x +SpZnUrwà pQpUrw¹ ·  // implicit: V = this line
UmZ{Zç'x +SpZnUrw} pQpUrw) qR // ungolfed
UmZ{             }            // U mapped by the function:
    Zç'x                      //   "x" times this item
         +SpZnUrw             //   plus " " times the max of the input array (Urw) minus this value (Z)
                   pQpUrw)    // push " (Q) times the max
                           qR // join with newlines

V                             // implicit: W = this line

 l o ®   V=z d" x""x " z3Ã uW // implicit: X = this line
Ul o mZ{ZV=z d" x""x " z3} uW // ungolfed
Ul o                          // the array of the range [0, U.length)
     mZ{Z                }    // mapped by the no-arg function:
         V=z                  //   set V to itself rotated 90deg
             d" x""x "        //   replace all " x" with "x " to "fall"
                       z3     // rotate back to normal
                           uW // add  W(the original) to the start

X¯XbXgJ)Ä ·                   // implicit: return this line
Xs0,XbXgJ)+1 qR               // ungolfed
Xs0,                          // get the substring of X from 0 to...
    XbXgJ)+1                  // the first index of the last item, plus one
             qR               // join with newlines

1
เงินฝากออมทรัพย์ที่รวดเร็วไม่กี่สำหรับคุณ ฉันแน่ใจว่ามีมากกว่านี้ แต่ฉันค่อนข้างเหนื่อย
Shaggy

@Shaggy ขอบคุณมาก! นั่นเป็นตัวอย่างที่ดีมากของการตั้งค่าตัวแปรตามบรรทัดคำสั่งที่เปิดอยู่ หากไม่ได้อยู่ในโพสต์เคล็ดลับ Japt ควรจะเป็น
Justin Mariner

เสร็จสิ้น แสดงความคิดเห็นหากคุณเห็นห้องใด ๆ สำหรับการปรับปรุง
Shaggy

@Shaggy ดูดีและขอแสดงความยินดีกับตราทองของคุณ!
Justin Mariner

2

R , 210 205 ไบต์

l=scan();w=max(l);h=sum(l|1);a=1:h;p=h+1;m=matrix(' ',w,p);m[,p]='+';for(x in a)m[l[x]:1,x]='*';f=function()write(m,'',w,sep='');f();while(any(i<-m[,a]>m[,a+1])){s=which(i);m[,a][s]=' ';m[,a][s+w]='*';f()}

ลองออนไลน์!

อ่านในรายการจาก stdin; แยกจากกันโดยตัวละครแทน+ -มันนานกว่าที่ฉันคิดไว้มาก ใช้ประโยชน์จากความจริงที่ว่าเปรียบเทียบ'*'>'+'ประเมินFALSEแต่'*'>' 'เป็นTRUEอย่างน้อยใน TIO (ในเครื่องของฉันฉันใช้'='ซึ่งมองเล็ก ๆ น้อย ๆ ที่ดีกว่า)

จัดการให้กอล์ฟลง 5 ไบต์จากเทคนิคทั้งหมดที่ฉันได้เรียนรู้ตั้งแต่เขียนคำตอบดั้งเดิม

ลองออนไลน์!



1

Javascript, 274 ไบต์

a=>(r="",m=Math.max(...a),b=a.map(n=>Array(m).fill(0).map((_,i)=>i<n)),(k=_=>(b.map(c=>r+=c.map(v=>v?"*":" ").join``.trim()+`
`),r+="-".repeat(m)+`
`,n=0,b.map((r,i)=>(s=b[i+1])&&r.map((c,j)=>s[j]||(n|=s[j]=-(c>0),c>0&&(r[j]=0)))),b=b.map(c=>c.map(n=>n<0?1:n)),n&&k()))(),r)

ตัวอย่างข้อมูลโค้ด:

f =

a=>(r="",m=Math.max(...a),b=a.map(n=>Array(m).fill(0).map((_,i)=>i<n)),(k=_=>(b.map(c=>r+=c.map(v=>v?"*":" ").join``.trim()+`
`),r+="-".repeat(m)+`
`,n=0,b.map((r,i)=>(s=b[i+1])&&r.map((c,j)=>s[j]||(n|=s[j]=-(c>0),c>0&&(r[j]=0)))),b=b.map(c=>c.map(n=>n<0?1:n)),n&&k()))(),r)

o.innerText = f([6,4,2,5,3,1])
<pre id=o>

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