Executar classificação por gravidade

29

Desafio

Dada uma lista de números inteiros, mostre como a classificação por gravidade seria feita.

Gravity Sort

Por gravidade, imagine os números como linhas de asteriscos. Então, tudo cai e as novas linhas serão obviamente classificadas. Vejamos um exemplo:

[2, 7, 4, 6]:

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

Observe que esse é apenas o tipo de bolha paralelizada.

Especificações exatas

Em cada iteração, começando na linha superior, pegue todos os asteriscos da linha que não possui um asterisco abaixo e mova-o para baixo uma linha. Continue fazendo isso até que a lista seja classificada.

Entrada

A entrada será uma lista de números inteiros estritamente positivos.

Saída

Para a saída, você deve gerar cada etapa. Você pode escolher dois caracteres ASCII imprimíveis que não sejam espaços em branco, um para ser os "asteriscos" e outro para os "traços" separados. As linhas de asteriscos devem ser separadas por uma nova linha padrão de algum tipo (por exemplo, \nou \r\f). A linha de traços deve ter pelo menos a largura da linha mais larga (caso contrário, seus asteriscos cairão muito!). Uma linha de traços na parte inferior é opcional. Uma nova linha final no final é permitida. Espaços à direita em cada linha são permitidos.

Casos de teste

A entrada será representada como uma lista e a saída será listada imediatamente abaixo. Os casos de teste são separados por uma nova linha dupla.

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

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

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

Por favor, sinta-se livre para corrigir meus casos de teste, se eles estiverem errados, eu os criei manualmente :)

Nota: Não produza a lista classificada no final. :)

Pontuação

Todos os seus programas serão escritos uns sobre os outros. Você não gostaria que partes do seu programa caíssem, portanto, tenha o código mais curto!

HyperNeutrino
fonte
11
Podemos evitar a impressão de traços? e Em vez de imprimir asteriscos, podemos imprimir uma matriz de 0s e 1s? Acho que o formato da impressão não acrescenta nada ao desafio.
rahnema1
@ rahnema1 1. Você pode substituir os traços por algum outro caractere que não seja um espaço em branco 2. Não.
HyperNeutrino
Eu acredito que está faltando um asterisco no 2º iteração do seu caso de teste última
MildlyMilquetoast
11
Se não queremos que partes do programa caiam, isso significa que não podemos ter linhas de código mais longas em cima de nossas linhas de código mais curtas? : o
Value Ink
11
Ei, é assim que eu classifico meus livros!
Robert Fraser

Respostas:

4

Perl 5 , 118 bytes

115 bytes de código + -plasinalizadores.

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

Experimente online!

Parece um pouco longo demais. Mas, novamente, lidar com cadeias de linhas múltiplas com regex geralmente não é fácil.

Estou usando em Yvez de *e em _vez de -.

dada
fonte
3

Oitava, 104 bytes

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)

* Requer pacote de imagem.

Experimente online!

Explicação:

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
rahnema1
fonte
infelizmente, provavelmente não há pontos de bônus para a animação quadro a quadro: |
Quetzalcoatl
temos agora - as minhas desculpas, comentário retraído
TessellatingHeckler
3

Python, 203 199 bytes

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')
Uriel
fonte
11
Onde estão os traços?
Freira vazada
@LeakyNun corrigido
Uriel
Considere usar o Python 2 em vez do atual Python 3, onde mapretorna uma matriz imediatamente para que você não precise dividi-la. Você gostaria de atribuir uma variável para '\n'.joinajudá-lo a compensar a falta sep='\n', mas provavelmente ainda é mais curto dessa maneira.
Value Ink
@ValueInk, como você lidaria com os zíperes? a falta de descompactação pode custar muitos bytes
Uriel
O Python 2 permite descompactar uma função muito bem; Ouvi apenas que a descompactação em uma matriz às vezes tem problemas. Com apenas minhas alterações sugeridas o código Python 2 é 194 bytes, experimentá-lo on-line
Valor Ink
2

Japt , 69 62 bytes

-7 bytes graças a @Shaggy


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

Aprender japonês e queria experimentar um desafio mais complicado. Saídas com xs e "s em vez de asteriscos e traços; recebe entrada como uma matriz de números. Assume que a classificação será concluída em input.lengthetapas; me corrija se esse nunca for o caso.

Experimente online!

Explicação

                              // 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
Justin Mariner
fonte
11
Algumas economias rápidas para você . Tenho certeza de que há mais, mas estou bastante cansado.
Shaggy
@ Shaggy Muito obrigado! Esse é realmente um bom exemplo de configuração de variáveis ​​de acordo com a linha em que a instrução está. Se isso não está no post de dicas do Japt, deveria estar.
Justin Mariner
Feito . Deixe um comentário se vir algum espaço para melhorias.
Shaggy
@ Shaggy Parece ser bom e parabéns pelo seu distintivo dourado!
23717 Justin Mariner
2

R , 210 bytes 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()}

Experimente online!

lê na lista de stdin; separados por +caracteres em vez de -. É muito mais longo do que eu pensava que seria. Aproveita o fato de a comparação ser '*'>'+'avaliada como, FALSEmas '*'>' 'é TRUE, pelo menos no TIO (na minha máquina que usei '='que parecia um pouco melhor).

Consegui reduzir 5 bytes de todas as técnicas que aprendi desde que escrevi a resposta original.

Experimente online!

Giuseppe
fonte
1

Haskell , 213 211 208 bytes

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

Experimente online!

bartavelle
fonte
1

Javascript, 274 bytes

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)

Exemplo de trecho de código:

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>

Herman L
fonte