เคลื่อนไหวรูป Lissajous ที่หมุนได้


15

รายการสำหรับความท้าทายนี้จะแสดงภาพเคลื่อนไหวLissajous ที่หมุนได้ การปรากฏตัวของการหมุน 3d เกิดขึ้นเมื่อพารามิเตอร์ x ถูกเลื่อนเฟสอย่างต่อเนื่องในแต่ละเฟรม

การป้อนข้อมูล:

aและbพารามิเตอร์ (ตามบทความวิกิพีเดีย ) จะระบุไว้ในบรรทัดคำสั่งหรืออ่านจาก stdin

เอาท์พุท:

นี่คือดังนั้นเอาต์พุตจะแสดงในหน้าต่างเทอร์มินัลอีมูเลเตอร์หรือเทียบเท่า ขนาดเอาต์พุตอาจเป็นฮาร์ดโค้ด แต่ตัวเลข Lissajous ต้องมีขนาดใหญ่พอที่จะเติมหน้าต่าง 80x24

อัตราเฟรมภาพเคลื่อนไหวจะอยู่ที่ประมาณ 50fps การนอนระหว่าง 20ms ระหว่างแต่ละเฟรมนั้นดีตราบใดที่เวลาในการคำนวณแต่ละเฟรมนั้นมีขนาดเล็กเมื่อเทียบกับเวลาสลีปคงที่ หากภาษาที่คุณเลือกไม่สามารถคำนวณได้เร็วพอบนแพลตฟอร์มที่คุณเลือกคุณจะต้องคำนวณเวลาในการพักแบบไดนามิก

แต่ละเฟรมจะไม่แสดงจนกว่าการคำนวณทั้งหมดของเฟรมนั้นจะเสร็จสมบูรณ์ ไม่จำเป็นต้องล้างหน้าจอระหว่างแต่ละเฟรม

รูปจะ2*Piหมุนเต็มประมาณทุก 4 วินาที

สำหรับแต่ละเฟรมจะต้องสร้างเส้นโค้งปิดแบบเต็ม ต้องคำนวณอย่างน้อย 1,000 คะแนนตามเส้นโค้ง ไม่จำเป็นต้องลากเส้นระหว่างจุด

คะแนนของเส้นโค้งจะถูกพล็อตเป็น#ตัวละคร พื้นที่แสดงผลส่วนที่เหลือจะว่างเปล่า / ว่าง

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ (ถือว่าฉันยอมรับได้) จะเป็นผู้ชนะที่ได้รับการยอมรับหนึ่งสัปดาห์หลังจากโพสต์นี้


Ungolfed คำตอบอ้างอิง


1
เราได้รับอนุญาตให้วาดโดยใช้ภาษากราฟิกหรือไม่?
TheDoctor

@TheDoctor ฉันถูกฉีกขาดว่า แต่ตัดสินใจที่จะ จำกัด เพื่อASCII ศิลปะ บางทีเราอาจจะทำการติดตามผลแบบกราฟิกถ้ามันจบลงด้วยความนิยม
Digital Trauma

1
เช่นเดียวกับตัวเลขการหมุนตัวเลขเหล่านี้หมุนได้หลายวิธีขึ้นอยู่กับว่าคุณดูอย่างไร ตัวอย่างเช่นคำตอบของคุณดูเหมือนจะโยกไปมากับฉัน แต่เมื่อฉันพยายามอย่างหนักฉันจะเห็นการหมุนปกติ
Justin

คำตอบ:


7

Perl - 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
ขำขันว่าคำตอบอ้างอิงได้รับการโหวตอย่างไร ...
TheDoctor

@TheDoctor ฉันรู้ถูกต้อง นั่นเป็นเหตุผลที่ฉันลงเอยด้วยการเพิ่มเวอร์ชัน golfed เนื่องจากมันไม่ถูกต้องที่จะรับ upvotes สำหรับคำตอบที่ไม่ดี
Digital Trauma

หากคุณกำลังusleepวิ่ง 20000ms ทำไมไม่เพียงแค่sleep20 วินาที
user12205

@ace usleep (20,000) == 20,000 ไมโครวินาทีไม่ใช่ 20000 มิลลิวินาที
Digital Trauma

โอ๊ะขอโทษฉันไม่ดี เกี่ยวกับusleep(2e4);อะไร
user12205

2

Python 3 - 280

อย่ามีหนึ่งใน gif อนิเมชันแฟนซีสำหรับ ya, ขออภัย Windows คอนโซลทำงานช้าขณะพิมพ์: P

ไม่แน่ใจว่าสิ่งนี้ตรงตามข้อกำหนด 50fps แต่ฉันไม่แน่ใจว่าเป็นไปได้กับ Python คุณสามารถปรับ 1,000 ในบรรทัดที่สองสำหรับจำนวนคะแนนที่จะคำนวณ (รายการคือความกว้างของเอาต์พุต, ความสูงของเอาต์พุต, จุดที่จะค้นหา, ความก้าวหน้าต่อเฟรม (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 สำหรับอันนี้

การแสดงผล Lissajous


อืมมันแค่แฮงค์สำหรับฉันด้วย python 3.2.3 (และ 2.7.3) บน Ubuntu ฉันเดาว่าฉันต้องขุด windows VM จากที่อื่น หรือเรียนรู้หลาม
Digital Trauma

@ DigitalTrauma หืม ฉันใช้ 3.3.2 แปลกที่มันไม่ทำงาน แต่ไม่เห็นขั้นตอนเฉพาะแพลตฟอร์มในรหัสของฉัน
cjfaure

บันทึกเป็นlissajous.pyจากนั้นเรียกใช้python3 lissajous.py 2 3ควรเพียงพอใช่ไหม
Digital Trauma

@ DigitalTrauma โอ้โอ้ขอโทษ ใช้อินพุตจากstdinไม่ใช่ args (ไม่สามารถระบุว่า ... oops) พื้นที่แยกออกจากกัน
cjfaure

Aha - ฉันคิดว่าฉันควรจะเห็นinput()และเดาว่า ทำงานได้ดีสำหรับฉันตอนนี้ด้วย 3.2.3 +1
บาดเจ็บทางดิจิตอล

1

C # - 360 352 (ข้ามแพลตฟอร์ม - 332 สำหรับ Windows เท่านั้น)

แก้ไขหลังจากการแก้ไขข้อผิดพลาดไมโคร + กอล์ฟและปัดเศษ + ข้อเสนอแนะโดย 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);}}}}

Memory hog สร้างอาร์เรย์ใหม่สำหรับทุกการรีเฟรช แต่เดิม (ใหม่) ใช้ StringBuilder แต่เสียสละเพื่อความสะดวก แต่อย่างน้อยการรีเฟรชใช้เวลาน้อยกว่า 1 ms ใน Core2 เดิมของฉัน

หลังจากลบบางส่วน - ตอนนี้เป็นอันตรายต่อความยาว - กอล์ฟเก่าซึ่งช่วยลดได้ 8 ตัวอักษรฉันพยายามเอามันกลับไปที่ "บทกวี" 360 โดยย้อนกลับไปเป็นสองเท่าแทนที่จะแยกวิเคราะห์ int และกลับไปที่ 80 * 24 แทน 1920 ถึงกระนั้นก็ยังมีเพียง 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 console ยอมรับการแสดงผลตัวอักษรว่างเปล่าจำนวนมาก บางทีนั่นอาจอธิบายได้ว่าทำไมมันถึงไม่ดีนักกับอูบุนตูบน Ubuntu ฉันไม่มี windows / .net สะดวกตอนนี้ดังนั้นฉันจะเอาคำของคุณไปใช้งานได้
Digital Trauma

เพิ่งเพิ่มสกรีนช็อต - ควรทำให้มันเป็นแพลตฟอร์มข้าม แต่เมื่อพิจารณาจากสถานะที่ไม่ใช่คู่แข่งที่มีอยู่แล้ว - และจำนวนตัวละครที่ "กวี" ค่อนข้างมากบางทีมันควรจะถูกปล่อยทิ้งไว้ :-)
JimmiTh

ไม่จำเป็นต้องมีคำตอบทั้งหมดเพื่อเป็น IMO ข้ามแพลตฟอร์ม หากคำตอบนั้นขึ้นอยู่กับแพลตฟอร์มเฉพาะมันดีที่จะพูดถึงแพลตฟอร์มแม้ว่า C # จะเป็นที่รู้จักกันดีว่ามันชัดเจนอยู่แล้ว
Digital Trauma

ไม่using C = Consoleจริงๆประหยัดตัวอักษรใด?
Ypnypn

@Ypnypn - หลังจากบุกรุก System namespace ไม่ได้ ไม่ได้เปลี่ยนหรือค้นหาเพราะเป้าหมายที่ระบุตัวเองคือไปที่อักขระ 360 ตัวเดียวกันในขณะที่ยังคงใช้การกำหนดค่าเริ่มต้นอาร์เรย์ "เหมาะสม" ขอบคุณ :-)
JimmiTh

1

Python 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.