给我看一些烟花!


16

以任何方式和顺序给予

  • 尺寸(按您想要的顺序)

  • 概率(您想要的任何格式)

  • 迭代次数(您可以选择是否计算初始状态)

一个如下:

  • 动画,或

  • 输出的每个步骤,或

  • 返回状态列表

这些尺寸的空间充满了天空。

对于每次迭代:

  • 每个天空角色都有给定的概率 *

  • 八字环绕的任何*
    \ | /
    -      -
    / | \,如果他们不成为明星,但是,

  • 如果字符在2 *s的范围内,则将其设置为X

7×22天空(仅出于清晰起见,请勿输出该帧)

┌──────────────────────┐
│                      │
│                      │
│                      │
│                      │
│                      │
│                      │
│                      │
└──────────────────────┘

可能以1%的概率成为

┌──────────────────────┐
│  *                   │
│                      │
│                      │
│                      │
│                      │
│           *          │
│                      │
└──────────────────────┘

下一步

┌──────────────────────┐
│ - - *                │
│ /|\                  │
│          *           │
│                      │
│          \|/         │
│          - -         │
│          /|\         │
└──────────────────────┘

接着

┌──────────────────────┐
│    - -               │
│    /|\  \|/          │
│         - -          │
│         /|\          │
│                      │
│      * *             │
│                      │
└──────────────────────┘

┌──────────────────────┐
│                      │
│                      │
│                      │
│                      │
│     \|X|/            │
│     - X -            │
│     /|X|\          * │
└──────────────────────┘

等等

┌──────────────────────┐
│                      │
│                      │
│                      │
│                   *  │
│                      │
│                   \|/│
│                   - -│
└──────────────────────┘

5
如果有人对此一无所知,可能会对您为什么在7月4日发射烟花感到困惑。
Okx

@Okx当然要消灭所有反对者!
魔术章鱼缸

Answers:


5

ES6,520个 496字节

剪裁和其他所有功能现在都可以使用。

(w,h,p,i,r=0,s=($=>{while(++r<i)for(j=0,_=$[r]=[],z=$[r-1]||[];j<w*h;){k=j+1,l='*',c=0
n=(j%w&&z[j-1]==l&&++c)|(k%w&&z[k]==l&&++c)?'-':' '
n=(z[j-w]==l&&++c)|(z[j+w]==l&&++c)?'|':n
n=(j%w&&z[j-w-1]==l&&++c)|(k%w&&z[k+w]==l&&++c)?'\\':n
n=(k%w&&z[k-w]==l&&++c)|(j%w&&z[j+w-1]==l&&++c)?'/':n
_[j++]=Math.random()<p?l:c>1?'X':n}})(x=[])||x)=>{c=document.body.children[0],r=0;while(++r<i)setTimeout((k=0)=>{for(r++,c.innerHTML='';k<h;)c.innerHTML+=s[r].slice(k*w,++k*w).join('')+'\n'},90*r);r=0}

查看动画!

感谢Zacharý的提示,节省了24个字节。

旧解决方案,478字节(带有剪切错误)

我认为所有规则都正确无误,但是解决方案存在一个裁剪问题,其中,右/左离开的所有内容在另一侧的上/下环绕一线。

(w,h,p,i,r=0,s=($=>{while(++r<i)for(j=0,_=$[r]=[],z=$[r-1]||[];j<w*h;){c=0
n=(z[j-1]=='*'&&++c)|(z[j+1]=='*'&&++c)?'-':' '
n=(z[j-w]=='*'&&++c)|(z[j+w]=='*'&&++c)?'|':n
n=(z[j-w-1]=='*'&&++c)|(z[j+w+1]=='*'&&++c)?'\\':n
n=(z[j-w+1]=='*'&&++c)|(z[j+w-1]=='*'&&++c)?'/':n
_[j++]=Math.random()<p?'*':c>1?'X':n}})(x=[])||x)=>{c=document.body.children[0],r=0;while(++r<i)setTimeout((k=0)=>{for(r++,c.innerHTML='';k<h;)c.innerHTML+=s[r].slice(k*w,++k*w).join('')+'\n'},90*r);r=0}

查看旧。


做得很好。您不能通过在侧面添加空白列,设置动画然后进行切碎来修复剪辑吗?
ADAM

'*'因为经常使用它,您是否不能将变量定义为?
扎卡里

@Zacharý好的提示,我将为'*'以及其他常用的东西定义变量。
2ndAttmt

如果只有JS有宏。
扎卡里

2

APL(Dyalog),65个字符或71个字节*

对于尺寸(行,列),则对于迭代(不包括初始状态)的提示,则概率(如ñ在¹/ )。

⎕{1=?⍺⍺:'*'2≤+/b←'*'=1↓4⌽,⍵:'X'⋄⊃b/'-/|\\|/-'}⌺3 3{⍺⍺⎕←⍵}⍣⎕⊢⎕⍴''

在线尝试!

⎕⍴'' 提示输入并用它来ř ESHAPE一个空字符串,以填充空格根据需要

 产生

⍣⎕ 提示输入,并将以下功能多次应用于上述():

 ... {... } 导出使用下面的函数作为操作数(函数⍺⍺),如下所示:

  ⎕←⍵ 打印参数

  ⍺⍺ 应用以下功能:

   … ⌺3 3 对每个元素的3×3 Moore邻域应用以下函数:

    ⎕{} 获取输入并将其用作操作数(⍺⍺)以派生新函数

     ?⍺⍺ 前⍺⍺个整数中的随机整数

     1= 等于1的布尔值

     : 如果是真的:

      '*' 还一颗星

      其他:

      ,⍵ 拉扯(拉平)论点(摩尔邻里)

      4⌽ 向左循环四步旋转

      1↓ 删除一个元素(原始中心)

      '*'= 等于星号的布尔值列表

      b← 将其存储为b

      +/ 总结一下

      2≤ 如果两个或以上,则为布尔值

      : 如果是真的:

       'X' 返回X

       其他:

       b/'-/|\\|/-' 使用b过滤字符串

        选择第一个,如果没有,则选择原型(一个空格)


*要在Dyalog Classic中运行,只需替换⎕U233A

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.