সি #, 660 বাইট
using System.Linq;using System;class P{int p=1,x,y,r;P l;static void Main(){var Q="$&.$'7$(@$*R$'/$(8$)A'(A('A$+S$(0$)9'(9('9$*B$,T$*2$+;$,D$.V*,V,*V";var I=Console.ReadLine().Split(',').Select(int.Parse).ToList();int i=0,t,s=7,u,v,w,p=I[3]*I[2];for(var D=new[]{new P{r=Math.Abs(I[3]),l=new P{r=Math.Abs(I[2]),x=I[0],y=I[1],p=3}}}.ToList();i>=0;){P c=D[i++],l=c.l;for(;(l=l?.l)!=null&&(s=(t=c.x-l.x)*t+(t=c.y-l.y)*t-(t=c.r+l.r)*t)>0;);if(s==0&&l.p>2&p*c.p<0)for(i=-1;c.l.p<3;c=c.l)Console.WriteLine(c.x+","+c.y+","+c.r);for(t=0;s>0&t<66;t++)for(u=Q[t++]-36,v=Q[t++]-36,s=1;s++<5&Q[t]%9==c.r;w=u,u=v,v=-w,D.Add(new P{l=c,r=Q[t]/9-4,x=c.x+u,y=c.y+v,p=-c.p}));}}}
এটি অনলাইন চেষ্টা করুন
এই ছিল অনেক মজার !! সম্পূর্ণ প্রোগ্রাম, STDIN, এসটিডিআউট থেকে আউটপুট গ্রহণ করে। আউটপুট হ'ল শেষ থেকে শুরু পর্যন্ত গিয়ারগুলি। ব্যবহার:
একটি সাধারণ প্রস্থের প্রথম অনুসন্ধান সম্পাদন করে, যা 4-গিয়ার সমস্যাটি এক সেকেন্ডেরও কম সময়ে সমাধান করে। ব্রাঞ্চিং ফ্যাক্টরটি আসলে এত বড় নয়, সুতরাং এটি বেশিরভাগের জন্য ভাল হওয়া উচিত (সত্যিকার অর্থে এটি পরীক্ষা করা হয় না)। দুঃখজনকভাবে এটি লিনক ব্যবহার করে।
Q
(একটি অর্থাত্ স্ট্রিং সব অনুমতি গিয়ার সংযোগের একটি টেবিল r=3
এবং একটি সাথে সংযোগ r=1
যদি dx=4
এবং dy=0
) এক পাদ, যা অন্যদের এটি আবর্তিত হয়। 3 বাইট প্রতি সেট dx
, dy
একটি আইনি সংযোগের জন্য, এবং ব্যাসার্ধ তথ্য। (
অফসেট হিসাবে পছন্দটি খুব ইচ্ছাকৃত ছিল : আরোপিত ASCII চরিত্রগুলির জন্য দুর্দান্ত সম্পত্তি অনুসন্ধান করার চেয়ে মরিয়া চেষ্টা করার পরিবর্তে একবারে দুর্দান্ত বৈশিষ্ট্যগুলির জন্য একটি ASCII চরিত্র চয়ন করা মজাদার ছিল।
আমি সম্ভবত ইনপুট পড়ার জন্য আরও ভাল কাজ করতে পারি, তবে আমার এখনও ভাগ্য হয়নি, অন্তত নয় কারণ লিঙ্কের জন্য একটি তালিকা প্রয়োজনের জন্য প্রদান করা হয়েছিল। আমি ঘোরানো কোডটি দেখেও খুব হতাশ, আমার মনে হয় এটি যথেষ্ট কম বাইটে করা যেতে পারে।
Q
জেনারেটরের সাথে ফর্ম্যাট এবং মন্তব্য কোড :
using System.Linq; // seems to pay today
using System;
class P
{
static void GenQ()
{
int t, k = 0, m = 0;
Func<P, P, int> C = (P c, P l) => (t = c.x - l.x) * t + (t = c.y - l.y) * t - (t = c.r + l.r) * t; // ==0 -> touching, <0 -> not touching, >0 -> overlap
string str = "";
string T(int i) => "" + (char)('$' + i); // $ is zero, '$' == 36, so we can mod and div by 9, and greater than " so we don't have to escape it
foreach (int r in new[] { 1, 2, 3, 5 }) // at 0,0 (current gear)
foreach (int s in new[] { 1, 2, 3, 5 }) // gear to place
for (int i = 0; i <= r + s; i++) // x
for (int j = 1; j <= r + s; j++, m++) // y
if (C(new P { r = r }, new P { r = s, x = i, y = j }) == 0) //
{
str += T(i) + T(j) + T(r + s * 9);
k++;
}
System.Console.WriteLine("K : " + k);
System.Console.WriteLine("M : " + m);
System.Console.WriteLine(str);
System.Console.ReadKey(true);
return;
}
int p=1, // parity
x, // x
y, // y
r; // radias (TODO: store radias^2 ?)
P l; // previous in search list
static void Main()
{
//GenQ();
// '$' == 36 (4*9)
// 3char blocks: x,y,r+9*s
var Q="$&.$'7$(@$*R$'/$(8$)A'(A('A$+S$(0$)9'(9('9$*B$,T$*2$+;$,D$.V*,V,*V"; // quarter table
// primative read ints
var I=Console.ReadLine().Split(',').Select(int.Parse).ToList();
int i=0, // position in Due
t, // check differential cache, position in Q
s=7, // check cache, rotation counter (>0)
u, // rotation x
v, // rotation y
w, // rotation x cache
p=I[3]*I[2]; // parity (>0 -> same, even ; <0 -> different, odd)
// due (not point using a queue, the search space grows exponentially)
for(var D=new[]{
new P{r=Math.Abs(I[3]), // start (p==1)
l=new P{r=Math.Abs(I[2]),x=I[0],y=I[1],p=3} // terminal (detect with p==3)
}}.ToList();
i>=0;) // infinite number of configurations, no bounds, i is escape term
{
P c=D[i++], // current
l=c.l; // check, initially the one before the previous (we know we are touching last already)
// 'checks' c against l
//Func<int>C=()=>(t=c.x-l.x)*t+(t=c.y-l.y)*t-(t=c.r+l.r)*t; // ==0 -> touching, >0 -> not touching, <0 -> overlap
// check we arn't touching any before us (last thing we check is terminal)
for(;(l=l?.l)!=null&& // for each before us (skipping the first one)
(s=(t=c.x-l.x)*t+(t=c.y-l.y)*t-(t=c.r+l.r)*t)>0;); // check c against l and cache in s, ==0 -> touching, >0 -> not touching, <0 -> overlap
if(s==0&& // touching last checked?
l.p>2& // stopped on terminal?
p*c.p<0) // correct parity? -> win
for(i=-1; // escape
c.l.p<3;c=c.l) // for each that wasn't the first
Console.WriteLine(c.x+","+c.y+","+c.r);
// enumerate possible additions, and queue them in due
for(t=0;
s>0& // not touching or overlapping anything (including terminal)
t<66;t++) // 66 = Q.Length
for(
u=Q[t++]-36, // '$'
v=Q[t++]-36,
s=1;s++<5& // rotate 4 times
Q[t]%9==c.r; // our raidus matches
w=u, // chache y value
u=v, // rotate
v=-w,
D.Add(new P // add
{
l=c,
r=Q[t]/9-4, // radius
x=c.x+u,
y=c.y+v,
p=-c.p // flip parity
}));
}
}
}