एक घूर्णन Lissajous चित्रा चेतन


15

इस चुनौती के लिए प्रविष्टियाँ एक एनिमेटेड घूर्णन Lissajous आंकड़ा प्रदर्शित करेंगी । 3 डी रोटेशन की उपस्थिति तब होती है जब x पैरामीटर क्रमिक रूप से प्रत्येक फ्रेम में चरण-स्थानांतरित हो जाता है।

इनपुट:

aऔर b(के अनुसार मानकों विकिपीडिया लेख ) आदेश पंक्ति पर निर्दिष्ट किया जाएगा, या stdin से पढ़ें।

आउटपुट:

यह , इसलिए आउटपुट को टर्मिनल एमुलेटर विंडो या समकक्ष में प्रदर्शित किया जाएगा। आउटपुट का आकार हार्डकोड हो सकता है, लेकिन 80x24 विंडो को भरने के लिए Lissajous आंकड़ा कम से कम इतना बड़ा होना चाहिए।

एनीमेशन फ्रेम दर लगभग 50fps होगी। प्रत्येक फ्रेम के बीच 20ms की नींद ठीक है, जब तक कि प्रत्येक फ्रेम की गणना करने का समय निश्चित नींद के समय की तुलना में छोटा न हो। यदि आपकी पसंद की भाषा आपके चुने हुए मंच पर जल्दी गणना नहीं कर सकती है, तो आपको गतिशील रूप से सोने के लिए समय की गणना करनी होगी।

प्रत्येक फ्रेम तब तक प्रदर्शित नहीं किया जाएगा जब तक कि उस फ्रेम के लिए सभी गणना पूर्ण न हो जाए। प्रत्येक फ्रेम के बीच स्क्रीन को साफ करने की आवश्यकता नहीं है।

आंकड़ा 2*Piलगभग हर 4 सेकंड में एक पूर्ण रोटेशन करेगा ।

प्रत्येक फ्रेम के लिए, एक पूर्ण बंद वक्र उत्पन्न होना चाहिए। वक्र के साथ कम से कम 1000 बिंदुओं की गणना की जानी चाहिए। बिंदुओं के बीच में रेखा-चित्र बनाना आवश्यक नहीं है।

वक्र के बिंदुओं को #पात्रों के रूप में प्लॉट किया जाएगा । शेष प्रदर्शन क्षेत्र रिक्त / व्हाट्सएप होगा।

यह , इसलिए बाइट्स में सबसे छोटा उत्तर (मेरे द्वारा स्वीकार्य माना जाता है) इस पोस्टिंग के एक सप्ताह बाद स्वीकृत विजेता होगा।


अघोषित संदर्भ उत्तर


1
क्या हमें ग्राफिक्स-उन्मुख भाषा का उपयोग करके इसे खींचने की अनुमति है?
TheDoctor

@ TheDoctor मैं उस पर फटा हुआ था, लेकिन असीसी -कला तक सीमित करने का फैसला किया । शायद यह एक ग्राफिकल-आउटपुट फॉलो-अप कर सकता है अगर यह लोकप्रिय हो।
डिजिटल ट्रामा

1
कई घूर्णन आंकड़ों के साथ, ये आंकड़े अलग-अलग तरीकों से घूमते हैं, जो इस बात पर निर्भर करते हैं कि आप उन्हें कैसे देखते हैं। उदाहरण के लिए, आपका उत्तर मेरे आगे-पीछे हिलता हुआ प्रतीत होता है। लेकिन जब मैं कड़ी मेहनत करता हूं, तो मैं नियमित रोटेशन देख सकता हूं।
जस्टिन

जवाबों:


7

पर्ल - 177

while($d+=.1){print"\e[H\e[2J";$a=0;while(($a+=.01)<4*atan2 1,0){$x=$==40+40*cos$d+$a*$ARGV[0];$y=$==13+13*sin$d+$a*$ARGV[1];print"\e[$y;$x"."H#";}print$/;select($v,$v,$v,.03);}

गुणांकों को तर्कों के माध्यम से पारित किया जाता है। उपरोक्त gif से उत्पन्न होता हैperl % 2 3


1
@DigitalTrauma मेरे पास X11 में स्क्रीन रिकॉर्ड करने के लिए मेरा बहुत ही उपकरण है
mniip

7

सी (संदर्भ उत्तर - गोल्फ नहीं)

इसके साथ आउटपुट ./lissajous 2 3:

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

/*
 * lissajous.c
 *
 * Compile with:
 *   cc lissajous.c -lm -o lissajous
 *
 * Usage:
 *   ./lissajous a b
 *
 * a and b are the parameters as described in:
 * http://en.wikipedia.org/wiki/Lissajous_curve
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <unistd.h>

int main (int argc, char **argv) {
    char buffer[25][80];
    double t, p;
    int x, y;
    int a, b;

    if (argc != 3) return 1;

    a = atoi(argv[1]);
    b = atoi(argv[2]);

    for (;;) {
        for (p = 0; p < 2 * M_PI; p += M_PI / 100) {
            memset(buffer, ' ', sizeof(buffer));
            /* Set 1st char of final line to nul.  Then we can printf
             * the whole 2d array as if it were one long 1d buffer.
             * Line wraps at 80 chars are assumed */
            buffer[24][0] = 0;
            for (t = 0; t < 2 * M_PI; t += M_PI / 500) {
                x = 39.5 * (1 + sin(a * t + p));
                y = 11.5 * (1 + sin(b * t)); 
                buffer[y][x] = '#';
            }
            printf("%s\n", &buffer[0][0]);
            usleep(20000);
        }
    }
    return (0);
}

सी, 257 बाइट्स

ठीक है, अच्छी तरह से मैं इसे थोड़ा सा अपने आप को गोल्फ का विरोध नहीं कर सका। मुझे लगता है कि इस पर और भी बहुत कुछ किया जाना है:

#include<math.h>
main(int a,char**v){char x,y,b,d[25][80];double t,p,q=2*M_PI;a=atoi(v[1]);b=atoi(v[2]);for(p=0;memset(d,32,2000);p+=q/100){p=p<q?p:0;d[24][0]=0;for(t=0;t<q;y=11.5*sin(b*t)+12,d[y][x]=35,t+=q/1e3)x=39.5*sin(a*t+p)+40;puts(d);usleep(20000);}}

2
अजीब बात है कि संदर्भ उत्तर कैसे बढ़ रहा है ...
TheDoctor

@ मुझे पता है, सही है। यही कारण है कि मैं एक गोल्फ संस्करण को जोड़ने के लिए समाप्त हो गया, क्योंकि यह एक ungolfed जवाब के लिए upvotes पाने के लिए सही नहीं लगा।
डिजिटल ट्रामा

यदि आप usleep20000ms के लिए आईएनजी हैं , तो सिर्फ sleep20 के लिए ही क्यों ?
user12205

@ace usleep (२००००) == २०००० माइक्रो सेकंड, २०००० मिली सेकंड नहीं
डिजिटल ट्रामा

उफ़, माफ़ करना, मेरी बुर। किस बारे में usleep(2e4);?
user12205

2

पायथन 3 - 280

हाँ, खेद के लिए उन फैंसी एनिमेटेड gifs में से एक नहीं है। Windows कंसोल मुद्रण पर धीमा है: P

यह निश्चित नहीं है कि यह 50fps की आवश्यकता को पूरा करता है, हालांकि मुझे यकीन नहीं है कि यह वास्तव में पायथन के साथ संभव है। आप गणना करने के लिए बिंदुओं की मात्रा के लिए दूसरी पंक्ति पर 1000 को समायोजित कर सकते हैं (सूची आउटपुट चौड़ाई, आउटपुट ऊंचाई है, अंक खोजने के लिए, फ्रेम प्रति प्रगति (pi * 2 / n) और प्रारंभिक बिंदु)। या आप उन्हें हटा सकते हैं और इनपुट में भी निर्दिष्ट कर सकते हैं।

import math as m
a,b,w,h,p,r,t=list(map(int,input().split()))+[79,24,1000,100,0]
while 1:v,z=w/2,h/2;d=[[int(m.sin(a*k+t)*v+v),int(m.sin(b*k)*z+z)]for k in[m.pi*2/p*l for l in range(p)]];print('\n'.join(''.join([' ','#'][[i,j]in d]for i in range(w))for j in range(h)));t+=m.pi*2/r

अधिक महत्वपूर्ण संस्करण: स्टड के माध्यम से इनपुट, अंतरिक्ष-पृथक, न्यूलाइन समाप्त। आपके इनपुट का इंतज़ार रहेगा

संपादित करें: स्क्रीनशॉट। इस एक के लिए ऊंचाई 40 से बदल दी।

लिज्जत का प्रतिपादन


हम्म, यह सिर्फ उबंटू पर अजगर 3.2.3 (और 2.7.3) के साथ मेरे लिए लटका हुआ है। मुझे लगता है कि मुझे कहीं से एक विंडोज़ वीएम खोदना होगा। या अजगर जानें।
डिजिटल ट्रामा

@DigitalTrauma हम्म। मैं 3.3.2 चला रहा हूं। अजीब बात है कि यह हालांकि काम नहीं करता है, मेरे कोड में कोई भी प्लेटफ़ॉर्म-विशिष्ट प्रक्रिया नहीं देखता है।
cjfaure

के रूप में सहेजें lissajous.py, तो रन python3 lissajous.py 2 3पर्याप्त होना चाहिए, है ना?
डिजिटल ट्रामा

@DigitalTrauma ओह, ओह, क्षमा करें। यह इनपुट लेता है stdin, न कि आर्ग्स (यह निर्दिष्ट करने में विफल ... उफ़)। अंतरिक्ष-अलग कर दिया।
cjfaure

अहा - मुझे लगता है कि मुझे उसे देखना input()और अनुमान लगाना चाहिए था । 3.2.3 के साथ मेरे लिए अब ठीक काम करता है। +1
डिजिटल ट्रामा

1

C # - 360 352 (क्रॉस प्लेटफॉर्म - 332 केवल विंडोज के लिए)

Ypnypn द्वारा माइक्रो-गोल्फिंग और राउंडिंग बग फिक्स + सुझाव के बाद संपादित

उस लंबाई में बिल्कुल एक दावेदार नहीं है - और यह संदर्भ की एक शब्दशः नकल है - लेकिन ठीक है। :)

namespace System{class P{static int Main(string[]m){double p=Math.PI*2,a=int.Parse(m[0]),b=int.Parse(m[1]),q,t;for(;;)for(q=0;q<p;q+=p/200){var s=new string(' ',1920).ToCharArray();for(t=0;t<p;t+=p/1000)s[(int)(39.5*Math.Sin(a*t+q)+40)+(int)(11.5*Math.Sin(b*t)+12)*80]='#';Console.SetCursorPosition(0,0);Console.Write(s);Threading.Thread.Sleep(20);}}}}

मेमोरी हॉग, हर रिफ्रेश के लिए एक नया एरे बनाते हुए - मूल रूप से (पुनः) एक स्ट्रिंगबर्स्ट का इस्तेमाल किया, लेकिन छोटेपन के लिए इसे त्याग दिया। लेकिन कम से कम ताज़ा मेरे पुराने Core2 पर 1 एमएस से कम लेता है।

कुछ को हटाने के बाद - अब लंबाई में चोट लगने वाली - पुरानी गोल्फिंग, जिससे इसे 8 पात्रों से कम कर दिया गया, मैंने इसे अंतरंग पार्स करने की बजाय दोगुना करने के लिए "काव्य" 360 पर वापस लाने की कोशिश की, और 1920 के बजाय 80 * 24 पर लौट आया। यह अभी भी केवल 359 है, हालांकि - और कोई अन्य एकल वर्ण जोड़ नहीं है जो मैं सोच सकता हूं कि वास्तव में कोड के लिए कोई भी मूल्य जोड़ता है। तो हम बस 352 के साथ रहना होगा। :-)

अनियंत्रित (पूर्व-गोल्फ कोड खो गया):

namespace System
{
    class P
    {
        static int Main(string[] m)
        {
            double p = Math.PI * 2,
                   a = int.Parse(m[0]),
                   b = int.Parse(m[1]),
                   q, t;

            for (;;)
            {
                for (q = 0; q < p; q += p/200)
                {
                    var s = new string(' ', 1920).ToCharArray();
                    // Alternative - Windows console only:
                    // var s = new char[1920];

                    for (t = 0; t < p; t += p/1000)
                    {
                        s[
                            (int) (39.5*Math.Sin(a * t + q) + 40)
                          + (int) (11.5*Math.Sin(b * t) + 12) * 80
                        ] = '#';
                    }
                    Console.SetCursorPosition(0, 0);
                    Console.Write(s);
                    Threading.Thread.Sleep(20);
                }
            }
        }
    }
}

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

कोई फैंसी एनीमेशन नहीं, खेद :-)


विंडोज कंसोल वास्तव में बहुत सारे अशक्त आउटपुट को स्वीकार करता है । आह शायद यह बताता है कि उबंटू पर मोनो के साथ यह इतना अच्छा क्यों नहीं है। मेरे पास अभी विंडोज़ / .net काम नहीं है, इसलिए मैं इसके लिए आपका शब्द लेता हूँ कि यह काम करता है।
डिजिटल ट्रामा

बस एक स्क्रीनशॉट जोड़ा - इसे क्रॉस प्लेटफॉर्म बनाना चाहिए, लेकिन गैर-दावेदार की स्थिति को देखते हुए यह पहले से ही है - और पात्रों के बजाय "काव्यात्मक" संख्या, शायद इसे बस के रूप में छोड़ दिया जाना चाहिए। :-)
जिम्मी तेह

सभी उत्तरों के लिए क्रॉस-प्लेटफॉर्म IMO होने की आवश्यकता नहीं है। यदि उत्तर प्लेटफ़ॉर्म-विशिष्ट हैं, तो प्लेटफ़ॉर्म का उल्लेख करना अच्छा है, हालांकि सी # इतना प्रसिद्ध है कि इसकी पहले से ही स्पष्ट है।
डिजिटल ट्रामा

क्या using C = Consoleवाकई कोई पात्र बचता है?
य्प्पनिप

@ यिप्प्न - सिस्टम नेमस्पेस, नोप पर आक्रमण करने के बाद नहीं। इसे बदल नहीं, या इसके लिए देखो, क्योंकि स्व-घोषित लक्ष्य "उचित" वर्ण सरणी आरंभीकरण का उपयोग करते हुए समान 360 वर्णों को प्राप्त करना था। धन्यवाद। :-)
जिम्मी

1

पायथन 2.7 - 214

मुझे लगता है कि मैं इस पर एक और नज़र रखने जा रहा हूं। मुझे लग रहा है कि इसे और भी नीचे लाया जा सकता है, लेकिन पर्ल बाइट की गिनती में आना मुश्किल होगा। गणित यहां मेरी सबसे बड़ी सीमा लगती है।

चेतावनी: आप जो भी टर्मिनल का उपयोग कर रहे हैं वह दुर्घटनाग्रस्त हो सकता है। मैंने विंडोज कमांड प्रॉम्प्ट पर इसका परीक्षण किया lissajous.py 2 3। कमांड प्रॉम्प्ट को त्वरित लिखने के कारण, फ़्रेम को थोड़ा कूदने की अपेक्षा करें। यह ज्यादातर (और गति की लागत पर) हल किया जा सकता sहै range(s)और अधिक से अधिक का उपयोग करके t=2*pi*i

मैं जानबूझकर \rया \bयहाँ इस्तेमाल नहीं करता क्योंकि मैं इसे विंडोज पर चला रहा हूँ और इससे अतिरिक्त पात्रों का खर्च होगा।

from math import*;import sys;a,b=sys.argv[1:];p=s=1920
while p:
 c = [" "]*s
 for i in range(s):
    t=2*pi*i/s;c[int(round((39.5*(1+sin(eval(a)*t+p))))+round(11.5*(1+sin(eval(b)*t)))*80)]="#"
 print ''.join(c)
 p+=.1

+1 उबंटू पर काम करता है, हालांकि आउटपुट थोड़ा उछल
डिजिटल ट्रामा

@DigitalTrauma हाँ कूदने का कारण यह क्रॉस प्लेटफ़ॉर्म सॉल्यूशन है (यानी विंडोज कमांड प्रॉम्प्ट पर काम करने के लिए)।
ग्रूव्सएनएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.