সিনুসয়েডাল এএসসিআইআই আর্ট অ্যানিমেটেড পাঠ্য


11

আমি সেই পুরানো ডেমোগুলি কম্পিউটারের সক্ষমতা দেখাচ্ছে যখন তাদের i3, i5 এবং i7 এর পরিবর্তে x86 বলা হত miss আমার 386-এ আমি প্রথম দেখেছি তার মধ্যে একটি হ'ল ফিউচার ক্রুর অবাস্তব ডেমো যা এখন এটির 25 তম বার্ষিকী উদযাপন করছে। এ মিনিটে 0:43 ডেমো প্রথম অংশ শুরু হয় এবং আমরা একে sinusoidal পথ অনুসরণ করে একটি স্ক্রলিং টেক্সট দেখুন। আস্কি শিল্পে সেই প্রভাবটি অনুকরণ করার চেষ্টা করা যাক!

চ্যালেঞ্জ

এই পথ দেওয়া:

***                                ***
   ***                          ***
      **                      **
        *                    *
         *                  *
         *                  *
          *                *
           **            **
             ***      ***
                ******

এবং একটি ইনপুট পাঠ্য, এই পথটির অনুসরণ করে পাঠ্যটি আঁকুন:

Thi                                Golf! 
   s i                          de       Yay
      s                       Co            !
        P                     
         r                  d
         o                  n
          g                a
           ra            s 
             mmi      zle
                ng Puz

নোট করুন যে ফাঁকা স্থানগুলি পাথের অক্ষর হিসাবে গণনা করা হয়েছে, এবং যদি পাঠ্য নমুনার চেয়ে দীর্ঘ হয় তবে পথটি পুনরাবৃত্তি করে।

অ্যানিমেশন অংশ

একবার আপনি পাঠ্যটি আঁকলে, 100 এমএসের জন্য অপেক্ষা করুন (প্রায় 10 এফপিএসের একটি অ্যানিমেশন তৈরি করতে) এবং আবার পাঠ্যটি আঁকুন তবে পথের পরবর্তী অবস্থান থেকে শুরু করুন। সুতরাং, ফ্রেমের জন্য #n, গণনা করুন n modulo 40এবং পাঠ্যটি সর্বদা ক্যানভাসের বামদিকে সারিবদ্ধভাবে পাঠের নীচের অবস্থানে অঙ্কন শুরু করুন:

***                                ***
|  ***                          ***  |
|     **                      **     |
|       *                    *       |
|        *                  *        |
|        *                  *        |
|         *                *         |
|          **            **          |
|            ***      ***            |
|               ******               |
Position 0                 Position 39

ফ্রেম 10 এর জন্য আমাদের কাছে রয়েছে:

                           and Co
                        es       de 
                      zl            Go
                     z                l
                    u                  f
T                   P                  !
 h                                       
  is             ng                       Ya
     is       mmi                           y!
        Progra

মন্তব্য

  • অ্যানিমেটেড পাঠ্যের সাথে ইনপুটটি একক string(বা charঅ্যারে যাই হোক না কেন) থাকবে এবং সর্বদা কমপক্ষে 1 টি অক্ষর থাকবে।
  • অ্যানিমেট করতে বৈধ অক্ষর যারা মুদ্রণযোগ্য হওয়া ASCII সেট
  • অনুসরণের পথটি ঠিক যেমনটি দেওয়া হবে তেমনই হবে।
  • পাঠ্যটি সর্বদা ক্যানভাসের বামে প্রান্তিক করা হবে, সুতরাং প্রভাবটি কোনও পাঠ্য স্থানচ্যুতি না করে পতাকার মতো পাঠানো পাঠ্য হবে। এবং ক্যানভাস দ্বারা আমি পর্দা বলতে চাইছি বা যা আপনি পাঠ্যটি দেখানোর জন্য ব্যবহার করবেন । ;-)
  • পূর্ববর্তী ফ্রেমগুলি থেকে ফ্রেমগুলি অবশ্যই কোনও অক্ষর / পিক্সেল সম্পর্কে পরিষ্কার হওয়া উচিত যদি না উভয় ফ্রেমে অক্ষর / পিক্সেল একই হয়।
  • অ্যানিমেশনটির গতি ততক্ষণ ততক্ষণ যায় না যতক্ষণ না এটি সাবলীলভাবে চালানো হয় বা তত দ্রুত আপনার ডিভাইসটি চালায় (আমরা সর্বনিম্ন 5 এফপিএস নির্ধারণ করতে পারি, তবে এটি কোনও প্রয়োজন নয়)। এটিকে তরল করে তোলার জন্য কেবল গতিটি সামঞ্জস্য করুন এবং অপেক্ষার সময়গুলি একই রকম না হলে চিন্তা করবেন না।
  • অ্যানিমেশন অবিরাম লুপ হবে।

এটি , তাই সংক্ষিপ্ততম প্রোগ্রাম বা ফাংশনটি পাঠ্যটি অ্যানিমেটেড করতে সক্ষম হতে পারে!



1
আমি বদলে 38 টি কলাম 40 নির্ভর করতে পারেন
Arnauld

1
@ আর্নল্ড এর কারণ এটি কি কলামগুলির পক্ষে নয়, সেই পথে অবস্থানগুলি।
চার্লি 21

আচ্ছা বুঝলাম. বোধ হয়।
আর্নল্ড

কি এই আউটপুট ঠিক আছে তো? এটি একটি সাইনোসয়েডাল তরঙ্গ আকারে ইনপুট প্রদর্শন করে এবং অবিরাম লুপ করে। অবশ্যই ভিডিওটি গ্রাফিক্স ইন্টারচেঞ্জ ফর্ম্যাটে রয়েছে তাই এটি বাস্তবের চেয়ে দ্রুত is
আর কাপ,

উত্তর:


9

এইচটিএমএল + ইএস 6, 241 244 237 বাইট

ভাঙ্গন:

  • এইচটিএমএল: 16 বাইট
  • জেএস ফাংশন: 221 বাইট

let f =

s=>setInterval(_=>o.innerHTML=[...s].map((c,i)=>([j,y]=[...Array(40)].map((_,k)=>[j=k%20,y,y+=77732>>j&1?k<20||-1:0],y=0)[(i+p)%40],a[y]=a[y]||[...s].fill` `)[x]=(x+=j!=9,c),x=0,a=[],p++)&&a.map(r=>r.join``).join`
`,p=30)

f("This is Programming Puzzles and Code Golf! Yay!")
<pre id=o></pre>

কিভাবে?

পথ তৈরি করছে

নিম্নলিখিত কোডটি পথ তৈরি করে:

[...Array(40)].map((_, k) =>
  [
    j = k % 20,
    y,
    y += 77732 >> j & 1 ? k < 20 || -1 : 0
  ],
  y = 0
)

এটি অ্যারের একটি অ্যারে দেয় [j, y, z]যেখানে জে পজিশনটি মডিউল 20, y এই স্থানে y- সমন্বিত হয় এবং z পরে ব্যবহার হয় না (কিছু বাইট সংরক্ষণ করার জন্য এটি এখানে গণনা করা যায়)।

যেহেতু পথটি প্রতিসম হয়, আমাদের কেবলমাত্র 20 টি প্রথম অবস্থানের এনকোড করা দরকার। আমরা বাইনারি নম্বর ব্যবহার করে এটি করি যেখানে প্রতিটি 1বিটের অর্থ হ'ল y আপডেট করতে হবে (প্রথমার্ধের জন্য +1, দ্বিতীয়ার্ধের জন্য -1)।

001
   001
      01
        1
         1
         1
          1
           01
             001
                000

প্রথম অবস্থানটি সর্বনিম্ন তাৎপর্যপূর্ণ কিছুতে ম্যাপ হওয়ার সাথে সাথে এটি দেয়:

00010010111110100100 as binary = 77732 as decimal

যেহেতু এই বাইনারি সংখ্যাটি নিজেও প্রতিসম হয়, আমরা এটি দ্বিতীয় অর্ধের জন্য একই ক্রমে পড়তে পারি।

সূত্র:

y += (77732 >> j) & 1 ? (k < 20 ? 1 : -1) : 0

যা এ হিসাবে লেখা যেতে পারে:

y += (77732 >> j) & 1 ? k < 20 || -1 : 0

যেখানে k অবস্থান এবং জে অবস্থানের মডুলো 20 20

এক্স আপডেট করা অনেক সহজ: আমাদের কাছে কেবল 9 এর সাথে মডুলো 20 পজিশনের তুলনা করে সনাক্ত করার জন্য একটি বিশেষ কেস রয়েছে।

পাঠ্য আঁকছি

নিম্নলিখিত কোডে, উপরে বর্ণিত পাথ বিল্ডিং কোডটি pathপঠনযোগ্যতার জন্য পরিবর্তনশীল দ্বারা প্রতিস্থাপন করা হয়েছে ।

s => setInterval(                       // set a periodic timer:
  _ =>                                  //   with an anonymous callback
    o.innerHTML =                       //   which updates the content of 'o'
      [...s].map((c, i) => (            //   for each character c of the string s
          [j, y] = path[(i + p) % 40],  //     retrieve j and y from the path
          a[y] = a[y] || [...s].fill` ` //     initialize a[y] if it's undefined
        )[x] = (x += j! = 9, c),        //     update a[y][x] / update x
        x = 0,                          //     initialize x
        a = [],                         //     initialize a[]
        p++                             //     increment the phase
      ) &&                              //   end of map()
      a.map(r => r.join``).join`\n`,    //   join everything together
  p = 30                                //   initial phase = interval period = 30
)                                       // end of timer definition

এটি উজ্জ্বল, এবং জিজ্ঞাসিত পথটির খুব কাছে, তবে পথটি আমি আঁকা ঠিক তেমনটি নয়। যে দুটি কলাম দুটি *উল্লম্বভাবে ধারণ করে তা সারিবদ্ধ হয় না (একই উচ্চতায়) এবং অন্য একটি ছোট্ট নাইটপিক। তবে আমি অবশ্যই বলব যে আমি এখনও জানি না যে কীভাবে আপনার কোডটি তরঙ্গ প্রভাব তৈরি করে (কী করে y+=155464?)। অভিনন্দন!
চার্লি 21

@ কার্লোস আলেজো আমার ধারণা এখন পথটি ঠিক করা উচিত। আপনি দয়া করে ডাবল চেক করতে পারেন? আমি ব্যবহৃত পদ্ধতির একটি ব্যাখ্যা যুক্ত করব।
আর্নল্ড

1
পথটি পরীক্ষা করা হয়েছে, এবং ব্যাখ্যাটির জন্য আপনাকে অনেক ধন্যবাদ!
চার্লি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.