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!


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 -.


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

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')

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

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!


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!


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>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.