แสดงดอกไม้ไฟให้ฉันดู!


16

ให้ในทางใดทางหนึ่งและคำสั่งซื้อ

  • ขนาด (ตามลำดับที่คุณต้องการ)

  • ความน่าจะเป็น (ในรูปแบบที่คุณต้องการ)

  • จำนวนการวนซ้ำ (คุณสามารถเลือกว่าจะนับสถานะเริ่มต้นหรือไม่)

ทำอย่างใดอย่างหนึ่งต่อไปนี้:

  • เคลื่อนไหวหรือ

  • เอาต์พุตแต่ละขั้นตอนของหรือ

  • ส่งคืนรายการสถานะของ

ท้องฟ้าที่เต็มไปด้วยอวกาศของมิติเหล่านั้น

สำหรับการทำซ้ำแต่ละครั้ง:

  • อักขระบนท้องฟ้าทุกตัวมีความน่าจะเป็นที่จะได้รับ *

  • อักขระแปดตัวที่ล้อมรอบ*จะกลายเป็นสิ่งใด ๆ
    \ | /
    -      -
    / | \ถ้าพวกเขาไม่ได้กลายเป็นดาวอย่างไร

  • หากตัวละครอยู่ในช่วงสอง*s ให้ทำให้เป็นX

ตัวอย่าง

ท้องฟ้า 7 × 22 (เฟรมเพื่อความชัดเจนเท่านั้น - อย่าส่งออกเฟรม)

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

ได้ด้วยความน่าจะเป็น 1%

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

และขั้นตอนต่อไป

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

แล้ว

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

และ

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

และอื่น ๆ

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

5
หากใครบางคนที่ดูสิ่งนี้ไม่คุ้นเคยกับวัฒนธรรมของ USA พวกเขาอาจสับสนว่าทำไมคุณถึงเปิดตัวดอกไม้ไฟในวันที่ 4 กรกฎาคม
Okx

@Okx ที่จะทำลายทุกคนที่ต่อต้านแน่นอน!
Magic Octopus Urn

คำตอบ:


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}

ดูภาพเคลื่อนไหว!

บันทึก 24 ไบต์ด้วยปลายของZacharý

วิธีแก้ปัญหาแบบเก่า 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}

ดูเก่า


ทำได้ดีมาก คุณไม่สามารถแก้ไขการตัดโดยการผนวกคอลัมน์ว่างที่ด้านข้างสร้างภาพเคลื่อนไหวแล้วสับใช่ไหม
Adám

คุณไม่สามารถกำหนดตัวแปรให้เป็น'*'เพราะคุณใช้บ่อยดังนั้น?
Zacharý

@ Zacharýคำแนะนำที่ดีฉันจะกำหนดตัวแปรสำหรับ'*'และสิ่งอื่น ๆ ที่ใช้กันทั่วไป
ครั้งที่ 2

หากมีเพียง JS มาโคร
Zacharý

2

APL (Dyalog) 65 ตัวอักษรหรือ 71 ไบต์ *

แสดงพร้อมต์สำหรับมิติ (แถว, คอลัมน์), สำหรับการวนซ้ำ (ไม่นับสถานะเริ่มต้น), จากนั้นสำหรับความน่าจะเป็น (ตามnใน ¹⁄ )

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

ลองออนไลน์!

⎕⍴'' ความพร้อมในการป้อนข้อมูลและการใช้งานที่จะR eshape สตริงว่าง padding มีช่องว่างตามความจำเป็น

 ให้ผลผลิตที่

... ⍣⎕ แจ้งให้ป้อนข้อมูลและใช้งานฟังก์ชั่นต่อไปนี้กับด้านบน ( ) หลายครั้ง:

 ... {... } ได้รับมาฟังก์ชั่นการใช้ฟังก์ชั่นด้านล่างเป็นตัวถูกดำเนินการ ( ⍺⍺ ) ดังต่อไปนี้:

  ⎕←⍵ พิมพ์อาร์กิวเมนต์

  ⍺⍺ ใช้ฟังก์ชั่นต่อไปนี้:

   ...⌺3 3  ใช้ฟังก์ชั่นต่อไปนี้กับละแวก Moore 3 × 3 ของแต่ละองค์ประกอบ:

    ⎕{} รับอินพุตและใช้เป็น operand ( ⍺⍺ ) เพื่อรับฟังก์ชั่นใหม่

     ?⍺⍺ จำนวนเต็มแบบสุ่มในกลุ่มแรก ⍺⍺จำนวนเต็ม

     1= บูลีนถ้าเท่ากับหนึ่ง

     : ถ้าเป็นจริง:

      '*' คืนดาว

      อื่น:

      ,⍵ ravel (แบน) อาร์กิวเมนต์ (ย่าน Moore)

      4⌽ หมุนเป็นวงกลมไปทางซ้ายสี่ก้าว

      1↓ ปล่อยองค์ประกอบหนึ่ง (ศูนย์เดิม)

      '*'= รายการบูลีนที่เท่ากับดาว

      b← ร้านค้าที่เป็น b

      +/ สรุปว่า

      2≤ บูลีนถ้าสองคนหรือสูงกว่า

      : ถ้าเป็นจริง:

       'X' ส่งคืน X

       อื่น:

       b/'-/|\\|/-' ใช้bเพื่อกรองสตริง

        เลือกอันแรกหากไม่มีให้เลือกต้นแบบ (เว้นวรรค)


* ในการทำงานใน Dyalog คลาสสิกเพียงแทนที่⎕U233A ด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.