Thực hiện sắp xếp trọng lực


29

Thử thách

Đưa ra một danh sách các số nguyên, cho thấy cách sắp xếp trọng lực sẽ được thực hiện.

Sắp xếp trọng lực

Trong sắp xếp trọng lực, hãy tưởng tượng các số là hàng của dấu sao. Sau đó, mọi thứ rơi xuống, và các hàng mới sẽ được sắp xếp rõ ràng. Hãy xem một ví dụ:

[2, 7, 4, 6]:

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

Lưu ý rằng điều này là khá nhiều chỉ là sắp xếp bong bóng song song.

Thông số kỹ thuật chính xác

Trên mỗi lần lặp, bắt đầu từ hàng trên cùng, lấy mọi dấu hoa thị từ hàng không có dấu hoa thị bên dưới nó và di chuyển nó xuống một hàng. Tiếp tục làm điều đó cho đến khi danh sách được sắp xếp.

Đầu vào

Đầu vào sẽ là một danh sách các số nguyên tích cực nghiêm ngặt.

Đầu ra

Đối với đầu ra, bạn phải xuất từng bước. Bạn có thể chọn bất kỳ hai ký tự ASCII không có khoảng trắng có thể in, một ký tự là "dấu hoa thị" và một ký tự là "dấu gạch ngang". Các hàng dấu hoa thị phải được phân tách bằng một dòng mới tiêu chuẩn của một số loại (ví dụ \nhoặc \r\f). Hàng dấu gạch ngang tối thiểu phải là chiều rộng của hàng rộng nhất (nếu không các dấu sao của bạn sẽ rơi quá xa!). Một hàng dấu gạch ngang ở dưới cùng là tùy chọn. Một dòng mới ở cuối được cho phép. Không gian lưu trữ trên mỗi dòng được cho phép.

Các trường hợp thử nghiệm

đầu vào sẽ được trình bày dưới dạng một danh sách, sau đó đầu ra sẽ được liệt kê ngay bên dưới. Các trường hợp thử nghiệm được phân tách bằng một dòng mới.

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

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

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

Xin vui lòng sửa các trường hợp thử nghiệm của tôi nếu họ sai, tôi đã thực hiện chúng bằng tay :)

Lưu ý: Không xuất danh sách đã sắp xếp ở cuối. :)

Chấm điểm

Tất cả các chương trình của bạn sẽ được viết lên nhau. Bạn sẽ không muốn các phần của chương trình của bạn rơi xuống, vì vậy hãy chắc chắn rằng bạn có mã ngắn nhất!


1
Chúng ta có thể tránh in dấu gạch ngang? và Thay vì in dấu hoa thị, chúng ta có thể in ma trận 0 và 1 không? Tôi nghĩ định dạng in không thêm gì vào thử thách.
rahnema1

@ rahnema1 1. Bạn có thể thay thế dấu gạch ngang bằng một số ký tự không phải khoảng trắng khác 2. Không
HyperNeutrino

Tôi tin rằng bạn đang thiếu một dấu sao trong lần lặp thứ 2 của trường hợp thử nghiệm cuối cùng của bạn
MildlyMilquetoast

1
Nếu chúng ta không muốn các phần của chương trình rơi xuống, điều này có nghĩa là chúng ta không thể có các dòng mã dài hơn trên các dòng mã ngắn hơn? : o
Mực giá trị

1
Này đó là cách tôi sắp xếp sách của mình!
Robert Fraser

Câu trả lời:



4

Perl 5 , 118 byte

115 byte mã + -placờ.

\@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 /}

Hãy thử trực tuyến!

Có vẻ như một chút quá dài. Nhưng một lần nữa, đối phó với các chuỗi đa dòng với regex thường không dễ dàng.

Tôi đang sử dụng Ythay vì *_thay vì -.


3

Octave, 104 byte

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)

* Yêu cầu gói hình ảnh.

Hãy thử trực tuyến!

Giải trình:

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

thật đáng buồn, có lẽ không có điểm thưởng cho hoạt hình theo từng khung hình: |
quetzalcoatl

bây giờ - lời xin lỗi của tôi, bình luận rút lại
TessellatingHeckler

3

Python, 203 199 byte

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
Dấu gạch ngang ở đâu?
Nữ tu rò rỉ

@LeakyNun đã sửa
Uriel

Cân nhắc sử dụng Python 2 thay vì Python 3 hiện tại của bạn, nơi maptrả về một mảng ngay lập tức để bạn không cần phải ghép nó. Tuy nhiên, bạn muốn chỉ định một biến để '\n'.joingiúp bạn bù đắp sự thiếu hụt sep='\n', nhưng có lẽ nó vẫn ngắn hơn theo cách đó.
Mực giá trị

@ValueInk bạn sẽ đi như thế nào về khóa kéo? việc không giải nén có thể tiêu tốn nhiều byte
Uriel

Python 2 cho phép bạn giải nén vào một chức năng tốt; Tôi chỉ nghe nói rằng việc giải nén vào một mảng đôi khi có vấn đề. Chỉ với các thay đổi được đề xuất của tôi, mã Python 2 là 194 byte, hãy thử trực tuyến
Value Ink

2

Japt , 69 62 byte

-7 byte nhờ @Shaggy


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

Học Japt và muốn thử một thử thách phức tạp hơn. Đầu ra với xs và "s thay vì dấu hoa thị và dấu gạch ngang; lấy đầu vào như một mảng số. Giả định sắp xếp sẽ được hoàn thành trong input.lengthcác bước; sửa tôi nếu đó không phải là trường hợp.

Hãy thử trực tuyến!

Giải trình

                              // 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
Một vài tiết kiệm nhanh chóng cho bạn . Tôi chắc chắn có nhiều hơn nhưng tôi khá mệt mỏi.
Shaggy

@Shaggy Cảm ơn rất nhiều! Đó là một ví dụ thực sự tốt về việc thiết lập các biến theo dòng mà câu lệnh được bật. Nếu đó không phải là trên bài viết mẹo Japt, thì nó nên.
Justin Mariner

Xong rồi . Để lại một bình luận nếu bạn thấy bất kỳ phòng để cải thiện.
Shaggy

@Shaggy Có vẻ tốt, và chúc mừng cho huy hiệu vàng của bạn!
Justin Mariner

2

R , 210 205 byte

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

Hãy thử trực tuyến!

đọc trong danh sách từ stdin; cách nhau bởi các +ký tự thay vì -. Nó dài hơn tôi nghĩ rất nhiều. Tận dụng lợi thế của việc so sánh '*'>'+'đánh giáFALSE nhưng '*'>' 'TRUE, ít nhất là trên TIO (trên máy tính của tôi, tôi sử dụng '='mà nhìn tốt hơn một chút).

Quản lý để chơi golf 5 byte từ tất cả các kỹ thuật tôi đã học được kể từ khi viết câu trả lời ban đầu.

Hãy thử trực tuyến!


1

Haskell , 213 211 208 byte

import Data.List
(?)=replicate
p=transpose
s l|w<-length l,i<-[n?'*'++w?' '|n<-l]=intercalate[w?'-']$i:(p<$>unfoldr f(p i))
f i|i==n=mempty|2>1=Just(n,n)where n=t<$>i
t(a:b:y)|a>b=" *"++t y|2>1=a:t(b:y);t k=k

Hãy thử trực tuyến!


1

Javascript, 274 byte

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ạn mã ví dụ:

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.