Mã nhỏ gọn nhất cho một vụ nổ mô phỏng


13

Bạn có thể viết một chương trình hiển thị để sàng lọc một nhóm pixel phát nổ (như trong một công cụ hạt đơn giản) và bạn có thể làm điều này trong bất kỳ số lượng ký tự nhỏ đáng kể nào (các nét chính) không? (Nhớ lại những trò chơi điện tử, khi những kẻ nhỏ đó sẽ nổ tung và những mảnh pixel nhỏ của chúng bay ra.)

Ai đó đã lập trình một hệ thống hạt đơn giản ở đây như một bản phác thảo Xử lý và nó khá nặng so với những gì tôi nghĩ người khác có thể thực hiện được nếu họ cố gắng. Nhưng tôi sẽ ấn tượng hơn nhiều nếu ai đó có thể làm điều tương tự trong c ++ và sdl, hoặc thậm chí java hoặc c #.


2
"Các dòng mã" là một số liệu mở ra nhiều sự mơ hồ và chắc chắn không phải là [code-golf] mà là "số lượng ký tự" hoặc đôi khi là "số byte". Thảo luận liên quan về meta.
dmckee --- ex-moderator mèo con

4
BTW - Vấn đề tôi nêu ở trên và đặc điểm kỹ thuật khá chưa hoàn chỉnh là những điều có thể được giải quyết hữu ích bằng cách thảo luận trước về điều này trong trò chuyện Puzzle Lab hoặc Sandbox trên meta . Nhưng, trong mọi trường hợp, chào mừng bạn đến với CodeGolf.SE.
dmckee --- ex-moderator mèo con

Câu hỏi cập nhật, thay thế LỘC bằng số ký tự.
Todd Hopkinson

1
vâng, nếu bạn viết đạo hàm C / C ++ / Java / Bất kỳ C nào, bạn có thể viết toàn bộ HĐH trong 1 dòng mã
Nate Koppenhaver

Câu trả lời:


13

Python, ký tự 245

import random,time
R=lambda:random.randrange(-999,999)/1e3
P=[(40+20j,R()+1j*R())for i in' '*20]
for i in' '*20:
 C=([' ']*80+['\n'])*40
 for p,v in P:C[int(p.real)+81*int(p.imag)]='*'
 print''.join(C);P=[(p+v,v*.95)for p,v in P];time.sleep(.1)

Đó không phải là vụ nổ lem luốc, nhưng chắc chắn là +1 cho sự ngắn gọn!
Todd Hopkinson

10

C #, WPF - 1523

Không quá nghiêm trọng; đây chủ yếu là một nỗ lực cho dù nó thực sự hoạt động.

Những gì tôi đang làm ở đây là sử dụng ItemControl (Menu, vì nó ngắn hơn) trong WPF để hiển thị các hạt thông qua liên kết dữ liệu và tạo khuôn mẫu. Mẫu dữ liệu kiểm soát các hạt trông như thế nào (trong trường hợp này là một vòng tròn đơn giản) và liên kết dữ liệu kiểm soát màu sắc và vị trí của các hạt.

Mỗi hạt có một vị trí, màu sắc và hướng được cập nhật bởi bộ đếm thời gian. Ban đầu, một loạt các hạt được tạo ra ở trung tâm của cửa sổ với các hướng ngẫu nhiên (phân phối bình thường). Bộ sưu tập đó được liên kết dữ liệu với ItemControl, sau đó xử lý hiển thị các hạt tự động, bất cứ khi nào các thuộc tính được cập nhật. Các hạt được kéo xuống một chút do trọng lực.

Nó có một chút dài, thừa nhận. Nhưng ít nhất nó trông cũng đẹp:

nhập mô tả hình ảnh ở đây

Nó chắc chắn có thể được thực hiện ngắn hơn bằng cách bỏ qua:

  • trọng lực, làm cho các hạt mở rộng đồng đều ra mọi phía;
  • phân phối bình thường cho các vectơ ban đầu, làm cho các hạt mở rộng trong một hộp »thưa thớt«;
  • sự thay đổi độ sáng, để lại các hạt màu đen.

Tôi đã chọn không làm như vậy vì lợi ích của thẩm mỹ. Giải pháp này dài hơn hầu hết mọi thứ khác. Cách tiếp cận liên kết dữ liệu và tạo khuôn mẫu có thể rất thanh lịch nhưng nó cũng khá dài dòng so với việc chỉ cập nhật một bitmap. (Lưu ý: Tôi đã giảm xuống còn 1356 bằng cách bỏ tất cả những điều trên, nhưng sau đó nó trông thật kinh khủng.)

Mã được phân phối trong ba tệp, được đưa ra ở đây dưới dạng được định dạng cho mức độ dễ đọc:

Ứng dụng.xaml

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" StartupUri="W.xaml"/>

W.xaml

<Window x:Class="W" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Menu Name="i">
        <Menu.ItemTemplate>
            <DataTemplate>
                <Ellipse Width="2" Height="2" Fill="#000" Opacity="{Binding O}">
                    <Ellipse.RenderTransform>
                        <TranslateTransform X="{Binding X}" Y="{Binding Y}"/>
                    </Ellipse.RenderTransform>
                </Ellipse>
            </DataTemplate>
        </Menu.ItemTemplate>
        <Menu.Template>
            <ControlTemplate>
                <ItemsPresenter/>
            </ControlTemplate>
        </Menu.Template>
        <Menu.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas/>
            </ItemsPanelTemplate>
        </Menu.ItemsPanel>
    </Menu>
</Window>

W.xaml.cs

using M = System.Math;
using T = System.Timers.Timer;
using System;
using System.ComponentModel;

partial class W
{
    int a;
    T t = new T(99);

    public W()
    {
        InitializeComponent();
        Height = Width = 500;
        var r = new Random();
        Func<double> n = () => 2 * (M.Sqrt(-2 * M.Log(r.NextDouble())) * M.Sin(6 * r.NextDouble()));
        var l = new System.Collections.Generic.List<P>();
        for (; a++ < 300; )
            l.Add(new P { X = 250, Y = 250, f = n(), g = n() });
        i.ItemsSource = l;
        t.Elapsed += delegate
        {
            foreach (P x in l)
            {
                x.X += x.f;
                x.Y += x.g += .2;
                x.O = M.Max(1 - M.Sqrt(M.Pow(250 - x.X, 2) + M.Pow(250 - x.Y, 2)) / 250, 0);
            }
        };
        t.Start();
    }
}

class P : System.Windows.ContentElement, INotifyPropertyChanged
{
    public double y, f, g;
    public double X { get; set; }
    public double O { get; set; }
    public double Y
    {
        get { return y; }
        set
        {
            y = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(""));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

1
+1 Ví dụ tìm kiếm tuyệt vời! Giống như những quả cầu nổ tung kinh điển của những ngày đã qua. Và tôi nghĩ rằng điều này đánh bại mã Xử lý trong Câu hỏi ban đầu.
Todd Hopkinson

@icnivad: Tôi phải thừa nhận rằng bản phác thảo Xử lý (tôi chỉ nhìn vào kết quả cuối cùng, không phải mã) là nguồn cảm hứng của tôi cho vẻ ngoài.
Joey

Trời ạ! Tôi dừng chơi golf này, bây giờ. Hiện tại nó có một số thủ thuật hay (chẳng hạn như PropertyChanged cho tất cả các thuộc tính và chỉ trên cái cuối cùng được đặt). Cho rằng tôi đã bắt đầu trên 2000 ký tự, tôi đoán việc giảm 500 ký tự không quá tệ. Bây giờ nó cũng khá chậm. DispatcherTimer hoạt động tốt hơn nhiều so với Timer, nhưng lâu hơn. Tôi có thể bị cám dỗ chuyển cái này sang Silverlight và chạy nó trên điện thoại của tôi.
Joey

Tôi nghĩ rằng đây là một trong những đánh bại cho sự kết hợp của kích thước mã và chất lượng thẩm mỹ của vụ nổ.
Todd Hopkinson

icnivad: Tôi sẽ viết lại toàn bộ thứ để vẽ trực tiếp trên bitmap sau; nó sẽ ngắn hơn nhiều 45% mã là XAML; một phần lớn mã đi vào khả năng liên kết các phần tử UI với các thuộc tính hạt. Thêm vào đó là mức độ chi tiết chung của C # và nó dài dòng hơn mức cần thiết.
Joey

7

phần tái bút - 287 244 ký tự

currentpagedevice/q{exch def}def/PageSize get/z{dup 3 1 roll add exch 4 2 roll}def{2
div}forall/y/r{rand 2 27 exp div 8 sub}def q/x q[99{[x r y r]}repeat]50{dup{aload/t q
3 index 2 index 4 4 rectfill 1 sub z z t astore pop}forall showpage}repeat

chạy với gs -dNOPAUSE asplode.ps

Bạn thậm chí có thể in nó ra và làm một cuốn sách lật


Tuyệt vời! Nó thật đẹp!
người dùng không xác định

5

Javascript - 268 ký tự

Đây là một vụ nổ 1 chiều, 2 hạt:

javascript:d=document;c=d.createElement('canvas');d.body.appendChild(c);g=c.getContext("2d");function e(x,y,m){g.arc(x,y,m,0,2*Math.PI,false);g.fill()}function s(a,b,v,t){c.width=c.width;e(50+t*v,50,b);e(50+t*b*v/(b-a),50,a-b);setTimeout(function(){s(a,b,v,t+1)},100)};s(9,5,1,0)

Để chạy nó, hãy mở một trang about: blank trong trình duyệt web tốt, dán vào thanh url và nhấn enter. Bạn có thể sửa đổi vụ nổ bằng cách chỉnh sửa các giá trị ở cuối s(10,5,1,0). Giá trị đầu tiên là kích thước của hạt được phát nổ. Giá trị thứ hai là kích thước của hạt được phát nổ ra khỏi nó. Giá trị thứ ba là tốc độ của hạt phát nổ ra khỏi nó. Để nguyên '0'.


1
Điều này không hoạt động trong Safari 5.0.5 (hiển thị thứ gì đó trông hơi giống cây gậy bóng chày) hoặc trong Chrome 11.0.696.68 (hiển thị hai quả bóng, một quả bóng lớn hơn quả bóng kia một chút, di chuyển chậm).
bến

1
@marinus những gì đang xảy ra trong Chrome là những gì sẽ xảy ra.
david4dev

Không thể làm cho nó hoạt động trên FF4, IE8. :(
st0le

Vâng, tôi đã thử nghiệm nó trên Firefox 4.0.1 và Chromium 11.0.696,65. Làm cho bạn kiện bạn đã sao chép toàn bộ tập lệnh - Tôi thấy rất dễ bỏ lỡ dấu ngoặc cuối khi sao chép.
david4dev

@ st0le IE8 không hỗ trợ thẻ canvas , trừ khi bạn thực hiện một số thủ thuật bẩn: stackoverflow.com/questions/1332501/ chủ
Cristian Lupascu

4

APL ( 120 118)

Nó có cùng loại đầu ra như mục Python (nghĩa là nó chỉ xuất các trạng thái trên lưới ký tự). Chỉ có lưới là 30x15 và nguồn gốc hạt là 15x7.

⍎⊃,⌿(9⍴⊂'(⎕DL.1)⊢{{(A+2↑⍵),0.95×A←2↓⍵}¨⍵⊣⎕←'' ⍟''[1+(⍳15 30)∊2↑¨⌊⍵]}'),⊂',⌿⍉10 4⍴⍎''⍬'',420⍴'',(7 15,.01×99-?2⍴199)'''

2

JavaScript 502 500 496

Đây là sự kết hợp của Joey câu trả lời và david4dev (đây là bản sao không biết xấu hổ của thuật toán Joey được triển khai bằng Javascript / canvas):

W=500;H=250;function r(){return 2*m.sqrt(-2*m.log(m.random()))*m.sin(6*m.random())}function n(){z=[];for(i=W;i;i--){s={};s.x=s.y=H;s.f=r();s.g=r();z.push(s)}}function w(){x.clearRect(0,0,W,W);z.forEach(function(a){a.x+=a.f;a.y+=a.g+=.2;x.fillStyle="rgba(0,0,0,"+m.max(1-m.sqrt(m.pow(H-a.x,2)+m.pow(H-a.y,2))/H,0)+")";x.fillRect(a.x,a.y,2,2)})}z=[];m=Math;d=document;c=d.createElement("canvas");c.width=c.height=W;d.body.appendChild(c);x=c.getContext("2d");n();setInterval(n,2e3);setInterval(w,10)

Xem trước JSFiddle: http://jsfiddle.net/GVqFr/60/ (bạn có thể nhấn nút TidyUp để định dạng mã độc đáo)


@Qqwy Cảm ơn bạn đã chỉnh sửa!
Cristian Lupascu

Tôi không phải là chuyên gia javascript, nhưng bạn sử dụng hằng số 500rất nhiều. Nếu bạn có thể xác định một biến toàn cục a=500, bạn có thể lưu một vài ký tự bằng cách thay thế tất cả 500bằng a.
Ông Llama

@GigaWatt bạn nói đúng; mà làm việc cho 250là tốt.
Cristian Lupascu

1

Bash 380

C="4443311177"
t=".-xxXMXxx-."
alias c='echo -e "\e[2J"'
g(){
echo -e "\e[1;$4\e[$2;$1H$3"
}
f(){
x=$1
y=$2
p=$((2-RANDOM%5))
q=$((2-RANDOM%5))
for i in {-5..5}
do
x=$((x+p))
y=$((y+q))
n=$((5+i))
c=$((5+i))
g $x $y ${t:n:1} 3${C:c:1}m 
w=$(printf "%04i\n" $((5*i*i)))
sleep ${w/0/0.}
g $x $y " " 3${C:c:1}m
done
}
e(){
c
for i in {1..10}
do
f $((COLUMNS/2)) $((LINES/2)) &
done
}

Gọi e như nổ tung.

cập nhật: tô màu

t = văn bản, c = cls, g = gotoxy, f = fly, C = MÀU


1

C với SDL, 423 ký tự

Vì mô tả vấn đề ban đầu được đề cập rõ ràng về SDL, tôi cảm thấy đã đến lúc giải pháp SDL được gửi đi. Thật không may, tên của hàm SDL và cấu trúc không đặc biệt ngắn gọn, vì vậy chương trình này hơi dài. Trong thực tế, tôi thậm chí không thể rời khỏi #include.

#include<math.h>
#include"SDL.h"
SDL_Surface*s;SDL_Event e;SDL_Rect p;int i,n;double q[256];main(){
SDL_Init(SDL_INIT_VIDEO);s=SDL_SetVideoMode(320,320,32,0);
for(srand(time(0));e.type-SDL_QUIT;n=-~n%64){
for(i=256*!n;i;q[--i]=rand()%65536*9.5874e-5);
for(SDL_FillRect(s,0,i=0);++i<256;SDL_FillRect(s,&p,-n*67372036))
p.x=160+cos(q[i])*q[i-1]*n,p.y=160+sin(q[i])*q[i-1]*n,p.w=p.h=1;
SDL_Flip(s);SDL_Delay(50);SDL_PollEvent(&e);}}

(Vì mã đã quá lớn, tôi đã để lại một số bit bổ sung để nó sẽ biên dịch mà không có cảnh báo. Tôi nhớ việc biên dịch mà không có cảnh báo đôi khi. Xóa chúng sẽ tiết kiệm khoảng 30 ký tự.)

Các hình ảnh động chạy trong một vòng lặp vô hạn. Đóng cửa sổ để thoát khỏi chương trình. Mỗi vụ nổ sử dụng một tập hợp các hạt ngẫu nhiên mới.

Tôi cũng muốn chỉ ra số 67372036trong mã. Nó xuất hiện trong biểu thức cho đối số cuối cùng trong lệnh gọi thứ hai tới SDL_FillRect(). Khi mã đứng, vụ nổ được thể hiện hoàn toàn bằng màu xám. Thay đổi số này một chút sẽ thêm hiệu ứng màu sắc rất tinh tế nhưng dễ chịu cho vụ nổ. Số 67372032màu làm cho các hạt khi bắt đầu vụ nổ, trong khi số đó 67372034cung cấp hiệu ứng màu khi chúng mờ dần ở cuối. Các số khác có thể tạo ra hiệu ứng chu kỳ màu kém tinh tế. Tôi khuyến khích bạn thử chúng.


1

Sau khi thấy một số ví dụ tuyệt vời khác ở đây, tôi quyết định thử và tạo ra một hàm hạt phù hợp với 140byt.es

Javascript, 282 ký tự

( 138 chức năng hạt chars và 150 ký tự vẽ bạt cơ bản)

p=function(a,t,x,y,n,g,s,i,d){with(Math)for(i=n;i--;d=cos(i*sin(i*s)),a.globalAlpha=n/t/i,a.fillRect(x+t*sin(i)*d, y+t*cos(i)*d+t*g,2,2));};d=document;a=d.body.appendChild(d.createElement('canvas')).getContext('2d');t=setInterval("a.clearRect(0,0,300,150);p(a,t++, 50,50,1e3,.2,1)")

Ví dụ trực tiếp về JSFiddle tại đây

Bằng cách làm cho mã hoàn toàn theo thủ tục, tôi không còn cần bất kỳ mã hoặc mã gán đối tượng nào nữa, giảm kích thước rất nhiều. Tạo hiệu ứng thủ tục cũng có một số tác dụng phụ tốt đẹp khác.

Mã có thể được làm nhỏ hơn bằng cách sử dụng Gravity, Hạt giống, Số hạt, v.v., nhưng tôi nghĩ các tính năng này quá đẹp để loại bỏ;).

Đặc trưng

  • Cấu hình trung tâm X, Y của vụ nổ.
  • Số lượng hạt cấu hình
  • Trọng lực theo hướng thẳng đứng: Có các hạt của bạn rơi xuống hoặc bay lên!
  • Có thể gieo hạt, mỗi hạt giống có vụ nổ riêng và sẽ hiển thị chính xác vụ nổ đó mỗi lần, trên các máy tính.
  • Slowmotion, Fast Forward và chơi các vụ nổ Backwards đều có thể, do cách thức thủ tục tạo hiệu ứng.
  • Kích thước: 138 byte.

Ngoài ra hãy kiểm tra nó trên GitHub , để biết phiên bản có chú thích.


0

Python với PyGame, 240 ký tự

Tôi nhận ra rằng đã có một giải pháp trong python, nhưng vì nó chỉ in các ký tự, tôi nghĩ rằng sẽ rất đáng để tạo ra một bản vẽ hoạt hình đẹp.

Ungolfed, những gì tôi bắt đầu với:

import math
import random
import pygame
pygame.init()

screen = pygame.display.set_mode((800, 800))
particles = [(random.gauss(0,.5), random.uniform(0,6.28318)) for i in range(2000)]

for i in range(399):
    screen.fill((255,255,255))
    for speed, angle in particles:
        distance = i * speed
        x = 400 + distance * math.cos(angle)
        y = 400 + distance * math.sin(angle)
        screen.set_at((int(x), int(y)), (0,0,0))
    pygame.display.flip()

Sau nhiều vụ hack. Toàn màn hình để lưu một số ký tự. Không sử dụng âm thanh hoặc phông chữ, vì vậy tôi nghĩ init()là không cần thiết (nó hoạt động với tôi).

import math as m,random,pygame
d,x,g=pygame.display,range(999),random.gauss
s,e=d.set_mode(),[(g(0,.2),g(0,9))for i in x]
for i in x:
 d.flip(),s.fill([255]*3)
 for v,a in e:
        y=400+i*v*m.cos(a),400+i*v*m.sin(a)
        s.set_at(map(int,y),[0]*3)

0

Python - 327 ký tự

Những điều thú vị:

  • Sử dụng số phức làm vector 2D
  • (v * cos(a), v * sin(a)) thực hiện như v*e**(1j*a)
  • Trông giống như một vụ nổ 3D.
  • Trọng lực.

.

import pygame as P,random as R,math
R=R.random
D=P.display
D.init()
W=800
S=D.set_mode((W,W))
T=P.time.Clock()
C=lambda v:map(int,(v.real,v.imag))
X=[(8+R())*math.cos(R()*1.57)*2.7**(1j*R()*6.28) for i in range(999)]
for t in range(250):
 D.flip();T.tick(30);S.fill(2**24-1)
 for v in X:S.set_at(C(v*t+.005j*t*t+W/2*(1+1j)),0)

0

cư dân 112

c.width^=0
t?o.push({X:1e3,Y:500,U:S(99*t),V:C(9*t)}):o=[]
o.map(a=>{a.X+=a.U,a.Y+=a.V,x.fillRect(a.X,a.Y,9,9)})

dùng thử bằng cách sao chép / dán mã vào dwitter.net


Khi ngôn ngữ sau ngày thử thách, bạn phải đánh dấu nó là không cạnh tranh.
fnɛtɪk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.