执行重力排序


29

挑战

给定一个整数列表,说明如何进行重力排序。

重力排序

在重力排序中,将数字想象成星号行。然后,一切都掉了,新的行显然会被排序。让我们看一个例子:

[2, 7, 4, 6]

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

注意,这几乎只是并行化冒泡排序。

确切规格

在每次迭代中,从第一行开始,从该行下方没有星号的每个星号开始,然后将其向下移动一行。继续这样做,直到对列表进行排序。

输入值

输入将是严格的正整数列表。

输出量

对于输出,必须输出每个步骤。您可以选择任何两个非空白可打印ASCII字符,一个为“星号”,另一个为分隔的“破折号”。星号行必须用某种标准的换行符分隔(例如\n\r\f)。破折号行必须至少是最宽的行的宽度(否则星号会掉得太低!)。最底部的破折号是可选的。末尾可以使用换行符。允许在每行尾随空格。

测试用例

输入将被表示为列表,然后输出将立即在下面列出。测试用例用双换行符分隔。

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

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

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

如果它们是错误的,请随时纠正我的测试用例,我手工制作了它们:)

注意:请勿在末尾输出排序列表。:)

计分

您的所有程序都将相互重叠。您不希望程序的各个部分崩溃,因此请确保您拥有最短的代码!


1
我们可以避免打印破折号吗?除了打印星号,我们还可以打印0和1的矩阵吗?我认为打印格式没有增加任何挑战。
rahnema17年

@ rahnema1 1.您可以将破折​​号替换为其他非空白字符2.编号
HyperNeutrino

我相信您在上一个测试用例的第二次迭代中缺少星号
MildlyMilquetoast,2017年

1
如果我们不希望程序的各个部分崩溃,这是否意味着我们不能在较短的代码行之上包含较长的代码行?:o
价值墨水

1
嘿,这就是我整理书本的方式!
罗伯特·弗雷泽

Answers:



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

可悲的是,逐帧动画可能没有加分:|
quetzalcoatl

现在有-我的歉意,评论已撤消
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
破折号在哪里?
Leaky Nun

@LeakyNun已修复
Uriel

考虑使用Python 2而不是当前的Python 3,后者会map立即返回一个数组,因此您无需执行Splat操作。您可能希望分配一个变量来'\n'.join帮助您弥补的不足sep='\n',但这种方式可能仍然更短。
价值墨水

@ValueInk您将如何处理拉链?缺少解压缩可能会花费很多字节
Uriel'5

Python 2使您可以将其解压缩为一个函数。我只听说有时解压缩到数组中会遇到问题。由于只有我的建议修改了Python 2代码为194个字节,可以在线
价值油墨

2

Japt69 62字节

-7个字节,感谢@Shaggy


®ç'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

[R 210个 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

Haskell中213个 211 208字节

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

在线尝试!


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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.