重力ソートを実行する


29

チャレンジ

整数のリストが与えられたら、重力ソートがどのように行われるかを示します。

重力ソート

重力ソートでは、数字をアスタリスクの行として想像してください。その後、すべてが落ち、新しい行が明らかにソートされます。例を見てみましょう:

[2, 7, 4, 6]

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

これは、ほとんど並列化されたバブルソートであることに注意してください。

正確な仕様

各反復で、一番上の行から開始し、その下にアスタリスクのない行からすべてのアスタリスクを取得し、行の下に移動します。リストがソートされるまでそれを続けてください。

入力

入力は、厳密に正の整数のリストになります。

出力

出力については、各ステップを出力する必要があります。任意の2つの非空白印刷可能ASCII文字を選択できます。1つは「アスタリスク」で、もう1つは分離する「ダッシュ」です。アスタリスクの行は、ある種の標準改行(\nまたは\r\f)で区切る必要があります。ダッシュの行は、少なくとも最も広い行の幅である必要があります(そうしないと、アスタリスクが下がりすぎます!)。一番下のダッシュの列はオプションです。末尾の改行は許可されます。各行の末尾のスペースは許可されます。

テストケース

入力はリストとして表され、出力はすぐ下にリストされます。テストケースは二重改行で区切られています。

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

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

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

テストケースが間違っている場合は、気軽に修正してください。手作業で作成しました:)

注:ソートされたリストを最後に出力しないでください。:)

得点

すべてのプログラムは、互いの上に書き込まれます。プログラムの一部が落ちないようにするため、最短のコードを使用してください。


1
ダッシュの印刷を回避できますか?そして、アスタリスクを印刷する代わりに、0と1のマトリックスを印刷できますか?
rahnema1

@ rahnema1 1.あなたは、いくつかの他の非空白文字2番にダッシュを置き換えること
HyperNeutrino

最後のテストケースの2回目の繰り返し
-MildlyMilquetoast

1
プログラムの断片が落ちたくない場合、これは短いコード行の上に長いコード行を置くことができないことを意味しますか?:o
バリューインク

1
ちょっとそれは私が私の本を並べ替える方法です!
ロバートフレイザー

回答:



4

Perl 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

Python、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
ダッシュはどこにありますか?
リーキー修道女

@LeakyNunは、固定
ウリエル

現在のPython 3の代わりにPython 2を使用することを検討してください。ここでmapは、配列をすぐに返すため、スプラットする必要はありません。ただし、の'\n'.join不足を補うために変数を割り当てる必要がありますsep='\n'が、おそらくそのように短くなります。
バリューインク

@ValueInk zipについてどうしますか?開梱の欠如は、多くのバイトのコストかもしれません
ウリエル

Python 2では、問題なく関数にアンパックできます。配列への展開には時々問題があると聞いただけです。唯一の私の提案された変更ではPython 2のコードは、オンラインでそれを試して、194バイトである
バリューインクを

2

Japt69 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のヒントの投稿にない場合は、そうでなければなりません。
ジャスティンマリナー

完了しました。改善の余地がある場合は、コメントを残してください。
シャギー

@Shaggyよさそうだ、そして金バッジおめでとう!
ジャスティンマリナー

2

R210 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

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