Tetris! চূড়ান্ত উচ্চতা (3 দিন)


19

আমার বিশ্ববিদ্যালয়ের কোড চ্যালেঞ্জ প্রতিযোগিতা থেকে চ্যালেঞ্জ নেওয়া হয়েছে

এটি আসলে 0 দিনের তবে গতকালের চ্যালেঞ্জটি খুব সহজ ছিল এবং এখানে অন্য একটি প্রশ্নের জবাবদিহি হতে পারে।


টেট্রিস এমন একটি ভিডিও গেম যা 80 এর দশকে জনপ্রিয় হয়েছিল। এটি বোর্ডে পড়ে থাকা বিভিন্ন আকারের সাথে কয়েকটি সিরিজের টুকরো স্থাপন করে যাতে তারা সম্ভবত সবচেয়ে কমপ্যাক্ট উপায়ে ফিট করে।

এই সমস্যায় আমরা টুকরো টুকরো ক্রমগুলি অনুমান করব যা প্রতিটি একটি নির্দিষ্ট অবস্থানে এবং একটি নির্দিষ্ট অভিযোজন সহ যা পরিবর্তন করা যায় না। টুকরোগুলি পড়ার সাথে সাথে গাদা হয়ে গেছে এবং সম্পূর্ণ সারিগুলি মুছে ফেলা হয়নি (আসল গেমের মতো)। উদ্দেশ্যটি হ'ল সমস্ত টুকরো পড়ে যাওয়ার পরে বোর্ডের প্রতিটি কলামের চূড়ান্ত উচ্চতা নির্ধারণ করা।

চিত্রটিতে প্রদর্শিত মোট 7 টি বিভিন্ন টুকরো রয়েছে:

আকার

চ্যালেঞ্জ

টুকরোয়ের একটি তালিকা দেওয়া হয়েছে, সমস্ত টুকরো পড়ার পরে বোর্ড থেকে সমস্ত কলামের উচ্চতা আউটপুট করুন

একটি টুকরা তিনটি সংখ্যা নিয়ে গঠিত: I, R এবং P. প্রথম সংখ্যা, I, এই টুকরোটির শনাক্তকারী (1 এবং 7 এর মধ্যে একটি সংখ্যা, চিত্রের মতো একই ক্রমে)। দ্বিতীয় নম্বর, আর, হয় টুকরা ঘোরানো। এটি 0, 90, 180 বা 270 মান গ্রহণ করতে পারে এবং এন্টি-ক্লকওয়াইজ দিকের অংশে টুকরো ঘোরার কোণকে উপস্থাপন করে। তৃতীয় নম্বর, পি, টুকরা অবস্থান নির্দেশ করে। টুকরা দ্বারা দখল করা বাম দিকে কলামটি উপস্থাপন করে (এটি 1 বা 0 সূচক হতে পারে Please দয়া করে নির্দিষ্ট করুন)।

উদাহরণ এবং পরীক্ষার কেস (1 সূচক)

  • প্রদত্ত [[1, 0, 1], [4, 0, 1], [5, 90, 4]]

মামলা 1

  • আউটপুট [3, 3, 1, 3, 2]

  • প্রদত্ত [[6, 270, 4], [1, 180, 5], [1, 90, 6], [7, 0, 4]]

কেস # 2

  • আউটপুট [0, 0, 0, 9, 9, 8, 3, 3]

  • প্রদত্ত [[3,0,1],[3,180,3]]আউটপুট[1,1,4,4,4]

  • প্রদত্ত [[2,180,1],[2,0,3]]আউটপুট[2,2,4,3,3]

মন্তব্য

  • এটি
  • সারি / কলাম 1 বা 0 সূচক হতে পারে। নির্ধারন করুন.
  • আপনি ইনপুট মানগুলিকে নতুন করে সংজ্ঞায়িত করতে পারেন (সম্ভবত আপনি পিস 1 কে এ, ইত্যাদি হিসাবে কল করতে চান)। সেক্ষেত্রে দয়া করে নির্দিষ্ট করুন

প্রশ্নাবলি

  • আমরা কি ডিগ্রি পরিবর্তিত কোণগুলির পরিবর্তে 4 টি স্বতন্ত্র মান ব্যবহার করতে পারি ?: হ্যাঁ

  • যদি কোনও টুকরোগুলি আগেরটির চেয়ে ঠিক ফিট না হয় তবে কী আমাদের "গর্তগুলি" পরিচালনা করার কথা রয়েছে ?: হ্যাঁ

  • বোর্ডের উচ্চতা বা প্রস্থটি সীমাবদ্ধ? না। প্রস্থ বা উচ্চতাও সীমাবদ্ধ নয়


ছবিগুলি এবং পরীক্ষার মামলার জন্য @ আরনাউল্ডকে ধন্যবাদ *। *


পারি I, Rএবং Pএকটি ভিন্ন অনুক্রমে ইনপুট হবে?
নীল

@ নিল হ্যাঁ এটি যে কোনও ক্রমে হতে পারে
লুইস ফিলিপ দে জেসুস মুনোজ

যদি আমরা ইনপুট মানগুলিকে নতুন করে সংজ্ঞায়িত করতে পারি, তবে আমি কি টুকরো আইডিটিকে ম্যাট্রিক্স হিসাবে নিতে পারি যা টুকরো আকৃতির প্রতিনিধিত্ব করে (কোনও আবর্তন ছাড়াই)?
অজ্ঞতার প্রতিমূর্তি

1
আমি মনে করি আমরা 2 কারণে টুকরা আকারের প্রতিনিধিত্ব করে একটি ম্যাট্রিক্স ইনপুট করতে পারি না। ইনপুটটি স্পষ্টভাবে সংজ্ঞায়িত করা হয়েছে: 1,2,3 .. বা এ, বি, সি .. এবং এই চ্যালেঞ্জের একটি মৌলিক অংশ হল এই সীমাবদ্ধতা পরিচালনা করা।
আজটেকো

1
0 এর পিছনে অন্তর্ভুক্ত করা কি ঠিক হবে?
ডানা

উত্তর:


10

জাভাস্ক্রিপ্ট (নোড.জেএস) ,  286 284 270  266 বাইট

টুকরো এবং অবস্থানগুলি 0-ইনডেক্স করা হয়। কোণগুলি ।[0..3]

a=>a.map(([p,r,x])=>(g=y=>y>3?g(+!Y--):b[Y+y]&(m[y]=('0x'+`717433667233ff4717333327661${1e12+0x5e7056a566ffff57efa65n.toString(4)}`[(p*2+r*56+y*99+13)%113])<<x)?m.map(v=>(g=x=>v&&g(x+1,H[x]=v&1?Y:~~H[x],v>>=1))(0,b[++Y]|=v)):g(y+1))(Y=a.length*4),m=[b=[-1]],H=[])&&H

এটি অনলাইন চেষ্টা করুন! বা একটি বর্ধিত সংস্করণ চেষ্টা করুন যা চূড়ান্ত বোর্ডটিও প্রদর্শন করে।

শেপ এনকোডিং

সমস্ত টুকরা বিপরীত ক্রমে সাজানো সারিগুলির সাথে যথাযথ 4 টি নিম্বল (4x4 বিট) হিসাবে সংরক্ষণ করা হয় এবং বাম দিকের পিক্সেলটি ম্যাপ করা হয় কমপক্ষে তাত্পর্যপূর্ণ বিটকে। অন্য কথায়, আকৃতির বাইনারি উপস্থাপনা উভয় উল্লম্ব এবং অনুভূমিকভাবে মিরর করা হয়।

উদাহরণ:

শেপ এনকোডিংয়ের উদাহরণ

হ্যাশ ফাংশন এবং অনুসন্ধান সারণী

এক টুকরা দেওয়া , একটি ঘূর্ণন এবং একটি সারিতে , আমরা সূচক পেতে নিম্নলিখিত হ্যাশ ফাংশন ব্যবহার এর অনুসন্ধান টেবিল থেকে সম্পর্কিত বিটমাস্ক:p[0..6]r[0..3]y[0..3]n

n=(2p+56r+99y+13)mod113

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

এই এন্ট্রিগুলি এইভাবে প্যাক করা হয়েছে:

`717433667233ff4717333327661${1e12+0x5e7056a566ffff57efa65n.toString(4)}`

যা নিম্নলিখিত 82 স্তন্যপায়ী প্রসারিত:

"717433667233ff47173333276611000000000000113213001112221112123333333311133233221211"

চূড়ান্ত বিন্যাসে হেক্সাডেসিমাল ব্যবহার করা কেবল টুকরোর দুটি অনুভূমিক উপস্থাপনার জন্য প্রয়োজনীয় , সুতরাং উপরের স্ট্রিংয়ের মধ্যে।I"ff"

হ্যাশ ফাংশনটির প্যারামিটারগুলি এমনভাবে জোর করে বাধ্য করা হয়েছিল যা নেতৃস্থানীয় এবং পিছনের শূন্যকে অনুকূল করে তোলে। 1e12মাঝখানে শূন্যগুলির জন্য এবং স্ট্রিংটি ডান অংশের জন্য বেস -16 থেকে বেস -4 এ রূপান্তরটি ব্যবহার করে স্ট্রিংটিকে আরও কিছুটা সংকুচিত করা যায় তা কেবল একটি স্বাগত তবে অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া। :-)

এখানে সমস্ত টুকরো এবং সমস্ত আবর্তনের জন্য আনপ্যাকিং প্রক্রিয়াটির একটি প্রদর্শন রয়েছে।

মন্তব্য

a => a.map(([p, r, x]) => (     // for each piece p with rotation r and position x:
  g = y =>                      //   g = recursive function taking y
    y > 3 ?                     //   if y is greater than 3:
      g(+!Y--)                  //     reset y to 0, decrement Y and try again
    :                           //   else:
      b[Y + y] & (              //     test if we have a collision of the board with
        m[y] =                  //     the y-th row m[y] of the current piece
          ('0x' + `717...`[     //     which is extracted from a lookup table
            (p * 2 + r * 56 +   //     using the hash function described in the
             y * 99 + 13) % 113 //     previous paragraph
          ]) << x               //     and shifted to the left according to x
      ) ?                       //     if we have a collision:
        m.map(v => (            //       we iterate again on the piece rows stored in m[]
          g = x =>              //         g = recursive function taking x
            v &&                //         if v is not equal to 0:
            g(                  //           do a recursive call:
              x + 1,            //             increment x
              H[x] =            //             update the height at x:
                v & 1 ?         //               if this bit is set:
                  Y             //                 set it to Y
                :               //               else:
                  ~~H[x],       //                 leave it unchanged or force it to 0
                                //                 if it was still undefined
              v >>= 1           //             shift v to the right
            )                   //           end of recursive call
          )(0,                  //         initial call to g with x = 0
               b[++Y] |= v)     //         increment Y and copy the piece row to the board
        )                       //     end of map()
      :                         //   else (no collision):
        g(y + 1)                //     do a recursive call to test the next row
  )(Y = a.length * 4),          //   initial call to g with y = Y = 4 * the number of pieces
                                //   (assuming the worst case: piled vertical I pieces)
  m = [b = [-1]], H = []        //   initialize m[], b[] and H[]
                                //   we set a full line at the bottom of b[]
) && H                          // end of map(); return H[]

3
সুন্দর কাজ প্যাকিং / টুকরা আনপ্যাকিং। এটি সত্যিই চিত্তাকর্ষক :)
ডানা

7

সি (ঝনঝন) , 253 239 221 212 বাইট

t(*a,*b,c){char*z="VP\225TBUIUVAaUZ@AWVDeTf@EVWhU😎EQV😀RTYT😉UU";for(size_t*p,f,n,y,i;c--;b++){f=1<<(8-*b)/3;p=z+*b++*8+*b++%f*2;f=n=*p;for(y=i=0;i<=f%4;y=fmax(y,a[*b+i++]+n%4))n/=4;for(;i--;a[*b+i]=y+n%4)n/=4;}}

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

পিএস আসলে কোডটির আকারটি 221 বাইট (তবে 212 অক্ষর) কারণ ইউটিএফএডি -8 এ ইউনিকোডে চরগুলি কোডেড হয়েছে। তবে tio.run এটিকে 212 বাইট কোড হিসাবে বিবেচনা করে ...

আমার কম্পিউটারে কোডের আকার 209 অক্ষর (218 বাইট)। তবে আমি tio.run visible এ\225 দৃশ্যমান চর দ্বারা প্রতিস্থাপন করতে পারি না 😞

অবহেলিত কোড

// a - output array (must be zeroed), b - array of block info, c - number of blocks

// Figure codes: 2->0, 3->1, 6->2, 1->3, 5->4, 7->5, 4->6 (0,1 are L-figures, 2 is is T-figure, 3 is a line 1x4; 4,5 are zigzags; 6 is a cube 2x2)
// Vertical and horizontal positions are zero-indexed, angles = 0..3

t(*a,*b,c)
{
  char*z="VP\225TBUIUVAaUZ@AWVDeTf@EVWhU😎EQV😀RTYT😉UU";  // UTF-8
//char*z="VP\225TBUIUVAaUZ@AWVDeTf@EVW\1hU😎\26EQV😀RTYT😉UU";  // 3 bytes longer (use it if you can't copy previous string correctly) :)
  // Blocks
  for(size_t*p,f,n,y,i;c--;b++){
    f=1<<(8-*b)/3;  // number of figure variants
    p=z+*b++*8+*b++%f*2;
    // Get top base line position (y)
    f=n=*p;  // figure width, TBLs and HATs
    for(y=i=0;i<=f%4;
      y=fmax(y,a[*b+i++]+n%4))
      n/=4;
    // Add heights (HATs)
    for(;i--;
      a[*b+i]=y+n%4)
      n/=4;
  }
}  // 215 chars (224 bytes)

বিবরণ

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

উদাহরণ:

                       ________ ________
_ [] _____ হাট = 1,0,0 [] [] [] হাট = 0,0,0 ___ [] [] _ ​​হাট = 0,1,1 [] [] [] হাট = 0,0,0
 [] [] [] টিবিএল = 1,1,1 [] টিবিএল = 2,1,1 [] [] টিবিএল = 1,1,0 [] টিবিএল = 1,2,1

আসুন প্রতিটি চিত্র এবং প্রতিটি ঘূর্ণন কোণের জন্য TBLs এবং HATs বর্ণনা করুন:

প্রস্থ টিবিএল হ্যাটস
----- ------- -------
এল-পরিসংখ্যান:
  3 1 1 1 1 0 0 // 0 °
  2 1 1 0 2 // 90 °
  3 1 1 2 0 0 0 // 180 °
  2 3 1 0 0 // 270 °

  3 1 1 1 0 0 1 // 0 °
  2 1 3 0 0 // 90 °
  3 2 1 1 0 0 0 // 180 °
  2 1 1 2 0 // 270 °

টি-চিত্রে:
  3 1 1 1 0 1 0 // 0 °
  2 1 2 0 1 // 90 °
  3 1 2 1 0 0 0 // 180 °
  2 2 1 1 0 // 270 °

লাইন:
  4 1 1 1 1 0 0 0 0 // 0 °, 180 °
  1 4 0 // 90 °, 270 °

zigzags:
  3 1 1 0 0 1 1 // 0 °, 180 °
  2 1 2 1 0 // 90 °, 270 °

  3 0 1 1 1 1 0 // 0 °, 180 °
  2 2 1 0 1 // 90 °, 270 °

ঘনক:
  2 2 2 0 0 // যে কোনও কোণ

এখন আমরা 2 বিট একটি সিকোয়েন্স যেমন এই সংখ্যা এনকোড এবং একটি অ্যারের পুরা করা উচিত (প্রতিস্থাপন 4 0দ্বারা 3 190 ° "লাইনের" 2 বিট মাপসই কোণ জন্য - ফলাফলের একই হবে; 1 ও হ্রাস প্রস্থ)।

আমরা ক্রমে এনকোড করব: প্রস্থ (2 এলএসবিতে ), টিবিএল , হ্যাটস (পিছনের লুপের জন্য পিছনে)। যেমন 2 2 1 1 0 270 ° টি-চিত্র কোণ হিসেবে এনকোড করা হবে না 1 0 1 2 1(শেষ 1 হয় প্রস্থ -1 ): 0b0100011001 = 281

12.02 আপডেট হয়েছে:

ক) আমি একটি অ্যারেটিকে একটি স্ট্রিংয়ে রূপান্তর করেছি এবং 18 টি অক্ষর সংরক্ষণ করেছি (আপনি আগের 239 বাইট কোড দেখতে পারেন ) :)

খ) আরও অনুকূলকরণ, কোডটি 9 টি অক্ষর দ্বারা সঙ্কুচিত করা হয়েছে।
এটি আমার শেষ প্রয়াস (আমি মনে করি, হও!) 😀 😀


1
আপনি ব্যবহার করে ধর্মঘট করতে পারেন <s> ... </s>
জোনাথন ফ্রেচ


ওহ ঠান্ডা. ধন্যবাদ। লোল :))
জিন এক্স

কি দারুন! নিম্ন-স্তরের টেট্রিস 🤔
বি

টিবিএল হ'ল সর্বোচ্চ লাইনের নিচে ফিগার সেলগুলির সংখ্যা যার নিচে এবং উপরে কেবল ফাঁকা জায়গা বা সেল ব্লক রয়েছে (কোনও মুক্ত স্থান এবং তারপরে কোনও ঘর নেই)। টিবিএল + হ্যাট = চিত্রের উচ্চতা (প্রতিটি অনুভূমিক অবস্থানে)। টিবিএল> 0 এবং হ্যাট> 0ও।
জিন এক্স

5

কমন লিস্প, 634 বাইট

(let((w(make-hash-table))(r 0))(defun z(c)(or(gethash c w)0))(defun x(c v)(setf r(max r c))(setf(gethash c w)v))(defun m(s)(dolist(c s)(apply(lambda(n u p)(let*((i(let*((j'(2 2 2))(k'(3 3))(l'(2 3))(m'(3 2))(o(case n(1(list'(1 1 1 1)'(4)))(2(list j k'(1 1 2)'(3 1)))(3(list j'(1 3)'(2 1 1)k))(4(list'(2 2)))(5(list'(2 2 1)l))(6(list j l'(1 2 1)m))(7(list'(1 2 2)m)))))(setf(cdr(last o))o)))(o(nth(+ u 2)i))(b(nth u i))(s(length o))(d 0)(h 0))(dotimes(i s)(let*((w(nth i b))(g(z(+ i p)))(m(+ g w)))(when(> m d)(setf d m)(setf h(- g(-(apply'max b)w))))))(dotimes(i s)(x(-(+ s p)i 1)(+(nth i o)h)))))c))(dotimes(i r)(print(z (+ i 1))))))

বাগাড়ম্বরপূর্ণ

(defun circular (list)
  (setf (cdr (last list)) list))

(defun get-piece (piece-number)
  (circular (case piece-number
              (1 (list '(1 1 1 1)
                       '(4)))
              (2 (list '(2 2 2)
                       '(3 3)
                       '(1 1 2)
                       '(3 1)))
              (3 (list '(2 2 2)
                       '(1 3)
                       '(2 1 1)
                       '(3 3)))
              (4 (list '(2 2)))
              (5 (list '(2 2 1)
                       '(2 3)))
              (6 (list '(2 2 2)
                       '(2 3)
                       '(1 2 1)
                       '(3 2)))
              (7 (list '(1 2 2)
                       '(3 2))))))

(let ((world (make-hash-table))
      (rightmost-column 0))
  (defun get-world-column (column)
    (or (gethash column world) 0))

  (defun set-world-column (column value)
    (setf rightmost-column (max rightmost-column column))
    (setf (gethash column world) value))

  (defun drop-piece (piece-number rotation position)
    (let* ((piece (get-piece piece-number))
           (top (nth (+ rotation 2) piece))
           (bottom (nth rotation piece))
           (size (length top))
           (max-combined-height 0)
           (contact-height 0))
      (dotimes (i size)
        (let* ((down-distance (nth i bottom))
               (height (get-world-column (+ i position)))
               (combined-height (+ height down-distance)))
          (when (> combined-height max-combined-height)
            (setf max-combined-height combined-height)
            (setf contact-height
                  (- height
                     (- (apply #'max bottom)
                        down-distance))))))
      (dotimes (i size)
        (set-world-column (- (+ size position) i 1)
                          (+ (nth i top) contact-height)))))

  (defun drop-pieces (pieces)
    (dolist (piece pieces)
      (apply #'drop-piece piece)))

  (defun print-world ()
    (loop for i from 1 to rightmost-column
          do (print (get-world-column i)))))

(defun play-tetris (pieces)
  (drop-pieces pieces)
  (print-world))

এটা পরীক্ষা করো

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

আবর্তন একটি অ-নেতিবাচক পূর্ণসংখ্যা। 0 = 0 ডিগ্রি, 1 = 90 ডিগ্রি, 2 = 180 ডিগ্রি, 4 = 270 ডিগ্রি


5

সি # (ভিজ্যুয়াল সি # ইন্টারেক্টিভ সংকলক) , 308 বাইট

a=>{var o=new int[a.Max(x=>x.Item3+4)];foreach(var(i,r,p)in a){var b="\"4TqzŒª!\0\0HSš	Ó\0$\n\0!“A“š š@";int m=0,n=b[i],t=0,u=n/8+r%(n%8),v=b[u*=2]<<8|b[u-1];for(;t<v/8%8;m=m>n?m:n)n=o[p+t]+v%8-(n=(u=v>>6+3*t++)/2&1)-(n&u);for(;t-->0;)o[p+t]=m-(n=(u=v>>6+3*t)/4&1)-(n&u);}return o;}

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

ঠিক আছে - এটি পাগলামি ছিল ... আমি একটি উত্তর জমা দিয়েছিলাম যা মিল-কোড-গল্ফ কৌশলগুলি ব্যবহার করে। তবে যখন আমি দেখলাম অন্যরা কী জমা দিচ্ছে, আমি বুঝতে পারি এর থেকে আরও ভাল উপায় ছিল।

প্রতিটি (shape, rotation)টিপল ডুপ্লিকেট অপসারণ করে একটি সি # স্ট্রিং আক্ষরিক মধ্যে এনকোড করা হয়। এনকোডিং প্রক্রিয়া এই কনফিগারেশনগুলির প্রতিটি 2 বাইটে ক্যাপচার করে।

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

  W   H
010 010 (2x2)
010 011 (2x3)
001 100 (1x4)
011 010 (3x2)
100 001 (4x1)

এরপরে, প্রতিটি কলাম 3 বিটে সংরক্ষণ করা হয়। আমার জন্য সর্বাধিক দরকারী জিনিসটি হ'ল কলামটির উপরের এবং নীচের দিক থেকে হারিয়ে যাওয়া স্কোয়ারের সংখ্যা।

// missing squares per column

+------ 0 top / 0 bottom
|+----- 0 top / 1 bottom
||+---- 0 top / 1 bottom
|||
HHH (L-Shape)         HH (Jagged-Shape)
H                    HH
                     |||
1 top / 0 bottom ----+||
0 top / 0 bottom -----+|
0 top / 1 bottom ------+

উপরের বা নীচ থেকে 2 টিরও বেশি স্কোয়ার কখনও অনুপস্থিত নয় এবং একইসাথে দু'টি থেকে 1 টিরও বেশি স্কোর কখনও অনুপস্থিত নেই। এই সীমাবদ্ধতার সেটটি দেওয়া, আমি নিম্নলিখিত এনকোডিং নিয়ে এসেছি:

// column encoding of missing squares per column

000: none missing
100: 1 missing on top
101: 2 missing on top
010: 1 missing on bottom
011: 2 missing on bottom
110: 1 missing on top and bottom

যেহেতু আমাদের উপরে বা নীচে নিখোঁজ স্কোয়ারগুলি সহ সর্বাধিক 3 টি কলামের জন্য অ্যাকাউন্ট করতে হবে, তাই আমরা প্রতিটি (shape, rotation)বিস্তৃত 15 টি বিটকে এনকোড করতে পারি ।

 C3  C2  C1   W   H
000 000 000 010 010 - 2x2 with no missing squares
000 000 000 100 001 - 4x1 with no missing squares
100 000 100 011 010 - 3x2 with missings square on top of columns 1 and 3
000 110 000 010 011 - 2x3 with missing squares on top and bottom of column 2

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

// Square
HH  (0, 90, 180, 270)
HH
#-------------------------------#
// ZigZag
HH  (0, 180)    H  (90, 270)
 HH            HH
               H
#-------------------------------#
// T
 H  (0)        HHH  (180)
HHH             H

 H  (90)       H    (270)
HH             HH
 H             H

সমস্ত অনন্য আউটপুট নির্ধারিত হয় এবং এটিতে সংরক্ষিত হয় byte[]এবং সি # স্ট্রিং লিটারিয়াল রূপান্তরিত হয়। কোন আকৃতির উপর ভিত্তি করে কোথায় তা দ্রুত অনুসন্ধান করার জন্য Iএবং Rঅ্যারের প্রথম 7 বাইটে একটি এনকোডযুক্ত লুকিং কী থাকে।

নীচে প্রোগ্রামটির একটি লিঙ্ক রয়েছে যা আমি টুকরাগুলি সংকুচিত করতে ব্যবহার করি।

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

কম গল্ফড এবং মন্তব্য করা কোড:

// a: input list of (i,r,p) tuples
a=>{
  // create an output array that 4 more than
  // the largest position. this may result
  // in some trailing 0's
  var o=new int[a.Max(x=>x.Item3+4)];

  // iterate over each (i,r,p) tuple
  foreach(var(i,r,p)in a){
    // escaped string
    var b="\"4Tqzª!\0\0HS   Ó\0$\n\0!A @";
    // declare several variables that will be used later
    int m=0,n=b[i],t=0,
      // u is the decoded index into b for the current (i,r) pair
      u=n/8+r%(n%8),
      // convert 2 bytes from b into an encoded (shape,rotation) pair
      v=b[u*=2]<<8|b[u-1];
    // iterate over the columns, determining the top of the current
    // piece. The formula here is:
    //   piece_top = max(column_height + shape_height - shape_space_bottom)
    for(;t<v/8%8;m=m>n?m:n)
      n=o[p+t]+v%8-(n=(u=v>>6+3*t++)/2&1)-(n&u);
    // iterate over the columns again, saving the the new height
    // in each column. The formula here is:
    //   new_column_height = piece_top - shape_space_top
    for(;t-->0;)
      o[p+t]=m-(n=(u=v>>6+3*t)/4&1)-(n&u);
  }
  return o;
}

4

কাঠকয়লা , 98 বাইট

Fθ«≔§⪪§⪪”)¶∧↷"e«↨U∧0%3;D∧⁼~h⊟⁵h/₂dΦ↗(EF”2⊟ι1⊟ιη≔⊟ιζW‹Lυ⁺ζLη⊞υ⁰≔⌈Eη⁻§υ⁺ζλ﹪Iκ³εFLη§≔υ⁺ζκ⁺ε⊕÷I§ηκ³»Iυ

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ইনপুটটিকে [পি, আর, আই] মানগুলির অ্যারে হিসাবে নেয়, যেখানে আমি 0 থেকে 6, আর 0 0 থেকে 3 এবং পি 0-সূচকযুক্তও হয়। ব্যাখ্যা:

Fθ«

ইনপুট টুকরা উপর লুপ।

≔§⪪§⪪”)¶∧↷"e«↨U∧0%3;D∧⁼~h⊟⁵h/₂dΦ↗(EF”2⊟ι1⊟ιη

বর্তমান টুকরা এবং ঘোরার বর্ণনাটি বের করুন। (নিচে দেখ.)

≔⊟ιζ

অবস্থানটি উত্তোলন করুন।

W‹Lυ⁺ζLη⊞υ⁰

টুকরো রাখার জন্য যথেষ্ট অনুভূমিক ঘর রয়েছে তা নিশ্চিত করুন।

≔⌈Eη⁻§υ⁺ζλ﹪Iκ³ε

টুকরো রাখার জন্য যথেষ্ট উল্লম্ব কক্ষ আছে তা নিশ্চিত করুন।

FLη§≔υ⁺ζκ⁺ε⊕÷I§ηκ³

প্রভাবিত কলামগুলির নতুন উচ্চতা গণনা করুন।

»Iυ

সমস্ত টুকরো প্রক্রিয়া করা হয়ে গেলে পৃথক লাইনে কলামের উচ্চতার চূড়ান্ত তালিকা আউটপুট করুন।

সংকুচিত স্ট্রিংটি মূল স্ট্রিংকে উপস্থাপন করে 00001923001061443168200318613441602332034173203014614341642430137। এখানে 2s Iবিভাজক এবং 1গুলি Rবিভাজক হয়। টুকরোগুলি নিম্নলিখিত হিসাবে ডিকোড করুন:

P\R  0    1    2    3
0    0000 9
1    300  06   443  68
2    003  86   344  60
4    33
5    034  73
6    030  46   434  64
7    430  37

হারানো Rমানগুলি স্বয়ংক্রিয়ভাবে চারকোল দ্বারা ঘূর্ণিত হয় filled প্রতিটি অঙ্ক তারপরে নিম্নলিখিত টেবিল অনুযায়ী দুটি মান, ওভারহ্যাং এবং মোট উচ্চতাতে মানচিত্র করে:

\ O H
0 0 1
3 0 2
4 1 2
6 0 3
7 1 3
8 2 3
9 0 4

ত্রিশঙ্কু এবং মোট উচ্চতা কলাম উচ্চতা কহা নিম্নরূপ: এক টুকরা যে আমরা একটি প্রদত্ত অবস্থানে স্থাপন করতে চান প্রদত্ত e, এটা সম্ভব টুকরা স্থাপন করতে যদিও কলামের এক তুলনায় বেশি লম্বা হতে পারে e। অতিরিক্ত স্থানের পরিমাণ ওভারহ্যাং দিয়ে। টুকরো স্থাপনের পরে কলামের নতুন উচ্চতাটি কেবল স্থানের অবস্থান এবং মোট উচ্চতা।

উদাহরণ: ধরুন আমরা 5কলাম 1-এ টুকরো রেখে শুরু করেছি কারণ যেহেতু আর কিছুই নেই এখনও টুকরোটি 0 এবং কলাম 1 এবং 3 পজিশনে এখন উচ্চতা 1 এবং কলাম 2 এর উচ্চতা 2 রয়েছে আমরা তখন একটি 6টুকরো রাখতে চাই 10 কলামে রোটেশন সহ 0 এখানে আমরা আসলে এই পিসটি 0 পজিশনে রাখতে পারি; যদিও কলাম 1 এর উচ্চতা 1 টির রয়েছে, টুকরোটি 1 টির ওভারহান রয়েছে, এবং তাই এটি স্থাপনের জন্য যথেষ্ট জায়গা রয়েছে। কলাম 0 2 এর উচ্চতা এবং 1 কলাম 1 এর উচ্চতা দিয়ে শেষ হয়।

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