কিউব কি কিউবে হাঁটার মাধ্যমে শব্দ বানান করতে পারে?


10

দুটি পরামিতি লাগে এমন একটি ফাংশন লিখুন: একটি ধনাত্মক পূর্ণসংখ্যা n এবং শব্দের একটি তালিকা।

এন- বাই- এন- বাই- এন ইউনিটগুলির একটি ঘনক্ষেত্র দেওয়া , প্রতিটি পৃষ্ঠের ইউনিটকে একটি এলোমেলো চিঠি (এজেড) নির্ধারণ করুন। (একটি 3x3x3 ঘনক্ষেত্রের জন্য, প্রতিটি মুখে 9 টি পৃষ্ঠের ইউনিট থাকবে))

তারপরে কোনও পিঁপড়ের পক্ষে প্রদত্ত প্রতিটি শব্দের বানান (মুখ অতিক্রম করার ক্ষমতা সহ) উপরিভাগে হাঁটা সম্ভব কিনা তা নির্ধারণ করুন। ধরে নিন যে কোনও শব্দের বানান করতে, বর্ণগুলি অবশ্যই উপরে / নীচে বা বাম / ডান সংলগ্ন হতে হবে, তবে অগত্যা একই মুখে নয়। [ সম্পাদনা করুন, স্পষ্টতার জন্য: পিঁপড়া তার পথটি বিপরীত করতে এবং একাধিকবার চিঠি ব্যবহার করতে পারে। প্রতিটি পৃষ্ঠের ইউনিটকে একটি চরিত্র হিসাবে গণনা করা হয়, তাই পুনরাবৃত্ত বর্ণগুলির সাথে একটি শব্দ বানান করতে (যেমন "দেখুন") পিপিলিকে তিনটি সংলগ্ন ইউনিট পরিদর্শন করতে হবে]]

ফাংশন দুটি জিনিস আউটপুট করা উচিত:

1) প্রতিটি মুখের প্রতিটি অক্ষর এমনভাবে টপোলজি অনুমান করা যায়। উদাহরণস্বরূপ, 2x2x2 ঘনক্ষেত্রের জন্য, একটি গ্রহণযোগ্য আউটপুট দেখতে পাবেন:

   QW
   ER
TY OP UI
DF JK XC
   AS
   GH
   LZ
   VB

2) প্রতিটি শব্দ, বুলিয়ান সহ কিউবের পৃষ্ঠের উপর দিয়ে হাঁটা দিয়ে পিপড়াটি শব্দটি বানান সম্ভব কিনা তা উপস্থাপন করে। এই ক্ষেত্রে:

1 ask
0 practical
1 pure
0 full

বোনাস চ্যালেঞ্জের সন্ধানে থাকেন (স্কোর মধ্যে ফ্যাক্টর হবে না, শুধু মজার জন্য): বদলে এন ঘনক্ষেত্র একমাত্র আকার প্রতিনিধিত্বমূলক যাক এন এছাড়াও আকৃতি মাত্রা প্রতিনিধিত্ব করে। সুতরাং, 2 এর একটি এন 2x2 বর্গ উত্পাদন করবে; 3 এর একটি এন 3x3x3 কিউব উত্পাদন করে; এবং 4 এর একটি এন 4x4x4x4 পরীক্ষার উত্পাদন করবে।


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

1
যতক্ষণ টপোলজি অনুমান করা যায়, অক্ষরগুলি কীভাবে আউটপুট হয় সে সম্পর্কে আমি কোনও অতিরিক্ত সীমাবদ্ধতা রাখতে চাই না। বর্ণনায় আমার বহু-লাইন উদাহরণটি বর্ণনামূলক নয় বরং বর্ণনামূলক ছিল।
jawns317

3
দেখে মনে হচ্ছে পিপিলি দিক পরিবর্তন করতে সক্ষম; এটি স্পষ্টভাবে বলা উচিত। এটি কি 180-ডিগ্রি ঘুরিয়ে আনতে পারে এবং এটি একই অক্ষরটি পরপর দু'বার ব্যবহার করতে পারে? অন্য কথায়, আপনি কিউব qwqবা qqউদাহরণ কিউব খুঁজে পেতে পারেন ?
Zgarb

3
তদুপরি, পিঁপড়া কি একাধিকবার চিঠি ব্যবহার করতে পারে?
lirtosiast

1
এলোমেলো চিঠি বিতরণের নিয়ম কী? আপনার উদাহরণটি কোনও পুনরাবৃত্ত অক্ষর দেখায় না, তবুও একটি সাধারণ অ্যালগরিদম যেখানে 26 টি সম্ভাবনার মধ্যে প্রতিটি অক্ষর স্বাধীনভাবে বেছে নেওয়া হয়, শূন্যের পুনরাবৃত্তি হওয়ার সম্ভাবনা অত্যন্ত অসম্ভব unlikely অবশ্যই N> 2 এর সাথে পুনরাবৃত্তি করতে হবে। আপনার এটিকে আরও স্পষ্টভাবে উল্লেখ করতে হবে, যদি কেউ পুরো ঘনক্ষেত্রে এলোমেলোভাবে বিতরণ করা হয় কেবল দুটি ভিন্ন অক্ষর সহ একটি ঘনক্ষেত্র চেষ্টা করে।
স্তর নদী সেন্ট

উত্তর:


3

রুবি, 272 বাইট

gপাঠযোগ্যতা উন্নত করতে নেস্টেড ফাংশনের উভয় পক্ষের কোডে দুটি অপ্রয়োজনীয় নিউলাইনগুলি যুক্ত করা হয়েছে । এগুলি স্কোর থেকে বাদ পড়ে। অক্ষরগুলি f=যা কোনও ভেরিয়েবলের বেনামে ফাংশন নির্ধারণ করে সেগুলিও বাদ হয়।

আউটপুট ফরম্যাট 0বা 1পরিবর্তে প্রশ্ন রুবি এর নেটিভ প্রতি trueএবং false। বুলিয়ান এবং শব্দটি পৃথক করতে একটি নিউলাইন (একটি স্থানের পরিবর্তে) ব্যবহৃত হয়। আমার বোধগম্যতা হ'ল এটি আউটপুট প্রয়োজনীয়তার একটি গ্রহণযোগ্য ব্যাখ্যা, তবে তা না হলে বাইট কাউন্টের উপর প্রভাব সামান্য হবে।

f=->n,l{c=''
x=[p=6*n,1,-p,-1]
(m=3*p*n).times{|i|c<<(5+i/n%6-i/n/p&6==6?65+rand(26):i%p==p-1?10:46)}
q=m+3*n
puts c

g=->w,i,d{w==''?$r=1:c[i]<?A?g[w,(i+x[d])%q,d^1]:w[0]==c[i]&&4.times{|j|g[w[1..-1],(i+x[j])%q,j^1]}}

l.each{|w|$r=0
m.times{|i|c[i]>?@&&g[w,i,0]}
puts $r,w}}

আউটপুট

প্রায় 50 টি কল এর পরে:

f[4,['PPCG','CODE','GOLF','ANT','CAN','CUBE','WORD','WALK','SPELL']]

আমি শেষ পর্যন্ত 2 টি হিট দিয়ে নিম্নলিখিত আউটপুটটি পেয়েছি। ANTনীচে ডানদিকে যাচ্ছে এবং উপরের বাম থেকে মোড়কের সাহায্যে ANভাগ করা হবে ।CANC

....KCAAXRHT...........
....ALRZXRKL...........
....NDDLCMCT...........
....ETQZHXQF...........
........FYYUSRZX.......
........CFNPAUVX.......
........ZTJVHZVQ.......
........AUWKGVMC.......
............XWKSDWVZ...
............DPLUVTZF...
............DMFJINRJ...
............ZRXJIAFT...
0
PPCG
0
CODE
0
GOLF
1
ANT
1
CAN
0
CUBE
0
WORD
0
WALK
0
SPELL

ব্যাখ্যা

ঘনক্ষেত্রের নির্দিষ্ট উদ্ঘাটিতটি নির্বাচন করা হয়েছে, এটি আঁকার সহজতরতার জন্য, তবে মূলত এটি অনুসন্ধানে স্বাচ্ছন্দ্যের জন্য বেছে নেওয়া হয়েছিল।

বর্ণমালাবিহীন অক্ষরগুলি (প্রতিটি লাইনের শেষে ডটস প্লাস নিউলাইন) ক্ষেত্রের একটি গুরুত্বপূর্ণ অঙ্গ যেখানে পিঁপড়ে হাঁটতে দেখা যায়।

অনুসন্ধান পুনরাবৃত্তি ফাংশন দ্বারা সঞ্চালিত হয় g, যা ফাংশন নেস্ট করা হয় f। পাস করা শব্দটি যদি খালি স্ট্রিং হয় তবে অনুসন্ধানটি সম্পূর্ণ হবে এবং $r1 তে সেট করা আছে যদি পিপড়া শব্দের প্রথম অক্ষরের সাথে মিলে যায় এমন একটি অক্ষরের স্কোয়ারে থাকে তবে অনুসন্ধানটি চারটি দিকেই অবিরত থাকবে: ফাংশনটি আবার বলা হয় প্রথম অক্ষরটি সরিয়ে দিয়ে শব্দটি সংক্ষিপ্ত করে। এই ক্ষেত্রে দিকের পরামিতি উপেক্ষা করা হয়। মুভিংগুলি পুনরুক্তরূপে সেল সূচকগুলির সাথে মানগুলি পরিবর্তিত করে কল করার মাধ্যমে সম্পন্ন করা হয় x.সংযোজনের ফলস্বরূপ গ্রিডের আকার এবং একটি অতিরিক্ত অর্ধেক রেখার মডিউল নেওয়া হয়। এর অর্থ হ'ল নীচের লাইনটি শীর্ষ দিকে বিপরীতভাবে জড়িয়ে যায় এবং বিপরীতে, সঠিক অনুভূমিক অফসেট সহ।

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

মন্তব্য করা কোড

->n,l{                                   #n=square size, l=list of words to search
  c=''                                   #empty grid
  x=[p=6*n,1,-p,-1]                      #offsets for south, east, north, west. p is also number of characters per line
  (m=3*p*n).times{|i|                    #m=total cells in grid. for each cell
    c<<(5+i/n%6-i/n/p&6==6?              #apppend to c (according to the formula)
      65+rand(26):                       #either a random letter
      i%p==p-1?10:46)                    #or a "whitespace character" (newline, ASCII 10 or period, ASCII 46)
  }
  q=m+3*n                                #offset for vertical wraparound = grid size plus half a row.                           
  puts c                                 #print grid

  g=->w,i,d{                             #search function. w=word to search for, i=start index in grid, d=direction
    w==''?                               #if length zero, already found,
      $r=1:                              #so set flag to 1. Else
      c[i]<?A?                           #if grid cell is not a letter
        g[w,(i+x[d])%q,d^1]:             #recursively call from the cell in front, with the direction reflected in NW-SE axis
        w[0]==c[i]&&                     #else if the letter on the grid cell matches the start of the word
          4.times{|j|                    #for each direction (iterate 4 times, each time a different direction is "in front")
            g[w[1..-1],(i+x[j])%q,j^1]}  #recursively call from the cell in front. Chop first letter off word. 
   }                                       #Direction parameter is XORed (reflected in NW-SE axis) in case ant hits whitespace and has to zigzag.

   l.each{|w|                            #for each word in the list
     $r=0                                #set global variable $r to zero to act as a flag
     m.times{|i|c[i]>?@&&g[w,i,0]}       #call g from all cells in the grid that contain a letter 
     puts $r,w}                          #output flag value and word
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.