회전하는 리사 주 피겨 애니메이션


15

이 챌린지에 참가 하려면 애니메이션 회전 리사 주 그림 이 표시됩니다 . x 매개 변수가 각 프레임에서 연속적으로 위상 변이 될 때 3d 회전 모양이 나타납니다.

입력:

ab매개 변수 (당으로 위키 피 디아 문서는 ) 명령 줄에서 지정 또는 표준 입력에서 읽을 수 있습니다.

산출:

이것은 이므로 출력은 터미널 에뮬레이터 창 또는 이와 동등한 것으로 표시됩니다. 출력 크기는 하드 코딩 될 수 있지만 Lissajous 숫자는 80x24 창을 채울 수있을만큼 커야합니다.

애니메이션 프레임 속도는 약 50fps입니다. 고정 된 수면 시간에 비해 각 프레임을 계산하는 시간이 작다면 각 프레임 사이에서 20ms 동안 수면을 취하는 것이 좋습니다. 선택한 플랫폼에서 선택한 언어를 충분히 빨리 계산할 수 없으면 동적으로 잠자기 시간을 계산해야합니다.

해당 프레임에 대한 모든 계산이 완료 될 때까지 각 프레임이 표시되지 않습니다. 각 프레임 사이에서 화면을 지울 필요는 없습니다.

그림은 2*Pi약 4 초마다 완전히 회전합니다.

각 프레임마다 완전히 닫힌 곡선이 생성되어야합니다. 곡선을 따라 최소 1000 개의 점을 계산해야합니다. 점 사이의 선 그리기는 필요하지 않습니다.

곡선의 점이 #문자로 표시됩니다. 나머지 디스플레이 영역은 공백 / 공백입니다.

이것은 이므로 바이트로 표시 된 가장 짧은 답변 (나에게 허용되는 것으로 간주 됨) 은이 게시물 후 1 주일 만에 승자가됩니다.


ungolfed 참조 답변 .


1
그래픽 지향 언어를 사용하여 그릴 수 있습니까?
TheDoctor

@TheDoctor 나는 그것을 찢었지만 ascii-art 로 제한하기로 결정했습니다 . 아마도 이것이 인기가 있다면 그래픽 출력 후속 조치를 수행 할 수 있습니다 .
Digital Trauma

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

C (참조 답변-골프를 치지 않음)

로 출력 ./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);
}

C, 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
참조 답변이 어떻게 upvotes 점점 재미있다 ...
TheDoctor

@TheDoctor 알고 있습니다. 그것이 골프 버전을 추가하게 된 이유입니다. 골프가없는 답변에 대한 투표를하는 것이 옳지 않기 때문입니다.
Digital Trauma

당신이 경우을하고 usleep20000ms에 대한 보내고, 왜 그냥 sleep20 하시나요?
user12205

@ace usleep (20000) == 20000 밀리 초가 아닌 20000 마이크로
Digital Trauma

죄송합니다. 무엇에 대해 usleep(2e4);?
user12205

2

파이썬 3-280

나중에 멋진 애니메이션 GIF 중 하나가 없습니다. 죄송합니다. 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

더 중요한 편집 : stdin을 통해 입력하고 공백으로 구분하여 줄 바꿈을 종료했습니다. 입력을 기다립니다.

편집 : 스크린 샷. 이 높이를 40으로 변경했습니다.

리사 주 렌더링


흠, 그것은 우분투에서 파이썬 3.2.3 (및 2.7.3)으로 나를 위해 매달립니다. 어딘가에서 Windows VM을 파야한다고 생각합니다. 또는 파이썬을 배우십시오.
Digital Trauma

@DigitalTrauma 흠. 3.3.2를 실행 중입니다. 그래도 작동하지 않는 이상한, 내 코드에서 플랫폼 별 절차를 보지 마십시오.
cjfaure

로 저장 lissajous.py한 다음 실행 python3 lissajous.py 2 3하면 충분합니까?
Digital Trauma

@DigitalTrauma 아, 죄송합니다. stdinargs가 아닌에서 입력을받습니다 (그것이 ... oops를 지정하지 못했습니다). 공백으로 분리.
cjfaure

Aha-나는 그것을 보았을 것 같아요 input(). 3.2.3과 함께 이제 잘 작동합니다. +1
Digital Trauma

1

C 번호 - 360 (352) (크로스 플랫폼 - Windows 용 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);}}}}

메모리 새로 고침, 모든 새로 고침에 대해 새 배열 생성-원래는 StringBuilder를 사용했지만 짧게 희생했습니다. 그러나 이전 Core2에서는 적어도 새로 고침에 1ms 미만이 걸립니다.

이제는 오래 걸리는 오래된 골프를 제거하여 8자를 줄인 후 int 파싱 대신 두 배로 되돌리고 1920 대신 80 * 24로 돌아가서 "시적"360으로 되돌리려 고했습니다. 그래도 여전히 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);
                }
            }
        }
    }
}

Windows 콘솔은 실제로 많은 공백 문자 출력을 허용하므로 실제 공백 문자를 사용하는 것과 (그래픽으로) 동일한 출력이 발생하므로 문자 배열을 초기화하는 데 몇 문자가 적습니다.

멋진 애니메이션, 죄송합니다 :-)


Windows 콘솔은 실제로 많은 널 문자 출력을 허용 합니다. 어쩌면 그것은 우분투의 모노와 잘 어울리지 않는 이유를 설명합니다. 나는 현재 windows / .net을 가지고 있지 않기 때문에 그것이 작동한다는 것을 당신의 말로 받아 들일 것입니다.
Digital Trauma

스크린 샷을 추가했습니다-플랫폼을 교차시켜야하지만 경쟁자가 아닌 상태를 이미 고려하십시오-다소 "시적"인 문자 수는 그대로 유지해야합니다. :-)
JimmiTh

모든 답변이 크로스 플랫폼 IMO 일 필요는 없습니다. 답변이 플랫폼마다 다르면 C #은 이미 잘 알려져 있지만 플랫폼을 언급하는 것이 좋습니다.
Digital Trauma

using C = Console실제로 문자를 저장 합니까 ?
Ypnypn

@Ypnypn-시스템 네임 스페이스에 침입 한 후가 아닙니다. 자체 통계 목표는 여전히 "적절한"문자 배열 초기화를 사용하면서 동일한 360 자에 도달하는 것이기 때문에 변경하지 않았거나 찾아 보지 않았습니다. 감사. :-)
JimmiTh

1

파이썬 2.7-214

나는 이것에 대해 다시 살펴볼 것이라고 생각합니다. 나는 이것이 더 떨어질 수 있다고 생각하지만 Perl 바이트 수를 맞추기가 어려울 것입니다. 수학은 여기서 가장 큰 한계 인 것 같습니다.

경고 : 사용중인 터미널이 충돌 할 수 있습니다. 나는 이것을 Windows 명령 프롬프트에서 테스트했다 lissajous.py 2 3. 명령 프롬프트에 빠르게 기록하기 때문에 프레임이 약간 점프 할 것으로 예상합니다. 및 s에서 더 큰 값을 사용하면 대부분 속도를 희생하여 해결할 수 있습니다 .range(s)t=2*pi*i

내가 사용하지 않는 \r또는 \b여기에 의도적으로 내가 Windows에서 그것을 실행하는거야 때문에이 추가 문자를 요할 것입니다.

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 Ubuntu에서 작동하지만 출력이 약간 까다 롭습니다.
Digital Trauma

@DigitalTrauma 그래,이 문제는 크로스 플랫폼 솔루션 (예 : Windows 명령 프롬프트에서 작동)으로 인해 발생합니다.
grovesNL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.