স্টিম্পঙ্ক: ক্লেকার অ্যানিমেশন


11

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

আপনার কাজটি হ'ল এই জাতীয় ইঞ্জিন অনুকরণ এবং কোনও ইনপুট ফাইল দ্বারা নির্দিষ্ট হিসাবে একটি পিক্সिलेটেড অ্যানিমেশন প্রদর্শন করা। ইনপুটটিতে একটি নির্দিষ্ট-প্রস্থের বিন্যাসে লাইন থাকে তবে লাইন-এন্ডিং ইঙ্গিতের জন্য আপনি যা উপযুক্ত তা ধরে নিতে পারেন। বিন্যাসটি হ'ল:

SSSSYYxxXXOA
SSSS: 4 digit sequence no. may be padded by blanks or all blank
    YY: the y coordinate affected by this line (descending, top is 0, bottom is m-1)
      xx: the starting x coordinate
        XX: the ending x coordinate
          O: hexadecimal opcode
           A: argument (0 or 1)

ইনপুটটি সুস্পষ্টভাবে সিকোয়েন্সড হয় (আপনি যদি কখনও আপনার ডেকে কার্ডের ফ্লোরে ফেলে দেন তবে আপনি এই অংশটির জন্য আমাকে ধন্যবাদ জানবেন)। এর অর্থ প্রোগ্রামটি অবশ্যই সিকোয়েন কী হিসাবে সিকোয়েন্স ফিল্ডটি ব্যবহার করে ইনপুট লাইনের একটি স্থিতিশীল বাছাই করতে হবে। একই ক্রম সংখ্যাযুক্ত রেখাগুলি অবশ্যই তাদের মূল আপেক্ষিক ক্রম বজায় রাখতে হবে। (এটি যদি আপনার আসল লাইন নম্বরটি কীতে সংযোজন করা হয় তবে এটি একটি অস্থির বাছাইয়ের সাথে কাজ করা উচিত A) একটি ফাঁকা সিকোয়েন্স ক্ষেত্রটি কোনও সংখ্যার চেয়ে কম হিসাবে ব্যাখ্যা করা উচিত (এসকিআই কোলিশেশন সিকোয়েন্স)।

একটি একক বিবৃতি লাইনটি কেবল একটি একক y স্থানাঙ্ককে প্রভাবিত করতে পারে তবে এক্স মানগুলির একটি সংমিশ্রিত পরিসীমা নির্দিষ্ট করতে পারে। শেষের এক্স মানটি ফাঁকা ছেড়ে যেতে পারে বা একক পিক্সেলকে প্রভাবিত করতে প্রাথমিক মানের সাথে অভিন্ন হতে পারে।

অপকোড হেক্সাডেসিমাল ডিজিট যা ইউনিভার্সাল বাইনারি ফাংশন কোড নির্দিষ্ট করে যা একটি রাস্টারস্টপ হিসাবে ব্যবহৃত হয়। আর্গুমেন্ট 0 বা 1। সম্পন্ন রাস্টার অপারেশনটি হয়

pixel = pixel OP argument          infix expression
         --or-- 
        OP(pixel, argument)        function call expression

সুতরাং পিক্সেলের মূল মানটি ইউবিএফ সারণিতে এক্স হিসাবে প্রবেশ করে এবং বিবৃতি থেকে আর্গুমেন্টের মানটি ওয়াই হিসাবে প্রবেশ করে this এই ফাংশনের ফলাফলটি পিক্সেলের নতুন মান। এবং এই অপারেশনটি এক্স, ওয়াই থেকে এক্সএক্স, ওয়াই ওয়াই স্টেটমেন্টে নির্দিষ্ট প্রতিটি এক্স, ওয়াই জোয়ারের উপর সঞ্চালিত হয়। এক্সএক্স এবং এক্সএক্স দ্বারা নির্দিষ্ট রেঞ্জের উভয় প্রান্ত-পয়েন্ট অন্তর্ভুক্ত। সুতরাং

0000 0 010F1

0 সারিতে 0,1,2,3,4,5,6,7,8,9,10 পিক্সেল সেট করা উচিত।

আউটপুট মাত্রা ( মি x এন ) ন্যূনতম হতে 20 x 20 হওয়া উচিত, তবে ইচ্ছা করলে আরও বড় হতে পারে। তবে দানা দেখানো উচিত, জানো? এটি পিক্সেলিটেড হওয়ার কথা । গ্রাফিকাল এবং এএসসিআইআই-আর্ট উভয়ই গ্রহণযোগ্য।

উদাহরণস্বরূপ, আমরা একটি পিক্সেলিটেড চিত্রের চিত্র তৈরি করতে চেয়েছিলাম:

  #   #
   ###
   ##
   ####
    #
#### ####
   # #

   ###
   # #
   # #

যদি আমরা তাকে এক্সওআর এর মতো কিছুটা ফ্লিপিং অপ দিয়ে আঁকি, তবে স্ক্রীনটি কালো বা সাদা কিনা তা নির্বিশেষে এটি আঁকতে এবং মুছতে পারে।

    00020261
     0 6 661
     1 3 561
     2 3 461
     3 3 661
     4 4 461
     5 0 361
     5 5 861
     6 3 361
     6 5 561
     8 3 561
     9 3 361
     9 5 561
    10 3 361
    10 5 561

এই ক্রমের সদৃশকরণ চিত্রটি প্রদর্শিত হবে এবং অদৃশ্য হয়ে যাবে।

এনএমএম হ'ল মিকি মাউস নয়

সিকোয়েন্স ফিল্ডে বিভিন্ন "শট" নির্দিষ্ট করে একটি বৃহত্তর অ্যানিমেশনটি অফ-অর্ডার তৈরি করা যায়।

   100 016F0
   101 016F0
   102 016F0
   103 016F0
   104 016F0
   105 016F0
   106 016F0
   107 016F0
   108 016F0
   109 016F0
   110 016F0
   111 016F0
   112 016F0
   113 016F0
   114 016F0
   115 016F0
   200020261
   2 0 6 661
   2 1 3 561
   2 2 3 461
   2 3 3 661
   2 4 4 461
   2 5 0 361
   2 5 5 861
   2 6 3 361
   2 6 5 561
   2 8 3 561
   2 9 3 361
   2 9 5 561
   210 3 361
   210 5 561
    00020261
     0 6 661
     1 3 561
     2 3 461
     3 3 661
     4 4 461
     5 0 361
     5 5 861
     6 3 361
     6 5 561
     8 3 561
     9 3 361
     9 5 561
    10 3 361
    10 5 561
   300020261
   3 0 6 661
   3 1 3 561
   3 2 3 461
   3 3 3 661
   3 4 4 461
   3 5 0 361
   3 5 5 861
   3 6 3 361
   3 6 5 561
   3 8 3 561
   3 9 3 361
   3 9 5 561
   310 3 361
   310 5 561
    00020261
     0 6 661
     1 3 561
     2 3 461
     3 3 661
     4 4 461
     5 0 361
     5 5 861
     6 3 361
     6 5 561
     8 3 561
     9 3 361
     9 5 561
    10 3 361
    10 5 561

উত্পাদন:

কালো / সাদা বনাম সাদা / কালো

এটি তাই সংক্ষিপ্ততম প্রোগ্রাম (বাইট-কাউন্ট দ্বারা) জিতেছে। বোনাস (-50) যদি ইঞ্জিন ক্লিকি-ক্ল্যাক শব্দ করে তোলে।


3
সাধারণত একটি স্যান্ডবক্সে পোস্ট করে স্পষ্টতার জন্য অনুরোধ করে। আপনি কি স্যান্ডবক্সটি বন্ধ করার চেষ্টা করছেন?
জন ডিভোরাক

5
ব্যক্তিগতভাবে আমার জন্য, স্যান্ডবক্সগুলি একটি মৃত-শেষ। এগুলি শেষ করার জন্য আমি খুব ভাল। এখানে, লাইভ, আমি আমার বাটের নীচে আগুনটিকে উপেক্ষা করতে পারি না।
লুসার droog

1
বুলিয়ান সংযোজক কীভাবে কাজ করে? এটি কি একই সিকোয়েন্স নম্বর সহ কেবল লাইনে যুক্ত হয়? যদি তারা মিশ্রিত হয়, অপারেটর অগ্রাধিকার কিছু ফর্ম আছে? বুলিয়ান সংযোগকারীদের উপর নির্ভর করে এমন কোনও পরীক্ষার ক্ষেত্রে আপনার কি আছে? আপনি যে পরীক্ষার পোস্ট করেছেন তাতে কেন কোনও ক্রম সংখ্যা নেই? শেষ xসমষ্টি কি সর্বদা অন্তর্ভুক্ত?
পিটার টেলর

5
এখানে কিছু ক্লিকেটি ক্ল্যাক শোরগোল রয়েছে । আমি কি বোনাস পাব? ;-)
ডিজিটাল ট্রমা

1
শব্দের জন্য, আপনি কি ট্রেন স্টেশন ফ্লিপবোর্ডের মতো কিছু ভাবছেন? উদাহরণস্বরূপ স্যারারি বোর্ডে গ্যারি ডু নর্ড ট্রেন স্টেশন প্যারিসে বা স্প্লিট-ফ্ল্যাপ প্রদর্শন - ডিআইওয়াই ড্রাইভার সার্কিট । বা আপনি কি আরও যান্ত্রিক রিলে শব্দগুলি ভাবছেন?
স্কট লিডলি

উত্তর:


3

গণিত, 306 281 বাইট

এটি প্রত্যাশিত ইনপুট স্ট্রিংটি ভেরিয়েবলের মধ্যে সঞ্চয় করা হবে i

ListAnimate[ArrayPlot/@FoldList[({n,y,x,X,o,a}=#2;MapAt[IntegerDigits[o,2,4][[-1-FromDigits[{#,a},2]]]&,#,{y+1,x+1;;X+1}])&,Array[0&,{20,20}],ToExpression/@MapAt["16^^"<>#&,StringTrim/@SortBy[i~StringSplit~"\n"~StringCases~RegularExpression@"^....|..(?!.?$)|.",{#[[1]]&}],{;;,5}]]]

এবং এখানে কিছু সাদা জায়গা সহ:

ListAnimate[ArrayPlot /@ FoldList[(
     {n, y, x, X, o, a} = #2;
     MapAt[
      IntegerDigits[o, 2, 4][[-1 - FromDigits[{#, a}, 2]]] &,
      #,
      {y + 1, x + 1 ;; X + 1}
      ]
     ) &,
   Array[0 &, {20, 20}],
   ToExpression /@ 
    MapAt["16^^" <> # &, 
     StringTrim /@ 
      SortBy[i~StringSplit~"\n"~StringCases~
        RegularExpression@"^....|..(?!.?$)|.", {#[[1]] &}], {;; , 5}]
   ]]

এটি বেশ লম্বা হয়েছে। এই চ্যালেঞ্জটিতে প্রচুর পরিমাণে মজাদার বিবরণ রয়েছে এবং বিশেষত ইনপুট পার্সিংটি ম্যাথামেটিকায় প্রচুর কোড নেয় (এর প্রায় অর্ধেক, 137 বাইট, কেবল ইনপুটটি পার্সিং করছে)। ম্যাথামেটিকায় বসতি স্থাপন করার আগে আমি ভাষাটি দু'বার স্যুইচ করে শেষ করেছি (আমি ভেবেছিলাম রুবি ব্যবহার করে আমি ইনপুট পার্সিংয়ে সঞ্চয় করতে পারব, তবে তখন বুঝতে পারলাম ফলাফলটি অ্যানিমেটেড করা দরকার , তাই আমি ম্যাথমেটিকায় ফিরে গেলাম)।


2

অসম্পূর্ণ পোস্টস্ক্রিপ্ট উদাহরণ

এটি একটি "প্রোটোকল-প্রোলোলগ" স্টাইল প্রোগ্রাম, তাই ডেটা অবিলম্বে একই উত্স ফাইলে অনুসরণ করা হয়। অ্যানিমেটেড GIF ফাইল করে ImageMagick এর সঙ্গে হতে পারে- যেমন convertইউটিলিটি (ব্যবহারসমূহ Ghostscript): convert clack.ps clack.gif

%%BoundingBox: 0 0 321 321

/t { token pop exch pop } def
/min { 2 copy gt { exch } if pop } def
/max { 2 copy lt { exch } if pop } def

/m [ 20 { 20 string }repeat ] def
/draw { change {
        m {} forall 20 20 8 [ .0625 0 0 .0625 0 0 ] {} image showpage
    } if } def

%insertion sort from https://groups.google.com/d/topic/comp.lang.postscript/5nDEslzC-vg/discussion
% array greater_function insertionsort array
/insertionsort
{ 1 1 3 index length 1 sub
    { 2 index 1 index get exch % v, j
        { dup 0 eq {exit} if
            3 index 1 index 1 sub get 2 index 4 index exec
            {3 index 1 index 2 copy 1 sub get put 1 sub}
            {exit} ifelse
        } loop
        exch 3 index 3 1 roll put
    } for
    pop
} def

/process {
    x X min 1 x X max { % change? x
        m y get exch  % row-str x_i
        2 copy get  % r x r_x 
        dup         % r x r_x r_x
        0 eq { 0 }{ 1 } ifelse  % r x r_x b(x)
        2 mul a add f exch neg bitshift 1 and   % r x r_x f(x,a)
        0 eq { 0 }{ 255 } ifelse  % r x r_x c(f)
        exch 1 index % r x c(f) r_x c(f)
        ne { /change true def } if
        put
    } for
    draw
} def

{ [ {
     currentfile 15 string
         dup 2 13 getinterval exch 3 1 roll
         readline not{pop pop exit}if
    pop
    [ exch
     /b exch dup 0 1 getinterval exch
     /n exch dup 1 1 getinterval exch
     /seq exch dup 2 4 getinterval exch
     /y exch dup 6 2 getinterval t exch
     /x exch dup 8 2 getinterval t exch
     /X exch dup 10 2 getinterval dup (  ) ne { t exch }{pop 2 index exch} ifelse
     /f exch dup 12 get (16#?) dup 3 4 3 roll put t exch
     /a exch 13 get 48 sub
     /change false def
    >>
}loop ]
dup { /seq get exch /seq get exch gt } insertionsort
true exch
{ begin
    b(A)eq{
        { process } if
    }{
        b(O)eq{
            not { process } if
        }{
            pop
            process
        }ifelse
    }ifelse
    change
    end
} forall
    draw
} exec
   100 016F0
   101 016F0
   102 016F0
   103 016F0
   104 016F0
   105 016F0
   106 016F0
   107 016F0
   108 016F0
   109 016F0
   110 016F0
   111 016F0
   112 016F0
   113 016F0
   114 016F0
   115 016F0
   200020261
   2 0 6 661
   2 1 3 561
   2 2 3 461
   2 3 3 661
   2 4 4 461
   2 5 0 361
   2 5 5 861
   2 6 3 361
   2 6 5 561
   2 8 3 561
   2 9 3 361
   2 9 5 561
   210 3 361
   210 5 561
    00020261
     0 6 661
     1 3 561
     2 3 461
     3 3 661
     4 4 461
     5 0 361
     5 5 861
     6 3 361
     6 5 561
     8 3 561
     9 3 361
     9 5 561
    10 3 361
    10 5 561
   300020261
   3 0 6 661
   3 1 3 561
   3 2 3 461
   3 3 3 661
   3 4 4 461
   3 5 0 361
   3 5 5 861
   3 6 3 361
   3 6 5 561
   3 8 3 561
   3 9 3 361
   3 9 5 561
   310 3 361
   310 5 561
    00020261
     0 6 661
     1 3 561
     2 3 461
     3 3 661
     4 4 461
     5 0 361
     5 5 861
     6 3 361
     6 5 561
     8 3 561
     9 3 361
     9 5 561
    10 3 361
    10 5 561
0000 0 515F1
0000 1 11501
0000 1 115F1

বাউন্ডিং বক্সের তথ্য চালিয়ে আবিষ্কার করা হয়েছিল gs -sDEVICE=bbox clack.ps
লুসার ড্রোগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.