সাহায্য করুন, আমি একটি সিয়েরপিনস্কি ত্রিভুজ আটকা পড়েছি!


44

অঙ্কন Sierpinski ত্রিভুজ হয়েছে কাজ মৃত্যু । যদিও এটির সাথে আমরা আরও কিছু আকর্ষণীয় জিনিস করতে পারি। যদি আমরা ত্রিভুজটিতে যথেষ্ট পরিমাণে স্কুইন্ট করি তবে আমরা উল্টো ত্রিভুজগুলি একটি ফ্র্যাক্টাল গ্রাফের নোড হিসাবে দেখতে পারি। আসুন সেই গ্রাফের চারপাশে আমাদের পথটি খুঁজে বার করুন!

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

এখানে চিত্র বর্ণনা লিখুন
বৃহত্তর সংস্করণে ক্লিক করুন যেখানে ছোট সংখ্যাগুলি কিছুটা অস্পষ্ট।

(অবশ্যই, এই প্যাটার্ন নীল ত্রিভুজ ভিতরে সীমাহীনভাবে চলতে থাকে।) সংখ্যায়ন নির্ধারণ করতে আরেকটি উপায় কেন্দ্র নোড সূচক রয়েছে 0, এবং নোড সন্তান i(পরবর্তী-ছোট স্কেল সংলগ্ন ত্রিভুজ) সূচকের আছে 3i+1, 3i+2এবং 3i+3

এই গ্রাফের চারপাশে আমরা কীভাবে চলাফেরা করব? যে কোনও প্রদত্ত ত্রিভুজ থেকে কেউ নিতে পারে এমন ছয়টি প্রাকৃতিক পদক্ষেপ রয়েছে:

  • যে কোনও একটি সর্বদা প্রান্তের মধ্যবিন্দু দিয়ে বর্তমান নোডের তিনটি সন্তানের একটিতে যেতে পারে। আমরা এই পদক্ষেপগুলি N, SWএবং হিসাবে মনোনীত করব SE। যেমন আমরা যদি নোড বর্তমানে করছি 2, এই নোড হতে হবে 7, 8, 9যথাক্রমে। প্রান্তগুলির মধ্য দিয়ে অন্যান্য পদক্ষেপগুলি (পরোক্ষ বংশধরদের কাছে) অনুমোদিত নয়।
  • তিনটি কোণগুলির মধ্যে একটিও সরে যেতে পারে তবে শর্ত থাকে যে এটি ত্রিভুজের কিনার স্পর্শ না করে প্রত্যক্ষ পিতামাতা বা দুটি পরোক্ষ পূর্বপুরুষের মধ্যে একটির কাছে। আমরা এই পদক্ষেপগুলি S, NEএবং হিসাবে মনোনীত করব NW। যেমন আমরা যদি নোড বর্তমানে করছি 31, Sনেতৃত্ব হবে 10, NEঅবৈধ হবে এবং NWহতে হবে 0

চ্যালেঞ্জ

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

মনে রাখবেন যে আপনার কোডটি উপরের চিত্রটিতে চিত্রিত 5 টি মাত্রার চেয়ে বেশি কাজের জন্য কাজ করা উচিত। আপনি এটা ধরে নিতে পারেন x, y < 1743392200। এটি নিশ্চিত করে যে তারা 32-বিট স্বাক্ষরিত পূর্ণসংখ্যার মধ্যে ফিট করে। নোট করুন যে এটি গাছের 20 টি স্তরের সাথে মিলে যায়।

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

আপনি STDIN (অথবা নিকটতম বিকল্প), কমান্ড-লাইন আর্গুমেন্ট বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট নিয়ে কোনও প্রোগ্রাম বা ফাংশন লিখতে এবং STDOUT (বা নিকটতম বিকল্প), ফাংশন রিটার্ন মান বা ফাংশন (আউট) প্যারামিটারের মাধ্যমে ফলাফল আউটপুট করতে পারেন।

আউটপুট একটি ফ্ল্যাট, স্ট্রিং দ্ব্যর্থহীন তালিকা থাকা উচিত N, S, NE, NW, SE, SW, (স্পেস, linefeeds কমা, কোন যুক্তিসঙ্গত বিভাজক ব্যবহার ","...)।

স্ট্যান্ডার্ড বিধি প্রযোজ্য।

পরীক্ষার মামলা

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

0 40                    => N N N N
66 67                   => S SW N N N
30 2                    => NW NW -or- NE SW
93 2                    => NE SW
120 61                  => NW NW NW NW N SE SW N
1493682877 0            => S S NW NW
0 368460408             => SW SW N N SW SW SE SW SW N SE N N SW SW N SE SE
1371432130 1242824      => NW NW NE NW N SE SW SW SW SE SE SW N N N N SW
520174 1675046339       => NE NW NE NE SE SE SW SW N SE N SW N SW SE N N N N SE SE SW SW
312602548 940907702     => NE NW S SW N N SW SE SE SE SW SE N N SW SE SE SE SW
1238153746 1371016873   => NE NE NE SE N N SW N N SW N SE SE SW N SW N N SE N SE N
547211529 1386725128    => S S S NE NW N N SE N SW N SE SW SE SW N SE SE N SE SW SW N
1162261466 1743392199   => NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE

উত্তর:


5

রুবি, 195 194 190 184 বাইট

আসল: এল এর কাছে ক্ষমাপ্রার্থী হওয়ায় এটি মূলত তাদের উত্তরের একটি বন্দর এবং এই উত্তরটি ডিবাগ করতে তাদের সহায়তার জন্য ডুরকনবকে অনেক ধন্যবাদ । এই সমস্যার জন্য সম্ভবত অন্য একটি অ্যালগরিদম রয়েছে - এর সাথে কিছু করার জন্য *f[x[0,**however far x matches with y**],y]- তবে আমি এটি অন্য সময়ের জন্য সংরক্ষণ করব।

a=->n{n<1?[]:a[~-n/3]+[-n%3]}
f=->x,y{j=x.size
(Array===x)?x==y[0,j]?y[j..-1].map{|m|%w[SE SW N][m]}:x.uniq.map{|m|[%w[NW NE S][m],*f[x[0,x.rindex(m)],y]]}.min_by(&:size):f[a[x],a[y]]}

সম্পাদনা: লোভী অ্যালগরিদম কাজ করে না h[299792458, 1000000]। আমি বাইট সংখ্যাটি ১৯৫-এ ফিরিয়ে দিয়েছি, আমি আবার আমার অ্যালগরিদম পুনরায় মেরামত করার সময়। এটি কেবল বাইট গণনা 203 এ বাড়ানোর জন্য স্থির করে নিয়েছে S দীর্ঘশ্বাস ফেলুন

নির্মাণাধীন: এই প্রোগ্রামটি সাধারণ পূর্বপুরুষদের খুঁজতে লোভী অ্যালগরিদম ব্যবহার করে x[0,j]==y[0,j](দ্রষ্টব্য: বেশ কয়েকটি সাধারণ পূর্বপুরুষ থাকতে পারে)। অ্যালগরিদম এল এর পুনরাবৃত্ত পূর্বপুরুষ অনুসন্ধানের উপর খুব শিথিলভাবে ভিত্তি করে । ফলস্বরূপ নির্দেশাবলীর প্রথম অর্ধেকটি হল এই সাধারণ পূর্বপুরুষের কাছে কীভাবে যাবেন এবং দ্বিতীয় অর্ধেকটি y এর উপর ভিত্তি করে পাচ্ছেন y[j..-1]

দ্রষ্টব্য: a[n]এখানে পরিবর্তে অঙ্কগুলি ব্যবহার করে একটি বেস -3 বাইজিক সংখ্যাটি 2,1,0প্রদান করে 1,2,3

উদাহরণ হিসাবে, চলুন f[59,17]বা মাধ্যমে চলুন f[[2,0,2,1],[2,1,1]]। এখানে j == 1,। পেতে x[0,j], আমরা যেতে 0বা NW। তারপরে, yযেতে [1,1]বা যেতেSW SW

a=->n{n<1?[]:a[~-n/3]+[-n%3]}
h=->m,n{x=a[m];y=a[n];c=[];j=x.size
(j=x.uniq.map{|m|k=x.rindex(m);x[0..k]==y[0..k]?j:k}.min
c<<%w[NW NE S][x[j]];x=x[0,j])until x==y[0,j]
c+y[j..-1].map{|m|%w[SE SW N][m]}}

45

পাইথন 2, 208 205 200 বাইট

A=lambda n:n and A(~-n/3)+[-n%3]or[]
f=lambda x,y:f(A(x),A(y))if x<[]else["SSNEW"[m::3]for m in
y[len(x):]]if x==y[:len(x)]else min([["NNSWE"[m::3]]+f(x[:~x[::-1].index(m)],y)for
m in set(x)],key=len)

একটি ক্রিয়াকলাপ, fএকজোড়া নোড সংখ্যা গ্রহণ করে এবং স্ট্রিংগুলির তালিকা হিসাবে সবচেয়ে সংক্ষিপ্ত পথে ফেরত।

ব্যাখ্যা

আমরা ত্রিভুজগুলির জন্য একটি পৃথক ঠিকানা স্কিম নিয়োগ দিয়ে শুরু করি; প্রতিটি ত্রিভুজের ঠিকানা একটি স্ট্রিং, নিম্নলিখিত হিসাবে সংজ্ঞায়িত:

  • কেন্দ্রীয় ত্রিভুজের ঠিকানাটি খালি স্ট্রিং।

  • উত্তর, দক্ষিণ-পশ্চিমে, এবং প্রতিটি ত্রিভুজ দক্ষিণ-পূর্ব শিশুদের ঠিকানাগুলি সংযোজন গঠিত হয় 0, 1এবং 2ত্রিভুজ ঠিকানায় যথাক্রমে।

মূলত, প্রতিটি ত্রিভুজের ঠিকানাটি কেন্দ্রীয় ত্রিভুজ থেকে (সংক্ষিপ্ততম) পথটিকে এনকোড করে। আমাদের প্রোগ্রামটি প্রথম কাজটি করে সংশ্লিষ্ট সংস্থাগুলিতে ইনপুট ত্রিভুজ সংখ্যাগুলি অনুবাদ করা।

চিত্র 1

একটি বড় সংস্করণ জন্য ছবিতে ক্লিক করুন।

প্রতিটি ত্রিভুজের সম্ভাব্য পদক্ষেপগুলি সহজেই ঠিকানা থেকে নির্ধারিত হয়:

  • উত্তর, দক্ষিণ-পশ্চিমে, ও দক্ষিণ-পূর্ব শিশুদের সরাতে কেবলমাত্র আমরা পরিশেষে যোগ, 0, 1, এবং 2, যথাক্রমে ঠিকানায়।

  • দক্ষিণে সরাতে, উত্তর-পূর্ব ও উত্তর-পশ্চিমে পূর্বপুরুষদের, আমরা শেষ (ডানদিকে অবস্থিত) সংঘটন খুঁজে 0, 1এবং 2এটা বাঁদিকে, যথাক্রমে, এবং ছাঁটা ঠিকানা। যদি কোন হল 0, 1বা 2ঠিকানাতে, তারপর সংশ্লিষ্ট পূর্বপুরুষ কোন অস্তিত্ব নেই। উদাহরণস্বরূপ, উত্তর-পশ্চিমে পূর্বপুরুষ যাওয়ার 112(অর্থাত, তার পিতা বা মাতা), আমরা শেষ সংঘটন খুঁজে 2মধ্যে 112, যা শেষ অক্ষর, এবং ছাঁটা এটা বাম, আমাদের দান করতে ঠিকানা 11; উত্তর-পূর্ব পূর্বপুরুষ যাওয়ার, আমরা গত সংঘটন খুঁজে 1মধ্যে 112যা দ্বিতীয় চরিত্র, এবং এটি বাম, আমাদের দান করতে ঠিকানা ছাঁটা 1; তবে 112কোনও দক্ষিণ পূর্বপুরুষ নেই, যেহেতু নেই no0 তার ঠিকানায়।

এক জোড়া ঠিকানা, xএবং কয়েকটি বিষয় সম্পর্কে নোট করুন y:

  • যদি xএকটি প্রাথমিক সাবস্ট্রিং হয় y, তারপর yবংশের একজন x, সেইজন্য এবং থেকে সবচেয়ে কম পথ xথেকে yকেবল মধ্যবর্তী প্রতিটি ত্রিভুজ সংশ্লিষ্ট শিশু অনুসরণ xএবং y; অন্য কথায়, আমরা একে প্রতিস্থাপন করতে পারেন 0, 1এবং 2মধ্যে y[len(x):]দিয়ে N, SWআর SEযথাক্রমে।

  • তা না হলে, দিন iমধ্যে প্রথম পার্থক্য আছে, সূচক হতে xএবং y। সেখানে থেকে কোনো পথ xথেকে yযে মাধ্যমে পাস না x[:i](যা হিসাবে একই y[:i]অর্থাত,, প্রথম সাধারণ পূর্বপুরুষ) xএবং y। অতএব, যে কোনও পথে xযেতে yহবে x[:i]বা তার পূর্বপুরুষদের অবশ্যই পৌঁছাতে হবে , আসুন এই ত্রিভুজটি কল করুন zএবং এরপরে অবিরত y। থেকে পৌঁছাতে xকরার z, আমরা পূর্বপুরুষদের উপরে বর্ণিত অনুসরণ করুন। থেকে সবচেয়ে কম পথ zথেকে yপূর্ববর্তী বুলেট পয়েন্ট দেওয়া হয়।

যদি xএকটি প্রাথমিক সাবস্ট্রিং হয় y, তারপর থেকে সবচেয়ে কম পথ xথেকে yসহজে উপরে প্রথম বুলেট পয়েন্ট দেওয়া হয়। অন্যথায়, আমরা দিন jশেষ ঘটনা ঘটার সূচকের ক্ষুদ্রতম হতে 0, 1এবং 2মধ্যে x। যদি jচেয়ে অনেক বেশী, বা এর সমান মধ্যে প্রথম পার্থক্য আছে, সূচক xএবং y, i, কেবলমাত্র আমরা সংশ্লিষ্ট পদক্ষেপ (যোগ S, NEঅথবা NWপথে যথাক্রমে), ছাঁটা xবাঁদিকে j, আর অবিরত। বিষয়গুলি যদি jকম হয় তবে কৌশলগুলি আরও কমে যায় i, তারপরে আমরা yসাধারণ পূর্বপুরুষের কাছে x[:j]সরাসরি আরোহণ এবং সমস্ত পথে অবতরণ করে দ্রুততম দিকে যেতে পারি sincey, বা আমরা এর অন্য একটি সাধারণ পূর্বপুরুষের কাছে যেতে সক্ষম হতে পারি xএবং yএর ডান দিকে yভিন্ন পূর্বপুরুষের কাছে আরোহণ করে আরও কাছাকাছি পৌঁছে যেতে পারি এবং সেখান থেকে দ্রুত পৌঁছে যেতে পারি । উদাহরণস্বরূপ, থেকে পৌঁছনোর জন্য , সবচেয়ে সংক্ষিপ্ত পথটি প্রথমে কেন্দ্রীয় ত্রিভুজটি (যার ঠিকানা খালি স্ট্রিং) এ আরোহণ করা হয় এবং তারপরে নেমে আসে , অর্থাৎ প্রথম পদক্ষেপটি আমাদের মিল না পয়েন্টের বাম দিকে নিয়ে যায়। যাইহোক, থেকে যেতে , সংক্ষিপ্ততম পথটি আরোহণ করা হয় এবং তারপরে , অর্থাৎ প্রথম পদক্ষেপটি আমাদেরকে অমিলের পয়েন্টের ডানদিকে রাখে।xiy12221112221212212

সুতরাং, আমরা কীভাবে সংক্ষিপ্ততম পথটি আবিষ্কার করব? "অফিসিয়াল" প্রোগ্রামটি একটি নিষ্ঠুর-শক্তি-ইশ পন্থা ব্যবহার করে, পূর্বসূরীদের যখনই xকোনও প্রাথমিক স্ট্রিং থাকে না তখন যেকোনো পূর্বপুরুষের সমস্ত সম্ভাব্য পদক্ষেপের চেষ্টা করে y। এটি যেমন শোনাচ্ছে তত খারাপ নয়! এটি এক বা দুটি মধ্যে সমস্ত মিলিত পরীক্ষার কেস সমাধান করে।

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

পাইথন 2, 271 266 261 বাইট

def f(x,y):
 exec"g=f;f=[]\nwhile y:f=[-y%3]+f;y=~-y/3\ny=x;"*2;G=["SSNEW"[n::3]for
n in g];P=G+f;p=[];s=0
 while f[s:]:
    i=len(f)+~max(map(f[::-1].index,f[s:]));m=["NNSWE"[f[i]::3]]
    if f[:i]==g[:i]:P=min(p+m+G[i:],P,key=len);s=i+1
    else:p+=m;f=f[:i]
 return P

মনে রাখবেন, সংক্ষিপ্ত সংস্করণের বিপরীতে, এই সংস্করণটি নির্দিষ্টভাবে তাদের সংশ্লিষ্ট ঠিকানায় ইনপুট মানগুলির রূপান্তরকরণে পুনরাবৃত্তি না ব্যবহার করার জন্য রচনা করা হয়েছে, যাতে এটি স্ট্যাককে উপচে না ফেলে খুব বড় মানগুলি পরিচালনা করতে পারে।

ফলাফল

নিম্নলিখিত স্নিপেট দুটি সংস্করণের জন্য পরীক্ষা চালাতে এবং ফলাফল উত্পন্ন করতে ব্যবহার করা যেতে পারে:

def test(x, y, length):
    path = f(x, y)
    print "%10d %10d  =>  %2d: %s" % (x, y, len(path), " ".join(path))
    assert len(path) == length

#         x           y        Length
test(          0,          40,    4   )
test(         66,          67,    5   )
test(         30,           2,    2   )
test(         93,           2,    2   )
test(        120,          61,    8   )
test( 1493682877,           0,    4   )
test(          0,   368460408,   18   )
test( 1371432130,     1242824,   17   )
test(     520174,  1675046339,   23   )
test(  312602548,   940907702,   19   )
test( 1238153746,  1371016873,   22   )
test(  547211529,  1386725128,   23   )
test( 1162261466,  1743392199,   38   )

গল্ফ সংস্করণ

         0         40  =>   4: N N N N
        66         67  =>   5: S SW N N N
        30          2  =>   2: NE SW
        93          2  =>   2: NE SW
       120         61  =>   8: NW NW NW NW N SE SW N
1493682877          0  =>   4: S S NW NW
         0  368460408  =>  18: SW SW N N SW SW SE SW SW N SE N N SW SW N SE SE
1371432130    1242824  =>  17: NW NW NE NW N SE SW SW SW SE SE SW N N N N SW
    520174 1675046339  =>  23: NE NE NE NE SE SE SW SW N SE N SW N SW SE N N N N SE SE SW SW
 312602548  940907702  =>  19: NE NW S SW N N SW SE SE SE SW SE N N SW SE SE SE SW
1238153746 1371016873  =>  22: NE NE NE SE N N SW N N SW N SE SE SW N SW N N SE N SE N
 547211529 1386725128  =>  23: S S S S NW N N SE N SW N SE SW SE SW N SE SE N SE SW SW N
1162261466 1743392199  =>  38: NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE

দক্ষ সংস্করণ

         0         40  =>   4: N N N N
        66         67  =>   5: S SW N N N
        30          2  =>   2: NW NW
        93          2  =>   2: NE SW
       120         61  =>   8: NW NW NW NW N SE SW N
1493682877          0  =>   4: NE S NW NW
         0  368460408  =>  18: SW SW N N SW SW SE SW SW N SE N N SW SW N SE SE
1371432130    1242824  =>  17: NW NW NE NW N SE SW SW SW SE SE SW N N N N SW
    520174 1675046339  =>  23: NE NW NE NE SE SE SW SW N SE N SW N SW SE N N N N SE SE SW SW
 312602548  940907702  =>  19: NE NW S SW N N SW SE SE SE SW SE N N SW SE SE SE SW
1238153746 1371016873  =>  22: NE NE NE SE N N SW N N SW N SE SE SW N SW N N SE N SE N
 547211529 1386725128  =>  23: S S S S NW N N SE N SW N SE SW SE SW N SE SE N SE SW SW N
1162261466 1743392199  =>  38: NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE

6
জঘন্য যে দ্রুত ছিল। প্রতিবার আমার চ্যালেঞ্জগুলির একটির উত্তর দেওয়ার জন্য আমাকে যত খুশি করে তা আমি আপনাকে বলতে পারি না। :)
মার্টিন এন্ডার

2
@ মার্টিনবাটনার ধন্যবাদ, এটি একটি বিশাল প্রশংসা! এফডাব্লুআইডাব্লু, আমি আপনার চ্যালেঞ্জগুলি সমাধান করার জন্য প্রচুর উপভোগ করছি। স্যান্ডবক্সে থাকা অবস্থায় আমি সম্ভবত এটির কাজ শুরু করেছি বা নাও করতে পারি ... :)
এল

2
সম্বোধন প্রকল্পটি উজ্জ্বল। এটা সত্যিই দারুন.
ব্রেইনস্টিল

1
@ ব্রেনস্টিল আমার কাছে প্রথম যে বিষয়টি ঘটেছে তা হ'ল এই সম্বোধনের পরিকল্পনাটি চেষ্টা করা, তবে পুরো জিনিসটি ধারণার মধ্যে রূপান্তরিত, বাস্তবায়িত এবং এক ঘন্টার মধ্যে লিখিতভাবে দেখানো দুর্দান্ত। +1
স্তরের নদী সেন্ট

1
করছি @Zymus আমি নিশ্চিত যে আমি অনুসরণ করবেন, কিন্তু আপনি ছবি উল্লেখ করছি এটা খুলছেনা-এই ম্যাচে অনুমিত এর না একটি ভিন্ন অ্যাড্রেসিং স্কিম পোস্টে বর্ণনা অনুযায়ী হয়,।
Ell

3

এপিএল (ডায়ালগ ইউনিকোড) , 144 132 129 118 133 132 130 124 117 বাইট এসবিসিএস

এপিএল ভাষা শেখার দুর্দান্ত জায়গা, এপিএল অর্চার্ডে এটি গল্ফ করতে তাদের সহায়তার জন্য ভেন এবং এনএনজি-কে আপনাকে অনেক ধন্যবাদ । ⎕IO←0। গল্ফিং পরামর্শ স্বাগত জানাই।

সম্পাদনা: -১২ বাইটগুলি ভেন এবং এনএনজি কে ধন্যবাদ কীভাবে nসংজ্ঞায়িত করা হয় তা পরিবর্তন করে এবং 1-ইনডেক্সিং থেকে 0-সূচকগুলিতে স্যুইচ করে thanks -3 একটি বাগ ঠিক করার কারণে যেখানে সবকিছু 0-সূচকে পরিবর্তিত হয় না। -11 কারণে পরিবর্তন কিভাবে বাইট Pএবং Qসংজ্ঞায়িত করা হয়। s[⊃⍋|M-s]বিভাগটি নির্ধারণে সহায়তার জন্য এনএনজি করার জন্য আমার অ্যালগোরিদম অনেক ধন্যবাদ সহ একটি সমস্যা ঠিক করার কারণে +15 বাইট । ব্যাকট্র্যাকিংয়ের পথটি খুঁজে পাওয়ার পদ্ধতিটি পুনরায় সাজানো থেকে -২ বাইট এবং বাগ ফিক্সিংয়ের জন্য +1 বাইট -2 বাইটস এর সংজ্ঞাটি পুনরায় সাজানো থেকে অ্যাডামকে ধন্যবাদ জানায় I। -6 বাইটস সংজ্ঞাটি পুনরায় 'S' 'NE' 'NW' 'N' 'SW' 'SE'সাজানো এবং কীভাবে tসংজ্ঞায়িত করা হয়েছে তা পুনরায় সাজানো থেকে এনএনজিকে ধন্যবাদ (এটি আর আলাদা ভেরিয়েবল নয়)। -7 বাইটস কীভাবে sসংজ্ঞায়িত করা হয় গল্ফিং থেকে এনজিএনকে ধন্যবাদ ।

{M←⊃⍸≠⌿↑1+P Q←⍵{(⍵/3)⊤⍺-+/3*⍳⍵}¨⌊31+⍵×2⋄(∪¨↓6 2'SSNENWNNSWSE')[P[I],3+Q↓⍨⊃⌽I←⍬{M≥≢⍵:⍺⋄(⍺∘,∇↑∘⍵)s[⊃⍋|M-s←⌽⊢.⊢⌸⍵]}P]}

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

অ্যালগরিদমের বাগের ব্যাখ্যা

মূল সমস্যাটি হ'ল আমি ভেবেছিলাম যে সবচেয়ে সংক্ষিপ্ততম পথটি সরাসরি সাধারণ পূর্বপুরুষের মধ্য দিয়ে গেছে এবং বাস্তবে সাধারণ পূর্বপুরুষের পূর্বপুরুষের মধ্য দিয়ে যেতে পারেনি। নিম্নলিখিত উদাহরণগুলি প্রদর্শিত হিসাবে এটি ভুল।

66 থেকে 5 পর্যন্ত

66  0 2 2 2  0 2 2 2
5   0 1      0 1
       common ancestor

The two ancestors of 0 2 2 2 are:
0 2 2
(empty)

(empty) has the shorter path back to 0 1 as it only needs two forward moves,
while 0 2 2 requires two more backtracks and one more forward move.

299792458 থেকে 45687 পর্যন্ত

299792458  0 2 1 1 0 1 1 2 1 1 1 2 1 0 2 2 2 0
45687      0 2 1 1 0 1 1 1 2 2
                          common ancestor

The three ancestors of 299792458 are:
0 2 1 1 0 1 1 2 1 1 1 2 1 0 2 2 2
0 2 1 1 0 1 1 2 1 1 1 2             choose this one
0 2 1 1 0 1 1 2 1 1 1 2 1 0 2 2

And the three ancestors of 0 2 1 1 0 1 1 2 1 1 1 2 are:
0 2 1 1
0 2 1 1 0 1 1 2 1 1
0 2 1 1 0 1 1 2 1 1 1

0 2 1 1 0 1 1 1 2 2     45687 for reference
              common ancestor

While it seems like `0 2 1 1` is the shorter path,
it actually results in a path that is 8 steps long
(2 backtracks, 6 forward steps to 45687).

Meanwhile, `0 2 1 1 0 1 1 2 1 1` is at an equal distance
to the common ancestor and has the following ancestors:
0 2 1 1
0 2 1 1 0 1 1 2 1
0 2 1 1 0 1 1

0 2 1 1 0 1 1 1 2 2     45687 for reference
              common ancestor

Clearly, this is the superior path, as with three backtracks, we have reached
the point of the common ancestor. With 3 backtracks and 3 forward moves,
we have a path that is 6 steps long.

কোড ব্যাখ্যা

                         should be an array of 2 integers, x y
SierpinskiPath←{⎕IO0   0-indexing
         P Q←{...}¨⍵   First, the bijective base-3 numeration of x and y
    P Q←{
        n←⌊31+⍵×2   The number of digits in the numeration
        z←+/3*⍳⍵     The number of numerations with  n digits
        (n/3)⊤⍵-z    And a simple decode  (base conversion) of ⍵-z
    }¨⍵              gets us our numerations, our paths

    A←↑1+P Q       We turn (1+P Q) into an 2-by-longest-path-length array 
                    pads with 0s and our alphabet also uses 0s
                   So we add 1 first to avoid erroneous common ancestor matches
    Common←⊃⍸≠⌿A   We find the length of the common ancestor, Common

         I←⍬{...}P   Now we get the shortest backtracking path from P
    I←⍬{
        Common=≢⍵:⍺        If P is shorter than Common, return our backtrack path
        s←⌽⊢.⊢⌸⍵           Get the indices of the most recent N SW SE
        ts[⊃⍋|Common-s]   and keep the index that is closest to Common
                           and favoring the ancestors to the right of
                           Common in a tiebreaker (which is why we reverse ⊢.⊢⌸⍵)
        (⍺,t)∇t↑⍵          Then repeat this with each new index to backtrack
    }P                     and the path left to backtrack through

    BacktrackP[I]    We get our backtrack directions
    Forward←(⊃⌽I)↓Q   and our forward moves to Q
                      starting from the appropriate ancestor
    (∪¨↓6 2'SSNENWNNSWSE')[Backtrack,Forward]     'S' 'NE' 'NW' 'N' 'SW' 'SE'
}                     and return those directions

ডায়ালগ বর্ধিত এবং dfns ব্যবহার করে বিকল্প সমাধান

যদি আমরা ব্যবহার করি ⎕CY 'dfns' এর adicফাংশন এটি আমাদের বাইজিক বেস-এন সংখ্যাটি প্রয়োগ করে (যা আমি যে সংস্করণটি ব্যবহার করি তার জন্য অনুপ্রেরণা ছিল) খুব কম বাইটের জন্য। ডায়ালগ এক্সটেন্ডডে স্যুইচ করা বেশ কয়েকটি বাইট সংরক্ষণ করে এবং তাই আমরা এখানে। এটিকে গল্ফ করতে তার সহায়তার জন্য আদমকে অনেক ধন্যবাদ। গল্ফিং পরামর্শ স্বাগত!

সম্পাদনা করুন: -8 বাইটগুলি পরিবর্তনের কারণে কীভাবে Pএবং Qসংজ্ঞায়িত হয়। ডায়ালগ প্রসারিত স্যুইচ করার কারণে -14 বাইট। -2 dfn বন্ধনীগুলি সরানোর জন্য একটি সম্পূর্ণ প্রোগ্রাম ব্যবহার করার কারণে {}s[⊃⍋|M-s]বিভাগটি নির্ধারণে সহায়তার জন্য এনজিএনকে ধন্যবাদ জানাতে আমার অ্যালগরিদমটি অনেক সমস্যার সাথে স্থির করার কারণে +17 বাইট । বাগ ফিক্সিং থেকে +1 বাইট। -2 বাইটগুলি I উভয় সমাধানে আমার গল্ফগুলি রাখার জন্য স্মরণ করা থেকে এবং -1 বাইটের সংজ্ঞাটি পুনরায় সাজানো থেকে অ্যাডামকে ধন্যবাদ জানায় । -3 বাইটগুলি কার্ডিনাল দিকগুলির প্রজন্মকে পুনরায় সাজিয়ে এনগনকে ধন্যবাদ, বগি গল্ফটি সংশোধন করে +1 বাইট এবং কীভাবে পুনর্বিন্যাস করে এনজিএন -3 বাইটকে ধন্যবাদt সংজ্ঞায়িত তা (এটি আর পৃথক চলক নয়)। -7 বাইটগুলি কীভাবে sসংজ্ঞায়িত করা হয়েছে তা পুনরায় সাজিয়ে এনএনজি ধন্যবাদ জানায় ।

এপিএল (ডায়ালগ প্রসারিত) , 123 115 101 99 116 117 114 109 102 বাইট

M←⊃⍸≠⌿↑1+P Q←(⍳3)∘⌂adic¨⎕⋄(∪¨↓6 2'SSNENWNNSWSE')[P[I],3+Q↓⍨⊃⌽I←⍬{M≥≢⍵:⍺⋄(⍺∘,∇↑∘⍵){⍵[⊃⍋|M-⍵]}⌽⊢.⊢⌸⍵}P]

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


66 এবং 1 এর জন্য, এটি 0 এর মধ্য দিয়ে সংক্ষিপ্ততম
পথটি

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