Yerçekimi sıralama gerçekleştir


29

Meydan okuma

Bir tamsayı listesi göz önüne alındığında, yerçekimi sıralamasının nasıl yapıldığını gösterin.

Yerçekimi Sıralaması

Yerçekimi düzeninde, sayıları yıldız satırları olarak hayal edin. Sonra, her şey düşer ve yeni satırlar açıkça sıralanır. Bir örneğe bakalım:

[2, 7, 4, 6]:

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

Bunun hemen hemen sadece paralelleştirilmiş bir baloncuk sıralama olduğuna dikkat edin.

Tam özellikleri

Her yinelemede, üst satırdan başlayarak, altında yıldız işareti olmayan satırdaki tüm yıldızları alın ve bir satır aşağı doğru hareket ettirin. Liste sıralanana kadar bunu yapmaya devam edin.

Giriş

Giriş kesinlikle pozitif tam sayıların bir listesi olacaktır.

Çıktı

Çıktı için, her adımı çıkarmanız gerekir. Herhangi bir beyaz olmayan yazdırılabilir ASCII karakterini, biri "yıldız" ve biri "ayıran" ayıran karakterlerden birini seçebilirsiniz. Yıldız satırları, bir tür standart yeni satırla ayrılmalıdır (örneğin \nveya \r\f). Çizgilerin sırası en azından en geniş sıranın eni kadar olmalıdır (aksi halde yıldızlarınız çok aşağıya düşer!). En altta bir sıra çizgi isteğe bağlıdır. Sonunda izleyen bir satırsonuna izin verilir. Her satırdaki arka boşluklara izin verilir.

Test Kılıfları

giriş bir liste olarak gösterilecektir, daha sonra çıkış hemen aşağıda listelenecektir. Test vakaları çift satırsonu ile ayrılır.

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

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

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

Lütfen test durumlarımı yanlış ise düzeltmek için çekinmeyin, el ile yaptım :)

Not: Sıralanan listeyi sonunda çıkarmayın. :)

puanlama

Tüm programlarınız birbirinin üzerine yazılacaktır. Programınızın parçalarının düşmesini istemezsiniz, bu nedenle en kısa kodlara sahip olduğunuzdan emin olun!


1
Kısa çizgi yazdırmaktan kaçınabilir miyiz? ve yıldız işaretleri basmak yerine 0 ve 1 lerin matrislerini basabilir miyiz?
rahnema1

@ rahnema1 1. Çizgileri beyaz boşluk olmayan başka bir karakterle değiştirebilirsiniz 2. Hayır
HyperNeutrino

Son test davasının 2. tekrarında bir yıldız işareti eksik olduğuna inanıyorum
MildlyMilquetoast

1
Programın parçalarının düşmesini istemiyorsak, bu daha kısa kod satırlarımızda daha uzun kod satırlarına sahip olamayacağımız anlamına mı geliyor? : o
Değerli Mürekkep

1
Hey, kitaplarımı böyle sıralarım!
Robert Fraser,

Yanıtlar:



4

Perl 5 , 118 bayt

115 bayt kodu + -plabayraklar.

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

Çevrimiçi deneyin!

Biraz uzun görünüyor. Fakat yine de, regex ile çok satırlı dizelerle baş etmek genellikle kolay değildir.

Bunun Yyerine *ve _yerine kullanıyorum -.


3

Octave, 104 bayt

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)

* Görüntü paketi gerektirir.

Çevrimiçi deneyin!

Açıklama:

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

Ne yazık ki, muhtemelen kare kare animasyon için bonus puan yoktur: |
quetzalcoatl

Şimdi - Özür dilerim, yorum geri çekildi
TessellatingHeckler

3

Python, 203 199 bayt

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
Çizgiler nerede?
Sızdıran Rahibe

@LeakyNun sabit
Uriel

Geçerli Python 3'ünüz yerine Python 2'yi kullanmayı düşünün; burada maphemen bir dizi döndürülür, böylece onu uyarmanıza gerek kalmaz. Olsa da, '\n'.joineksikliği için telafi etmek için bir değişken atamak istersiniz sep='\n', ama muhtemelen hala bu şekilde kısa.
Değerli Mürekkep

@ValueInk fermuarlar hakkında nasıl gidersiniz? Ambalajın
açılmaması

Python 2, iyi bir işlevi bir paketten çıkarmanızı sağlar; Sadece bir diziye açılmanın bazen sorunları olduğunu duydum. Yalnızca önerilen değişikliklerimle Python 2 kodu 194 bayttır, çevrimiçi deneyin
Value Ink

2

Japt , 69 62 bayt

@Shaggy sayesinde -7 bayt


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

Japonca öğrenmek ve daha karmaşık bir meydan okuma denemek istedim. Yıldız ve çizgi yerine xs ve "s ile çıktılar ; girdiyi bir sayı dizisi olarak alır. Sıralama işleminin input.lengthadımlar içinde tamamlanacağını varsayar ; Durum böyle olmazsa beni düzelt.

Çevrimiçi deneyin!

açıklama

                              // 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
Sizin için birkaç hızlı tasarruf . Daha fazlası olduğundan eminim ama çok yorgunum.
Shaggy

@Shaggy Çok teşekkürler! Bu, ifadenin açık olduğu satıra göre değişkenlerin ayarlanmasına gerçekten iyi bir örnek. Bu Japt'in ipuçlarında görünmüyorsa, olmalı.
Justin Mariner

Bitti . İyileştirme için herhangi bir yer görürseniz, yorum yapın.
Shaggy

@Shaggy Güzel görünüyor ve altın kartınız için tebrikler!
Justin Mariner

2

R , 210 205 bayt

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

Çevrimiçi deneyin!

stdin'den listeye okur; +yerine karakterlerle ayrılmış -. Düşündüğümden çok daha uzun sürecek. Karşılaştırmaların '*'>'+'değerlendirildiğinden FALSEama en azından TIO’nun '*'>' 'olduğu gerçeğinden faydalanır ( TRUEkullandığım makinede '='biraz daha iyi görünüyordu).

Orijinal cevabı yazdığımdan beri öğrendiğim tüm tekniklerden 5 byte golf oynadı.

Çevrimiçi deneyin!


1

Haskell , 213 211 208 bayt

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

Çevrimiçi deneyin!


1

Javascript, 274 bayt

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)

Örnek kod pasajı:

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.