एक कॉम्पैक्ट धमाका के लिए सबसे कॉम्पैक्ट कोड


13

क्या आप एक प्रोग्राम लिख सकते हैं, जो अलग-अलग विस्फोट (जैसे कि एक साधारण कण इंजन में) पिक्सेल के एक समूह को स्क्रीन करने के लिए प्रदान करता है और क्या आप यह किसी भी छोटी संख्या में वर्णों (कुंजी स्ट्रोक) में कर सकते हैं? (उन छोटे लोगों को विस्फोट हो जाता है, और जब उनके छोटे पिक्सेल टुकड़े अलग उड़ते हैं, तो गेम लेमिंग्स को याद करें।)

किसी ने एक प्रसंस्करण प्रक्रिया स्केच के रूप में यहां एक सरल कण प्रणाली को क्रमादेशित किया और यह इस बात की तुलना में बहुत विषम है कि मुझे लगता है कि यदि वे कोशिश करते हैं तो दूसरों को पूरा करने में सक्षम होना चाहिए। लेकिन मैं और अधिक प्रभावित होगा अगर यह कोई c ++ और sdl, या यहाँ तक कि java या c # में भी ऐसा कर सके।


2
"कोड ऑफ़ लाइन्स" एक मीट्रिक है जो बहुत अस्पष्टता को खोलता है, और निश्चित रूप से [कोड-गोल्फ] नहीं है जो "वर्णों की संख्या" या कभी-कभी "बाइट्स की संख्या" है। मेटा पर संबंधित चर्चा
dmckee --- पूर्व-मध्यस्थ ने

4
BTW - मुद्दा मैंने ऊपर उठाया, और अधूरा विनिर्देशन ऐसी चीजें हैं जो पहेली लैब चैट या मेटा पर सैंडबॉक्स में पहले से चर्चा करके उपयोगी रूप से अंकित की जा सकती थीं । लेकिन, किसी भी मामले में, CodeGolf.SE में आपका स्वागत है।
dmckee --- पूर्व-मध्यस्थ ने बिल्ली का बच्चा

अद्यतित प्रश्न, LOC को वर्णों की संख्या से बदल दिया गया।
टॉड हॉपकिंसन

1
हाँ, यदि आप C / C ++ / Java / कोई C व्युत्पन्न लिखते हैं तो आप कोड की 1 पंक्ति में एक पूरा 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

सी #, डब्ल्यूपीएफ - 1523

बहुत गंभीर नहीं है; यह मुख्य रूप से एक प्रयास था कि क्या यह वास्तव में काम करता है।

मैं यहाँ क्या कर रहा हूँ डेटा बाइंडिंग और टेम्प्लेटिंग के माध्यम से कणों को प्रदर्शित करने के लिए WPF में एक आइटमकंट्रोल (मेनू, चूंकि यह छोटा है) का उपयोग कर रहा है। एक डेटा टेम्प्लेट नियंत्रित करता है कि कण कैसे दिखते हैं (इस मामले में एक साधारण चक्र) और डेटा बाइंडिंग कणों के रंग और स्थिति को नियंत्रित करता है।

प्रत्येक कण में एक स्थिति, एक रंग और एक दिशा होती है जो टाइमर द्वारा अपडेट की जाती है। प्रारंभ में कणों का एक गुच्छा खिड़की के केंद्र में (सामान्य-वितरित) यादृच्छिक दिशाओं से उत्पन्न होता है। उस संग्रह को आइटम-कन्ट्रोल के लिए डेटा-बाउंड किया जाता है, जो तब गुणों को प्रदर्शित करने के लिए स्वचालित रूप से कणों को प्रदर्शित करता है। गुरुत्वाकर्षण के कारण कणों को थोड़ा नीचे खींचा जाता है।

यह थोड़ा लंबा हो गया, भर्ती कराया गया। लेकिन कम से कम यह अच्छा लग रहा है:

यहाँ छवि विवरण दर्ज करें

इसे निश्चित रूप से कम करके कम किया जा सकता है:

  • गुरुत्वाकर्षण, जिससे कणों का सभी पक्षों पर समान रूप से विस्तार होता है;
  • प्रारंभिक वैक्टर के लिए सामान्य वितरण, जिससे कणों को एक विरल »बॉक्स« में विस्तारित किया जाता है;
  • चमक भिन्नता, कणों काले छोड़कर।

मैंने सौंदर्यशास्त्र के हित में ऐसा नहीं करने का विकल्प चुना। यह समाधान लगभग किसी भी चीज की तुलना में अधिक लंबा है। डेटा-बाइंडिंग और टेंपलेटिंग दृष्टिकोण सुरुचिपूर्ण हो सकता है लेकिन यह केवल एक बिटमैप को अपडेट करने की तुलना में काफी क्रियात्मक है। (नोट: मैंने इसे उपरोक्त सभी को छोड़ कर 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: मुझे यह स्वीकार करना होगा कि प्रोसेसिंग स्केच (मैंने केवल अंतिम परिणाम को देखा था, कोड को नहीं) लुक के लिए मेरी प्रेरणा थी।
जॉय

गाह! मैं अब इसे रोकना चाहता हूं। अब तक इसमें कुछ अच्छी तरकीबें हैं (जैसे कि प्रॉपर्टीज सभी संपत्तियों के लिए है और केवल उस आखिरी सेट पर जो सेट है)। यह देखते हुए कि मैंने 2000 वर्णों से ऊपर शुरुआत की है, मुझे लगता है कि 500-चार की कमी बहुत बुरी नहीं है। यह भी अब तक काफी धीमा हो गया। डिस्पैचरटाइमर टिमर की तुलना में बहुत बेहतर काम करता है, लेकिन अभी लंबा है। मुझे यह सिल्वरलाइट में पोर्ट करने और अपने फोन पर चलाने के लिए लुभाया जा सकता है, हालाँकि।
जोए

मुझे लगता है कि यह कोड आकार और विस्फोट की सौंदर्य गुणवत्ता के संयोजन के लिए हरा करने वाला है।
टॉड हॉपकिंसन

icnivad: मैं बाद में एक बिटमैप पर सीधे पेंट करने के लिए पूरी बात लिखूंगा; यह बहुत छोटा होना चाहिए, फिर। कोड का 45% XAML है; कोड का एक बड़ा हिस्सा यूआई तत्वों को कण गुणों से बांधने में सक्षम होता है। C # की सामान्य क्रिया को जोड़ें और यह जिस तरह से होना चाहिए उससे अधिक क्रिया है।
जॉय

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)

इसे चलाने के लिए, एक अच्छे वेब ब्राउज़र में रिक्त पृष्ठ खोलें, url बार में पेस्ट करें और एंटर दबाएं। आप अंत में मूल्यों को संपादित करके विस्फोट को संशोधित कर सकते हैं s(10,5,1,0)। पहला मान उस कण का आकार है जो विस्फोट होता है। दूसरा मूल्य कण का आकार है जो इससे बाहर फट गया है। तीसरा मूल्य कण की गति है जिससे उसमें विस्फोट हुआ। '0' को वैसे ही छोड़ दें।


1
यह सफारी 5.0.5 में काम नहीं करता है (कुछ ऐसा दिखता है जो बेसबॉल बैट की तरह दिखता है) या क्रोम 11.0.696.68 में (दो गेंदों को दिखाता है, एक दूसरे से थोड़ा बड़ा, धीरे-धीरे अलग होते हुए)।
मारीनस

1
@marinus क्रोम में क्या हो रहा है, क्या होने वाला है।
david4dev

FF4, IE8 पर काम करने के लिए इसे प्राप्त नहीं कर सकते। :(
st0le

खैर मैंने इसे फ़ायरफ़ॉक्स 4.0.1 और क्रोमियम 11.0.696.65 पर परीक्षण किया। मुक़दमा करें कि आपने पूरी स्क्रिप्ट की नकल की है - मुझे नकल करते समय अंतिम ब्रैकेट को याद करना आसान है।
दाविददेव

@ st0le IE8 कैनवास टैग का समर्थन नहीं करता है , जब तक कि आप कुछ गंदे चालें नहीं करते हैं: stackoverflow.com/questions/1332501/…
क्रिस्टियान लुपस्कू

4

एपीएल ( 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

यह जॉय का और david4dev के उत्तरों का संयोजन है (यह जावास्क्रिप्ट / कैनवास ey का उपयोग करके कार्यान्वित जॉय के एल्गोरिथ्म की एक बेशर्म नकल है):

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 संपादन के लिए धन्यवाद!
क्रिस्टियन लुपस्कु

मैं जावास्क्रिप्ट विशेषज्ञ नहीं हूं, लेकिन आप निरंतर का उपयोग करते हैं 500। यदि आप एक वैश्विक चर को परिभाषित कर सकते हैं a=500, तो आप सभी 500को बदलकर कुछ वर्णों को बचा सकते हैं a
श्री लामा

@ गीगावाट आप सही कह रहे हैं; कि के लिए भी काम किया 250
21:39 पर क्रिस्टियन लुपस्कू

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
}

विस्फोट की तरह ई कॉल।

अद्यतन: रंगीन

t = टेक्स्ट, c = cls, g = gotoxy, f = fly, C = COLOR


1

C, SDL के साथ, 423 वर्ण

चूंकि मूल समस्या वर्णन में स्पष्ट रूप से एसडीएल का उल्लेख किया गया था, मुझे लगा कि पिछली बार एसडीएल समाधान प्रस्तुत किया गया था। दुर्भाग्य से, 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)")

यहां लाइव जेफल्ड उदाहरण देखें

कोड को पूरी तरह से प्रक्रियात्मक बनाकर मुझे अब किसी भी सरणी या ऑब्जेक्ट-असाइनमेंट कोड की आवश्यकता नहीं थी, आकार को बहुत कम कर दिया। एक प्रक्रियात्मक प्रभाव बनाने से कुछ अन्य अच्छे दुष्प्रभाव भी होते हैं।

कोड को ग्रेविटी, सीड्स, पार्टिकल्स की संख्या आदि को छोटा करके बनाया जा सकता है, लेकिन मुझे लगता है कि ये फीचर्स हटाने में बहुत अच्छे हैं;)।

विशेषताएं

  • कॉन्फ़िगरेशन एक्स, वाई विस्फोट का केंद्र।
  • कणों की विन्यास योग्य संख्या
  • ऊर्ध्वाधर दिशा में गुरुत्वाकर्षण: क्या आपके कण नीचे गिर रहे हैं या उड़ गए हैं!
  • बीजापूर्ण, प्रत्येक बीज का अपना विस्फोट होता है और वह हर बार उस विस्फोट को कंप्यूटरों में दिखाता है।
  • धीमी गति से, फास्ट फॉरवर्ड और खेल विस्फोट पीछे की ओर संभव है, प्रक्रियात्मक तरीके से प्रभाव पैदा होता है।
  • आकार: 138 बाइट्स।

एक एनोटेट संस्करण के लिए, इसे GitHub पर देखें


0

अजगर PyGame के साथ, 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 वर्ण

अंतरंग बातें:

  • 2 डी वेक्टर के रूप में जटिल संख्या का उपयोग करें
  • (v * cos(a), v * sin(a)) के रूप में कार्यान्वित किया गया v*e**(1j*a)
  • एक 3 डी विस्फोट की तरह लग रहा है।
  • गुरुत्वाकर्षण।

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

dwitter 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.