আর্নল্ডের বিড়ালের মানচিত্র


21

চ্যালেঞ্জ

একই প্রস্থ এবং উচ্চতা, আউটপুট ইমেজ অধীনে রুপান্তরিত সঙ্গে একটি রং রাস্টার ইমেজ * প্রদত্ত আর্নল্ড এর বিড়াল মানচিত্র । (* বিশদ নীচে দেখুন)

সংজ্ঞা

চিত্রটির আকার দেওয়া Nআমরা ধরে নিয়েছি যে পিক্সেলের স্থানাঙ্কগুলি 0এবং এর মধ্যে সংখ্যা হিসাবে দেওয়া হয় N-1

আর্নল্ডের বিড়ালের মানচিত্রটি তখন নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়:

স্থানাঙ্কে একটি পিক্সেল [x,y]সরানো হয় [(2*x + y) mod N, (x + y) mod N]

এটি টরাসের উপর রৈখিক রূপান্তর ছাড়া আর কিছুই নয়: হলুদ, বেগুনি এবং সবুজ অংশটি প্রাথমিক স্কোয়ারের কারণে ফিরে আসে mod N

কল্পনা

এই মানচিত্রে (আসুন এটি কল করুন f) নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  • এটি বাইজিক , এর অর্থ বিপরীতমুখী: এটি ম্যাট্রিক্সের সাথে লিনিয়ার রূপান্তর [[2,1],[1,1]]। যেহেতু এটির নির্ধারক রয়েছে 1এবং এটিতে কেবল পূর্ণসংখ্যার এন্ট্রি রয়েছে, বিপরীতে কেবলমাত্র পূর্ণসংখ্যার এন্ট্রি থাকে এবং এটি দিয়ে দেওয়া হয় [[1,-1],[-1,2]], এর অর্থ এটি এটি পূর্ণসংখ্যার স্থানাঙ্কগুলিতে দ্বিপাক্ষিকও হয়।

  • এটি চিত্রগুলির বাইজিক মানচিত্রের গোষ্ঠীর একটি টর্সিং উপাদান, এর N x Nঅর্থ আপনি যদি এটি যথেষ্ট পরিমাণে প্রয়োগ করেন তবে আপনি আসল চিত্রটি ফিরে পাবেন: f(f(...f(x)...)) = xমানচিত্রটি নিজের পরিচয়টিতে যতবার প্রয়োগ হয়েছে তার পরিমাণের পরিমাণ কম হওয়ার নিশ্চয়তা দেওয়া হচ্ছে বা এর সমান 3*N। নীচে আপনি আর্নল্ডের বিড়ালের মানচিত্রে প্রদত্ত সংখ্যক পুনরাবৃত্ত প্রয়োগগুলির পরে একটি বিড়ালের চিত্র এবং পুনরাবৃত্ত অ্যাপ্লিকেশনটির মতো দেখতে একটি অ্যানিমেশন দেখতে পাবেন:

একাধিক পুনরাবৃত্তি অ্যাপ্লিকেশন

বিস্তারিত

  • আপনার প্রোগ্রামটি অগত্যা চিত্রগুলির সাথে ডিল করতে হবে না, তবে 2D-অ্যারে / ম্যাট্রিকেস, স্ট্রিং বা অনুরূপ 2D-কাঠামো গ্রহণযোগ্য।

  • আপনার (0,0)পয়েন্টটি নীচে বাম দিকে বা উপরে বাম দিকে আছে কিনা তা বিবেচ্য নয় । (বা অন্য কোনও কোণে, যদি এটি আপনার ভাষায় আরও সুবিধাজনক হয়)) দয়া করে আপনার জমা দেওয়ার ক্ষেত্রে আপনি কোন কনভেনশন ব্যবহার করেন তা নির্দিষ্ট করুন।

Testcases

ম্যাট্রিক্স আকারে ( [1,2,3,4]শীর্ষ সারিতে রয়েছে, 1সূচক রয়েছে (0,0), 2সূচক রয়েছে (1,0), 5সূচক রয়েছে (0,1))

 1     2     3     4
 5     6     7     8
 9    10    11    12
13    14    15    16

maps to:

 1    14    11     8
12     5     2    15
 3    16     9     6
10     7     4    13

 --------------------

 1     2     3
 4     5     6
 7     8     9

 map to:

 1     8     6
 9     4     2
 5     3     7

চিত্র হিসাবে (নীচে বাম হয় (0,0)):


1
দরিদ্র লেনা। আমি আশা করি আপনি যথেষ্ট পরিমাণে পুনরাবৃত্তি করেছেন
লুইস মেন্ডো

2
আমরা কি ইনপুট হিসাবে চিত্রের আকার নিতে পারি? এটা কি সর্বদা বর্গক্ষেত্র?
xnor

1
হ্যাঁ চিত্রটি সর্বদা বর্গক্ষেত্র এবং আমি আকার সম্পর্কে নিশ্চিত নই, এর বিপরীতে কিছু আছে কি না এটির অনুমতি দেওয়ার ?
flawr

উত্তর:


10

জেলি , 9 বাইট

Zṙ"JC$µ2¡

এটি অনলাইন চেষ্টা করুন! স্থানাঙ্কগুলি উত্তর হিসাবে রয়েছে।

ব্যাখ্যা

      µ2¡   Twice:
Z             Transpose, then
 ṙ"           Rotate rows left by
   JC$          0, -1, -2, -3, …, 1-n units.

এই মোড়কের কাঁচটি এক দিকের ম্যাট্রিক্সে, অন্যদিকে।


কল্পনাপ্রসূত অ্যালগরিদম!
গ্রেগ মার্টিন

7

MATL , 23 বাইট

tt&n:qt&+&y\tb+&y\b*+Q(

(0,0)বিন্দু উচ্চতর চ্যালেঞ্জ টেক্সট উদাহরণ হিসাবে, ছেড়ে দেওয়া হয়।

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

ব্যাখ্যা

এমএটিএল-তে একটি ম্যাট্রিক্স দুটির পরিবর্তে একক সূচকের সাথে সূচকযুক্ত হতে পারে। একে লিনিয়ার ইনডেক্সিং বলা হয় এবং এটি কলাম-মেজর ক্রম ব্যবহার করে। এটি নিম্নলিখিত 4 × 4 ম্যাট্রিক্স দ্বারা চিত্রিত হয়েছে, যেখানে প্রতিটি প্রবেশের মানটি তার রৈখিক সূচকের সাথে মিলে যায়:

1   5   9  13
2   6  10  14
3   7  11  15
4   8  12  16

চ্যালেঞ্জের ম্যাপিং বাস্তবায়নের জন্য দুটি অনুরূপ পন্থা রয়েছে:

  1. একটি সূচক ম্যাট্রিক্স তৈরি করুন যা লিনিয়ার সূচকগুলিতে আর্নল্ডের বিপরীত ম্যাপিং উপস্থাপন করে এবং মূল ম্যাট্রিক্স থেকে মানগুলি নির্বাচন করতে এটি ব্যবহার করুন । 4 × 4 ক্ষেত্রে ইনডেক্সিং ম্যাট্রিক্স হবে

     1  8 11 14
    15  2  5 12
     9 16  3  6
     7 10 13  4
    

    কহন উদাহরণস্বরূপ মূল যে 5এক্স = 2, ওয়াই = 1 যায় এক্স = 3, Y = 2। এই অপারেশনটিকে রেফারেন্স ইনডেক্সিং বলা হয় : আসল ম্যাট্রিক্স থেকে কোন উপাদানটি বেছে নেওয়া উচিত তা বলতে ইনডেক্সিং ম্যাট্রিক্স ব্যবহার করুন। এটি ফান্টন ), যা দুটি ইনপুট নেয় (এটির ডিফল্ট কনফিগারেশনে)।

  2. একটি সূচক ম্যাট্রিক্স তৈরি করুন যা লিনিয়ার সূচকগুলিতে আর্নল্ডের সরাসরি ম্যাপিং উপস্থাপন করে এবং মূল ম্যাট্রিক্সে মান লিখতে এটি ব্যবহার করুন। 4 × 4 ক্ষেত্রে ইনডেক্সিং ম্যাট্রিক্স হবে

     1 10  3 12
     6 15  8 13
    11  4  9  2
    16  5 14  7
    

    কহন যে এন্ট্রি এক্স = 2, ওয়াই = 1 টি নতুন ম্যাট্রিক্স রৈখিক সূচকের সাথে এন্ট্রি সম্মুখের ওভাররাইট হবে 10, যে, এক্স = 3, Y = 2। এটিকে অ্যাসাইনমেন্ট ইনডেক্সিং বলা হয় : ইনডেক্সিং ম্যাট্রিক্স, একটি ডেটা ম্যাট্রিক্স এবং মূল ম্যাট্রিক্স ব্যবহার করুন এবং নির্দিষ্ট সূচকগুলিতে মূল ম্যাট্রিক্সে ডেটা লিখুন। এটি ফাংশন (, যা তিনটি ইনপুট নেয় (এটির ডিফল্ট কনফিগারেশনে)।

পদ্ধতি 1 আরও সোজা, তবে পদ্ধতি 2 আরও খাটো হয়ে উঠেছে।

tt     % Take the input implicitly and push two more copies
&n     % Get its size as two (equal) numbers: N, N
:qt    % Push range [0  1 ... N-1] twice. This represents the original x values
&+     % Matrix of all pairwise additions. This represents x+y
&y     % Push a copy of N onto the top of the stack
\      % Modulo. This is the new y coordinate: y_new
t      % Push another copy
b+     % Bubble up the remaining copy of [0 1 ... N-1] and add. This is 2*x+y
&y     % Push a copy of N onto the top of the stack
\      % Modulo. This is the new x coordinate: x_new
b*+    % Bubble up the remaining copy of N, multiply, add. This computes
       % x_new*N+y_new, which is the linear index for those x_new, y_new 
Q      % Add 1, because MATL uses 1-based indexing
(      % Assigmnent indexing: write the values of the original matrix into
       % (another copy of) the original matrix at the entries given by the
       % indexing matrix. Implicitly display the result

5

গণিত, 44 বাইট

(n=MapIndexed[RotateLeft[#,1-#2]&,#]&)@*n

লিনের দুর্দান্ত অ্যালগরিদমের একটি বন্দর । শেষের আগে ইউটিএফ -8 এনকোডিংয়ে একটি অদৃশ্য 3-বাইট অক্ষর, ইউ + এফ 3 সি 7 রয়েছে ]; গাণিতিক এটিকে একটি সুপারস্ক্রিপ্ট হিসাবে উপস্থাপন করে Tএবং এটি একটি ম্যাট্রিক্সের স্থানান্তর গ্রহণ করে।

গণিত, 54 বাইট

Table[#2[[Mod[2x-y-1,#]+1,Mod[y-x,#]+1]],{x,#},{y,#}]&

নামহীন ফাংশন দুটি আর্গুমেন্ট, ধনাত্মক পূর্ণসংখ্যা #এবং 2D #2মাত্রার #এক্স #অ্যারে গ্রহণ করে এবং একই আকারের 2D অ্যারে প্রদান করে। প্রদত্ত পরীক্ষার ক্ষেত্রে হিসাবে, স্থানাঙ্কগুলির সাথে বিন্দু {0,0। উপরের বামদিকে এবং এক্স-অক্ষটি অনুভূমিক। [[1,-1],[-1,2]]প্রশ্নটিতে উল্লিখিত বিপরীতটি ব্যবহার করে সোজা-বাস্তবায়ন বাস্তবায়নের -1জন্য অ্যাকাউন্টে প্রথম স্থানাঙ্কে অ্যারেগুলি সহজাতভাবে গাণিতিকায় 1-সূচিযুক্ত হয় for আমরা একটি অতিরিক্ত আর্গুমেন্ট হিসাবে ম্যাট্রিক্স মাত্রা নিতে মঞ্জুরিপ্রাপ্ত নন, তাহলে এই সমাধান নয় বাইট আর হয়ে (প্রথম প্রতিস্থাপন #-not #2-সঙ্গে a=Length@#এবং সমস্ত পরবর্তী #সঙ্গে গুলি aগুলি)।


ডাং, আমাকে এটিকে মারধর করুন
জংহওয়ান মিন

3

পাইথন 2, 89 82 77 73 বাইট

def f(a):exec'a=[l[-i:]+l[:-i]for i,l in enumerate(zip(*a))];'*2;return a

ইনপুট তালিকাগুলির একটি তালিকা,
এক্সিকিউটের অভ্যন্তরে থাকা স্ট্রিং প্রতিটি তালিকাকে চক্রাকারে রেখার সূচক দ্বারা আবর্তিত করে (0 ভিত্তিক - তৃতীয় লাইনটি ডানদিকে 2 বার ঘোরানো হয়)।
এই প্রক্রিয়াটি ইনপুটটিতে 2 বার করা হয়।

+4 বাইট যা রূপান্তরটি N বার করবে

def f(a,n):exec'a=[l[-i:]+l[:-i]for i,l in enumerate(zip(*a))];'*2*n;return a

2

হাস্কেল, 55 বাইট

m#n|r<-[0..n-1]=[[m!!mod(2*y-x)n!!mod(x-y)n|x<-r]|y<-r]

ব্যবহারের উদাহরণ: [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] # 4-> [[1,14,11,8],[12,5,2,15],[3,16,9,6],[10,7,4,13]]

0,0উপরের বাম কোণে। এটি বিপরীত রূপান্তর ব্যবহার করে।


1

পাইথন, 69 বাইট

lambda M:eval("[r[-i:]+r[:-i]for i,r in enumerate(zip(*"*2+"M))]))]")

রডের ট্রান্সপোজ এবং শিফট-দ্বিগুণ পদ্ধতির উন্নতি । M -> [r[-i:]+r[:-i]for i,r in enumerate(zip(*M))]স্ট্রিং তৈরি এবং মূল্যায়ন করে দুবার অপারেশন প্রয়োগ করে

[r[-i:]+r[:-i]for i,r in enumerate(zip(*[r[-i:]+r[:-i]for i,r in enumerate(zip(*M))]))]

চিত্রটি বর্গক্ষেত্রযুক্ত এবং এর দৈর্ঘ্য ইনপুট হিসাবে নেওয়া যেতে পারে ধরে ধরে এটি সংক্ষিপ্তভাবে প্রত্যক্ষ রূপান্তর (70 বাইট) মারবে:

lambda M,n:[[M[(2*j-i)%n][(i-j)%n]for i in range(n)]for j in range(n)]

1

ইমেজজে ম্যাক্রো, 29 বাইট

v=getPixel((x+y)%w,(2*y+x)%h)
  • লেনার উন্মুক্ত চিত্র
  • প্রক্রিয়া মেনু থেকে গণিত / ম্যাক্রো নির্বাচন করুন ...

এটি কি f perform (- 1) সম্পাদন করে না? এটি স্থানাঙ্কগুলিতে পিক্সেল মান পায় যা এটিতে সরাতে অনুমিত হয়। আপনি সম্ভবত বলতে চাইছেন v=getPixel((2*y-x)%w,(x-y)%h)
রবিন কোচ

@ রবিনকোচ ধন্যবাদ, 2*x+yপরিবর্তন করেছেন2*y+x
রাহনেমা 1

এটি আমি যা লিখেছিলাম তা নয় বা আমি কী বোঝাতে চাইছি তা নয়। আপনার পদ্ধতির জন্য আপনার বিপরীত রূপান্তর প্রয়োজন। জন্য f(x,y) = (2x+y, x+y)এই বিপরীত রূপান্তর দ্বারা বর্ণনা করা হয় f^(-1) = (x-y, 2y-x)। (আমার অন্য মন্তব্যটি ভুল ছিল)) সুতরাং আপনার কোডটি বামে v=getPixel((x-y)%w,(2*y-x)%h)
রবিন কোচ

আমি আমার সূত্রটি পরীক্ষা করেছিলাম এবং ফলাফলটি প্রশ্নে লেনার চিত্রের মতো
রাহনেমা 1

@ রবিনকোচ আপনি ইমেজজে ডাউনলোড করতে পারেন এবং উভয় সূত্র পরীক্ষা করতে পারেন
rahnema1

1

জাভা, 160

Golfed:

int[][]f(int[][]m){int x=0,y,l=m.length,r[][]=new int[l][];for(;x<l;++x)r[x]=new int[l];for(x=0;x<l;++x)for(y=0;y<l;++y)r[(x+y)%l][(2*x+y)%l]=m[y][x];return r;}

Ungolfed:

  int[][] f(int[][] m) {
    int x = 0, y, l = m.length, r[][] = new int[l][];
    for (; x < l; ++x) {
      r[x] = new int[l];
    }
    for (x = 0; x < l; ++x) {
      for (y = 0; y < l; ++y) {
        r[(x + y) % l][(2 * x + y) % l] = m[y][x];
      }
    }
    return r;
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.