এএসসিআইআই আর্ট স্কোয়ার অ্যাফাইন ফ্র্যাক্টাল


9

অ্যাফাইন ফ্র্যাক্টালগুলি তৈরি করতে আপনি সবচেয়ে ছোট প্রোগ্রামটি লিখুন। আপনি নীচের নিয়ম মত একই ফলাফল উত্পন্ন মনে হয় যে কোনও পদ্ধতি আপনি ব্যবহার করতে পারেন। আপনাকে প্রস্তাবিত পদ্ধতিগুলি থেকে কোনও ধারণা ব্যবহার করতে হবে না!

আপনার প্রোগ্রামে দুটি ইনপুট লাগবে, প্রথমটি 0740 থেকে 7 অবধি তিন অঙ্কের বিন্যাসে প্যাটার্নটি সংজ্ঞায়িত করবে দ্বিতীয় ইনপুটটি আকার নির্ধারণ 3করবে, 8x8 4হবে , 16x16 হবে এবং এ জাতীয় (2 ^ n) হবে। আপনার প্রোগ্রামকে অবশ্যই 0 (1x1) থেকে কমপক্ষে 5 (32x32) এ সমস্ত আকারের সঠিক ফলাফল আউটপুট করতে হবে। যদি এটি উচ্চতর সংখ্যার জন্য কোনও আউটপুট উত্পাদন করে তবে তা অবশ্যই সঠিক হতে হবে, অর্থাত এটি অবশ্যই একটি নির্দিষ্ট আকার পর্যন্ত সঠিক আউটপুট উত্পন্ন করতে পারে তবে ভুল হলে ভুল হবে যদি আকারের উপরে কোনও আউটপুট উত্পাদন করে না। আপনি সর্বাধিক আকার 15 (32768x32768) ধরে নিতে পারেন কারণ এটি ইতিমধ্যে ASCII আর্টের জন্য একটি উন্মাদ আকার (1GB)!

একটি 8x8 প্যাটার্ন নীচের মতো দেখতে হবে (নিয়ম 160)। বাম-সর্বাধিক অঙ্কটি ব্লকের জন্য A, মাঝারি অঙ্কের (কোনও অভদ্র চিন্তাভাবনা নেই!) ব্লকের জন্য Bএবং ব্লকের জন্য ডান-সর্বাধিক অঙ্ক হবে C। ফ্র্যাক্টালটি তৈরি করতে, উভয় মাত্রায় এটি অর্ধেক সঙ্কুচিত করুন এবং ব্লকের জন্য ঘূর্ণন / মিররিং নিয়মটি প্রয়োগ করুন। প্যাটার্নটি সঙ্কুচিত করতে এটিকে 2x2 অঞ্চলে সমানভাবে ভাগ করুন। হয় প্রতিটি ক্ষেত্রে 3 টি দৃশ্যমান অক্ষর বা কোনও একটিই থাকবে। যদি দৃশ্যমান অক্ষরগুলি থাকে তবে ছোট ব্লকে যথাযথ জায়গায় একটি অক্ষর রাখুন, অন্যথায় একটি স্থান রাখুন। বিধি 0- 3মিরর করা হয় না, নিয়ম 4- 7মিরর করা হয়। বিধিগুলি 0এবং 4ঘোরানো হয় না, 1এবং 590 ডিগ্রি ঘড়ির কাঁটার দিকে ঘোরানো হয় 2এবং6180 ডিগ্রি ঘোরানো হয় 3এবং 7270 ডিগ্রি ঘড়ির কাঁটার দিকে ঘোরানো হয়। Aউপরের-বাম কোণে, Bনীচে-বাম এবং Cনীচে-ডানদিকে দেখানো ক্রমে তিনটি ব্লক একসাথে সেলাই করুন ।

 AAA    
AA A    
AA      
A       
BBB CC  
B BBC   
  BBCCC 
   B CCC

সঙ্কুচিত, আবর্তিত এবং নিয়ম সংখ্যা দ্বারা মিরর:

 0       1       2       3       4       5       6       7  
----    ----    ----    ----    ----    ----    ----    ----
AA       BAA    CCB        C    C        BCC    AAB       AA
A       BB A     CBB      CC    CC      BBC     A BB       A
BBC     CC         A    A BB    BB A    A         CC     CBB
 BCC    C         AA    AAB      BAA    AA         C    CCB 

নিয়মাবলী:

  1. মিরর করা হয়নি, 90 ডিগ্রি ঘড়ির কাঁটার দিকে ঘোরানো হয়েছে
  2. মিরর করা হয়নি, 180 ডিগ্রি ঘড়ির কাঁটার দিকে ঘোরানো হয়েছে
  3. মিরর করা হয়নি, ঘড়ির কাঁটার দিকে 270 ডিগ্রি ঘোরানো হয়েছে
  4. মিরর করা কিন্তু ঘোরানো হয়নি
  5. মিরর করা তারপর 90 ডিগ্রি ঘড়ির কাঁটার দিকে ঘোরানো
  6. মিররড তারপর 180 ডিগ্রি ঘড়ির কাঁটার দিকে ঘোরানো
  7. মিররড তারপর ঘড়ির কাঁটার দিকে 270 ডিগ্রি ঘোরানো হয়েছে
  8. বিধি 0: মিরর করা হয় না, ঘোরানো হয় না

মিররিংটি সর্বদা প্রথমে করা হয় এবং ফাঁকা কোণার মাধ্যমে তির্যকভাবে করা হয় যেমন নিয়ম 0 বনাম 4 নিয়ম:

 0       4  
----    ----
AA /    C  /
A /     CC/ 
BBC     BB A
/BCC    /BAA

শুধু নিয়ম 1, 6এবং 0, উপরে প্যাটার্ন ব্যবহার করা হয় যাতে। রূপান্তরগুলি প্রয়োগ করার পরে এবং ব্লকগুলি একসাথে সেলাই করা বাদে এটি নীচের মত দেখতে ব্যতীত আমি প্রতিটি ব্লককে একে অপরের থেকে এক স্পেসে ফাঁক করে রেখেছি। আপনার কোডটিতে এটি অতিরিক্ত স্থান পাবে না। আপনি যদি এটি "পিতামাতার" চিত্রের সাথে তুলনা করেন আপনি দেখতে পাবেন যে এটিতে একই পজিশনে দৃশ্যমান অক্ষর রয়েছে।

 BAA
BB A
CC  
C   

AAB  AA  
A BB A   
  CC BBC 
   C  BCC

সঙ্কুচিত না হয়ে চিত্রটি উত্পন্ন করার আরেকটি উপায় নিম্নরূপ: একটি অক্ষর দিয়ে শুরু করুন:

X

তিনটি ব্লকের প্রত্যেকটির জন্য রূপান্তরগুলি প্রয়োগ করুন (এটি কেবলমাত্র একটি অক্ষর নয়) এবং ব্লকগুলি একসাথে সেলাই করুন:

X
XX

আবার তিনটি ব্লকের প্রতিটিটির জন্য রূপান্তরগুলি প্রয়োগ করুন:

1 
--
XX
X 

6     0 
--    --
XX    X 
 X    XX

তাদের একসাথে সেলাই:

XX
X 
XXX 
 XXX

আবার তিনটি ব্লকের প্রতিটিটির জন্য রূপান্তরগুলি প্রয়োগ করুন:

 1  
----
 XXX
XX X
XX  
X   

 6       0  
----    ----
XXX     XX  
X XX    X   
  XX    XXX 
   X     XXX

তাদের একসাথে সেলাই:

 XXX    
XX X    
XX      
X       
XXX XX  
X XXX   
  XXXXX 
   X XXX

আপনি প্যাটার্নের দৃশ্যমান অংশের জন্য কোনও মুদ্রণযোগ্য অক্ষর বা অক্ষর (0x21 - 0x7E) ব্যবহার করতে পারেন তবে ফাঁকা স্থানগুলির জন্য কেবল স্থান অক্ষর (0x20)। ট্রেলিং স্পেসের অনুমতি রয়েছে তবে পুরো স্কোয়ারের বাইরে কোনও ফাঁকা স্থান থাকতে হবে না (অর্থাত্ 8x8 বর্গের জন্য কলাম 8 এর আগের কোনও অক্ষর থাকতে পারে না)।

এখানে 512 বিভিন্ন বিধি রয়েছে, তবে তাদের মধ্যে কিছু একই প্যাটার্ন উত্পাদন করে। পার্শ্ব নোট হিসাবে, যে কোনও প্যাটার্ন কেবল 0এবং 4এতে সিয়েরপিনস্কি ত্রিভুজ (৮ টি আলাদা বিধি) উত্পাদন করবে।

আপনি পছন্দসইভাবে আপনার প্রিয় প্যাটার্ন এবং এটি তৈরি করে এমন নিয়ম পোস্ট করতে পারেন। আপনি যদি তা করেন তবে নিশ্চিত হয়ে নিন যে আকারটি কমপক্ষে 3 (8x8) এর মতো একই বিধি থেকে আলাদা করতে পারে।


@ থ্রিচোপ্লেক্স আপনি সম্পূর্ণ ভরাট স্কোয়ার বা এর মধ্যে কেবল 1 টি দৃশ্যমান অক্ষর সহ একটি বর্গ দিয়ে শুরু করতে পারেন। যে কোনও উপায়ে, নিয়মগুলি n বার পুনরাবৃত্তি করা হবে , যেখানে এন ইনপুট আকার, একই ফলাফলের গ্যারান্টি দেবে। তবে আপনাকে এইভাবে প্যাটার্নটি উত্পন্ন করতে হবে না, কেবল এটি এইভাবে করার মতো একই প্যাটার্নটি তৈরি করুন।
সিজে ডেনিস

@ থ্রিচোপল্যাক্স আমি আপনার ইনপুট প্রশংসা করি। আমি যেভাবে জিনিস দেখি তা অন্য লোকেরা যেভাবে দেখায় তা নয় এবং আমি জানি না যে আমি তাদের পক্ষে এটি কঠিন করে তুলছি!
সিজে ডেনিস

2
+1 আপনাকে ধন্যবাদ, আপনি ব্যাখ্যাটি আরও পরিষ্কার করে দিয়েছেন! ভবিষ্যতে, আমি আপনাকে আমাদের স্যান্ডবক্সের মাধ্যমে জিনিসগুলি চালানোর পরামর্শ দিচ্ছি যাতে লোকেরা আপনি কী কী সময়ের আগে জিজ্ঞাসা করছেন তার একটি পরিষ্কার চিত্র পেতে পারে। আমি শীঘ্রই এই চ্যালেঞ্জ নিয়ে কাজ করব :)
ব্রেইনস্টিল

হ্যাঁ প্রত্যেকে বিষয়গুলি ভিন্নভাবে দেখেন। প্রতিক্রিয়া জানাতে খুশি - একটি ভাল প্রশ্ন স্পষ্ট করার মতো। এটি এখন ভাল পড়া।
ট্রাইকোপ্লাক্স

@ ব্রেনস্টিল ধন্যবাদ, করবেন! আমি অনেক বছর ধরে এসই তে ঘুরেছি তবে আমি এখনও পিসিজিতে তুলনামূলকভাবে নতুন!
সিজে ডেনিস

উত্তর:


1

সিজেম, 63 57 54 52 বাইট

0aarari*{\f{\~7"W%z"a*3"Wf%"t<s~}({__Ser+}%\~.++}/N*

এটি কীভাবে কাজ করে :

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

0aa                           e# Starting condition, equivalent to a single A
   ra                         e# Read the rule string and wrap it in an array
     ri*                      e# Repeat the rule array, second input number of times
        { ...  }/             e# Loop for each rule in the rule array
                              e# In each loop, we will have the current fractal and
                              e# then the rule on stack
\f{\~7"W%z"a*3"Wf%"t<s~}      
\f{                    }      e# Move the rule on top of stack and for each of the rule
                              e# character, run this loop on the current fractal
   \~                         e# Move the rule char on top and convert to int by face value
     7"W%z"a*3"Wf%"t          e# This is the array which has the logic to perform the rules
                              e# ["W%z" "W%z" "W%z" "Wf%" "W%z" "W%z" "W%z"]
                    <s        e# Based on the rule number value, take that many first items
                              e# from the above array and do a toString on the array
                              e# For rule 0 through 7, you will get the following strings:
                              e# 0: "", 1: "W%z", 2: "W%zW%z", 3: "W%zW%zW%z",
                              e# 4: "W%zW%zW%zWf%", 5: "W%zW%zW%zWf%W%z",
                              e# 6: "W%zW%zW%zWf%W%zW%z", 7: "W%zW%zW%zWf%W%zW%zW%z"
                              e# This works because each W%z will rotate the block of
                              e# fractal 90 degrees in clockwise direction.
                              e# For rule 4, where we need to mirror diagonally, we first
                              e# rotate it 279 degrees clock wise and then reverse each row
                              e# of the block. The rest of the rules after 4 take that
                              e# mirroring as base and rotate 90 degrees additionally
                      ~       e# Simply evaluate the string to apply the rule.
\f{ ... }                     e# After this for each loop, we get 3 copies of the fractal
                              e# block before the for loop. Each copy gets each one of the
                              e# three rule gets applied.
         ({      }%           e# We take out the first part corresponding to the 1st
                              e# quadrant and run each row through this loop to fill the
                              e# second quadrant with spaces
           __Ser              e# Take a copy of the row and replace everything in the
                              e# copy with spaces
                +             e# Append it to the original row
                   \~         e# Bring the last two quadrant array on top and unwrap it
                     .+       e# Append corresponding rows from the 4th quadrant to 3rd
                       +      e# Append the rows from lower half to the upper half
                              e# Now we have a full block ready to be run through
                              e# the next iteration which will double its size
                          N*  e# Finally, we join the rows of final fractal block with
                              e# newlines and automatically print the result

এটি এখানে অনলাইনে চেষ্টা করুন


খুব সুন্দর! যদি প্যাটার্নটি শুরু হয় 0এবং জেমস বন্ডের হত্যার লাইসেন্স রয়েছে তবে এটি খুব কম মুদ্রণযোগ্য অক্ষর তৈরি করে । 007: ইনডেক্সআউটঅফাউন্ডসএক্সেপশন
সিজে ডেনিস

@ সিজেডেনিস শীর্ষস্থানীয় জিরো সহ একটি বাগ রয়েছে। এখনই স্থির।
অপটিমাইজার

সাবাশ! আউটপুট এখন নিখুঁত দেখাচ্ছে!
সিজে ডেনিস

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