সি #, 530 বাইট
সম্পূর্ণ সি # প্রোগ্রামটি, এসটিডিইএন থেকে একক লাইন হিসাবে ইনপুট নেয় এবং একটি অনুচ্ছেদে "" দ্বারা একটি একক লাইন STDOUT এ আউটপুট দেয়।
এটি বরং দীর্ঘ ... এবং এর সাথে অনেক বেশি এক্স / ওয়াই / জেড পুনরাবৃত্তি রয়েছে, তবে আমি এ পর্যন্ত এটিকে বোধগম্য কিছুতে কমিয়ে আনতে পারিনি, এবং ২৪ ঘন্টার মধ্যে একটি পরীক্ষা করলাম, আগামীকালই ফিরে আসতে পারে।
using Q=System.Console;class P{static void Main(){int q=9,w=0,e=9,r=0,t=9,u=0,i=0,x=0,y=0,z=0,p=0;System.Action V=()=>{z=(int)System.Math.Sqrt(i);p=(x=i-z*z)%2;x/=2;y=(++z*z--+~i)/2;},W=()=>{Q.Write(i+","+(x<0|y++<0|z>7?"X":""+(z*z+2*x+1-p))+" ");};foreach(var g in Q.ReadLine().Split(',')){i=int.Parse(g);V();q=q>x?x:q;w=w<x?x:w;e=e>y?y:e;r=r<y?y:r;t=t>z?z:t;u=u<z?z:u;}for(i=64;i-->0;){V();if(!(x<q|x>w|y<e|y>r|z<t|z>u))if(p>0){if(y==r)W();if(x++==w)W();x--;if(z--==t)W();}else{if(y--==e)W();if(x--==q)W();x++;if(z++==u)W();}}}}
এই চিত্রটি কী চলছে তা সর্বাধিক ব্যাখ্যা করে।
এটি শনাক্ত করুন যেহেতু আমাদের 0-প্রস্থের বিভাগ থাকতে পারে না, একটি "ষড়ভুজ" সর্বদা সস্তার আকার হতে চলেছে (এবং গিজকে সর্বাধিক স্থান দেওয়ার সুবিধা রয়েছে)।
প্রোগ্রামটি প্রথমে সমস্ত ইনপুট সেল সূচকগুলিকে এক্স / ওয়াই / জেড সমন্বয়গুলিতে অনুবাদ করে এবং প্রতিটি x / y / z এর সর্বনিম্ন / সর্বোচ্চ সন্ধান করে কাজ করে।
z = floor(root(i))
x = floor((i - z^2) / 2)
y = floor((z+1)^2 - i - 1) / 2)
p = (i - z^2) % 2
এরপরে, এটি প্রতিটি ঘর সূচকটি অতিক্রম করে এবং এটি বর্ণিত 'ষড়ভুজ' বাউন্ডে ফিট করে কিনা তা পরীক্ষা করে দেখছি। যদি এটি হয় তবে এটি সীমানার চরম প্রান্তগুলির কোনও (যেমন x = xmin, বা y = ymax) এর উপর রয়েছে কিনা তা পরীক্ষা করে এবং এটি প্রাসঙ্গিক প্রান্তগুলি যুক্ত করে। এটি এর পাশের প্রান্তের সূচিটি তৈরি করতে হবে। এক্স এবং জেড এর জন্য, আমরা কেবল তাদের চাই / ইনক্রিমেন্ট / হ্রাস, এবং তারপরে নিম্নলিখিত সূত্রটি ব্যবহার করুন:
i = z^2 + 2*x + (1-p)
লক্ষ্য করুন যে "সমতা" সর্বদা পরিবর্তিত হয়, এবং যে y জড়িত না। Y এর জন্য আমাদের কোনও পরিবর্তন করতে হবে না, তবে কোডটি কিছুটা গণ্ডগোলের কারণ পরবর্তী পাশের ঘরটি একটি "এক্স" হওয়া উচিত কিনা তা সনাক্ত করার জন্য এটি "ত্রিভুজ" সীমা পরীক্ষা করতে হবে।
উদাহরণ সমাধান (তিনটি কোণ থেকে গিজযুক্ত সেলগুলি):
Input
2,50,62
Output
62,63 61,X 59,X 57,X 55,X 53,X 51,X 50,49 48,X 36,X 35,X 25,X 24,X 16,X 15,X 9,X 8,X 4,X 3,X 2,0 1,X
মন্তব্য সহ টিডিয়ার কোড:
using Q=System.Console;
class P
{
static void Main()
{
int q=9,w=0,e=9,r=0,t=9,u=0, // min/max x/y/z/ (init min high, and max low)
i=0, // index of cell we are looking at
x=0,y=0,z=0,p=0; // x,y,z dimension
System.Action V=()=>
{ // translates the index into x/y/z/p
z=(int)System.Math.Sqrt(i);
p=(x=i-z*z)%2; // 'parity'
x/=2; // see p assignment
y=(++z*z--+~i)/2; // ~i == -i - 1
},
W=()=>
{ // writes out the edge of i, and the cell described by x/z/inverse of p (the inversion of p handles y +/-)
Q.Write(i+","+ // write out the edge
(x<0|y++<0|z>7?"X":""+(z*z+2*x+1-p)) // either X (if we go out of 'trianlge' bounds), or we translate x/z/inverse of p into an index
+" "); // leaves a trailing space (as shown in example output)
};
foreach(var g in Q.ReadLine().Split(',')) // for each cell with geese
{
i=int.Parse(g); // grab index of cell
V(); // compute x/y/z/p
q=q>x?x:q; // sort out mins/maxes
w=w<x?x:w;
e=e>y?y:e;
r=r<y?y:r;
t=t>z?z:t;
u=u<z?z:u;
// code like the above suggests a solution with a couple of arrays would be better...
// I've not had success with that yet, but maybe in a couple of days I will try again
}
for(i=64;i-->0;) // for each cell
{
V(); // compute x/y/z/p
if(!(x<q|x>w|y<e|y>r|z<t|z>u)) // if we are inside the 'hex' bounds
if(p>0)
{ // x max, y max, z min
// these checks check that we are on the extremes of the 'hex' bounds,
// and set up the appropriate vars for W calls to put the edges in
// must do y first, because W modifies it for us (saves 2 bytes in the next block)
if(y==r) // don't need the ++ (can't go out of 'trianlge' bounds)
W();
if(x++==w)
W();
x--;
if(z--==t)
W();
//z++; not used again
}
else
{ // x min, y min, z max
if(y--==e) // do need the -- (used for 'trianlge' bounds checking)
W();
// y is reset in W, as such
if(x--==q)
W();
x++;
if(z++==u)
W();
//z--; not used again
}
}
}
}