অ্যারিস্টটলের নম্বর সমস্যা সমাধান করুন


21

অ্যারিস্টটলের নম্বর ধাঁধাটি হেক্সাগোনাল গ্রিডে প্রতিটি 19 টি কক্ষকে 1 এবং 19 এর মধ্যে একটি অনন্য পূর্ণসংখ্যার সাথে পপুলেশন করার চ্যালেঞ্জ, যা প্রতিটি অক্ষের সাথে মোট 38 হয়।

আপনি গেম বোর্ডটি দেখতে এমন ছবি তুলতে পারেন:

অ্যারিস্টটল গ্রিড

এবং ধাঁধা, সংক্ষেপে, পনের সমীকরণের নিম্নলিখিত সেটটির সমাধান:

((a + b + c) == 38 && (d + e + f + g) == 38 && (h + i + j + k + l) == 
   38 && (m + n + o + p) == 38 && (q + r + s) == 38 && (a + d + h) == 
   38 && (b + e + i + m) == 38 && (c + f + j + n + q) == 
   38 && (g + k + o + r) == 38 && (l + p + s) == 38 && (c + g + l) == 
   38 && (b + f + k + p) == 38 && (a + e + j + o + s) == 
   38 && (d + i + n + r) == 38 && (h + m + q) == 38)

যেখানে প্রতিটি পরিবর্তনশীল সেটে একটি অনন্য সংখ্যা {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}

একাধিক সম্ভাব্য সমাধান রয়েছে এবং এর 19!পূর্ণসংখ্যার সম্ভাব্য সংমিশ্রণগুলি রয়েছে, তাই নিরীহ ব্রুট ফোর্সটি ব্যবহারিক হবে না।

নিয়মাবলী:

  1. উত্তর হার্ডকোডিং বা উত্তর কোথাও খুঁজে না; আপনার কোডটি এটি নিজেরাই খুঁজে পেতে হবে
  2. গতি কিছু যায় আসে না, তবে আপনাকে আপনার ফলাফলগুলি দেখাতে হবে, সুতরাং চালাতে 1000 বছর সময় লাগবে এমন কোড আপনাকে সাহায্য করবে না
  3. সমস্ত উত্তর সন্ধান করুন
  4. ঘূর্ণন অধীনে অভিন্ন হিসাবে দেওয়া উত্তরগুলি অভিন্ন হিসাবে চিকিত্সা করুন
  5. যদি আপনি আকর্ষণীয় মধুচক্রের ফলাফল আউটপুট করেন তবে আপনার মোট বাইট গণনার 5% হ্রাস করুন
  6. সবচেয়ে কম বাইট জেতা

দুর্দান্ত সমাধান, এটির সমাধানের জন্য কাজ করার অপেক্ষায়।
প্রোগ্রামারডান

আপনি কি ঘোরানো উত্তরগুলি অনন্য হিসাবে বিবেচনা করেন? উদাহরণস্বরূপ একটি, বি, সি = 1, 18, 19 সূচকগুলি একটি নির্দিষ্ট সমাধান অনুমান করি, যদি আমরা সি, জি, এল = 1, 18, 19 সেট করে থাকি এবং অন্যান্য সমস্ত মানগুলি মিলিয়ে দেওয়ার জন্য "আবর্তিত" হয়, আপনি কি এটি একটি অনন্য হিসাবে বিবেচনা করেন? সমাধান?
প্রোগ্রামারড্যান

@ প্রোগ্রামারড্যান ঘোরানো উত্তরগুলি অভিন্ন। আমি পরিষ্কার করব।
মাইকেল স্টার্ন

1
একটি ষড়ভুজের কেবল ঘোরার চেয়ে আরও বেশি প্রতিসাম্য রয়েছে। উত্তর এবং প্রতিবিম্বের সংমিশ্রণে যে উত্তরগুলি অভিন্ন?
পিটার টেলর

স্ব-সংগঠিত মানচিত্র ব্যবহার করে এটির সমাধান দেখতে আগ্রহী।
পিপীলিকা পি

উত্তর:


3

হাস্কেল 295 289

import Data.List
t=38
y a b=[max(19-b)(a+1)..19]
w=y 0 t
x=filter((==w).sort)$[[a,b,c,d,e,f,g,h,i,t-a-e-o-s,k,l,m,t-d-i-r,o,p,q,r,s]|a<-[1..14],c<-y a a,l<-y a c,s<-y a l,q<-y a s,h<-y c q,e<-w,let{f=t-g-e-d;i=t-b-e-m;o=t-r-k-g;k=t-p-f-b;b=t-a-c;g=t-l-c;p=t-l-s;r=t-q-s;m=t-q-h;d=t-a-h}]

মধ্যবর্তী হেক্সেস পেতে গাণিতিক ব্যবহার করে অন্য একটি অনুরূপ উত্তর। অন্যান্য সমাধানগুলির বিপরীতে, আমি এই পরিমাণগুলি> ০ হওয়ার জন্য পরীক্ষা করি না, বাছাই করা হেক্সসগুলি পরিসরের সমান [১.১৯৯] যথেষ্ট কিনা তা পরীক্ষা করে। এ, সি এবং এইচটি সীমাবদ্ধ করা হয়েছে যাতে কেবল অনন্যভাবে ঘোরানো / মিররযুক্ত সমাধানগুলি অনুমোদিত হয়। সমাধানটি কয়েক সেকেন্ড পরে উপস্থিত হয়, তারপরে আর এক মিনিট বা তার অপেক্ষা করার অপেক্ষা রাখে it

গিগিতে ব্যবহার:

ghci> x
[[3,19,16,17,7,2,12,18,1,5,4,10,11,6,8,13,9,14,15]]

কয়েকটি চর শেভ করার জন্য সম্পাদিত। 'y 0 টি' উত্পাদন করে [1..19]।


1
আসলে আমি আমার সি উত্তরে একই জিনিস করছি :) জঘন্য আমি কীভাবে দেখতে পেলাম না যে হাস্কেল কাজের জন্য উপযুক্ত হাতিয়ার: পি +১
নিক্লাস বি।

আমি আপনার x>0চেকটি মিস করব, কারণ আমি অ্যারে বাড়ানোর পরিবর্তে নেতিবাচকগুলি সহ তালিকাটি বাছাই করেছি? অন্যদিকে, y a bহাস্কেলকে পারফর্ম করতে আমাকে রেঞ্জগুলি (আমার ) সীমাবদ্ধ করতে হয়েছে, এতে আমার কয়েকটা অক্ষর ব্যয় হয়। তবে বিল্ট-ইন বাছাই করা এমন আরও একটি ভাষা হতে বাধ্য that যা আমাকে একইভাবে কাজ করতে মারবে (আপনার দিকে, গণিত) a
বাজরঘ

হ্যাঁ, দুর্ভাগ্যক্রমে সিতে বাছাই করা হাস্কেলের মতো সহজ নয়। ম্যাথমেটিকার সমস্যা হ'ল এটি সংকলিত হয়নি এবং এইভাবে ধীর ধাপ :(
নিক্লাস বি।

আমি সবসময় অনুশীলনের জন্য হাস্কেলে এগুলি করি, এমনকি অন্য ভাষা আরও ভাল would
বাজরাঘ

আমি আসলে হাস্কেলকে পার্শ্ববর্তী কাজ হিসাবে প্রোগ্রাম করি, তাই আমি এখানে স্ট্যাম্পড হয়ে গিয়েছিলাম যে এটি এখানে ব্যবহার করা আমার পক্ষে ঘটেনি: ডি এটি সত্যই / দুর্দান্ত নাগরিকের এমনকি একটি দুর্দান্ত ভাষা
নিক্লাস বি

10

জাভা (1517 - 75.85) = 1441.15 (1429 - 71.45) = 1357.55 (1325 - 66.25) = 1258.75

এই মজা ছিল।

সমস্ত অনন্য সমাধান মুদ্রাঙ্কিত মিররিং এবং আবর্তন মুদ্রণ করে একটি মনোরম মৌচাক (সুতরাং ৫% হ্রাস)

রানটাইম: আমার 4 বছরের পুরানো ল্যাপটপে ~ 0.122s (122 মিলিসেকেন্ড)।

গল্ফযুক্ত কোড ( সম্পাদনা বুঝতে পেরেছিলাম যে আমি আমার মুদ্রণগুলি মূর্খতার সাথে পুনরাবৃত্তি করছিলাম, সেগুলি সর্বাধিক গল্ফের জন্য একটি একক মুদ্রণে পরিণত করেছি) ( নতুন সম্পাদনা কলকে চতুর ছোট ফাংশনগুলিতে সেট করার জন্য কমানো কলগুলি, কিছু অন্যান্য মাইক্রো-অপ্টিমাইজেশন):

import java.util.*;class A{boolean c(Set<Integer>u,int z){return!u.contains(z);}Set<Integer>b(Set<Integer>c,int...v){Set<Integer>q=new HashSet<Integer>(c);for(int x:v)q.add(x);return q;}void w(){Set<Integer>U,t,u,v,w,y,z;int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,X,Z;X=20;Z=38;for(a=1;a<X;a++)for(b=1;b<X;b++)if(b!=a)for(c=1;c<X;c++)if(c!=a&&c!=b&&a+b+c==Z){U=b(new HashSet<Integer>(),a,b,c);for(d=1;d<X;d++)if(c(U,d))for(h=1;h<X;h++)if(h!=d&&c(U,h)&&a+d+h==Z){t=b(U,a,b,c,d,h);for(m=1;m<X;m++)if(c(t,m))for(q=1;q<X;q++)if(q!=m&&c(t,q)&&h+m+q==Z){u=b(t,m,q);for(r=1;r<X;r++)if(c(u,r))for(s=1;s<X;s++)if(s!=r&&c(u,s)&&q+r+s==Z){v=b(u,r,s);for(p=1;p<X;p++)if(c(v,p))for(l=1;l<X;l++)if(l!=p&&c(v,l)&&s+p+l==Z){w=b(v,p,l);for(g=1;g<X;g++)if(c(w,g)&&l+g+c==Z)for(e=1;e<X;e++)if(e!=g&&c(w,e))for(f=1;f<X;f++)if(f!=e&&f!=g&&c(w,f)&&d+e+f+g==Z){y=b(w,g,e,f);for(i=1;i<X;i++)if(c(y,i))for(n=1;n<X;n++)if(n!=i&&c(y,n)&&d+i+n+r==Z&&b+e+i+m==Z){z=b(y,i,n);for(o=1;o<X;o++)if(c(z,o))for(k=1;k<X;k++)if(k!=o&&c(z,k)&&m+n+o+p==Z&&r+o+k+g==Z&&b+f+k+p==Z)for(j=1;j<X;j++)if(c(z,j)&&j!=o&&j!=k&&a+e+j+o+s==Z&&c+f+j+n+q==Z&&h+i+j+k+l==Z){System.out.printf("%6d%4d%4d\n\n%4d%4d%4d%4d\n\n%2d%4d%4d%4d%4d\n\n%4d%4d%4d%4d\n\n%6d%4d%4d\n\n",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);return;}}}}}}}}}public static void main(String[]a){(new A()).w();}}

ব্রুট ফোর্স পাস্স, তবে কেবলমাত্র খুব সামান্য সমাধানের উপস্থিতি সম্পর্কে চতুর ব্যবহার আমাকে পুনরাবৃত্তি ভিত্তিক উত্তরের দিকে নিয়ে যায়, যেখানে পুনরাবৃত্তির প্রতিটি লুপের মধ্যে আমি কেবল পূর্ণসংখ্যা বিবেচনা করি যা এখনও "নির্ধারিত" হয়নি। আমি আগে ব্যবহার করা সংখ্যার জন্য ও (1) অনুসন্ধান করতে জাভার হ্যাশসেট ব্যবহার করি। অবশেষে, ঠিক 12 টি সমাধান রয়েছে, তবে আপনি যখন ঘূর্ণন এবং মিরর উভয়ই ছাড় পান তবে এটি কেবল একটি অনন্য সমাধানকে হ্রাস করে, তাই যখন প্রথম সমাধানটি আসে তখন আমি এটিকে মুদ্রণ করে শেষ করি। আমি কীভাবে এই সমাধানটির দিকে যাচ্ছি তার কিছুটা পরিষ্কার দৃষ্টিভঙ্গির জন্য গিথুবটিতে আমার কম-গল্ফযুক্ত কোডটি দেখুন।

উপভোগ করুন!


ঠিক আছে, আপনি আপনার স্পয়লারে পড়ে আছেন, আরও বিভিন্ন সমাধান রয়েছে, সুতরাং আপনার উত্তরটি অবৈধ।
ST3

দৃ claim় দাবি, আপনি কি এটি প্রমাণ করার জন্য নিজের উত্তর দিয়ে একে ব্যাক আপ করতে পারেন? আমি আমার স্পোলারটিতে কোনও উদ্দেশ্যমূলক মিথ্যা সম্পর্কে অবশ্যই অবগত নই।
প্রোগ্রামারডান

সুতরাং যখন প্রথম সমাধানটির মুখোমুখি হয়, তখন আমি এটিকে মুদ্রণ করি এবং নিয়ম নংটি সমাপ্ত করি । 3 সমস্ত উত্তর খুঁজে পেতে বলে। ওপেন যেমন 19 বলেছেন, এটি সত্যই 19 হয় কিনা তা নিশ্চিত নন, তবে আমি আগে একই ধরণের কাজটি চালিয়েছি, সুতরাং জেনে রাখুন যে এরপরে আরও একটি আছে।
এসটি 3

আপনার আমার পুরো স্পোলারটি পড়তে হবে । আমি 12 টি সমাধান পেয়েছি। তারপরে আপনাকে প্রশ্নের সাথে যুক্ত পুরো মন্তব্যগুলি পড়তে হবে । ওপি বলছে যে সমান ঘূর্ণন সমান উত্তরগুলি সমান এবং এড়াতে হবে। অন্য একজনকে জিজ্ঞাসা করা হয়েছে যে উত্তরগুলি সমান রিট মিররিং এড়িয়ে যাওয়া উচিত। যদিও ওপিতে এখনও এই প্রশ্নের জবাব দেয় নি, তবে আমার এবং তারিখের অন্যান্য সমস্ত সমাধান উভয়ই উত্তরটি "হ্যাঁ" বলে ধরে নিয়েছে। সুতরাং, আমার সমাধান সম্পূর্ণরূপে সম্পূর্ণ, সম্পূর্ণ নির্ভুল এবং এখানে কোনও "মিথ্যা" নেই are তবে, আপনি যদি 12 টি সমাধান দেখতে চান তবে return;বিবৃতিটি সরিয়ে দিন ।
প্রোগ্রামারডান

অবশেষে, এটি কোড গল্ফ। একটি স্বেচ্ছাসেবক return;বিবৃতি যোগ করার কথা বিবেচনা করে আমার কোডের দৈর্ঘ্য by বৃদ্ধি পেয়েছে, সত্যিকারের উত্তরটিতে একে অপরের কেবল ঘোরানো / মিরর সংস্করণগুলি অন্তর্ভুক্ত করে এমন 12 টি সমাধান অন্তর্ভুক্ত করা আমার পক্ষে এটি যুক্ত হওয়া পাগল হবে। যদিও উন্মাদনাটিকে উড়িয়ে দেওয়া যায় না, তবে এই ক্ষেত্রে সংযোজনটি return;উদ্দেশ্যমূলক ছিল এবং আমি যেমন পূর্ণ প্রশ্ন এবং মন্তব্য সংলাপের উপর ভিত্তি করে বর্ণনা করেছি , যা আপনাকে অভিযোগ তোলার আগে পর্যালোচনা করা উচিত take ধন্যবাদ!
প্রোগ্রামারডান

8

সি, 366 বাইট ( সি ++ 541 450 )

#define R(i)for(int i=19;i;--i)
#define X(x)if(x>0&&!V[x]++)
#define K(X)X(a)X(b)X(c)X(d)X(e)X(f)X(g)X(h)X(i)X(j)X(k)X(l)X(m)X(n)X(o)X(p)X(q)X(r)X(s)
Q(x){printf("%d ",x);}
T=38,V[99];main(){R(h)R(c)R(s)R(a)R(l)R(q)R(e){int d=T-a-h,b=T-a-c,g=T-c-l,p=T-l-s,r=T-q-s,m=T-h-q,f=T-g-e-d,i=T-b-e-m,n=T-d-i-r,o=T-p-n-m,k=T-g-o-r,j=T-h-i-k-l;R(C)V[C]=0;K(X)K(+Q),exit(0);}}

সঙ্গে সংকলন gcc -std=c99 -O3

বিন্যাসে প্রতিটি অনন্য সমাধান মডুলোর ঘূর্ণন এবং মিররিং মুদ্রণ করে a b c d ...per

রানটাইম: আমার কম্পিউটারে 0.8 সেকেন্ড।

আমরা সর্বোচ্চ ছাঁটাইয়ের জন্য h -> c -> s -> a -> l -> q -> e ক্রমে ঘরগুলি গণনা করি। আসলে উপরের সংস্করণটি প্রতি 20 ^ 7 অ্যাসাইনমেন্টগুলি সেই ভেরিয়েবলগুলির জন্য চেষ্টা করে। তারপরে আমরা অন্যান্য সমস্ত কক্ষগুলি গণনা করতে পারি। একমাত্র অনন্য সমাধান মডুলো রোটেশন / মিররিং রয়েছে। একটি পুরোনো, কম golfed এবং ~ 20 গুণ দ্রুত (কারণে ছাঁটাই করার জন্য) সি ++ সংস্করণ পাওয়া যাবে GitHub থেকে


আমি এখানে বেশিরভাগ গাণিতিক পদ্ধতির পছন্দ করি। বলিহারি! +1
প্রোগ্রামারডান

1

মতলব: 333 320 টি অক্ষর

এটি একটি সুন্দর বোবা কাছাকাছি ব্রুট ফোর্স পদ্ধতির যা পুনরাবৃত্তি ব্যবহার করে না। এটি আংশিক সমাধান তৈরি করে zযা শেষে মুদ্রিত হয়। প্রতিটি কলাম একটি সমাধান; উপাদানগুলি উপরে থেকে নীচে এজে তালিকাভুক্ত করা হয়। রানটাইম হয় 1-2 ঘন্টা।

z=[];
a='abc adh hmq qrs spl lgc defg beim mnop dinr rokg pkfb hijkl aejos cfjnq';while a[k,a]=strtok(a);n=length(k);x=nchoosek(1:19,n)';s=[];for t=x(:,sum(x)==38)s=[s,perms(t)'];end
m=0.*s;m(19,:)=0;m(k(1:n)-96,:)=s(1:n,:);y=[];for p=m for w=z m=[];l=w.*p~=0;if p(l)==w(l) y(:,end+1)=w+p.*(~l);end
end
end
z=[m,y];end
z

মতলবের মধ্যে থেকে চলছে:

>> aristotle;
>> z(:,1)

ans =

    9
   11
   18
   14
    6
    1
   17
   15
    8
    5
    7
    3
   13
    4
    2
   19
   10
   12
   16
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.