একটি স্যান্ডপাইল তৈরি করুন


59

একটি আবেলীয় স্যান্ডপাইল , আমাদের উদ্দেশ্যে, একটি অসীম গ্রিড যা পূর্ণসংখ্যার স্থানাঙ্ক সহ প্রাথমিকভাবে বালি খালি থাকে। প্রতি সেকেন্ডের পরে, বালির একটি দানা স্থাপন করা হয় (0,0)। যখনই কোনও গ্রিড কোষে 4 বা ততোধিক শস্য বালি থাকে, এটি তার চার প্রতিবেশীর এক সাথে একই সাথে একটি করে শস্য বালি ছড়িয়ে দেয়। (X, y) এর প্রতিবেশী হলেন (x-1, y), (x + 1, y), (x, y-1), এবং (x, y + 1)।

যখন কোনও কোষ ছড়িয়ে পড়ে তখন এটি তার প্রতিবেশীদের ছড়িয়ে পড়তে পারে। কিছু ঘটনা:

  • এই ক্যাসকেড শেষ পর্যন্ত থামবে।
  • যে ক্রমে কোষগুলি ছড়িয়ে পড়ে তা অপ্রাসঙ্গিক; ফলাফল একই হবে।

উদাহরণ

3 সেকেন্ড পরে, গ্রিড মত দেখাচ্ছে

.....
.....
..3..
.....
.....

4 সেকেন্ড পরে:

.....
..1..
.1.1.
..1..
.....

15 সেকেন্ড পরে:

.....
..3..
.333.
..3..
.....

এবং 16 সেকেন্ড পরে:

..1..
.212.
11.11
.212.
..1..

চ্যালেঞ্জ

যতটা সম্ভব বাইটে, এমন একটি ফাংশন লিখুন যা একক ধনাত্মক পূর্ণসংখ্যার টি নেয় এবং টি সেকেন্ডের পরে স্যান্ডপাইলের ছবি আউটপুট করে ।

ইনপুট

আপনার চয়ন করা যে কোনও বিন্যাসে একটি একক ধনাত্মক পূর্ণসংখ্যা টি

আউটপুট

অক্ষরগুলি ব্যবহার করে টি সেকেন্ড পরে স্যান্ডপাইলের একটি ছবি

 . 1 2 3

সম্পাদনা: আপনার পছন্দ মতো চারটি স্বতন্ত্র অক্ষর ব্যবহার করুন বা একটি ছবি আঁকুন। আপনি যদি ".123" বা "0123" ব্যবহার করছেন না, অক্ষরগুলি কী বোঝায় তা আপনার উত্তরে উল্লেখ করুন।

উদাহরণগুলির বিপরীতে, আপনার আউটপুটে স্যান্ডপাইলের নানজারো অংশটি দেখানোর জন্য প্রয়োজনীয় ন্যূনতম সংখ্যক সারি এবং কলাম থাকা উচিত।

অর্থাৎ ইনপুট 3 এর জন্য আউটপুট হওয়া উচিত

 3

4 এর জন্য, আউটপুট হওয়া উচিত

 .1.
 1.1
 .1.

স্কোরিং

স্ট্যান্ডার্ড গল্ফ স্কোরিং প্রযোজ্য।

বিধি

কোনও ভাষা ফাংশন বা পাঠাগারগুলি যা ইতিমধ্যে জানে যে একটি স্যান্ডপাইল অনুমোদিত is

সম্পাদনা: আউটপুট বিভাগটি সম্পাদনা করা হয়েছে, অক্ষর সেট বিধিনিষেধ সম্পূর্ণরূপে সরানো হয়েছে। আপনার পছন্দ মতো চারটি স্বতন্ত্র অক্ষর বা রঙ ব্যবহার করুন।


2
ইনপুট টি কি হতে পারে 0? তাহলে আউটপুট কি?
লুইস মেন্ডো

1
এটি নির্দিষ্ট সময়টির জন্য কি একাধিক ক্যাসকেড এককভাবে সংঘটিত হতে পারে? সুতরাং সেই টাইমস্টেপে প্রতিটি ঘর আবার 3 বা তার কম না হওয়া পর্যন্ত ক্যাসকেডগুলি ঘটতে থাকবে?
flawr

2
@ ফ্লোয়ার: হ্যাঁ, এটি সঠিক হবে। টি = 15 এবং টি = 16 এর মধ্যে পার্থক্যটি দেখুন।
এল'েন্ডিয়া স্টারম্যান

@ লুইসেমেন্ডো ইনপুটটি ইতিবাচক টি হিসাবে নির্দিষ্ট করা হয়েছে , সুতরাং শূন্যটি কোনও বৈধ ইনপুট নয়।
এরিক ট্র্রেসার

1
.খালি কোষগুলির জন্য এটি কি কেবল প্রয়োজনীয় ? আমরা কি 0একটি বৈধ খালি ঘর হিসাবে থাকতে পারি ?
Andreï Kostyrka

উত্তর:


56

আর, 378 343 297 291 বাইট

সাধারণত, ব্যবহারকারী তার / তার ইনপুট সরবরাহ করে scan()(আমি ইতিমধ্যে ভেরিয়েবলটি ব্যবহার করেছি t, সুতরাং এর zপরিবর্তে আসি ), সুতরাং দ্বিতীয় লাইনটি আলাদাভাবে চালু করা উচিত এবং তারপরে বাকীটি:

e=numeric
a=1%*%scan()
x=1
o=a>3
n=1
while(any(o)){
v=which(o,T)
if(any(v==1)){a=rbind(e(n+2),cbind(e(n),a,e(n)),e(n+2));x=x+1;n=n+2;v=which(a>3,T)}
q=nrow(v)
u=cbind(e(q),1)
l=v-u[,1:2];r=v+u[,1:2];t=v-u[,2:1];b=v+u[,2:1]
a[l]=a[l]+1;a[r]=a[r]+1;a[t]=a[t]+1;a[b]=a[b]+1
a[v]=a[v]-4
o=a>3}
a

একটি অ্যারের যে মান রয়েছে আউটপুট করে atম প্রজন্ম (0, 1, 2 অথবা 3)।

পরীক্ষার কেস:

z=3
     [,1]
[1,]    3
z=4
     [,1] [,2] [,3]
[1,]    0    1    0
[2,]    1    0    1
[3,]    0    1    0
z=16
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    1    0    0
[2,]    0    2    1    2    0
[3,]    1    1    0    1    1
[4,]    0    2    1    2    0
[5,]    0    0    1    0    0

এটি আমাদের সহায়তা করে যে এই জিনিসটি উভয় এবং উলম্বভাবে সমান্তরাল, যার অর্থ বাম দিকের পয়েন্টটি 4 এর উচ্চতা পায়, এর অর্থ শীর্ষস্থানীয়, ডানদিকের এবং নিম্নতম পয়েন্টগুলিও 4।

ওহ, এবং আমি কি বলেছিলাম যে আপনি সুন্দর দর্শন করতে পারেন?

1000 ফোঁটা পরে:

1000 পদক্ষেপের পরে অ্যাবেলিয়ান স্যান্ডপাইল

50000 ফোঁটা (seconds4 সেকেন্ড) পরে:

500,000 পদক্ষেপের পরে অ্যাবেলিয়ান স্যান্ডপাইল

333333 ড্রপ পরে (15 মিনিট):

100,000 পদক্ষেপের পরে অ্যাবেলিয়ান স্যান্ডপাইল

আপনি এটি আঁকতে পারেন!

image(1:n,1:n,a,col=colorRampPalette(c("#FFFFFF","#000000"))(4), axes=F, xlab="", ylab="")

এই জিনিসটি 10000 পুনরাবৃত্তির জন্য 4 সেকেন্ড সময় নিয়েছে তবে বড় অ্যারের আকারের জন্য (যেমন, 100000 পুনরাবৃত্তির জন্য কয়েক মিনিট কয়েক মিনিট) ধীর হয়ে যায়। এ কারণেই এটি এত ধীর হয়ে যায় (আমি হিসাবে বৃদ্ধির হার অনুমান করেছি বৃদ্ধির হারএবং অর্জন করেছি i (i) ≈689 ^ i ^ 1.08, সুতরাং পুরো স্যান্ডপাইল পর্বের পরে স্থির না হওয়া পর্যন্ত প্রতি অতিরিক্ত শস্যের গড় সময় একের iচেয়ে সামান্য বড় হয়) , এবং শস্যের সংখ্যার ফাংশন হিসাবে মোট সময়টি চতুর্ভুজের তুলনায় কিছুটা ধীর গতিতে বেড়ে যায় (টি (i) ≈0.028 * i ^ 1.74):

স্তূপ স্থির না হওয়া পর্যন্ত গড় পুনরুক্তি

আনুমানিক গণনার সময়

এবং এখন একটি সম্পূর্ণ ব্যাখ্যা সহ:

e=numeric # Convenient abbreviation for further repeated use
a=1%*%scan() # Creates a 1×1 array with a user-supplied number
x=1 # The coordinate of the centre
o=a>3 # Remember which cells were overflown
n=1 # Array height that is going to change over time
while(any(o)){ # If there is still any overflow
  v=which(o,T) # Get overflown cells' indices
  if(any(v==1)){ # If overflow occurred at the border, grow the array
    a=rbind(e(n+2),cbind(e(n),a,e(n)),e(n+2)) # Growing
    x=x+1 # Move the centre
    n=n+2 # Change the height
    v=which(a>3,T) # Re-index the overflowed cells
    }
  q=nrow(v) # See how many indices are overflown
  u=cbind(e(q),1) # Building block for neighbours' indices
  l=v-u[,1:2];r=v+u[,1:2];t=v-u[,2:1];b=v+u[,2:1] # L, R, T, B neighbours
  a[l]=a[l]+1;a[r]=a[r]+1;a[t]=a[t]+1;a[b]=a[b]+1 # Increment neighbours
  a[v]=a[v]-4 # Remove 4 grains from the overflown indices
  o=a>3} # See if still overflown indices remain
a # Output the matrix

আমার জীবনে এই প্রথম যখন ক্রমবর্ধমান বস্তুগুলি (যেমন a <- c(a, 1)) মানগুলির জন্য একটি বড় ফাঁকা ম্যাট্রিক্সকে প্রাক বরাদ্দকরণ এবং এক টন জিরো অব্যবহৃত ব্যবহারের সাথে ধীরে ধীরে পূরণ করার চেয়ে এত দ্রুত কাজ করে।

হালনাগাদ. সরানোর 18 বাইট Golfed arr.indমধ্যে whichবকেয়া Billywob এবং প্রতিস্থাপন rep(0,n)সঙ্গে e=numeric;e(n)5 বকেয়া স্থানেই JDL , 17 আরো বাইট বকেয়া JDL

আপডেট ২. যেহেতু স্যান্ডপাইলটি আবেলিয়ান, এটি পছন্দসই উচ্চতার একটি স্ট্যাক দিয়ে শুরু হতে পারে, তাই আমি অপ্রয়োজনীয় লুপটি সরিয়ে দিয়েছি এবং উত্পাদনশীলতায় বিশাল উত্সাহ অর্জন করেছি!


1
আমি অতিরিক্ত কলাম, সারি সূচকগুলি সম্পর্কে আপনার বক্তব্যটি পেয়েছি যা আপনি আউটপুট করছেন তবে আমি মনে করি যে আমি আউটপুটটিকে কেবল "উত্তর" হিসাবে সীমাবদ্ধ করতে চাই এবং আরও কিছু নয়। যদিও আপনি ছবিগুলি অন্তর্ভুক্ত করেছেন আমি আনন্দিত।
এরিক ট্র্রেসার

1
সুন্দর উত্তর আন্দ্রে! আপনি অবশ্যই কিছু বাইট অবশ্যই গল্ফ করতে পারেন যদিও উদাহরণস্বরূপ পূর্বনির্ধারিত হিসাবে rep()আপনি এটি 6 বার ব্যবহার করেছেন। দ্বিতীয়ত, আমি মনে করি না আপনি ফাংশন arr.ind=Tজন্য বিকল্প লিখতে প্রয়োজন which()। সহজভাবে ব্যবহার করুন which(...,T)
বিলিওব

1
এটি সংজ্ঞা দেওয়া n=numericএবং পরিবর্তে এটি ব্যবহার করা গল্ফিয়ার হতে পারে , যেহেতু n(k)এর চেয়ে কম অক্ষর রয়েছে r(0,k)। আমি যদিও ছবিগুলি পছন্দ করি।
জেডিএল

1
আরেকটি পরামর্শ: 1%*%0এর চেয়ে কম অক্ষর array(0,c(1,1))। এছাড়াও দ্বিতীয় আর্গুমেন্টটি u <- cbind1 হতে পারে, cbindএটি ডিফল্টরূপে প্রথম আর্গুমেন্টের দৈর্ঘ্যে প্রসারিত করবে।
জেডিএল

1
@ গ্রেগমার্টিন এটি স্থির করেছে তার জন্য দুঃখিত; আমার প্রথম ভাষায়, আমরা "স্ব-এর" শব্দটি ব্যবহার করি এবং প্রশ্নযুক্ত ব্যক্তির লিঙ্গ সম্পর্কে কখনই মাথা ঘামাই না (যেমন "কোনও পুরুষের জন্য একটি ছোট পদক্ষেপ"); তবুও, কখনও কখনও, খুব বিরল অনুষ্ঠানে আমি একটি কুকুরকে "সে" বা "তিনি" বলি, যদিও এটি "এটি" হওয়া উচিত, যতক্ষণ না আপনি মালিক হন এবং আপনি সত্যই আপনার ব্যথার লিঙ্গের উপর জোর দিতে চান না ( তবুও যে স্ত্রী থেকে একজন পুরুষকে বলা খুব কঠিন নয়))
Andreï Kostyrka

13

এমএটিএল , 55 53 48 43 42 বাইট

দ্বারা অনুপ্রাণিত @ flawr এর উত্তর

গ্রাফিকাল আউটপুট :

0i:"Gto~+XytP*+t"t4=t1Y6Z+b+w~*]]tat3$)1YG

এমএটিএল অনলাইন এ চেষ্টা করুন! । ইনপুটটির জন্য এটি প্রায় 10 সেকেন্ড সময় নেয় 30। আপনার পৃষ্ঠাটি রিফ্রেশ করতে হবে এবং যদি এটি কাজ না করে তবে আবার "রান" টিপুন।

ইনপুট জন্য এখানে উদাহরণ ফলাফল 100:

এখানে চিত্র বর্ণনা লিখুন

এএসসিআইআই আউটপুট (43 বাইট) :

0i:"Gto~+XytP*+t"t4=t1Y6Z+b+w~*]]tat3$)48+c

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

ব্যাখ্যা

0          % Push a 0. This is the initial array. Will be resized in first iteration
i:         % Take input n. Generate range [1 2 ... n]
"          % For each, i.e. repeat n times
  Gto~+    %   Push input and add negate parity. This "rounds up" n to odd number
           %   m = n or n+1
  Xy       %   Identity matrix with that size
  tP*      %   Multiply element-wise by vertically flipped copy. This produces a
           %   matrix with a 1 in the center and the rest entries equal to 0
  +        %   Add to previous array. This updates the sandpile array
  t        %   Duplicate
  "        %   For each column (i.e. repeat m times)
    t4=    %     Duplicate. Compare with 4 element-wise. This gives a 2D mask that
           %     contains 1 for entries of the sandpile array that equal 4, and 0
           %     for the rest
    t      %     Duplicate
    1Y6    %     Predefined literal: [0 1 0; 1 0 1; 0 1 0]
    Z+     %     2D convolution, maintaining size
    b      %     Bubble up to bring sandpile array to top
    +      %     Element-wise addition. This adds 1 to the neighbours of a 4
    w      %     Swap to bring copy of mask to top
    ~*     %     Multiply bu negated mask. This removes all previous 4
  ]        %  End
]          % End
t          % Duplicate the updated sandpile array
a          % 1D mask that contains 1 for columns that contain a 1. This will be
           % used as a logical index to select columns
t          % Duplicate. This will be used as logical index to select rows (this
           % can be done because of symmetry)
3$)        % Keep only those rows and columns. This trims the outer zeros in the
           % sandpile array
1YG        % Display as scaled image

3
আমি jeর্ষা করছি 1Y6
flawr

1
@ ফ্লোয়ার তবে আপনারা ~mod(spiral(3),2)আরও চালাক :-)
লুইস মেন্ডো

11

মতলব, 160 156 148 বাইট

n=input('');z=zeros(3*n);z(n+1,n+1)=n;for k=1:n;x=z>3;z=z+conv2(+x,1-mod(spiral(3),2),'s');z(x)=z(x)-4;end;v=find(sum(z));z=z(v,v);[z+48-(z<1)*2,'']

nমাঝখানে কোথাও কোথাও কোথাও না কোনও উপায় নিয়ে খুব বড় ম্যাট্রিক্স তৈরি করা হয় । তারপরে ক্যাসকেডিংটি খুব সুবিধাজনক 2 ডি সমঝোতার সাথে গণনা করা হয়। শেষে অতিরিক্ত ছাঁটাই করা হয় এবং পুরো জিনিসটি একটি স্ট্রিতে রূপান্তরিত হয়।

উদাহরণস্বরূপ আউটপুট t=100

...121...
..32.23..
.3.323.3.
123.3.321
2.23.32.2
123.3.321
.3.323.3.
..32.23..
...121...

যথারীতি:

সংকল্প সাফল্যের মূল চাবিকাঠি।


v=any(z)পরিবর্তে v=find(sum(z))(আমি আমার উত্তরে এটি ব্যবহার করছি)। এছাড়াও, এর 2*~zপরিবর্তে(z<1)*2
লুইস মেন্ডো

আমার কম্পিউটার ইনপুটটিতে হিমশীতল n=500... এটি n=400কয়েক সেকেন্ডের জন্য প্রক্রিয়াজাত ছিল । আমি কি ভুল কিছু করছি?
Andreï Kostyrka

@ AndreïKostyrka এটি আমার জন্য কাজ করে (মতলব আর ২০১৫ বি)
লুইস মেন্ডো

1
@ AndreïKostyrka nএই প্রোগ্রামের একটি ইনপুট জন্য একটি 3*n x 3*nম্যাট্রিক্স উত্পন্ন করে , তাই এটির জন্য প্রায় 9*n^2সংখ্যা সঞ্চয় করা দরকার । এছাড়াও এটি সম্পূর্ণরূপে অকার্যকর, কারণ আমাদের কাছে 1 থেকে এন পর্যন্ত সম্পূর্ণ অপ্রয়োজনীয় দীর্ঘ পুনরাবৃত্তি রয়েছে। তবে তারপরে আবার এটি কোড-গল্ফ , একটি প্রোগ্রামকে দক্ষ করে তোলা অন্য এক কাপ চা।
flawr

@ AndreïKostyrka আপনি স্পারস ম্যাট্রিক্স (দ্বিতীয় লাইন z=sparse(zeros(2*n+1)):) ব্যবহার করে এবং লুপের জন্য লুপটি পরিবর্তন করে এটি আরও মেমরির দক্ষ করতে পারেন while any(z(:)>3)। তারপর আপনি সম্ভবত মাত্র একবার সংবর্তন কার্নেল গনা করতে পারেন: kern = 1-mod(spiral(3),2)
flawr

9

পাইথন 2, 195 +1 +24 = 220 217

from pylab import*
ifrom scipy.signal import convolve2d as c
k=(arange(9)%2).reshape(3,3)
def f(n):g=zeros((n,n),int);g[n/2,n/2]=n;exec"g=c(g/4,k,'same')+g%4;"*n;return g[any(g,0)].T[any(g,0)]

n = 16 এর জন্য আউটপুট

array([[0, 0, 1, 0, 0],
       [0, 2, 1, 2, 0],
       [1, 1, 0, 1, 1],
       [0, 2, 1, 2, 0],
       [0, 0, 1, 0, 0]])

n"গুড-পর্যাপ্ত" উপরের বাউন্ড হিসাবে ব্যবহার করে প্রচুর অপ্রয়োজনীয় প্যাডিং এবং পুনরাবৃত্তি রয়েছে, তবে এন = ২০০ এখনও এক সেকেন্ডে এবং n = 500 প্রায় 12 সেকেন্ডে সম্পূর্ণ হয়েছে

ungolfed

from pylab import*
from scipy.signal import convolve2d as c
k=array([0,1,0],
        [1,0,1],
        [0,1,0])
def f(n):
  g=zeros((n,n))                 # big grid of zeros, way bigger than necessary
  g[n/2,n/2]=n                   # put n grains in the middle
  exec"g=c(g/4,k,'same')+g%4;"*n # leave places with <4 grains as is, convolve the rest with the kernel k, repeat until convergence (and then some more)
  return g[any(g,0)].T[any(g,0)] # removes surrounding 0-rows and columns

প্রতিস্থাপন return xদ্বারা imshow(x)একটি অক্ষর যোগ করা হয়েছে এবং একটি কুশ্রী ইন্টারপোলেট ইমেজ আউটপুট যোগ imshow(x,'gray',None,1,'nearest')ঝাপসা ক্ষেপক চশমা পর্যন্ত আউটপুট আনয়ন সরিয়ে ফেলা হবে

এন = 100


যখন আমি আপনার কোড চালানো আমি নিম্নলিখিত ত্রুটির পাবেন: ImportError: No module named convolve2d। ইস্যু সমাধানে পরিবর্তন import scipy.signal.convolve2d as cকরা from scipy.signal import convolve2d as c। আমি স্কিপি সংস্করণ 0.16.1 ব্যবহার করছি, আমার কি আরও পুরানো বা আরও নতুন সংস্করণ প্রয়োজন? নাকি বিষয়টি অন্য কিছু?
অ্যান্ড্রু এপস্টেইন

আজব, এখন আপনি উল্লেখ করেছেন যে এটি আমার পক্ষে আর কাজ করে না। আমি সম্ভবত এটি প্রথম প্রথম ইন্টারেক্টিভ মোডে করেছি, তারপরে এটি সংক্ষিপ্ত করে ত্রুটিটিকে উপেক্ষা করেছি, তবে ফাংশনটি স্মৃতিতে রয়ে গেছে
ডেনডেনডো

6

পার্ল, 157 147 বাইট

এর জন্য +1 অন্তর্ভুক্ত -p

STDIN এ গণনা সহ চলুন, STDOUT ব্যবহার করে মানচিত্রটি মুদ্রণ করুন 0123:

sandpile.pl <<< 16

sandpile.pl:

#!/usr/bin/perl -p
map{++substr$_,y///c/2-1,1;/4
/?$.+=s%^|\z%0 x$..$/%eg+!s/\b/0/g:s^.^$&%4+grep{3<substr$\,0|$_+"@+",1}-$.-2,-2,0,$.^eg while/[4-7]/}($\="0
")x$_}{

5

পাইথন 3 2, 418 385 362 342 330 বাইট

w='[(i,j)for i in r(n)for j in r(n)if a[i][j]>3]'
def f(z):
 a,x,r=[[z]],0,range
 for _ in[0]*z:
  n=len(a);v=eval(w)
  if[1for b,c in v if(b==0)+(c==0)]:n+=2;a=[[0]*n]+[[0]+a[i]+[0]for i in r(n-2)]+[[0]*n];x+=1;v=eval(w)
  for c,d in v:exec'a[c+%s][d+%s]+=1;'*4%(-1,0,1,0,0,-1,0,1);a[c][d]-=4
 for i in a:print''.join(map(str,i))

সম্পাদনা করুন: @ কিওয়ার্প-ডের্পকে ধন্যবাদ 6 টি বাইট সংরক্ষণ করা হয়েছে

@ অ্যান্ড্রে কোস্টায়রকার সমস্ত ক্রেডিট, কারণ এটি পাইথনে তাঁর আর কোডের সরাসরি অনুবাদ।


আমি মনে করি আপনি অ্যাসাইনমেন্টটি a,x,rফাংশন আর্গুমেন্টের মধ্যে স্থানান্তর করতে পারেন ।
লুভজো

1
আমি আপনার কোডটি কয়েকটি বাইট দ্বারা গল্ফ করে ফেলেছি ... এটি খুব বেশি নয় তবে এটি করতে হবে। আমি যদি আপনার উত্তরে একটি সম্পাদনা রাখি এবং পাইথনের সংস্করণটি পাইথন 2 তে পরিবর্তন করি তবে আপনি কি আপত্তি করেন?
কিউয়ার্প-ডের্প

@ কিউয়ার্প-ডার্প: নিখরচায়! আপনি কি করেছেন তা দেখতে আমি পছন্দ করব।
অ্যান্ড্রু এপস্টেইন

3

জাভাস্ক্রিপ্ট, 418 416 406 400 393 বাইট

একটি বেনামি ফাংশন তৈরি করে যা কনসোলে আউটপুট প্রদর্শন করে।

var f =
    t=>{a=(q,w)=>Math.max(q,w);c=_=>{x=a(p[0],x);y=a(p[1],y);m[p]=(g(p)+1)%4;if(!m[p]){s.push([p[0],p[1]]);}};x=y=0,m={};g=k=>{v=m[k];return!v?0:v;};m[o=[0,0]]=1;s=[];while(--t){m[o]=(m[o]+1)%4;if(!m[o]){s.push(o);}while(s.length){p=s.pop();p[0]++;c();p[0]-=2;c();p[0]++;p[1]++;c();p[1]-=2;c();p[1]++;}}s='';for(i=-x;i<=x;i++){for(j=-y;j<=y;j++){v=g([i,j]);s+=v==0?'.':v;}s+='\n';}console.log(s);}
<input id="i" type="number"><input type="button" value="Run" onclick="var v = +document.getElementById('i').value; if (v>0) f(v)">


1
সতর্কতা: আমি ইনপুট ছাড়াই 'রান' চাপলাম এবং আমার স্ক্রিন ক্র্যাশ হয়ে গেছে (অসীম লুপ)। আমার মতো মূর্খ হয়ে উঠো না।
রবার্ট-এস

1
@ রবার্ট আমি এড়াতে আমার উত্তর আপডেট করেছি।
hetzi

3

নিম, 294 টি অক্ষর

import os,math,sequtils,strutils
var
 z=parseFloat paramStr 1
 y=z.sqrt.toInt+1
 w=y/%2
 b=y.newSeqWith newSeq[int] y
 x=0
proc d(r,c:int)=
 b[r][c]+=1;if b[r][c]>3:b[r][c]=0;d r-1,c;d r,c+1;d r+1,c;d r,c-1
for i in 1..z.toInt:d w,w
while b[w][x]<1:x+=1
for r in b[x..< ^x]:echo join r[x..< ^x]

সংকলন এবং রান করুন:

nim c -r sandbox.nim 1000

নোট:

  1. আমি একটি সংক্ষিপ্ত সংস্করণ নিয়ে আসতে সক্ষম হয়েছি যা একটি নির্দিষ্ট টেবিল আকার ব্যবহার করে তবে আমি গতিশীলটির পক্ষে এটি সম্পাদনা করি।
  2. একবার স্যান্ডবক্স গণনা করা হয়, xমাঝারি সারিটির শুরুতে শূন্য কলামের সংখ্যা হিসাবে গণনা করা হয়।
  3. প্রদর্শনের জন্য, টেবিলটি xপ্রতিটি প্রান্ত থেকে সারি এবং কলামগুলি বাদ দিয়ে কাটা হয় ।

কর্মক্ষমতা

nim c --stackTrace:off --lineTrace:off --threads:off \ 
      --checks:off --opt:speed sandbox.nim

time ./sandbox   10000       0.053s
time ./sandbox   20000       0.172s
time ./sandbox   30000       0.392s
time ./sandbox   40000       0.670s
time ./sandbox  100000       4.421s
time ./sandbox 1000000    6m59.047s

3

স্কালা, 274 বাইট

val t=args(0).toInt
val s=(Math.sqrt(t)+1).toInt
val (a,c)=(Array.ofDim[Int](s,s),s/2)
(1 to t).map{_=> ?(c,c)}
println(a.map{_.mkString}.mkString("\n"))
def?(b:Int,c:Int):Unit={
a(b)(c)+=1
if(a(b)(c)<4)return
a(b)(c)=0
?(b+1,c)
?(b-1,c)
?(b,c+1)
?(b,c-1)
}

ব্যবহার:

scala sandpile.scala <iterations>

আমি মনে করি না এটি সম্পর্কে অনেক কিছু ব্যাখ্যা করার আছে। মূলত এটি কেন্দ্রে কেবল একটি দানা বালি যুক্ত করে। তারপরে এটি 4 এর চেয়ে বড় কিনা তা পরীক্ষা করে দেখুন, যদি এটি 4 টির চেয়ে বেশি বড় হয়ে যায় এবং 4 টির চেয়ে বড় সমস্ত প্রতিবেশী যাচাই করে ফেলে etc.

কর্মক্ষমতা:

  • t = 10000 72ms
  • t = 20000 167ms
  • t = 30000 419ms
  • t = 40000 659ms
  • t = 100000 3413ms
  • t = 1000000 প্রায় 6 মিনিট

আমার প্রোগ্রামটি পরামর্শ দেয় যে, (0,0) কেন্দ্রে, স্যান্ডপাইলটি প্রথমে টি = 1552 এ 15 এর ব্যাসার্ধকে আঘাত করে। এটি সঞ্চয় করতে 31x31 অ্যারে লাগবে (স্থানাঙ্ক -15 থেকে 15 সহ)। আপনি কি নিশ্চিত যে টি = 5000 এর মাধ্যমে এটি সঠিক?
এরিক ট্র্রেসার

আমি নিশ্চিত যে এটি সঠিক কিনা, যদিও আমি মনে করি আমি যুক্তিটি সঠিক পেয়েছি? আমি টি> 5593
অ্যামেজিংড্রিমস

যখন আমি বৃদ্ধি এবং তারপরে তাত্ক্ষণিকভাবে স্পিলিজ পরীক্ষা করে দেখুন এটি টি = 1552 এর বাইরে চলে যায়। আমি বলব যে এটি সঠিক বাস্তবায়ন। আমি কোড আপডেট করেছি।
অ্যামেজিংড্রিমস

আপনার পারফরম্যান্স কেবল সংকলক অপ্টিমাইজেশনের মাধ্যমে সি বা ফোর্টরানে সরাসরি অ্যারে ম্যানিপুলেশন দ্বারা পরাজিত হতে পারে। আমি তোমাকে ঈর্ষা করি.
Andreï Kostyrka

@ আন্দ্রে কোস্টায়ারকা, হ্যাঁ, এখানেই স্ক্যালাল জ্বলছে! আমার আউটপুটটি
চশমাগুলির

2

জে, 76 বাইট

p=:0,.~0,.0,~0,]
p`(4&|+3 3([:+/@,*&(_3]\2|i.9));._3[:<.4%~p)@.([:*/4>{.)^:_

আমি একটি ক্রিয়া সংজ্ঞায়িত করি pযা ইনপুটটির চারপাশে শূন্যের সীমানা প্যাড করে। মূল ক্রিয়াটি ইনপুট হিসাবে একটি অ্যারে নেয়। এরপরে 4 বা ততোধিক শস্যযুক্ত যে কোনও বালুচর জন্য এটি প্রথম সারিতে পরীক্ষা করে। যদি কেউ এটি করে থাকে তবে এটি প্যাডযুক্ত ব্যবহার ছাড়া একই অ্যারেটিকে আউটপুট দেয় pএবং অন্যথায় এটি পড়ন্ত শস্যের সিমুলেট করার জন্য 2 ডি কনভোলজ সম্পাদন করে। প্রধান ক্রিয়াটি পাওয়ার অপারেটর ব্যবহার করে রূপান্তর না হওয়া পর্যন্ত পুনরাবৃত্তি হয় ^:_

ব্যবহার

   p =: 0,.~0,.0,~0,]
   f =: p`(4&|+3 3([:+/@,*&(_3]\2|i.9));._3[:<.4%~p)@.([:*/4>{.)^:_
   f 15
0 3 0
3 3 3
0 3 0
   f 50
0 0 0 1 0 0 0
0 0 3 1 3 0 0
0 3 2 2 2 3 0
1 1 2 2 2 1 1
0 3 2 2 2 3 0
0 0 3 1 3 0 0
0 0 0 1 0 0 0
   timex 'r =: f 50000'
46.3472
   load 'viewmat'
   ((256#.3&#)"0<.255*4%~i._4) viewmat r

এন = 50000 এর জন্য ফলাফলটি গণনা করতে প্রায় 46 সেকেন্ড সময় লাগে এবং viewmatএকরঙা রঙের স্কিমের সাহায্যে অ্যাডন ব্যবহার করে ফলাফলটি প্রদর্শিত হতে পারে ।

ব্যক্তিত্ব


2

সি 229 (প্রচুর সতর্কবার্তা সহ)

G[99][99],x,y,a=99,b=99,c,d;S(x,y){if(++G[y][x]>3)G[y][x]=0,S(x+1,y),S(x-1,y),S(x,y+1),S(x,y-1);a=x<a?x:a;b=y<b?y:b;c=x>c?x:c;d=y>d?y:d;}F(t){for(;t--;)S(49,49);for(y=b;y<=d;y++){for(x=a;x<=c;x++)printf("%d ",G[y][x]);puts("");}}

/* call it like this */
main(_,v)char**v;{F(atoi(v[1]));}

ঠিক আছে, আমি হাল ছেড়ে দিচ্ছি: আপনার অ্যারেটি 98 দ্বারা 98 কেন?
এরিক ট্রেসারার

@ এরিকট্রেসার আমি কীভাবে পরীক্ষায় এটি পেলাম না ?!
জেরি যেরেমিয়া


1

পিএইচপি, 213 বাইট

function d($x,$y){global$p,$m;$m=max($m,$x);$q=&$p[$y][$x];if(++$q>3){$q=0;d($x+1,$y);d($x-1,$y);d($x,$y+1);d($x,$y-1);}}while($argv[1]--)d(0,0);for($y=-$m-1;$y++<$m;print"\n")for($x=-$m;$x<=$m;)echo+$p[$y][$x++];

$pআকারটি মনে রেখে পুনরাবৃত্তভাবে গাদা তৈরি করে $m; তারপরে নেস্টেড লুপগুলি সহ প্রিন্ট করুন।
সাথে চালাও -r

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