Lakukan semacam gravitasi

29

Tantangan

Diberikan daftar bilangan bulat, perlihatkan bagaimana pengurutan gravitasi akan dilakukan.

Sortir Gravitasi

Dalam jenis gravitasi, bayangkan angka sebagai deretan tanda bintang. Kemudian, semuanya jatuh, dan baris baru akan jelas diurutkan. Mari kita lihat sebuah contoh:

[2, 7, 4, 6]:

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

Perhatikan bahwa ini hanya semacam gelembung paralel.

Spesifikasi Tepat

Pada setiap iterasi, mulai dari baris atas, ambil setiap tanda bintang dari baris yang tidak memiliki tanda bintang di bawahnya, dan pindahkan ke bawah satu baris. Terus lakukan itu sampai daftar diurutkan.

Memasukkan

Input akan menjadi daftar bilangan bulat yang benar-benar positif.

Keluaran

Untuk output, Anda harus menampilkan setiap langkah. Anda dapat memilih dua karakter ASCII non-spasi putih yang dapat dicetak, satu untuk menjadi "tanda bintang", dan satu untuk menjadi "tanda hubung" yang memisahkan. Baris tanda bintang harus dipisahkan dengan baris baru standar semacam (misalnya \natau \r\f). Baris tanda hubung harus setidaknya lebar dari baris terluas (jika tidak, tanda bintang Anda akan jatuh terlalu jauh ke bawah!). Deretan tanda hubung di bagian paling bawah adalah opsional. Baris baru di akhir diizinkan. Ruang tambahan di setiap baris diizinkan.

Uji Kasus

input akan diwakili sebagai daftar, maka output akan terdaftar segera di bawah ini. Kasus uji dipisahkan oleh garis ganda-baru.

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

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

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

Jangan ragu untuk memperbaiki kasus pengujian saya jika salah, saya membuatnya dengan tangan :)

Catatan: Jangan tampilkan daftar yang diurutkan di bagian akhir. :)

Mencetak gol

Semua program Anda akan ditulis di atas satu sama lain. Anda tidak ingin potongan program Anda jatuh, jadi pastikan Anda memiliki kode terpendek!

HyperNeutrino
sumber
1
Bisakah kita menghindari percetakan? dan Alih-alih mencetak tanda bintang, bisakah kita mencetak matriks 0s dan 1s? Saya pikir format pencetakan tidak menambah tantangan.
rahnema1
@ rahnema1 1. Anda dapat mengganti tanda hubung dengan karakter non-spasi putih lainnya 2. Tidak.
HyperNeutrino
Saya percaya Anda kehilangan tanda bintang pada iterasi ke-2 dari kasus uji terakhir Anda
MildlyMilquetoast
1
Jika kita tidak ingin potongan program jatuh, apakah ini berarti kita tidak dapat memiliki baris kode yang lebih panjang di atas baris kode kita yang lebih pendek? : o
Value Ink
1
Hei begitulah cara saya menyortir buku saya!
Robert Fraser

Jawaban:

4

Perl 5 , 118 byte

115 byte kode + -plabendera.

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

Cobalah online!

Sepertinya agak terlalu lama. Tetapi sekali lagi, berurusan dengan string multiline dengan regex biasanya tidak mudah.

Saya menggunakan Ybukannya *dan _bukan -.

Dada
sumber
3

Oktaf, 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)

* Membutuhkan paket gambar.

Cobalah online!

Penjelasan:

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
sumber
Sayangnya, mungkin tidak ada poin bonus untuk animasi frame-by-frame: |
quetzalcoatl
miliki sekarang - permintaan maaf saya, komentar ditarik kembali
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')
Uriel
sumber
1
Di mana tanda hubung?
Leaky Nun
@LeakyNun diperbaiki
Uriel
Pertimbangkan untuk menggunakan Python 2 daripada Python 3 Anda saat ini, di mana mapsegera mengembalikan array sehingga Anda tidak perlu memercikkannya. Anda ingin menetapkan variabel ke'\n'.join membantu Anda menebus kekurangan sep='\n', meskipun, tapi itu mungkin masih lebih pendek seperti itu.
Value Ink
@ValueInk bagaimana Anda akan menjalankan ritsleting? kurangnya pembongkaran mungkin membutuhkan banyak byte
Uriel
Python 2 memungkinkan Anda membongkar ke suatu fungsi dengan baik; Saya hanya mendengar bahwa mengekstrak ke dalam array terkadang memiliki masalah. Dengan hanya perubahan yang saya sarankan kode Python 2 adalah 194 byte, coba online
Nilai Tinta
2

Japt , 69 62 byte

-7 byte terima kasih kepada @Shaggy


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

Mempelajari Japt dan ingin mencoba tantangan yang lebih rumit. Output dengan xs dan "s bukannya tanda bintang dan tanda hubung; mengambil input sebagai array angka. Asumsikan pengurutan akan selesai dalam beberapa input.lengthlangkah; koreksi saya jika itu tidak pernah terjadi.

Cobalah online!

Penjelasan

                              // 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
sumber
1
Beberapa penghematan cepat untuk Anda . Saya yakin ada lebih banyak tetapi saya cukup lelah.
Shaggy
@ Shaggy Terima kasih banyak! Itu adalah contoh yang sangat bagus dari pengaturan variabel sesuai dengan baris pernyataan aktif. Jika itu tidak ada di pos kiat Japt, seharusnya.
Justin Mariner
Selesai . Tinggalkan komentar jika Anda melihat ada ruang untuk perbaikan.
Shaggy
@Shaggy Terlihat bagus, dan selamat atas lencana emas Anda!
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()}

Cobalah online!

membaca dalam daftar dari stdin; dipisahkan oleh +karakter, bukan -. Ini jauh lebih lama daripada yang saya kira. Mengambil keuntungan dari kenyataan bahwa perbandingan '*'>'+'dievaluasiFALSE tetapi '*'>' 'adalah TRUE, setidaknya pada TIO (di mesin saya saya menggunakan'=' yang tampak sedikit lebih baik).

Berhasil menurunkan 5 byte dari semua teknik yang saya pelajari sejak menulis jawaban asli.

Cobalah online!

Giuseppe
sumber
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

Cobalah online!

bartavelle
sumber
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)

Cuplikan kode contoh:

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