시뮬레이션 된 폭발을위한 가장 컴팩트 한 코드


13

간단한 입자 엔진에서와 같이 폭발하는 픽셀 그룹을 스크리닝하는 프로그램을 작성할 수 있습니까? 그리고 아주 적은 수의 문자 (키 스트로크)로이 작업을 수행 할 수 있습니까? (작은 사람들이 폭발하고 작은 픽셀 조각이 날아갈 때 게임 레밍을 기억하십시오.)

누군가가 여기에 간단한 파티클 시스템을 프로세싱 스케치 로 프로그래밍 했고 다른 사람들이 시도했을 때 달성 할 수 있다고 생각하는 것에 비하면 꽤 무겁습니다. 그러나 누군가가 C ++ 및 sdl에서 또는 Java 또는 C #에서 동일한 작업을 수행 할 수 있다면 훨씬 더 인상적입니다.


2
"코드 라인"은 많은 모호성을 여는 메트릭이며, "문자 수"또는 "바이트 수"인 [code-golf]는 아닙니다. 메타에 대한 관련 토론.
dmckee --- 전 운영자 고양이

4
BTW-- 위에서 제기 한 문제와 다소 불완전한 사양은 Puzzle Lab 채팅 또는 Sandbox on meta 에서 미리 논의하여 유용하게 사용할 수있는 것들입니다 . 그러나 어떠한 경우에도 CodeGolf.SE에 오신 것을 환영합니다.
dmckee --- 전 운영자 고양이

질문을 업데이트하고 LOC를 문자 수로 대체했습니다.
토드 홉 킨슨

1
예, C / C ++ / Java / Any C 파생어를 작성하면 한 줄의 코드로 전체 OS를 작성할 수 있습니다.
Nate Koppenhaver

답변:


13

파이썬, 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)

폭발적인 폭발은 아니지만 간결함을 위해 +1입니다!
토드 홉 킨슨

10

C #, WPF – 1523

별로 심각하지 않습니다. 이것은 실제로 실제로 작동했는지 여부에 대한 시도였습니다.

내가 여기서하고있는 일은 WPF에서 ItemsControl (메뉴가 짧기 때문에 Menu가 짧음)을 사용하여 데이터 바인딩 및 템플릿을 통해 입자를 표시하는 것입니다. 데이터 템플릿은 입자 모양 (이 경우 간단한 원)을 제어하고 데이터 바인딩은 입자의 색과 위치를 제어합니다.

각 입자에는 타이머에 의해 업데이트되는 위치, 색상 및 방향이 있습니다. 처음에는 (정규 분포 된) 임의의 방향으로 창 중앙에 많은 입자가 생성됩니다. 이 컬렉션은 ItemsControl에 데이터 바인딩 된 다음 속성이 업데이트 될 때마다 입자 표시를 자동으로 처리합니다. 중력으로 인해 입자가 약간 아래로 드래그됩니다.

시원히 조금 길었다. 그러나 적어도 멋지게 보입니다.

여기에 이미지 설명을 입력하십시오

다음을 생략하면 더 짧아 질 수 있습니다.

  • 중력으로 인해 입자가 모든면으로 균일하게 팽창합니다.
  • 초기 벡터에 대한 정규 분포는 입자가 희소 한»box«에서 팽창하게하고;
  • 입자를 검은 색으로 유지하면서 밝기 변화.

나는 미학의 이익을 위해 그렇게하지 않기로 결정했다. 이 솔루션은 거의 모든 다른 것보다 길다. 데이터 바인딩 및 템플릿 접근 방식은 우아 할 수 있지만 단순히 비트 맵을 업데이트하는 것과 비교할 때 매우 장황합니다. (참고 : 위의 내용을 모두 생략 하여 1356 으로 낮추었 지만 그때는 끔찍합니다.)

코드는 세 개의 파일로 배포되며 여기에는 가독성을 위해 형식화 된 형식으로 제공됩니다.

App.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 대단한 예! 며칠이 지나간 클래식 한 폭발물과 매우 흡사합니다. 그리고 이것이 초기 질문의 처리 코드를 능가한다고 생각합니다.
토드 홉 킨슨

@icnivad : 처리 스케치 (코드가 아닌 최종 결과 만 보았습니다)가 외모에 대한 영감이라는 것을 인정해야합니다.
Joey

가! 나는 이제 골프를 그만 두었다. 그것은 지금까지 좋은 트릭을 가지고 있습니다 (예 : 모든 속성에 대해 PropertyChanged와 마지막으로 설정된 속성에만). 2000 자 이상으로 시작했다고 가정하면 500 자 감소가 그렇게 나쁘지 않은 것 같습니다. 지금도 꽤 느려졌습니다. DispatcherTimer는 Timer보다 훨씬 잘 작동하지만 더 길다. 그래도 이것을 Silverlight로 이식하고 내 전화에서 실행하고 싶을 수도 있습니다.
Joey

나는 이것이 코드 크기와 폭발의 미적 품질의 조합에서 이길 수 있다고 생각합니다.
토드 홉 킨슨

icnivad : 나중에 비트 맵에 직접 페인트하기 위해 모든 것을 다시 작성할 것입니다. 그렇다면 훨씬 짧아야합니다. 코드의 45 %는 XAML입니다. 코드의 상당 부분은 UI 요소를 입자 속성에 바인딩 할 수 있습니다. 여기에 C #의 일반적인 세부 정보가 추가되고 필요 이상으로 더 장황합니다.
Joey

7

후기 - 287 개 244 문자

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

와 실행 gs -dNOPAUSE asplode.ps

당신은 그것을 인쇄하고 플립 북을 만들 수 있습니다


훌륭한! 아름답다!
사용자가 알 수 없음

5

자바 스크립트-268 자

다음은 1 차원, 2 입자, 폭발입니다.

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)

그것을 실행하려면 좋은 웹 브라우저에서 about : blank 페이지를 열고 url 바에 붙여 넣고 enter를 누르십시오. 의 끝에있는 값을 편집하여 폭발을 수정할 수 있습니다 s(10,5,1,0). 첫 번째 값은 폭발 한 입자의 크기입니다. 두 번째 값은 폭발 한 입자의 크기입니다. 세 번째 값은 입자의 폭발 속도입니다. '0'을 그대로 두십시오.


1
Safari 5.0.5 (야구 방망이처럼 보이는 것) 또는 Chrome 11.0.696.68 (하나는 다른 것보다 약간 큰 공이 느리게 움직이는 경우)에서는 작동하지 않습니다.
marinus

1
@marinus Chrome에서 일어나고있는 일은 일어나고있는 것입니다.
david4dev

FF4, IE8에서는 작동하지 않습니다. :(
st0le

Firefox 4.0.1 및 Chromium 11.0.696.65에서 테스트했습니다. 전체 스크립트를 복사했는지 확인하십시오. 복사 할 때 끝 괄호를 놓치기 쉽습니다.
david4dev

@ st0le IE8은 지원하지 않습니다 캔버스 , 태그를 일부 더러운 트릭을 수행하지 않는 : stackoverflow.com/questions/1332501/...
크리스티안 루파 스쿠을

4

APL ( 120 118)

그것은 파이썬 엔트리와 같은 종류의 출력을 가지고 있습니다 (즉, 단지 문자 그리드에 상태를 출력합니다). 그리드 만 30x15이고 입자 원점은 15x7입니다.

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

2

자바 스크립트 (502) 500 (496)

이것은 Joeydavid4dev 의 답변 의 조합입니다 (Javascript / 캔버스를 사용하여 구현 된 Joey 알고리즘의 부끄러운 사본입니다 ☺).

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)

JSFiddle 미리보기 : http://jsfiddle.net/GVqFr/60/ (TidyUp 버튼을 누르면 코드를 멋지게 포맷 할 수 있습니다)


@Qqwy 편집 해 주셔서 감사합니다!
Cristian Lupascu 18시 58 분

나는 자바 스크립트 전문가는 아니지만 상수 500를 많이 사용합니다 . 전역 변수를 정의 할 수 있으면 a=500모두 500를 로 바꾸어 몇 개의 문자를 저장할 수 있습니다 a.
Mr. Llama

@GigaWatt 당신이 맞아요; 그것도 효과가 250있었습니다.
Cristian Lupascu

1

배쉬 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
}

폭발처럼 e를 부릅니다.

업데이트 : 채색

t = 텍스트, c = cls, g = gotoxy, f = 비행, C = COLOR


1

SDL이있는 C, 423 자

원래 문제점 설명에 SDL이 명시 적으로 언급되었으므로 SDL 솔루션이 제출 된 시간이 지났다고 생각했습니다. 불행히도 SDL 함수와 구조체의 이름은 특별히 간결하지 않으므로이 프로그램은 약간 길다. 사실, 나는 심지어를 떠날 수도 없습니다 #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);}}

(코드가 이미 너무 커서, 경고없이 컴파일 할 수 있도록 여분의 비트를 남겨 두었습니다. 때로는 경고없이 컴파일을 놓칠 수 없습니다. 제거하면 약 30 자 정도 절약됩니다.)

애니메이션은 무한 루프로 실행됩니다. 프로그램을 종료하려면 창을 닫으십시오. 각 폭발은 새로운 무작위 입자 세트를 사용합니다.

또한 67372036코드 에서 숫자를 지적하고 싶습니다 . 에 대한 두 번째 호출의 마지막 인수에 대한 표현식에 나타납니다 SDL_FillRect(). 코드가 서있는 것처럼 폭발은 완전히 회색으로 렌더링됩니다. 이 숫자를 약간 변경하면 폭발에 미묘하지만 유쾌한 색상 효과가 추가됩니다. 숫자 67372032는 폭발이 시작될 때 입자의 색을 지정하는 반면 숫자 67372034는 끝에서 희미 해짐에 따라 색 효과를 제공합니다. 다른 숫자는 덜 미묘한 색상 순환 효과를 낼 수 있습니다. 나는 당신이 그들을 시도하는 것이 좋습니다.


1

다른 훌륭한 예제를 본 후에, 나는 그것을 포기하기로 결정하고 140byt.es에 맞는 입자 함수를 만들었습니다.

자바 스크립트, 282 자

( 138 문자 파티클 기능 및 150 문자 기본 캔버스 드로잉 상용구)

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)")

여기에 JSFiddle 라이브 예제

코드를 완전히 절차 적으로 만들면 더 이상 배열이나 객체 할당 코드가 필요하지 않아 크기가 크게 줄어 들었습니다. 절차 적 효과를 만드는 것도 다른 좋은 부작용이 있습니다.

중력, 씨앗, 입자 수 등을 생략하여 코드를 작게 만들 수 있지만 이러한 기능을 제거하기에는 너무 좋은 것 같습니다.).

풍모

  • 구성 가능한 X, Y 폭발 중심.
  • 구성 가능한 입자 수
  • 수직 방향의 중력 : 입자가 떨어지거나 위로 올라 오게하십시오!
  • 시드 가능한 각 시드에는 자체 폭발이 있으며 컴퓨터 전체에서 매번 그 폭발을 정확하게 보여줍니다.
  • 슬로우 모션, 빨리 감기 및 폭발 재생 효과가 생성되는 절차 적 방식으로 인해 뒤로 모두 가능합니다.
  • 크기 : 138 바이트

주석이 달린 버전 은 GitHub 에서 확인하십시오 .


0

PyGame이 포함 된 Python, 240 자

나는 이미 파이썬에 해결책이 있다는 것을 알고 있지만, 그중 하나는 문자를 인쇄하기 때문에 멋진 애니메이션을 그리는 것이 가치가 있다고 생각했습니다.

Ungolfed, 내가 시작한 것 :

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()

많은 해커 후. 일부 문자를 저장하기위한 전체 화면. 소리 나 글꼴을 사용하지 않으므로 init()불필요 하다고 생각 합니다.

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

파이썬-327 자

모욕적 인 것들 :

  • 복소수를 2D 벡터로 사용
  • (v * cos(a), v * sin(a)) 로 구현 v*e**(1j*a)
  • 3D 폭발처럼 보입니다.
  • 중량.

.

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

산산조각 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)})

dwitter.net에 코드를 복사 / 붙여 넣기하여 사용해보십시오


언어가 도전 과제를 게시 한 후에는 비경쟁 언어로 표시해야합니다.
fəˈnɛtɪk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.