পরিচয় স্যান্ডপাইল সন্ধান করুন


18

এই প্রশ্নটি হ'ল অ্যাবেলিয়ান স্যান্ডপাইলস সম্পর্কে । এই পূর্ববর্তী চ্যালেঞ্জটি পড়ুন এবং আরও জানতে এই নম্বর ফাইল ফাইলটি দেখুন।


আকারের abelian sandpile এন দ্বারা এন সংখ্যা 0, 1, 2 এবং 3 (বালির দানা সংখ্যা প্রতীক) সম্বলিত একটি গ্রিড হয়। দুই sandpiles যোগ করার পদ্ধতি প্রথম উপাদান দ্বারা উপাদান যোগ করুন, এবং তারপর করে কাজ করে toppling কোনো উপাদান যে 3. ক্রমে আপনি নীচে পড়া না ব্যাপার, শেষ ফলাফল একই থাকে উপরে চলে যায়। যখন কোনও কোষ টপলগুলি তার সংখ্যা 4 দ্বারা হ্রাস পায় এবং এর প্রত্যক্ষ প্রতিবেশী প্রতিটি 1 দ্বারা বৃদ্ধি পায় এটি শৃঙ্খলা প্রতিক্রিয়া সৃষ্টি করতে পারে। যদি কোনও ঘর গ্রিডের প্রান্তে থাকে, টপলিংয়ের সময় গ্রিড থেকে পড়ে এমন কোনও দানা অদৃশ্য হয়ে যায়।

উদাহরণস্বরূপ, আমি দুটি 3 বাই 3 স্যান্ডপাইল যুক্ত করছি (বরং চরম চেইন প্রতিক্রিয়া দিচ্ছি):

3 3 3   1 2 1   4 5 4    4 6 4    6 2 6    6 3 6    2 5 2    4 1 4    4 2 4    0 4 0    2 0 2    2 1 2
3 3 3 + 2 1 2 = 5 4 5 -> 6 0 6 -> 2 4 2 -> 3 0 3 -> 5 0 5 -> 1 4 1 -> 2 0 2 -> 4 0 4 -> 0 4 0 -> 1 0 1
3 3 3   1 2 1   4 5 4    4 6 4    6 2 6    6 3 6    2 5 2    4 1 4    4 2 4    0 4 0    2 0 2    2 1 2

এই প্রতিদ্বন্দ্বিতায় আমরা সব সম্ভব একটি উপসেট প্রতি আগ্রহ দেখিয়েছেন এন দ্বারা এন sandpiles। এই উপসেট কোনো sandpile যে সমস্ত -3 s একটি অবাধ sandpile যোগ করে পেতে পারেন রয়েছে এন দ্বারা এন sandpile। উদাহরণস্বরূপ, ঠিক উপরে আমরা দেখেছি এটি 212 | 101 | 212সাবসেটে রয়েছে, কারণ আমরা অল -3 স্যান্ডপাইলটিতে কিছু যুক্ত করে এটি পেয়েছি।

এখন এই উপসেটটিতে একটি আকর্ষণীয় উপাদান রয়েছে: পরিচয় উপাদান। যদি আপনি এই উপাদানটি গ্রহণ করেন এবং এটি উপসেটের অন্য কোনও উপাদানের সাথে যুক্ত করেন তবে যোগফল অপরিবর্তিত। অন্য কথায়, এই স্যান্ডপাইল এই উপসেটের শূন্যের মতো কাজ করে । এটি ঠিক তাই ঘটে যা 212 | 101 | 2123 দ্বারা 3 এর উপসেটের শূন্য উপাদান example উদাহরণস্বরূপ:

2 2 2   2 1 2   4 3 4    0 5 0    2 1 2    2 2 2
2 2 2 + 1 0 1 = 3 2 3 -> 5 2 5 -> 1 6 1 -> 2 2 2
2 2 2   2 1 2   4 3 4    0 5 0    2 1 2    2 2 2

: এখন এই আপনার চ্যালেঞ্জ দেওয়া এন , এর উপসেট পরিচয় উপাদান খুঁজে এন দ্বারা এন গ্রিড । প্রত্যেকের সাথে আপনার পছন্দের পর্যাপ্ত বৈসাদৃশ্য সহ একটি অনন্য রঙ নির্ধারণ করে 0, 1, 2, 3এবং একটি এন কে এন চিত্র দ্বারা আউটপুট করুন। আপনার কোডটি একটি যুক্তিসঙ্গত আধুনিক পিসিতে এক মিনিটের মধ্যে 50 বাই 50 কেস উত্পাদন করতে সক্ষম হতে হবে।


উদাহরণস্বরূপ, 500 বাই 500 পরিচয় উপাদান:

500 বাই 500 পরিচয় উপাদান

এখানে নীল = 3, সবুজ = 2, লাল = 1, সাদা = 0 রয়েছে তবে আপনাকে নিজের উত্তরে এই রঙের স্কিমটি ব্যবহার করতে হবে না।


2
প্রতিযোগীদের একটি সতর্কতার শব্দ: আমি সমাধানটি কী তা গণনা করার উপায় নয় তা বর্ণনা করেছি। আপনার কোডটি অবশ্যই এক মিনিটের মধ্যে 50 বাই 50 কেস উত্পাদন করতে সক্ষম হবে, তাই জোর করে জোর করা কোনও সম্ভাবনা নয়। এটি সমাধানের জন্য অ্যালগরিদম রয়েছে এবং আমি আপনাকে সেগুলি দিচ্ছি না। এটা ইচ্ছাকৃত। আমি অনুভব করি যে প্রচুর চ্যালেঞ্জগুলি আপনাকে প্রাক-চিবানো খাবার সরবরাহ করে। আমি আমার প্রথম বিবেচনায় একটি +100 অনুগ্রহ দেব যা আমার বিবেচনার ভিত্তিতে বিল্টিন (আপনার দিকে তাকানো, ম্যাথেম্যাটিকা) দিয়ে সমস্যাটিকে তুচ্ছ করে না।
orlp

2
আমি মনে করি 500x500 পরিচয়ের চিত্রটি প্রতিটি বর্ণের সাথে কী সংখ্যার সাথে মিল রেখে বলে উপকার করবে।
xnor

"যথেষ্ট বৈপরীত্য" গঠন কী?
কনর ও'ব্রায়ান

@ কনরও ব্রায়েন এমন কোনও রঙের সেট যা যথেষ্ট পার্থক্যযোগ্য। আমি কিছু রঙ পরিমাপের সাথে এটি 100% উদ্দেশ্য করতে পারি, তবে আমি মনে করি এটি অত্যধিক দক্ষ। আপনি লাল, হলুদ, সবুজ, গ্রেস্কেল বা অন্য কিছু ব্যবহার করেন কিনা সে সম্পর্কে আমি চিন্তা করি না, কেবল ধূসর বর্ণের 4 টি শেড ব্যবহার করবেন না যা প্রতিটিের 1% এর মধ্যে (যেমন # 000000, # 000001, # 000002, # 000003)।
orlp

আহেম আমি বিশ্বাস করি এই প্রশ্নটি এখন অনুগ্রহের যোগ্য eligible আমি কি +100 বোনাস পেতে পারি? :)
জংহওয়ান মিন

উত্তর:


2

অক্টাভা, 120 113 বাইট

function a=W(a);while nnz(b=a>3);a+=conv2(b,[t=[0 1 0];!t;t],'same')-b*4;end;end;@(n)imagesc(W((x=ones(n)*6)-W(x)))

জংহওয়ান মিনকে তার গণিতের উত্তরে রেফারেন্স পেপারের লিঙ্ক সরবরাহ করার জন্য ধন্যবাদ । স্টিভি গ্রিফিনের
জন্য ধন্যবাদ আমাকে 7 বাইট সংরক্ষণ করল[any(any(x)) -> nnz(x)]

এখানে দুটি ফাংশন ব্যবহৃত হয়:

1 f.: ম্যাট্রিক্সের স্থিতিশীলকরণের জন্য
২. একটি বেনামী ফাংশন যা nইনপুট হিসাবে গ্রহণ করে এবং পরিচয় ম্যাট্রিক্স দেখায়।

এটি চেষ্টা করুন রেক্সটেস্টার!50 * 50 ম্যাট্রিক্সের প্রজন্মের জন্য

ম্যাট্রিক্স গণনার জন্য সময় অতিবাহিত: 0.0844409 seconds

ব্যাখ্যা:

এমন একটি ফাংশন বিবেচনা করুন f যা একটি ম্যাট্রিক্সকে স্থিতিশীল করে সনাক্তকরণের কাজটি সহজভাবে

f(ones(n)*6 - f(ones(n)*6)

এর ones(n)*6অর্থ 6 এর একটি * এন ম্যাট্রিক্স।

সুতরাং জন্য n=3:

M = [6 6 6
     6 6 6
     6 6 6];

ফলাফল হবে f(M-f(M))

স্থিতিশীলতার জন্য 2D সমাপ্তি টাস্কটি গতিতে ব্যবহৃত হয়; প্রতিটি পুনরাবৃত্তিতে আমরা bইনপুট ম্যাট্রিক্সের একই আকারের সাথে বাইনারি ম্যাট্রিক্স তৈরি করি এবং ইনপুট ম্যাট্রিক্সের সংশ্লিষ্ট উপাদান> 3 3 হলে এটি 1 তে সেট করি। তারপরে আমরা নিম্নোক্ত মুখোশ সহ বাইনারি ম্যাট্রিক্সের 2D সমাবর্তন প্রয়োগ করি

0 1 0
1 0 1
0 1 0

চারটি সরাসরি প্রতিবেশী প্রতিনিধিত্ব করে।
সমঝোতার ফলাফলটি ম্যাট্রিক্সে যুক্ত হয় এবং 4 বার বাইনারি ম্যাট্রিক্স এটি থেকে বিয়োগ করে।

ম্যাট্রিক্সের সমস্ত উপাদান <= 3 না হওয়া পর্যন্ত লুপটি অবিরত ছিল

অবরুদ্ধ সংস্করণ :

function a=stabilize(a)
    mask = [t=[0 1 0];!t;t];
    while any(any(b=a>3))
        a+=conv2(b,mask,'same')-b*4;
    end
end
n= 50;
M = ones(n)*6;
result = stabilize(M-stabilize(M));
imagesc(result);

8

গণিত, 177 157 135 133 বাইট

Colorize[f=BlockMap[⌊{l={0,1,0},1-l,l}#/4⌋~Total~2+#[[2,2]]~Mod~4&,#~ArrayPad~1,{3,3},1]&~FixedPoint~#&;k=Table[6,#,#];f[k-f@k]]&

একটি সংখ্যা নেয় n। আউটপুট হ'ল পরিচয় স্যান্ডপাইল। 0 টি কালো, 1 টি হালকা ধূসর, 2 টি ম্যাজেন্টা এবং 3 টি নীল-ধূসর।

দুঃখের বিষয়, ম্যাথমেটিকার কাছে এর জন্য কোনও বিল্টিন নেই ...

স্কট ক্যারি এবং ডেভিড পারকিনসনের কাগজে বর্ণিত অ্যালগরিদম ব্যবহার করুন ।

50x50 পরিচয় স্যান্ডপাইল গণনা করতে আমার 5 বছর বয়সী ল্যাপটপে 91.7 সেকেন্ড সময় নেয়। আমি বিশ্বাস করি যে একটি যুক্তিসঙ্গত আধুনিক ডেস্কটপ কম্পিউটার 50% এরও বেশি দ্রুত। (আমারও শেষে একটি উপায় দ্রুত কোড রয়েছে)।

ব্যাখ্যা

f= ...

ফাংশন সংজ্ঞায়িত করুন f(ইনপুটটি একটি স্যান্ডপাইল ম্যাট্রিক্স): এমন একটি ফাংশন যা ...

BlockMap[ ... ]~FixedPoint~#&

... BlockMapআউটপুট পরিবর্তিত হয় না হওয়া পর্যন্ত অপারেশন পুনরাবৃত্তি । BlockMapঅপারেশন: ...


#~ArrayPad~1

... 0 এর এক স্তর দিয়ে ইনপুট অ্যারে প্যাড করুন ...

{3,3},1

... এটি অফসেট 1 সহ 3x3 ম্যাট্রিকগুলিতে ভাগ করুন ...

⌊{l={0,1,0},1-l,l}#/4⌋~Total~2+#[[2,2]]~Mod~4&

... এবং প্রতিটি বিভাজনের জন্য, কেন্দ্রের ঘরে এবং কেন্দ্রের ঘর মান মোডে টপল করা বালির দানার সংখ্যা যুক্ত করুন।

অর্থাত্ আউটপুট fহ'ল ইনপুটটির স্থিতিশীল সংস্করণ।


k=Table[6,#,#]

নির্ধারণ করুন kএকটি হিসাবে এন দ্বারা এন 6s অ্যারে।

f[k-f@k]]

গণনা চ (কে - ফ (কে))।

Colorize[ ... ]

ফলাফলের জন্য রঙ প্রয়োগ করুন।

দ্রুততম সংস্করণ (142 বাইট)

Colorize[r=RotateLeft;a=ArrayPad;f=a[b=#~a~1;b+r[g=⌊b/4⌋,s={0,1}]+g~r~-s+r[g,1-s]+r[g,s-1]-4g,-1]&~FixedPoint~#&;k=Table[6,#,#];f[k-f@k]]&

একই কোড, তবে এর পরিবর্তে অন্তর্নির্মিত তালিকা ঘূর্ণন ব্যবহার করে BlockMap। আমার ল্যাপটপে 4.0 সেকেন্ডে এন = 50 কে গণনা করুন।


আপনি সময়সীমাটির চেতনা অনুসরণ করেছেন বলে বিবেচনা করে (ব্রুট ফোর্সের চেয়ে সত্যিকারের অ্যালগরিদম বাস্তবায়ন করে) এবং এটি অত্যন্ত প্রশংসনীয় যে একটি শক্তিশালী ডেস্কটপ কম্পিউটার 50% দ্রুত, আমি এটির অনুমতি দেব। যেহেতু এটি একটি তুচ্ছ বিল্ট-ইন ব্যতীত একটি আসল অ্যালগরিদম প্রয়োগ করে, এটি +100 বোনাসের জন্য যোগ্যতা অর্জন করে। আপনাকে অবশ্য এর জন্য অপেক্ষা করতে হবে, কারণ আমি এখনও কোনও অনুগ্রহ শুরু করতে পারি না।
orlp

বলা হচ্ছে, পাইথনে এটি বেশ তুচ্ছভাবে প্রয়োগ করা (একটি কুখ্যাত ধীর ভাষা), কেবলমাত্র এন = 50 এর জন্য ~ 2s লাগে Maybe সম্ভবত আপনি এটিকে কিছুটা গতি দিতে পারেন?
orlp

@orlp সম্পন্ন হয়েছে তবে এটি মূল কোডের চেয়ে দীর্ঘ। আমি কি দ্রুত সংস্করণটি আমার প্রধান উত্তরটি তৈরি করব বা আমি কেবল এটিকে শেষে রেখে দিতে পারি?
জংহওয়ান মিন

এই মত আমি মনে করি ঠিক আছে।
orlp

0

পাইথন 3 + নম্পি + পিআইএল, 385 370 364 বাইট

import numpy as q,PIL.Image as w
n=int(input())
z=n,n
def r(p):
 while len(p[p>3]):
  for x,y in q.ndindex(z):
   if p[x,y]>3:
    p[x,y]-=4;p[x-1,y]+=x>0;p[x,y-1]+=y>0
    if~-n>x:p[x+1,y]+=1
    if~-n>y:p[x,y+1]+=1
s=q.full(z,6)
t=s.copy()
r(t)
i=s-t
r(i)
w.fromarray(q.uint8(q.array(q.vectorize(lambda x:[x//1*65]*3,otypes=[object])(i).tolist()))).save('i.png')

STDIN এ ইনপুট নেয়। চিত্রটিকে গ্রেস্কেল হিসাবে আউটপুট করে i.png। কালো 0 টি, গা gray় ধূসর 1 এর সাথে হালকা ধূসর, 2 থেকে সাদা এবং 0 এর সাথে মিল রয়েছে।

সূত্রটি ব্যবহার করে I = R(S - R(S)), যেখানে Iপরিচয় উপাদান রয়েছে, Sতা ম্যাট্রিক্সটি ছয়টি দিয়ে পূর্ণ, এবং Rহ্রাস ফাংশন।

আমি পাইথন 2 এ গিয়ে কিছু করে বাইট বাঁচাতে পেরেছিলাম from numpy import*, কিন্তু (1) আমার কাছে পাইপথন 2-তে নম্পি ইনস্টল নেই এবং (2) প্রোগ্রামটি শেষ হচ্ছে না from numpy import*

Ungolfed:

import numpy as np
from PIL import Image

# Compute the identity element

n = int(input('Size of the sandpile: '))

def reduce_pile(sandpile):
  while any(element >= 4 for element in np.nditer(sandpile)):
    for x, y in np.ndindex((n, n)):
      if sandpile[x, y] >= 4:
        sandpile[x, y] -= 4
        if x > 0: sandpile[x - 1, y] += 1
        if y > 0: sandpile[x, y - 1] += 1
        if x < n - 1: sandpile[x + 1, y] += 1
        if y < n - 1: sandpile[x, y + 1] += 1

s = np.full((n, n), 6, dtype=np.int32)
s_prime = np.copy(s)

reduce_pile(s_prime)

identity = s - s_prime
reduce_pile(identity)

# Output it to identity.png as an image

colours = [[255, 255, 255], [255, 0, 0], [0, 255, 0], [0, 0, 255]]
img_array = np.vectorize(lambda x: colours[x], otypes=[object])(identity)
img_array = np.array(img_array.tolist(), dtype=np.uint8)

img = Image.fromarray(img_array)
img.save('identity.png')

আপনি পিআইএল দিয়ে স্পষ্টভাবে কোনও চিত্র উত্পন্ন করার পরিবর্তে ডেটা ব্যবহার করে scipyবা matplotlibপ্রদর্শন করে বাইটস সংরক্ষণ করতে পারবেন ।
orlp
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.