중력 정렬 수행


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로 바꿀 수 있습니다. No.
HyperNeutrino

마지막 테스트 사례의 두 번째 반복에서 별표가 누락되었다고 생각합니다.
MildlyMilquetoast

1
프로그램 조각이 떨어지지 않게하려면 더 짧은 코드 줄 위에 더 긴 코드 줄을 가질 수 없다는 의미입니까? : o
Value Ink

1
이게 내가 책을 정렬하는 방법입니다!
Robert Fraser

답변:



4

펄 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 /}

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

너무 길어 보입니다. 그러나 다시 말하지만 정규식으로 여러 줄 문자열을 다루는 것은 쉽지 않습니다.

내가 사용하고 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

슬프게도, 프레임 별 애니메이션에 대한 보너스 포인트는 없습니다. |
케찰코아틀

내 사과, 의견 철회
TessellatingHeckler

3

파이썬, 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
대시는 어디에 있습니까?
Leaky Nun

@LeakyNun 고정
Uriel

현재 Python 3 대신 Python 2를 사용하는 것이 좋습니다. 여기서 map배열을 즉시 반환하므로 표시 할 필요가 없습니다. 그러나 '\n'.join의 부족을 보충하는 데 도움이 되는 변수를 할당하고 싶지만 sep='\n'여전히 그렇게 짧습니다.
Value Ink

@ValueInk 우편 번호는 어떻습니까? 압축 풀기 부족으로 인해 많은 바이트가 소요될 수 있음
Uriel

Python 2를 사용하면 함수에 압축을 풀 수 있습니다. 어레이로 포장을 풀 때 때때로 문제가 있다고 들었습니다. 내 제안 된 변경 사항만으로 Python 2 코드는 194 바이트이며 온라인으로 시도하십시오.
Value Ink

2

Japt , 69 62 바이트

@Shaggy 덕분에 -7 바이트


®ç'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 감사합니다! 이것은 문장이있는 줄에 따라 변수를 설정하는 정말 좋은 예입니다. 그것이 Japt tips post에 없다면, 그렇습니다.
Justin Mariner

완료 . 개선의 여지가 있다면 의견을 남겨주십시오.
얽히고 설킨

@Shaggy 좋아 보인다, 그리고 당신의 금 배지를 축하합니다!
Justin Mariner

2

아르 자형 , 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

자바 스크립트, 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.