কিউব নেট জন্য মাছ ধরা


30

কিউবগুলি পাশাপাশি ছয়টি স্কোয়ারে তৈরি করা যেতে পারে। তবে আপনি তিনটি 2x1 আয়তক্ষেত্রকে অর্ধেক ভাঁজ করতে এবং এগুলি একসাথে ঘনক্ষেত তৈরি করতে পারেন। এখন এই চ্যালেঞ্জে আপনি স্কোয়ারগুলি থেকে তৈরি প্রতিটি টুকরোয়ের একটি সেট পাবেন এবং আপনি নির্ধারণ করতে হবে যে আপনি ইউনিট কিউব তৈরি করতে টুকরো বেছে নিতে পারেন কিনা। সমস্ত টুকরো ব্যবহার করতে হবে না, কিছু বাকি থাকতে পারে।

বিস্তারিত

টুকরা দুটি পৃথক অক্ষরের স্ট্রিং বা একটি কালো এবং সাদা চিত্র বা কোনও সুবিধাজনক 2D রাস্টার ফর্ম্যাট হিসাবে দেওয়া হয়। নিম্নলিখিতটিতে আমি ধরে নিয়েছি যে পিক্সেলগুলি টুকরোগুলি গঠন করে তা কালো এবং পটভূমি সাদা।

দুটি পিক্সেল যারা একপাশে ভাগ করে তাদের একই টুকরা সম্পর্কিত বলে মনে করা হয়। টুকরাগুলি কেবল গ্রিডলাইনগুলির সাথে ভাঁজ করা যেতে পারে যা পিক্সেলগুলি পৃথক করে এবং সেগুলি কাটা যাবে না। কিউবের প্রতিটি পাশের আকার এক পিক্সেল এবং কিউবের প্রতিটি পাশই কেবল একটি একক স্তর দিয়ে তৈরি হতে পারে।

আউটপুট অবশ্যই সত্যবাদী বা মিথ্যা মান হওয়া উচিত ।

Testcases

নীচে, স্পেসগুলি ব্যাকগ্রাউন্ড এবং হ্যাশ প্রতীকগুলি #টুকরাগুলি উপস্থাপন করে।

(আরও যুক্ত করা হবে)

বৈধ

##  
 ## 
  ##

 #  
####
 #  

# # # # # # #

# ##
## #

অকার্যকর

###
###

#  #
####

### ## ####

আরও টেস্টকেসের জন্য নিম্নলিখিত স্নিপেটটি চালান।

পিএস: এটি এই চ্যালেঞ্জের একটি সাধারণীকরণ


জেএস কোড স্নিপেট কেন কেবল অতিরিক্ত হার্ডকোডযুক্ত টেস্টকেসগুলি মুদ্রণ করছে? কেন শুধু তাদের পোস্টে রাখছেন না?
ম্যাজিক অক্টোপাস উরান

1
@ কারসোকম্পুটিং পোস্টটি বিশৃঙ্খলাবদ্ধ হতে আটকাতে এটি কেবলমাত্র একটি পদক্ষেপ ছিল।
flawr

সর্বদা ছয় পিক্সেল চালু থাকবে?
গম উইজার্ড

না, আরও কম-বেশি হতে পারে।
flawr

1
@ ব্লু আহ না, টুকরোগুলির ইনপুট বিশ্লেষণ করা চ্যালেঞ্জের একটি অংশ। এই ইনপুটটি বেশ খানিকটা সরল করবে, তাই আমি এটির অনুমতি দেব না। জিজ্ঞাসা করার জন্য ধন্যবাদ!
flawr

উত্তর:


7

সি, 824 803 বাইট

#define Z return
#define Y char*b
#define N --n
i,j,n,w,h,A,B,C,D,E,F,G,H;char c[9999],*r,*d;x(b)Y;{if(b<c||*b<35)Z;++n;*b^=1;x(b-1);x(b+1);x(b-w);x(b+w);}m(b,p,y)Y,*p;{d=b;if(!y)for(y=-1,--p;1[++p]&31;)d+=w;for(i=0;*p&31?!(*p&16>>i)||b[i]&1:0;++i>4?p+=y,b+=w,i=0:0);Z!(*p&31)?x(d),n:0;}a(b)Y;{for(j=n=0;j<w*h;++j)if(m(c+j,b,1)||m(c+j,b,0))Z n;Z 0;}f(Y){bzero(c,9999);for(h=0,b=strcpy(c,b);r=b,b=strchr(b+1,10);h++,w=b-r);for(A=2,r=1+"@_`^C@|T@^R@XO@XX`|FB@|PP@|DD@PXN@XHX@XPX`PPXL@XHHX@XLDD@XPPX`PPPXH@PXHHH@PPPPP@";*r;r+=A+=r[-1]/96)while(a(r));A=B=C=D=E=F=G=H=0;while(a("PX")||a("XH")) (n-=3)?N?N?N?0:++H:++G:++F:++C;while(a("^")||a("PPPP"))(n-=4)?N?N?0:++H:++G:++E;while(a("P"))N?N?N?N?N?N?0:++H:++G:++F:++D:++B:++A;Z H||(G&&A)||(F&&B+B+A>1)||(E&&A>1)||D>1||C>1||((D||C)*3+B*2+A>5)*(A>1||B>2||A*B);}

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

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

... এবং এটি বিশদটি ব্যাখ্যা করার আগে এটি একটি উচ্চ স্তরের ওভারভিউ মূল্য।

বেসিক ওভারভিউ

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

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

[^C```] [XHX``] [PPPXH] [XHHX`] [PXN``] [|PP``]
 ####.   ##...   #....   ##...   #....   ###..
 ...##   .#...   #....   .#...   ##...   #....
 .....   ##...   #....   .#...   .###.   #....
 .....   .....   ##...   ##...   .....   .....
 .....   .....   .#...   .....   .....   .....
[|FB``] [XPX``] [PPXL`] [XLDD`] [XPPX`] [|DD``]
 ###..   ##...   #....   ##...   ##...   ###..
 ..##.   #....   #....   .##..   #....   ..#..
 ...#.   ##...   ##...   ..#..   #....   ..#..
 .....   .....   .##..   ..#..   ##...   .....
 .....   .....   .....   .....   .....   .....
[|T```] [^R```] [PXHHH] [XO```] [_````] [PPPPP]
 ###..   ####.   #....   ##...   #####   #....
 #.#..   #..#.   ##...   .####   .....   #....
 .....   .....   .#...   .....   .....   #....
 .....   .....   .#...   .....   .....   #....
 .....   .....   .#...   .....   .....   #....

[XX```]
 ##...
 ##...
 .....
 .....
 .....

একবার এই পলিওমিনোস সমাপ্ত হয়ে গেলে, আমরা অবশিষ্ট পলিওমিনোজগুলি প্রাসঙ্গিক বিভাগে শ্রেণীবদ্ধ করি। এটি লক্ষণীয় যে প্রায় সমস্ত ক্ষেত্রেই, কেউ কেবল পলিওমিনোসগুলি খুঁজে পেতে পারে (যারা কিউবগুলিতে ভাঁজযোগ্য) এবং কেবল ছয়টির পরিমাণ অনুসন্ধান করতে পারে। দুটি ব্যতিক্রম আছে:

  • একটি কোণার ট্রোমিনো এবং একটি লাইন ট্রোমিনো কিউব তৈরি করতে পারে না
  • একটি লাইন টেট্রোমিনো এবং ডোমিনো কিউব তৈরি করতে পারে না

এই বিধিনিষেধটি সামঞ্জস্য রাখতে আমরা এএএচ থেকে ৮ টি বিভাগ গঠন করি: মনোমিনোস (একাকী টাইলস) এর জন্য এ, ডোমিনোজের জন্য বি, কোণার ট্রোমিনোজের জন্য সি, লাইন টেরোমিনোজের জন্য ডি, লাইন টেট্রোমিনোজের জন্য এফ, অন্যান্য টেট্রোমিনোস, জি জন্য পেন্টোমিনোয়াসের জন্য, এবং হেক্সোমিনোসের জন্য এইচ। এই বিভাগগুলির মধ্যে যে কোনও একটিতে না পড়ে কেবল তা উপেক্ষা করা হয়। পলিওমিনোসগুলি গণনা করা যা প্রতিটি বিভাগে যথেষ্ট।

শেষে, আমরা কেবল একটি বিশাল সমীকরণ এবং এই ট্যাবুলেশনের উপর ভিত্তি করে সত্যতা বা মিথ্যাতা ফিরিয়ে আছি।

মন্তব্যে অসম্পূর্ণ

i,j,n,w,h,A,B,C,D,E,F,G,H;char c[9999],*r,*d;
x(b)char*b;{      // recursively unmarks polyomino pointed to by b.
   if(b<c||*b<35)return;
   ++n; *b^=1;    // Tabulates tiles in n as it goes.
   x(b-1);x(b+1);x(b-w);x(b+w); // left/up/down/right
}
m(b,p,y)char*b,*p;{ // pattern match area b with pattern p, direction y.
                    //   y=1 scans down; y=0 scans up.
   d=b; // d tracks a tile in the currently matched pattern for unmarking.
        // Note that all patterns are oriented to where "top-left" is a tile.
   if(!y) // ...when scanning up, move p to the end, set y to -1 to count backward,
          //    and advance d to guarantee it points to a tile (now "bottom-left")
      for(y=-1,--p;1[++p]&31;)d+=w;
   // Match the pattern
   for(i=0;*p&31?!(*p&16>>i)||b[i]&1:0;++i>4?p+=y,b+=w,i=0:0);
   return !(*p&31)   // If it matches...
          ? x(d),n   // ...unmark/count total polyomino tiles and return the count
          : 0;
}
a(b)char*b;{ // Scan for an occurrence of the pattern b.
   for(j=n=0;j<w*h;++j)
      if(m(c+j,b,1)||m(c+j,b,0)) // (short circuit) try down then up
         return n;
   return 0;
}
// This is our function.  The parameter is a string containing the entire area,
// delimited by new lines.  The algorithm assumes that this is a rectangular area.
// '#' is used for tiles; ' ' spaces.
f(char*b) {
   bzero(c,9999); // Init categories, c buffer
   for(h=0,b=strcpy(c,b);r=b,b=strchr(b+1,10);h++,w=b-r); // Find width/height
   // Unmark all polyominoes that contain unfoldable subsets.  This was
   // compacted since the last version as follows.  A tracks
   // the current pattern's length; r[-1], usually terminator for the
   // previous pattern, encodes whether the length increases; and o/c
   // the patterns were sorted by length.
   for(A=2,r=1+"@_`^C@|T@^R@XO@XX`|FB@|PP@|DD@PXN@XHX@XPX`PPXL@XHHX@XLDD@XPPX`PPPXH@PXHHH@PPPPP@";*r;r+=A+=r[-1]/96)
      while(a(r));
   A=B=C=D=E=F=G=H=0;
   // Match corner trominoes now to ensure they go into C.
   while(a("PX")||a("XH"))
      (n-=3)
         ?   --n
             ?   --n
                 ?   --n
                    ?   0 // More than 6 tiles?  Ignore it.
                    : ++H // 6 tiles?  It's an H.
                 : ++G // 5 tiles?  It's a G.
             : ++F // 4 tiles?  It's an F.
        : ++C; // only 3 tiles?  It's a C.
   // Now match line tetrominoes to ensure they go into E.
   while(a("^")||a("PPPP"))
      (n-=4)
         ?   --n
             ?   --n
                 ?   0 // More than 6 tiles?  Ignore it.
                 : ++H // 6 tiles?  It's an H.
             : ++G // 5 tiles?  It's a G.
         : ++E; // only 4 tiles?  It's an E.
   // Find all remaining tetrominoes ("P" is a monomino pattern)
   while(a("P"))
      --n
         ?   --n
             ?   --n
                 ?   --n
                     ?   --n
                         ?   --n
                             ?   0 // More than 6 tiles?  Ignore it.
                             : ++H // 6 tiles?  It's an H.
                         : ++G // 5 tiles? It's a G.
                     : ++F // 4 tiles?  It's an F.
                : ++D // 3 tiles?  It's a D.
            : ++B // 2 tiles?  It's a B.
         : ++A; // only 1 tile? It's an A.
   // Figure out if we can form a cube:
   return H               // Yes if we have a foldable hexomino
      ||(G&&A)            // Yes if we have a foldable pentomino
                          // and a monomino
      ||(F&&B+B+A>1)      // Yes if we have a foldable non-line tetromino
                          // and 2 other tiles (dominoes count twice).
                          // Either one domino or two monominoes will do.
      ||(E&&A>1)          // Yes if we have a foldable line tetromino (E)
                          // and two monominoes (A).  Note we can't make a
                          // cube with a line tetromino and a domino (B).
      ||D>1               // Yes if we have two line trominoes
      ||C>1               // Yes if we have two corner trominoes
      ||((D||C)*3+B*2+A>5)
                          // Any combination of trominoes, dominoes, monominoes>6,
                          // where trominoes are used at most once
                          // (via logical or)...
         * (A>1||B>2||A*B)
                          // ...times this includer/excluder fudge factor
                          // that culls out the one non-working case;
                          // see table:
                          //
                          // Trominos Dominos Monomos Cube  A>1 B>2 A*B
                          //    1        0       3+    yes   Y   N   0
                          //    1        1       1+    yes   Y   N   1
                          //    1        2       0     no    N   N   0
                          //    0+       3       0+    yes   Y   Y   1
      ;
}

এটি কাজ করবে না। প্রশ্নটি বলছে কিছু টুকরা অব্যবহৃত হতে পারে
জন ডিভোরাক

@ জনডভোরাক এটি নির্দেশ করার জন্য ধন্যবাদ!
এইচ ওয়াল্টার্স

আমার কাছে এটা অদ্ভুত যে আপনার বানান মনে হয় tromino পরিবর্তে triomino , কিন্তু তারা উভয় বৈধ বানানের হয়, এটা মনে হয়।
mbomb007
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.