এই শব্দটি কি বগল বোর্ডে আছে?


38

ভূমিকা

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

তোমার কাজ

একটি প্রোগ্রাম, স্ক্রিপ্ট বা ফাংশন লিখুন যা একটি বগল বোর্ড এবং কোনও শব্দকে ইনপুট হিসাবে গ্রহণ করে এবং শব্দটি বোর্ডে থাকলে সত্য এবং শব্দটি না হলে মিথ্যা প্রমাণ দেয়।

ইনপুটটি ছয়টি \nসীমিত রেখার আকারে হবে । প্রথম পাঁচটি লাইনে 5x5 বগল বোর্ড থাকবে এবং প্রত্যেকটিতে পাঁচটি মূলধন থাকবে। ষষ্ঠ লাইনে সমস্ত মূল অক্ষরে শব্দ-ইন-প্রশ্ন থাকবে।

নমুনা ইনপুট:

AJNES
TNFTR
LSAIL
UDNEX
EQGMM
DAFTER

আউটপুট এমন কোনও কিছু হতে পারে যা আপনার পছন্দসই প্রোগ্রামিং ভাষার সত্য বা মিথ্যাটিকে দ্ব্যর্থহীনভাবে চিহ্নিত করে এবং শূন্য, নাল এবং খালি খালি চিহ্নের মানক কনভেনশনগুলিকে মেনে চলে।

উপরের ইনপুটটির জন্য নমুনা আউটপুট:

1

I / O নির্দেশিকা

  • ইনপুটটি স্টিডিন থেকে পড়তে পারে এবং স্ট্যান্ডআউটের উত্তর আউটপুট।

অথবা

  • ইনপুট কোনও ফাংশনের একক স্ট্রিং আর্গুমেন্ট হতে পারে এবং সেই ফাংশনের রিটার্ন মান হতে পারে উত্তর।

বগল বিধি

  • আপনি যদি বোর্ডটিতে টানা, সংলগ্ন, অ-পুনরাবৃত্তি টাইলসের পথ ধরে শব্দটি তৈরি করতে পারেন তবে একটি শব্দ 'বোর্ডে রয়েছে'।
  • চারদিকে আটটি টাইল সংলগ্ন একটি টাইল বিবেচনা করা হয় (তির্যক পথ অনুমোদিত)) বোর্ডের প্রান্তে টাইলস কেবল পাঁচটি টাইল সংলগ্ন। কোণে টাইলস কেবল তিনটি সংলগ্ন।
  • শব্দের ধারাবাহিক অক্ষর অবশ্যই সংলগ্ন হতে হবে, শব্দের iতম অক্ষরটি অবশ্যই i-1th ও i+1th এর সংলগ্ন হতে হবে ।
  • কোনও শব্দের মধ্যে একাধিকবার চিঠি উপস্থিত হতে পারে তবে আপনি বগল বোর্ডে প্রতি শব্দ প্রতি একাধিক বার ব্যবহার করতে পারবেন না।
  • আপনি যদি আগে কখনও বোগল না খেলেন তবে এই নিয়মগুলির জন্য অনুভূতি পেতে চান তবে অনলাইনে বগল সাইট ওয়ার্ডপ্লে.net কার্যকর হতে পারে।

নিয়মিত বগল থেকে পৃথক:

  • শব্দটি একটি বৈধ ইংরেজি শব্দ হওয়ায় আপনার চিন্তা করার দরকার নেই।
  • কোনও Quসিঙ্গল টাইল থাকবে না
  • শব্দ-ইন-প্রশ্ন যে কোনও দৈর্ঘ্যের> 0 হতে পারে

উদাহরণ

বোর্ডে

AJNES
TNFTR
LSAIL
UDNEX
EQGMM

এই শব্দগুলির সত্য হওয়া উচিত: ফেট, তারিখ, স্ট্যান্ডস, লিফটস।

এই শব্দগুলিকে মিথ্যা ফিরিয়ে দেওয়া উচিত: সাদডেন, সুলতানস, বিদ্যমান, সুড, ক্যোস্ট

এটি একটি কোড-গল্ফ চ্যালেঞ্জ, তাই সংক্ষিপ্ততম কোড জয়!


বোর্ড কি চারপাশে মোড়ানো? আমি মনে করতে পারি না
ক্লাদিউ

না এটি মোড়ানো হয় না, আমি এর প্রতিফলন করার জন্য সংলগ্নতার সম্পর্কে স্পষ্টতা আপডেট করেছি।
টারবুলেন্সেটো

পথটি কি নিজেই (তির্যকভাবে) অতিক্রম করতে পারে?
মার্টিন ইন্ডার

@ মিঃ বুয়েটনার ইয়েপ
টারবুলেন্সটো

বগল সাধারণত 4x4 বোর্ড is
mbomb007

উত্তর:


11

গল্ফস্ক্রিপ্ট, characters৪ টি অক্ষর

:^n%5>)]){{^@==}+29,\,{{+}+1$/}%\;}/{:s$..&=[s{.@-\}*;]1567`{7&.~)}%-!&},,

ইনপুটটি অবশ্যই STDIN এ দেওয়া উচিত। বোর্ডে বৈধ পাথের সংখ্যা মুদ্রণ করে, অর্থাত্ কোনওটির 0জন্য নয় এবং ধনাত্মক সংখ্যা (সত্য)।

আপনি উদাহরণটি অনলাইন পরীক্ষা করতে পারেন ।

কিছু মন্তব্য সহ কোড:

:^              # assign the input to variable ^
n%              # split at newlines
5>              # truncate array such that [WORD] remains
)])             # prepares [[]] and WORD on the stack

# the following loop generates all possible paths (valid and invalid ones)
# by looking up all index combinations which yield the correct word
{               # loop over all characters
  {^@==}+29,\,  # get all indices of current character in the board
  {{+}+1$/}%\;  # append any index to all lists in the result set
}/              # end loop

# filter the results list for valid paths
{               # {...}, -> apply filter
  :s            # save path to variable s
  $..&=         # check if all numbers in path are unique
  [s{.@-\}*;]   # calculate differences along the path
  1567`{7&.~)}% # generate the array [1 -1 5 -5 6 -6 7 -7] of valid
                # differences
  -!            # check if all differences were valid
  &             # are both conditions fulfilled?
},              # end of filter block

,               # count the number of remaining paths

12

জাভাস্ক্রিপ্ট (E6) 137 160 175 190

2 * এর চেয়ে কম গল্ফস্ক্রিপ্ট। নৈতিক বিজয় ...

F=a=>[...a].some((e,p,b)=>(Q=(p,n)=>p>29||b[p]!=b[n]||(b.r|=!b[++n])||(b[p]=b[n+~[1,5,6,7].map(q=>Q(p+q,n)|Q(p-q,n),b[p]=0)]))(p,30)&b.r)

গল্ফযুক্ত কোড পুনর্গঠন সম্পাদনা করুন । বারে বারে

অবহেলিত সর্বশেষ সংস্করণ, অনুসরণ করা কিছুটা জটিল y

F = a => 
  [...a] // input string to array, 30 chars of board then the target word
  .some ( // use some to scan the board, return true when found
      (e,p,b)=> // params to callback: element, position, complete array 
      (         // NB array b has no .r property, so use it for return value (it's undefined at start) 
        Q = (p,n) =>         // Scan function, p=position in board, n=nth char of target word
          p > 29 ||          // Chaek if going outside the board to the target word
          b[p] != b[n] ||    // if invalid char at current position, return
          (b.r |= !b[++n]) ||  // if at end of target, set r to 1 and return (also increment n )
          (                  // else... (NB next tree lines are coalesced in golfed code)
            b[p] = 0,        // remove current char (to avoid reusing) 
            [1,5,6,7].map( q => Q(p+q,n)|Q(p-q,n)), // recursive call for + - 1,5,6,7
            b[p] = b[n-1]    // put current char into array again 
          )
      )(p,30) & b.r // initial position 0 in target word is 30 in the array
  ) 

অবহেলিত প্রথম সংস্করণ, আরও পরিষ্কার হওয়া উচিত

F = a => (
  b = a.split('\n'),
  w = b.pop(),
  r = 0,
  Q = (p, n) => 
    (r |= !w[n]) || 
    (
      b[p] = 0,
      [1,5,6,7,-1,-5,-6,-7].map( q => b[q+=p]==w[n] && Q(q,n+1)),
      b[p] = w[n-1]
    ),
  b = [...b+''],
  b.map((e, p) => e==w[0] && Q(p,1)),
  r
)

ব্যবহার

F("AJNES\nTNFTR\nLSAIL\nUDNEX\nEQGMM\nLIFTS\nDAFTER")

পরীক্ষা

['DAFTER', 'STANDS', 'LIFTS', 'FATE', 'DATING' ,
 'SADDEN','SULTANS', 'EXIST', 'SUEDE', 'QUEST']
.map(w => [w, F("AJNES\nTNFTR\nLSAIL\nUDNEX\nEQGMM\n" +w)])

আউটপুট:

[["DAFTER", true], ["STANDS", true], ["LIFTS", true], ["FATE", true], ["DATING", true], 
["SADDEN", false], ["SULTANS", false], ["EXIST", false], ["SUEDE", false], ["QUEST", false]]

1
কিছু ছোট অপ্টিমাইজেশন:F=a=>(b=a.split('\n'),w=b.pop(Q=(p,n)=>((R|=!w[n])||(b[p]=0)||[1,5,6,7,-1,-5,-6,-7].map(q=>b[q+=p]==w[n]&&Q(q,n+1,b[q]=w[n])))),[Q(~~p,1)for(p in b=[...b.join(R=0)])if(b[p]==w[0])],R)
nderscore

এটি w = a.pop()(গল্ফড) বা w = b.pop()(অবরুদ্ধ, লাইন 2) হওয়ার কথা? (সম্ভবত পরবর্তীকর্মী, আমি মনে করি)
এইচআলটি

@ অ্যান্ড্রয়েড আমি পুনর্গঠনের পরে সুস্পষ্টতার জন্য পুরানো অব্যাহত কোড রেখেছি। তবে এটি সিঙ্কে 100% নয়। আমি স্পষ্ট করার চেষ্টা করব
edc65

আমার খারাপ, আপনি এটি a=a.pop()পরিবর্তে পরিবর্তিত হতে দেখেন নি b=a.pop()...
এইচল্ট

4

পাইথন, 207 204 203

g=raw_input
r=range
b=''.join(g()for _ in r(5))
w=g()
s=lambda b,w,i:0<=i<25and(not w or(b[i]==w[0])*any(s(b[:i]+'_'+b[i+1:],w[1:],i+j+k*5-6)for j in r(3)for k in r(3)))
print any(s(b,w,i)for i in r(25))

প্রতিস্থাপন করা হচ্ছে ... (b[i]==w[0])*any ...সঙ্গে ... b[i]==w[0]and any ...2 অক্ষরের খরচে অনেক ভালো পারফরম্যান্স দেয়।


1
সংখ্যা এবং কমান্ডের মধ্যে থাকা অবস্থায় আপনি স্থানগুলি শেভ করতে পারেন; 0<=i<25and
seequ

3

জে - 75 চর

এহু, এটিকে খারাপ লাগছে। এমনকি গল্ফস্ক্রিপ্টের সাথেও বেঁধে নেই! এটি স্ট্রিংকে এর একমাত্র যুক্তি হিসাবে গ্রহণ করছে। আপনি সর্বশেষ সহ প্রতিটি লাইনের শেষে যতক্ষণ যেকোন এক-অক্ষর ডিলিমিটার ব্যবহার করতে পারেন।

+/@([:*/"1^:2(2(=*)@-/\>@~.)S:1)@{@(((<@#:i.)5 5)<@#~&,"2{:=/&:>}:)@(<;._2)

একটি ব্যাখ্যা নিম্নলিখিত। নোট করুন যে ফাংশনটি 5 টি পৃথক শীর্ষ-স্তরের অংশগুলিতে বিভক্ত করা যেতে পারে, প্রতিটি পৃথক করে পৃথক করা যায় @, তাই আমরা ডান থেকে বামে সেই অংশগুলির প্রতিটি পৃথকভাবে বিবেচনা করব।

  • (<;._2)- এটি নতুনলাইন / বিভাজক অক্ষরের উপর রেখাগুলি বিভক্ত করে। এটি স্ট্রিংয়ের শেষে যে অক্ষরটি বিভক্ত হবে সেই চরিত্র হিসাবে ব্যবহার করে। আমরা বাক্সগুলিতে সমস্ত কিছু রেখেছি ( <) কারণ জে যখন ফল ফিরিয়ে দেয় তখন আমরা কিছু প্যাডিংয়ের সমস্যা না পাই।

  • (((<@#:i.)5 5)<@#~&,"2{:=/&:>}:) - শব্দের প্রতিটি অক্ষর যাচাই করার জন্য, বগল বোর্ডে সূচকের একটি তালিকা তৈরি করুন যেখানে যে কোনও ব্যক্তি সেই চিঠিটি পেতে পারেন।

    • {:এটি সর্বশেষ বিভক্ত টুকরো (যাচাই করার শব্দ) এবং }:এটি সর্বশেষ (বোগল বোর্ড) ব্যতীত।

    • &:>আমরা পূর্বে তৈরি বাক্সগুলি খুলি, }:2D অক্ষরের অক্ষরে রূপান্তরকারী দরকারী উপ-উত্পাদন সহ । =/তারপরে শব্দের প্রতিটি অক্ষরের জন্য এই বগল বোর্ডের একটি অনুলিপি তৈরি করে বোর্ডের চিঠিটি সেই অক্ষরটি শব্দের সাথে মিলছে কিনা তার উপর নির্ভর করে অবস্থানগুলিকে বুলেয়ানে পরিণত করে।

    • ((<@#:i.)5 5)সূচকগুলির 5x5 অ্যারে প্রকাশের একটি ছোট উপায়। বেস উপস্থাপনার একটি অ্যারে x#:yরূপান্তরিত yহয় x। (ঠিক আছে, প্রায়। সত্যটি আরও জটিল, তবে এটি আমাদের উদ্দেশ্যে কাজ করে))

    • <@#~&,"2- প্রতিটি চিঠির ফলস্বরূপ বুলিয়ান ম্যাট্রিক্সের জন্য, সমস্ত অনুরূপ সত্য সূচকগুলি একসাথে সংগ্রহ করুন। "2সমস্ত কিছু সঠিক ফলাফলের উপর কাজ #~&,করে, নির্বাচন করে এবং <@প্রতিটি ফলাফল পরবর্তী বাক্সের জন্য প্রস্তুত করতে একটি বাক্সে সংগ্রহ করে।

  • {- এই ক্রিয়াপদ, যা একাকীভাবে ব্যবহৃত হয়, তাকে ক্যাটালগ বলে এবং এটি বাক্সগুলির তালিকা হিসাবে যুক্তি হিসাবে গ্রহণ করে। এটি প্রতিটি বাক্সের অভ্যন্তরগুলি প্রতিটি সম্ভাব্য উপায়ে একত্রিত করে। সুতরাং উদাহরণস্বরূপ "AB" এবং "abc" স্ট্রিংযুক্ত কয়েকটি বাক্সের একটি ক্যাটালগ ফলাফল "এএ", "আব", "এসি", "বা", "বিবি", "বিসি" দেবে।

    সূচকগুলির তালিকাগুলির তালিকাগুলির তালিকায় এটি আমাদের তালিকাভুক্ত করা প্রতিটি সূচকের সমন্বয় করে। শব্দটি দীর্ঘ হলে এবং অনেকগুলি বারবার চিঠি পাওয়া গেলে এটি বড় সেট হতে পারে তবে কোনও চিঠি বোর্ডে না থাকলে খালিও। আমরা আরও লক্ষ করি যে আমরা এই কয়েকটি পথে টাইলগুলি পুনরায় ব্যবহার করেছি: আমরা পরে এটির জন্য অ্যাকাউন্ট করব।

  • ([:*/"1^:2(2(=*)@-/\>@~.)S:1) - এখানে আমরা প্রতিটি পাথ বৈধ কিনা তা পরীক্ষা করে দেখি।

    • (...)S:1(...)প্রতিটি পাথের জন্য প্রয়োগ করে এবং ফলকে একটি সমতল তালিকায় সংগ্রহ করে। এটি অত্যন্ত গুরুত্বপূর্ণ কারণ ফলাফলটি {একটি বহুমাত্রিক অ্যারে, এবং আমরা সেই অ্যারের কাঠামো সম্পর্কে যত্ন নিই না, প্রতিটি বাক্সে কেবল এটির বিষয়বস্তু।

    • 2(=*)@-/\>প্রতিটি সূচকের প্রতিটি স্থানাঙ্ক এটি অনুসরণকারীগুলির থেকে সর্বাধিক এক দূরে থাকলে একটি 0 দেয় এবং অন্যথায় 0 দেয়। 2এবং /\এই pairwise করছেন জন্য দায়ী।

    • */"1^:2লজিক্যাল-এন্ডগুলি এগুলি একসাথে শেষে। [:অংশ জে একটি কাঠামোগত জিনিস, এটা সম্পর্কে চিন্তা করবেন না হয়।

    • এর সাথে যুক্ত @~.করা >বারবার এন্ট্রি সহ পাথগুলি বাদ দেওয়ার জন্য একটি চতুর উপায়। ~.তাই তালিকা যদি এটা আত্ম-ছেদ করে সংক্ষিপ্ত করা হয়, এবং খাটো তালিকা স্বয়ংক্রিয়ভাবে 0 সেঃ সঙ্গে padded পেতে একটি তালিকা অনন্য আইটেম লাগে, যখন তারা একত্র করা, উপায় যে তারা বাইরে আসতে ফলাফল একত্রিত করা হয় মত S:। এটি স্ব-ছেদাগামী পথগুলি স্পষ্টভাবে বাদ দিয়ে চূড়ান্তভাবে খাটো।

  • +/- পরিশেষে, আমরা শেষে সবকিছু একসাথে যুক্ত করি। ফলাফলটি এমন বৈধ পাথের সংখ্যা যা বোর্ডে শব্দ তৈরি করে, যার অর্থ 0 নেই কোনও পাথ, অর্থাত্ এই শব্দটি বোর্ডে নেই। একটি চরিত্রের ব্যয়ের জন্য, আমরা +./পরিবর্তে (লজিক্যাল-ওরিং সব কিছু একসাথে) লিখতে পারি , যা স্পষ্টভাবে একটি বুলিয়ান 1 বা 0 দেবে।

এখানে কিছু উদাহরণ রান। আপনি jsoftware.com এ জে দোভাষী পেতে পারেন বা tryj.tk এ অনলাইনে চেষ্টা করতে পারেন

   NB. the  0 : 0 ... )  thing is how you do multiline strings in J
   +/@([:*/"1^:2(2(=*)@-/\>@~.)S:1)@{@(((<@#:i.)5 5)<@#~&,"2{:=/&:>}:)@(<;._2) 0 : 0
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
DAFTER
)
1
   b =: +/@([:*/"1^:2(2(=*)@-/\>@~.)S:1)@{@(((<@#:i.)5 5)<@#~&,"2{:=/&:>}:)@(<;._2)
   b 'AJNES TNFTR LSAIL UDNEX EQGMM FATE '    NB. any separator will do
1
   b 'AJNES TNFTR LSAIL UDNEX EQGMM SADDEN '  NB. not on the board
0
   b 'AJNES TNFTR LSAIL UDNEX EQGMM SANDS '   NB. self-intersecting path
0
   b 'AJNES TNFTR LSAIL UDNEX EQGMM MEND '    NB. multiple paths
2

1
বিশদ জন্য +1। আমি এই মত আরও উত্তর দেখতে চাই!
edc65

2

প্রোলগ - 315

r(L):-get_char(C),(C='\n',!,L=[];r(T),L=[C|T]).
b(0,[]):-!.
b(N,[R|T]):-M is N-1,r(R),b(M,T).
d(-1). d(0). d(1).
d([A,B],[C,D]):-d(X),C is A+X,d(Y),D is B+Y.
f([L|W],B,P,U):-P=[X,Y],nth(Y,B,R),nth(X,R,L),\+member(P,U),(W=[];d(P,Q),f(W,B,Q,[P|U])).
m:-b(5,B),r(W),f(W,B,_,[]),write(t);write(f).
:-initialization(m).

আমি ভেবেছিলাম অন্তর্নির্মিত ব্যাকট্র্যাকিং সমর্থন সহ প্রোলোগ এটির জন্য ভাল ভাষা হতে পারে তবে আমি অনুমান করি যে প্রায় প্রতিটি গণিত মানের জন্য একটি ভেরিয়েবলের প্রয়োজন হওয়ায় এটি আরও প্রতিবন্ধী।

জিএনইউ প্রোলগের সাথে পরীক্ষিত; আইএসও প্রোলোগের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত।

Ungolfed:

get_line(Line) :-
    get_char(C),
    (   C='\n', !, Line=[]
    ;   get_line(Tail), Line=[C|Tail]
    ).

% The cut prevents recursion to help_get_board(-1, MoreRows)
% (and golfs one character shorter than putting N>0 in the second rule).
help_get_board(0, []) :- !.
help_get_board(N, [Row|Tail]) :-
    M is N-1, get_line(Row), help_get_board(M, Tail).

% The golfed version doesn't define an equivalent to get_board/1.
% help_get_board(5,Board) is used directly instead.
get_board(Board) :- help_get_board(5,Board).

small(-1). small(0). small(1).
step([X1,Y1],[X2,Y2]) :-
    small(DX), X2 is X1+DX,
    small(DY), Y2 is Y1+DY.

% The golfed version doesn't define an equivalent to letter_at/3.
% See find_word/4.
letter_at([X,Y], Letter, Board) :-
    nth(Y, Board, Row),
    nth(X, Row, Letter).

find_word([Letter|Word], Board, Pos1, Used) :-
%    letter_at(Pos1, Letter, Board),  % "inlined" to next three lines:
    ( Pos1 = [X,Y],
      nth(Y, Board, Row),
      nth(X, Row, Letter) ),
    \+member(Pos1, Used),
    (   Word=[]
    ;
        step(Pos1, Pos2),
        find_word(Word, Board, Pos2, [Pos1|Used])
    ).

main :-
    get_board(Board),
    get_line(Word),
    % Begin at any position. Initially no positions are "Used".
    find_word(Word, Board, _, []).
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.