পনেরটি ধাঁধা এর অনুমতি


13

চ্যালেঞ্জ

এর সমাধান হওয়া অবস্থায় পনেরটি ধাঁধাটির নিম্নলিখিত চিত্রটি বিবেচনা করুন:

_____________________
|    |    |    |    |
| 1  | 2  | 3  | 4  |
|____|____|____|____|
|    |    |    |    |
| 5  | 6  | 7  | 8  |
|____|____|____|____|
|    |    |    |    |
| 9  | 10 | 11 | 12 |
|____|____|____|____|
|    |    |    |    |
| 13 | 14 | 15 |    |
|____|____|____|____|

প্রতিটি পদক্ষেপে, একটি উত্তেজিত পাজলারের ফাঁকা স্থান সংলগ্ন এক টুকরো ফাঁকা জায়গায় স্থানান্তরিত করার সুযোগ রয়েছে। উদাহরণস্বরূপ, 1সরানোর পরে , আমাদের 2সম্ভাব্য পরিস্থিতি রয়েছে ( 0ফাঁকা জায়গা হোক):

1   2   3   4          1   2   3   4
5   6   7   8          5   6   7   8
9   10  11  12   and   9   10  11  0
13  14  0   15         13  14  15  12

2চালচলনের পরে ধাঁধাটির 5বিভিন্ন ফলাফল রয়েছে (উল্লেখ্য যে উপরের দুটি মামলা বাদ দেওয়া হয়েছে, যেহেতু তারা 2 টি মুভিতে পৌঁছানো যায় না)। এর মধ্যে একটি হ'ল আসল সমাধান হওয়া অবস্থা এবং দুটি ভিন্ন উপায়ে পৌঁছানো যায়।

এই চ্যালেঞ্জের মধ্যে আপনার কাজটি হ'ল একটি নির্দিষ্ট সংখ্যাতে চালিত হতে পারে এমন বিভিন্ন ফলাফলের সংখ্যা উত্পাদন করা। ইনপুট হিসাবে, একটি সংখ্যা নিন N >= 0এবং সরানোর পরে প্রদর্শিত হতে পারে এমন অনন্য পরিস্থিতিতে আউটপুট দিন N

বিধি

  • এটি কোড-গল্ফ। সবচেয়ে কম কোড জয়!
  • স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়।
  • আপনার কোডটি N = 10কয়েক মিনিটের মধ্যে কেসটি গণনা করতে সক্ষম হবে । উত্তরটিতে সময়ের সুস্পষ্ট অপব্যবহার না হলে আমি সম্ভবত এই নিয়মটি পরীক্ষা করব না।

পরীক্ষার কেস

(এর summations থেকে উত্পন্ন ফলাফল OEIS A089484 (আস Geobits বর্ণিত চ্যাট ), মার্টিন Büttner এর দ্বারা স্বয়ংক্রিয় স্ক্রিপ্ট । ধন্যবাদ সব সাহায্যের জন্য!)

0 moves: 1
1 moves: 2
2 moves: 5
3 moves: 12
4 moves: 29
5 moves: 66
6 moves: 136
7 moves: 278
8 moves: 582
9 moves: 1224
10 moves: 2530
11 moves: 5162
12 moves: 10338
13 moves: 20706
14 moves: 41159
15 moves: 81548
16 moves: 160159
17 moves: 313392
18 moves: 607501
19 moves: 1173136
20 moves: 2244884
21 moves: 4271406
22 moves: 8047295
23 moves: 15055186
24 moves: 27873613
25 moves: 51197332
26 moves: 93009236
27 moves: 167435388
28 moves: 297909255
29 moves: 524507316
30 moves: 911835416
31 moves: 1566529356

উত্তর:


5

পাইথ, 36 বাইট

lu{smmXd,0@dk)fq1.a.DR4,Txd0UdGQ]U16

বিক্ষোভেরপরীক্ষার জোতা।

lu{smmXd,0@dk)fq1.a.DR4,Txd0UdGQ]U16

                 .a.DR4,Txd0            Find the Euclidean distance between the
                                        present location of 0 and a given location.
              fq1           Ud          Filter over all locations on that distance
                                        equaling 1.
     mXd,0@dk)                          Map each such location to the grid with 0
                                        and the value at that location swapped.
  {sm                         G         Map all unique grids possible after n-1
                                        steps to all unique grids after n steps.
 u                             Q]U16    Repeat <input> times, starting with the
                                        initial grid.
l                                       Print the length of the resulting set.

3

সিজেম, 54 52 51 50 49 47 45 বাইট

G,ari{{:S0#S{4md2$4md@-@@-mh1=},f{Se\}}%:|}*,

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন (10 সেকেন্ডের চেয়ে কম সময় লাগবে)।

কিভাবে এটা কাজ করে

G,a       e# Push R := [[0 1 ... 15]].
ri{       e# Do int(input()) times:
  {:S     e#   For each S in R:
    0#    e#     Push the index of 0 in S (I).
    S{    e#     Filter S; for each J in in S:
      4md e#       Push J/4 and J%4.
      2$  e#       Copy I.
      4md e#       Push I/4 and I%4.
      @-  e#       Compute (I%4)-(J%4).
      @@- e#       Compute (J%4)-(I%4).
      mh  e#       2-norm distance: a b -> sqrt(aa + bb)
      1=  e#       Check if the distance is 1.
    },    e#     Keep all values of J with distance 1 from I.
    f{    e#     For each J:
      S   e#       Push S. 
      e\  e#       Swap S at indexes I and J.
    }     e#     This pushes an array of all valid modifications of S.
  }%      e#   Collect the results for all S in R in an array.
  :|      e#   Reduce the outmost array using set union (removes duplicates).
}*        e#

3

রেটিনা , 289 276 বাইট

^
,abcd%efgh%ijkl%mnox,
(`(,[^,]*)x([^,%])([^,y]*),
$0$1$2x$3y,
(,[^,]*)([^,%])x([^,y]*),
$0$1x$2$3y,
(,[^,]*)x([^,]{4})([^,])([^,y]*),
$0$1$3$2x$4y,
(,[^,]*)([^,])([^,]{4})x([^,y]*),
$0$1x$3$2$4y,
,.{19},(?=.*1)|,[^,]{20},(?=[^1]*$)|y|1$

+)`([^,]{19})(.*),\1,
$1$2
[^a]

a
1

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

আপনি প্রতিটি লাইন একটি একক ফাইলে রেখে দিতে পারেন বা -sপতাকা সহ কোডটি চালাতে পারেন । উদাহরণ:

> echo -n 111|retina -s fifteen_puzzle
111111111111

পদ্ধতির মূলটি হ'ল আমরা সম্ভাব্য সমস্ত অবস্থানের (পুনরাবৃত্তি ছাড়াই) ট্র্যাক রাখি যা সঠিক kপদক্ষেপের পরে ঘটতে পারে । আমরা ফর্মটি শুরু করি k = 0এবং প্রতিস্থাপনের পদক্ষেপগুলি পুনরায় পুনরুক্ত করি ( (` and )` modifiersযতক্ষণ না ) আমরা পদক্ষেপগুলির ইনপুট সংখ্যায় পৌঁছায়।

এই গণনার সময় আমাদের স্ট্রিং এর সর্বদা রূপ থাকে

(,[puzzle_state]y?,)+1*

যেখানে puzzle_stateহয় abcd%efgh%ijkl%mnoxকিছু অক্ষরের বিন্যাস সঙ্গে। xখালি জায়গার জন্য দাঁড়িয়েছে, বাকি অক্ষরগুলি টাইলস। %এর সারি সীমাবদ্ধকারী are

yবর্তমান পদক্ষেপে রাজ্য উত্পন্ন হয়েছে তা চিহ্নিত করে ( k) সুতরাং এই পদক্ষেপে অন্যান্য রাজ্য উত্পন্ন করতে এটি ব্যবহার করা উচিত নয়।

1বাম পদক্ষেপের সংখ্যা চিহ্নিত করুন।

রেটিনা কোডের মেকানিকটি হ'ল একটি বিজোড় লাইনের প্রতিটি মিলই পরবর্তী (সমান) রেখায় পরিবর্তিত হয়।

অতিরিক্ত ব্যাখ্যা সহ কোড:

initialize string
^
,abcd%efgh%ijkl%mnox,

while string changes
(`

for every old (y-less) state concatenate a new state with moving the empty tile to r/l/d/u if possible
right
(,[^,]*)x([^,%])([^,y]*),
$0$1$2x$3y,
left
(,[^,]*)([^,%])x([^,y]*),
$0$1x$2$3y,
down
(,[^,]*)x([^,]{4})([^,])([^,y]*),
$0$1$3$2x$4y,
up
(,[^,]*)([^,])([^,]{4})x([^,y]*),
$0$1x$3$2$4y,

if we should have made this step (there are 1's left) remove old states
,.{19},(?=.*1)

if we should not have made this step (no more 1's left) remove new states
,[^,]{20},(?=[^1]*$)

remove y markers
y

remove one 1 (decrease remaining step count)
1$


remove duplicates until string changes (with + modifier)
+`([^,]{19})(.*),\1,
$1$2    

end while
)`

remove non-a's, 1 a stays from each state
[^a]

change a's to 1's
a
1

@ মার্টিনবাটনারকে 10 টি বাইট সংরক্ষণ করা হয়েছে।


2

পাইথন, 310 253 243 229 বাইট

উন্নয়নের সাথে সর্বশেষ সংস্করণ @randomra দ্বারা প্রস্তাবিত:

s=set()
s.add(tuple(range(16)))
def e(a,b):s.add(t[:a]+(t[b],)+t[a+1:b]+(t[a],)+t[b+1:])
for k in range(input()):
 p,s=s,set()
 for t in p:j=t.index(0);j%4and e(j-1,j);j%4>2or e(j,j+1);j<4or e(j-4,j);j>11or e(j,j+4)
print len(s)

আমার নিজস্ব সংস্করণ, যা দীর্ঘ ছিল (243 বাইট) তবে পড়তে সহজ:

s=set()
s.add(tuple(range(16)))
def e(a,b):s.add(t[:a]+(t[b],)+t[a+1:b]+(t[a],)+t[b+1:])
for k in range(input()):
 p,s=s,set()
 for t in p:
  j=t.index(0)
  if j%4:e(j-1,j)
  if j%4<3:e(j,j+1)
  if j>3:e(j-4,j)
  if j<12:e(j,j+4)
print len(s)

সরল প্রস্থের প্রথম অনুসন্ধান, রাজ্যগুলিকে টিপল হিসাবে এনকোডিং করা এবং তাদের অনন্য রাখার জন্য সেটে সংরক্ষণ করা।

N = 10 এর জন্য আমার ল্যাপটপে প্রায় 0.03 সেকেন্ড সময় নেয়। চলমান সময় বড় সংখ্যাগুলির জন্য যথেষ্ট পরিমাণে বৃদ্ধি পায়, উদাহরণস্বরূপ এন = 20 এর জন্য প্রায় 12 সেকেন্ড।


এলিয়াসিং s.addসম্ভবত কিছু অক্ষর সংরক্ষণ করতে পারে।
isaacg

@ আইসএইচজি আমি অনুরূপ কোডটিকে একটি ফাংশনে সরিয়ে রেখে বেশ কিছুটা সাশ্রয় করেছি। এখন এই দিকে তাকিয়ে, আমি সম্ভবত tএকটি যুক্তি হিসাবে পাস করতে হবে না । এর বাইরে, আমি যদি পাইথনের আরও ভাল দক্ষতা অর্জন করি তবে উন্নতির আরও সম্ভাবনা রয়েছে figure
রেটো কোড়াদি

3
আপনি রূপান্তর করতে পারেন ifমত পার্শ্ব প্রতিক্রিয়া সঙ্গে শর্ট-সার্কিট এক্সপ্রেশন মধ্যে বক্তব্য j%4and e(j-1,j)যাতে আপনি একটি বুলিয়ান tuple যেমন এক লাইন সেগুলি লাগাতে পারেন: j%4and e(j-1,j),j%4>2or e(j,j+1),j<4or e(j-4,j),j>11or e(j,j+4)
এলোমেলো

@ আরন্দোমরা ভাল লাগছে, আমি আগামীকাল চেষ্টা করব। আমি ভেবেছিলাম সিরিজের ifবিবৃতিগুলির পরিবর্তে শর্তাধীন অভিব্যক্তি ব্যবহারের কিছু চতুর উপায় সম্ভবত রয়েছে । আমি আরও আশ্চর্য হই যে দুটি উপাদান অদলবদল করে একটি টিউপল তৈরির একটি ছোট উপায় আছে কিনা।
রেটো কোরাদি

1
লিস্টে রূপান্তর, সোয়াপিং এবং tuple ফিরে রূপান্তর একটু খাটো: def e(a,b):*l,=t;l[a],l[b]=l[b],l[a];s.add(tuple(l))
এলোমেলো

1

পার্ল, 148

#!perl -p
$s{"abcd.efgh.ijkl.mno#"}=1;for(1..$_){$x=$_,map{$r{$_}=1if
s/($x)/$3$2$1/}keys%s for
qw!\w)(# #)(\w \w)(.{4})(# #)(.{4})(\w!;%s=%r;%r=()}$_=keys%s

উদাহরণ:

$ time perl 15.pl <<<20
2244884
real    0m39.660s
user    0m38.822s
sys 0m0.336s
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.