টেট্রিস মুভগুলির একটি তালিকা দেওয়া, সমাপ্ত লাইনের সংখ্যাটি ফিরিয়ে দিন


37

বিবরণ

আমরা টেট্রিসের কিছুটা সরলীকৃত সংস্করণ বিবেচনা করি যেখানে প্রতিটি পদক্ষেপের সমন্বয়ে:

  • টুকরোটি ঘড়ির কাঁটার দিকে, 0 থেকে 3 বার ঘোরানো
  • একটি নির্দিষ্ট কলামে টুকরা অবস্থান
  • দ্রুত ড্রপ

লক্ষ্যটি হ'ল সমাপ্ত লাইনের সংখ্যা নির্ধারণ করা, যেমন টেট্রিসের চালগুলির একটি তালিকা দেওয়া হয়।

স্ট্যান্ডার্ড টেট্রিস নিয়ম অনুসরণ করে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো

Playfield

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

টেট্রোমিনোসের আকার

আকার

ইনপুট আউটপুট

ইনপুট

টেট্রিসের একটি কমা দ্বারা পৃথক করা তালিকা 3 টি অক্ষর সহ এনকোডেড মুভ। প্রথম দুটি চরিত্রটি ব্যবহারের জন্য টেট্রোমিনো আকার বর্ণনা করে এবং শেষটি একটি যেখানে অবস্থানটি ফেলেছে তা বর্ণনা করে।

  1. Tetromino: I, O, T, L, J, Zবা S, উপরোক্ত হিসাবে একই যাতে।
  2. ঘড়ির কাঁটার ঘোরার সংখ্যা: 0থেকে3
  3. কলাম: 0থেকে 9। এটি সেই কলামে যেখানে টুকরোটির উপরের বাম কোণে ( xউপরের ছবিতে একটি চিহ্নযুক্ত ) ঘূর্ণন 1 পরে অবস্থিত

ধারণা করা হয় যে সরবরাহিত তালিকার সমস্ত পদক্ষেপ বৈধ। অবৈধ এন্ট্রিগুলির জন্য যেমন চেক করার দরকার নেই I07( Iডানদিকে আনুভূমিক আকৃতি খুব দূরে রাখা হয়েছে)।

1 আপনি কোনও আসল ঘূর্ণন অ্যালগরিদম প্রয়োগ করতে বা সমস্ত ভিন্ন আকারকে হার্ডকোড করতে মুক্ত, যতক্ষণ xনা সরানো তৃতীয় অক্ষরের দ্বারা প্রদত্ত কলামে অবস্থিত।

আউটপুট

সমাপ্ত লাইনের সংখ্যা।

উদাহরণ

উদাহরণ

O00,T24প্রথম অবস্থান O00,T24,S02,T01,L00,Z03,O07,L06,I05তৈরি করবে এবং দ্বিতীয় অবস্থান তৈরি করবে।

সুতরাং, নিম্নলিখিত ক্রমটি একটি টেট্রিস উত্পন্ন করবে এবং ফিরে আসবে 4:

O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19

পরীক্ষার মামলা

1) "O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19" -> 4
2) "S00,J03,L27,Z16,Z18,I10,T22,I01,I05,O01,L27,O05,S13" -> 5
3) "I01,T30,J18,L15,J37,I01,S15,L07,O03,O03,L00,Z00,T38,T01,S06,L18,L14" -> 4
4) "S14,T00,I13,I06,I05,I19,L20,J26,O07,Z14,Z10,Z12,O01,L27,L04,I03,S07,I01,T25,J23,J27,O01,
    I10,I10" -> 8
5) "O00,T24,L32,T16,L04,Z11,O06,L03,I18,J30,L23,Z07,I19,T05,T18,L30,I01,I01,I05,T02" -> 8

পরীক্ষার পৃষ্ঠা

একটি সরানো তালিকার পরীক্ষার জন্য আপনি এই জেএসফিডেলটি ব্যবহার করতে পারেন ।


1
টুকরোটি কী অক্ষরেখা ঘোরানো হয়?

1
@ আর্নল্ড আমি আপনাকে সুপার রোটেশন সিস্টেমটি একবার দেখে, এবং চিত্রটিকে কিছুটা সম্পাদনা করার পরামর্শ দিচ্ছি। tetris.wikia.com/wiki/SRS

1
সুতরাং, আমরা এগুলি 25 (15 টি ডুপ্লিকেট গণনা না করে) বিভিন্ন আকার হিসাবে বিবেচনা করতে পারি, তাহলে?

1
সমাধানগুলি কমা-বিচ্ছিন্ন স্ট্রিংয়ের পরিবর্তে অ্যারে হিসাবে ইনপুট নিতে পারে?
জর্দান

1
এটি দীর্ঘ সময়ের জন্য আমি দেখেছি সেরা পিসিজি প্রশ্ন। কি একটি মহান ধারণা! আকর্ষণীয় এবং ব্যবহারিক দিকগত দিক থেকে সেরা এবং খুব বড় নয় এমনকি খুব ছোট নয়।
গ্রিনআসজেড

উত্তর:


5

পিএইচপি, 405 399 378 372 368 360 354 347 331 330 328 319 309 300 বাইট

( ডেভের ব্লক ম্যাপিং সহ )

<?$f=[~0];L:for($y=0;$f[++$d+$y]|$s;$s>>=4)$y-=1022<$f[$d+$y]=$f[$d]|$s%16<<$x;$c-=$y;if(list($p,$r,$x)=$argv[++$z])for($s=I==$p?$r&1?4369:15:hexdec(decoct(O==$p?27:ord(base64_decode('M1ozWjqaF1kemR6ZPJMPyTnSJ0s')[ord($p)/4%5*4+$r])));;$d--)for($y=4;$y--;)if ($f[$d+$y]>>$x&$s>>$y*4&15)goto L;echo$c;

প্রোগ্রাম, পৃথক যুক্তি হিসাবে মুভ নেয়, ফলাফল মুদ্রণ

কার্যকারিতা ভাঙ্গন:

অ্যারে হিসাবে পদক্ষেপ নেয়, ফলাফল প্রদান করে

function t($a)
{
    $f=[~$z=0];             // init field $f (no need to init $z in golfed version)
    L:                      // jump label
                            // A: paint previous piece at line $d+1:
#   if($s)paint($f,$s,$d+1,$x);
    for($y=0;               // $y = working line offset and temporary score
        $f[++$d-$y]|$s;$s>>=4)// next field line; while field or piece have pixels ...
        $s>>=4)                 // next piece line
        $y+=1022<               // 3: decrease temp counter if updated line is full
            $f[$d-$y]=$f[$d]    // 2: use $y to copy over dropped lines
                |$s%16<<$x;     // 1: set pixels in working line
    $c+=$y;                         // add temp score to global score
#   paint($f);var_dump($c);
    if(list($p,$r,$x)=$a[$z++])// B: next piece: $p=name; $r=rotation, $x=column
#   {echo"<b>$z:$p$r-$x</b><br>";
        for(                // C: create base 16 value:
            $s=I==$p
                ? $r&1?4369:15  // I shape (rotated:0x1111, not rotated:0xf)
                : hexdec(decoct(    // 5: convert from base 8 to base 16
                    O==$p ? 27  // O shape (rotation irrelevant: 033)
                    : ord(          // 4: cast char to byte
                                    // 0: 4 bytes for each remaining tetromino
                        base64_decode('M1ozWjqaF1kemR6ZPJMPyTnSJ0s')[
                            ord($p)/4%5 // 1: map STZJL to 01234
                            *4      // 2: tetromino offset
                            +$r]    // 3: rotation offset
            )));;$d--
        )
            for($y=4;$y--;) // D: loop $y through piece lines
                if ($f[$d+$y]>>$x & $s>>$y*4 & 15) // if collision ...
                    goto L;         // goto Label: paint piece, tetris, next piece
#   }
    return$c;               // return score
}

রেফারেন্সের জন্য: পুরানো ম্যাপিং

            hexdec(decoct(          // 3. map from base 8 to base 16
                                    // 0. dword values - from high to low: rotation 3,2,1,0
                [0x991e991e,0xc90f933c,0x4b27d239,0x1b1b1b1b,0,0x5a335a33,0x59179a3a]
                [ord($m[0])/2%9]    // 1. map ZJLO.ST to 0123.56 -> fetch wanted tetromino
                >>8*$m[1]&255       // 2. the $m[1]th byte -> rotated piece
            ))

পরীক্ষামূলক

দেখতে আমার অন্যান্য পিএইচপি উত্তর

দেখতে চাই?

#ফাংশন উত্স থেকে অপসারণ এবং এটি যুক্ত করুন:

function paint($f,$s=0,$d=0,$x=0){echo'<pre>';for($y=count($f)+5;$y--;$g=0)if(($t=(($z=$y-$d)==$z&3)*($s>>4*$z&15)<<$x)|$r=$f[$y]|0){$z=$t?" $r|$t=<b".(1022<($z=$t|$r)?' style=color:green':'').">$z":" <b>$r";for($b=1;$b<513;$b*=2)$z=($t&$b?'<b>'.($r&$b?2:1).'</b>':($r&$b?1:'.')).$z;printf("%02d $z</b>\n",$y);}echo'</pre>';}

কিছু গল্ফিং পদক্ষেপ

5 রেভ: একটি বড় লাফ (399- 21 = 378) কেবল
দুটি পৃথক লুপ থেকে দুটি বিদ্যমান লুপে কলাম শিফটটি সরিয়ে এসেছিল ।

8 রেভ: টুকরা (গুলি) এর জন্য অ্যারে থেকে বেস 16 এ স্যুইচিং খুব বেশি দেয় নি,
তবে আরও কিছু গল্ফিংয়ের জন্য পথ তৈরি করেছে।

রেভ। 17: 16 বাইট সংরক্ষণ করার base64_encode(pack('V*',<values>))
পরিবর্তে মানগুলি ক্র্যাঞ্চ করে বাইট ইনডেক্সিং ব্যবহার করেছেunpack

25 থেকে 29: ডেভিসের কোড দ্বারা অনুপ্রাণিত: নতুন হ্যাশিং (-2), নতুন লুপ ডিজাইন (-9), গোটো (-10)
যদিও প্রি-শিফট নয়; যে 17 বাইট খরচ হবে।

আরও সম্ভাবনা

এর সাথে /2%9, আমি একটি ফাইলের মধ্যে বাইনারি ডেটা রেখে 15 বাইট (কেবলমাত্র 14 বাইট /4%5) সংরক্ষণ করতে পারি এবং তারপরে সূচীকরণ করতে পারি । আমি কি এটা চাই?
bfile(b)[0]

রূপান্তরকরণের জন্য ইউটিএফ -8 অক্ষরগুলির জন্য অনেক ব্যয় হবে।

হ্যাশিং উপর

আমি ব্যবহার করেছি ZJLO.ST /2%9 -> 0123.56; কিন্তু T.ZJLOS /3%7 -> 0.23456ভাল হিসাবে।
এক বাইট দীর্ঘ: O.STJLZ %13/2 -> 0.23456
এবং আরও তিনটি:OSTZJ.L %17%12%9 -> 01234.6

আমি একটি শর্ট হ্যাশ (সর্বোচ্চ 5 বাইট) খুঁজে পাইনি যা কোনও ফাঁক ফেলে না;
তবে ডেভ খুঁজে পেয়েছে STZJL /4%5 -> 01234, তালিকা থেকে ওটিকে বাদ দিচ্ছে। wtg!

BTW: TIJSL.ZO (%12%8) -> 01234.67জন্য পাতার রুম Iআকৃতি
(এবং একটি কাল্পনিক A, Mবা Yআকৃতি)। %28%8এবং %84%8, একই করুন (তবে Eপরিবর্তে A)।


নিস; আমি সম্মিলিত পেইন্টিং + লাইন সনাক্তকরণ পছন্দ করি এবং এটি break 2সিতে আমার যা করা উচিত তার চেয়ে অনেক বেশি ক্লিনার! আপনি পারে ব্যবহার করে কিছু বাইট সংরক্ষণ করতে পারবেন array_diff(একটি নির্দিষ্ট মান লাইন সেট সম্পন্ন পরিবর্তে ব্যবহার unsetতারপর প্রতিস্থাপন array_valuesসঙ্গে array_diff), কিন্তু আমি ডক্স থেকে বলতে পারবো না যে যদি পুনরাবৃত্তি মান চেপ্টা হবে (যেমন array_diff ([1,2, ২,৩], [১]) -> [২,২,৩] বা মাত্র [২,৩])
ডেভ

@ ডেভ: array_diffসদৃশ মানগুলি সরায় না; এবং আমার ইতিমধ্যে স্থির মান (1023) রয়েছে; তবে এটি অ্যারের সাথে পুনরায় সূচি দেয় না । দুর্দান্ত ধারণা, তবে এটিতে একটি বাইট লাগবে।
টাইটাস

আপনি আমার অতীত উড়ে যাওয়ার সময় বাহ! দেখে মনে হচ্ছে কিছু করার জন্য আমি পেয়েছি!
ডেভ

৩০০ পৌঁছে অভিনন্দন! আমি আপনার সর্বশেষ প্রস্তাবিত পরিবর্তনটি প্রয়োগ করব ( /10পুরো জায়গা জুড়ে এখন আমার দরকার নেই এমন ঘূর্ণন চেকটি সহজ করার চিন্তাভাবনা করেনি ) তবে অন্যথায় আমি মনে করি আমার কাজ শেষ হয়ে গেছে। পিএইচপি এবং সি সরাসরি প্রতিযোগিতামূলক হয়ে উঠতে পেরে আমি অবাক হয়েছি। এটি মজাদার ছিল - আশা করি ওপি আপনার উত্তর গ্রহণ করবে!
ডেভ

@ ডেভ অ্যান্ড টাইটাস - আমি আশা করি আমি উভয় উত্তর গ্রহণ করতে পারি। তোমরা অসাধারণ একটি কাজ করেছ। 300 এ পৌঁছানোর জন্য যাইহোক তিতাসকে অভিনন্দন জানানো হয়েছে And এবং আমি মনে করি এটি আসলে 299 যেহেতু আপনার পরে একটি অকেজো স্থান আছে if
আর্নল্ড

16

সি, 401 392 383 378 374 351 335 324 320 318 316 305 বাইট

d[99]={'3Z3Z',983177049,513351321,1016270793,970073931,~0},*L=d+5,V,s;char c;main(x){B:for(c=0;c[++L]|V;V>>=4)c-=(L[c]=*L|(V&15)<<x)>1022;s-=c;if(scanf("%c%1d%d,",&c,&V,&x)>2)for(V=c^79?d[c/4%5]>>24-V*8:27,V=c^73?V/64%4<<8|V/8%8<<4|V%8:V&32?15:4369;;--L)for(c=4;c--;)if(L[c]>>x&V>>c*4&15)goto B;return s;}

স্টিডিনে কমা-বিভক্ত ইনপুট নেয়, প্রস্থান স্থিতিতে স্কোরটি দেয়।

প্রয়োজন charসাইন ইন করা (যা জিসিসি জন্য ডিফল্ট হয়) এবং প্রয়োজন '3Z3Z'861549402 হিসেবে ব্যাখ্যা করা (যা, সামান্য endian মেশিনে জিসিসি ক্ষেত্রে দেখা যায় অন্তত)।


ব্যবহারের উদাহরণ:

echo "O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19" | ./tetris; echo "$?";

উচ্চ-স্তরের ব্যাখ্যা:

রেখা ব্যতীত সমস্ত আকার একটি কোণে অনুপস্থিত একটি 3x3 গ্রিডে ফিট করতে পারে:

6 7 -
3 4 5
0 1 2

এর অর্থ এগুলি প্রতিটি বাইটে সংরক্ষণ করা সহজ। উদাহরণ স্বরূপ:

- - -         0 0 -
- # -   -->   0 1 0   -->   0b00010111
# # #         1 1 1

(আমরা প্রতিটি টুকরোটি বাক্সের নীচে-বামে এটিকে ড্রপিংকে আরও সহজ করার জন্য সারিবদ্ধ করি)

যেহেতু আমরা কমপক্ষে 4 বাইট পেতে পারি, এর অর্থ আমরা প্রতিটি টুকরোটির 4 টি ঘূর্ণন একটি একক পূর্ণসংখ্যায় লাইনের জন্য একটি বিশেষ কেস দিয়ে সঞ্চয় করতে পারি। আমরা গেমের গ্রিডের প্রতিটি সারি একটি ইন্টিতে (কেবলমাত্র 10 টি বিট প্রয়োজন) এবং বর্তমানে লম্বা টুকরোটি দীর্ঘ (4 লাইন = 40 বিট) এর মধ্যে ফিট করতে পারি।


ভাঙ্গন:

d[99]={             // General memory
  '3Z3Z',           //  Shape of "S" piece (multi-char literal, value = 861549402)
  983177049,        //  Shape of "T" piece
  513351321,        //  Shape of "Z" piece
  1016270793,       //  Shape of "J" piece
  970073931,        //  Shape of "L" piece
  ~0                //  Bottom of game grid (solid row)
},                  //  Rest of array stores lines in the game
*L=d+5,             // Working line pointer (start >= base of grid)
V,                  // Current piece after expansion (also stores rotation)
s;                  // Current score (global to initialise as 0)
char c;             // Input shape identifier (also counts deleted lines)
main(x){            // "x" used to store x location
  B:                                // Loop label; jumps here when piece hits floor
  for(c=0;c[++L]|V;V>>=4)           // Paint latest piece & delete completed lines
    c-=(L[c]=*L|(V&15)<<x)>1022;
  s-=c;                             // Increment score
  if(scanf("%c%1d%d,",&c,&V,&x)>2)  // Load next command
    for(V=c^79?                     // Identify piece & rotation
          d[c/4%5]>>24-V*8          //  Not "O": load from data
        :27,                        //  Else "O": always 27
        V=c^73?                     // If not "I" (line):
          V/64%4<<8|V/8%8<<4|V%8    //  expand shape to 16-bits
        :                           // Else we are a line:
          V&32?                     //  "I" coincides with "J"; use this to check
               15:4369;             //  horizontal/vertical
        ;--L)                       // Loop from top-to-bottom of grid
      for(c=4;c--;)                 //  Loop through rows of piece
        if(L[c]>>x&V>>c*4&15)       //   If collides with existing piece:
          goto B;                   //    Exit loops
  return s;                         // Return score in exit status
}

-৪, -১ @ টিটাসকে এবং -২০, -১০ এর উত্তর থেকে অনুপ্রেরণা দিয়ে ধন্যবাদ জানায়


সুন্দর! আপনি শুধু s+=(d[A-x]=d[A])ব্যবহার না করে করতে পারেন x?
আর্নৌল্ড

দুর্ভাগ্যক্রমে xবর্তমান ধাপে কয়টি সারি ভেঙে পড়তে হবে (প্রতিটি সারি লুপের অগ্রগতির সাথে Aসাথে সারিটির A-x
ডেভ

ডি আহা! আমার খারাপ। এই ধরনের নির্বোধ পরামর্শের জন্য দুঃখিত। :)
আর্নৌল্ড

1
@ টিটাস এটি সি এর অ্যারে সূচকের অপব্যবহার। সহজভাবে লিখুন 1[a]এবং a[1]একই জিনিসটি করুন (বা আরও সুনির্দিষ্টভাবে a[b]অনুবাদ করুন *(a+b))। বন্ধনী এড়ানোর উপায় হিসাবে এটি এরূপভাবে আপত্তিজনক। এই ক্ষেত্রে, 1[*v]== (*v)[1], অর্থাৎ কমান্ডের দ্বিতীয় অক্ষর, অর্থাৎ ঘূর্ণন।
ডেভ

1
আপনি কি Iস্থানধারক থেকে মুক্তি পেতে পারেন ? যদি তা হয় তবে /2%9পরিবর্তে হ্যাশ হিসাবে চেষ্টা করুন %12%12%8যদি না.
টাইটাস

2

রুবি, 474 443 428 379 + 48 = 427 বাইট

@ 1Titus ধন্যবাদ

এটি অবশ্যই আরও গল্ফ করা যেতে পারে।

STDIN বা একটি ফাইল নাম থেকে টুকরাগুলির বাইনারি অভিধান পড়ুন (নীচে দেখুন) এবং একটি আর্গুমেন্ট হিসাবে একটি সরানো তালিকা গ্রহণ করে, যেমন $ cat pieces | ruby script.rb O00,T24,S02,...

q=$*.pop
z=$<.read.unpack('S*')
b=c=g=i=0
x=10
u=1023
r=->n{n&2**x-1>0?n:r[n>>x]}
y=->n{n>0?[n&u]+y[n>>x]:[]}
l=->c,n{z.find{|m|m>>x==c<<2|n.to_i}||l[c,n-2]}
q.scan(/(\w)(\d)(\d)/){n=l["IOTLJSZ".index($1),$2.to_i]
v=(n&1|(n&6)<<9|(n&56)<<17|(n&960)<<24)<<$3.to_i
(y[b].size+1).times{t=b<<40
t&v>0&&break
g=t|v
v<<=x}
b=0
a=y[r[g]]
a.grep_v(u){|o|b|=o<<x*i
i+=1}
c+=a.count u}
p c

বাইনারি পিস ডেটা (এক্সএক্সডি ফর্ম্যাট)

0000000: c003 4b04 d810 d814 b820 9c24 d029 5a2c  ..K...... .$.)Z,
0000010: 7830 9634 e039 ca3c 3841 d444 c849 4e4c  x0.4.9.<8A.D.INL
0000020: 9861 9869 5c64 5c6c f050 f058 9a54 9a5c  .a.i\d\l.P.X.T.\

এটি repl.it এ দেখুন (হার্ড-কোডেড আর্গুমেন্ট, অভিধান সহ): https://repl.it/Cqft/2

অবহেলিত ও ব্যাখ্যা

# Move list from ARGV
q = $*.pop

# Read piece dictionary; pieces are 16-bit integers: 3 for letter,
# 2 for rotation, 10 for shape (and 1 wasted)
z = $<.read.unpack('S*')

# Empty board and various counters
b = c = g = i = 0
x = 10 # Magic numbers
u = 1023

# A function to remove empty lines
r = ->n{ n & 2**x - 1 > 0 ? n : r[n >> x] }

# A function to split the board into lines
y = ->n{ n > 0 ? [n & u] + y[n >> x] : [] }

# A function to lookup a piece by letter and rotation index
l = ->c,n{ z.find {|m| m >> x == c << 2 | n.to_i } || l[c, n-2] }

# Read the move list
q.scan(/(\w)(\d)(\d)/) {
  # Look up the piece
  n = l["IOTLJSZ".index($1), $2.to_i]

  # Convert the 10-bit piece to a 40-bit piece (4 rows of 10 columns)
  v = (n & 1 |
        (n & 6) << 9 |
        (n & 56) << 17 |
        (n & 960) << 24
      ) << $3.to_i # Shift by the appropriate number of columns

  # Drop the piece onto the board
  (y[b].size + 1).times {
    t = b << 40
    t & v > 0 && break
    g = t | v
    v <<= x
  }

  # Clear completed rows
  b = 0
  a = y[r[g]]
  a.grep_v(u) {|o|
    b |= o << x * i
    i += 1
  }

  c += a.count u # Count cleared rows
}
p c

1 বাইট: m >> 10হতে পারেm >> x
টাইটাস

টাইটাস ভাল চোখ ধন্যবাদ!
জর্ডান

স্পষ্টভাবে প্রয়োজন করার কোন প্রয়োজন নেই \d: রেগুলার এক্সপ্রেশন মধ্যে গুলি /(\w)(\d)(\d)//(\w)(.)(.)/
manatwork

2

পিএইচপি, 454 435 427 420 414 বাইট

টুকরা এবং মানচিত্রের জন্য বিট ক্ষেত্র; তবে Iডেভের গল্ফিং হিসাবে আকৃতির কোনও বিশেষ ক্ষেত্রে নেই ।

<?$t=[I=>[15,4369],O=>[51],T=>[114,562,39,305],L=>[113,802,71,275],J=>[116,547,23,785],Z=>[54,561],S=>[99,306]];foreach($argv as$z=>$m)if($z){$s=$t[$m[0]][$m[1]%count($t[$m[0]])];for($d=$i=0;$i<4;$i++)for($k=0;$k<4;$k++)if($s>>4*$k&1<<$i){for($y=0;$y++<count($f);)if($f[$y-1]&1<<$m[2]+$i)$d=max($d,$y-$k);$k=3;}for($k=$d;$s;$k++,$s>>=4)if(1022<$f[$k]|=$s%16<<$m[2]){$c++;unset($f[$k]);}$f=array_values($f);}echo$c;

কমান্ড লাইন থেকে তর্কগুলি নেয়, ফলাফল মুদ্রণ করে

ফাংশন হিসাবে ungolfed

অ্যারে হিসাবে আর্গুমেন্ট নেয়, ফলাফল প্রদান

function t($a)
{
    // bitwise description of the stones and rotations
    $t=[I=>[15,4369],O=>[51],T=>[114,562,39,305],L=>[113,802,71,275],J=>[116,547,23,785],Z=>[54,561],S=>[99,306]];
    foreach($a as$m)
    {
        $s=$t[$m[0]][$m[1]%count($t[$m[0]])];   // $s=stone
        // find dropping space
        for($d=$i=0;$i<4;$i++)
            // a) lowest pixel of stone in column i
            for($k=0;$k<4;$k++)
                if($s>>4*$k&1<<$i)
                {
                    // b) top pixel of field in column x+i 
                    for($y=0;$y++<count($f);)
                        if($f[$y-1]&1<<$m[2]+$i)$d=max($d,$y-$k);
                    $k=3; // one byte shorter than `break;`
                }
        // do drop
        for($k=$d;$s;$k++,$s>>=4)
            if(1022<$f[$k]|=$s%16<<$m[2])   // add block pixels to line pixels ... if full,
            {$c++;unset($f[$k]);}           // tetris
        $f=array_values($f);
    }
    return$c;
}

পরীক্ষা (ফাংশনে)

$data=[
    "O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19"=>4,
    "S00,J03,L27,Z16,Z18,I10,T22,I01,I05,O01,L27,O05,S13" => 5,
    "I01,T30,J18,L15,J37,I01,S15,L07,O03,O03,L00,Z00,T38,T01,S06,L18,L14" => 4,
    "S14,T00,I13,I06,I05,I19,L20,J26,O07,Z14,Z10,Z12,O01,L27,L04,I03,S07,I01,T25,J23,J27,O01,I10,I10" => 8,
    // additional example for the two last tetrominoes:
    'O00,T24,L32,T16,L04,Z11,O06,L03,I18,J30,L23,Z07,I19,T05,T18,L30,I01,I01,I05,T02' => 8,
];
function out($a){if(is_object($a)){foreach($a as$v)$r[]=$v;return'{'.implode(',',$r).'}';}if(!is_array($a))return$a;$r=[];foreach($a as$v)$r[]=out($v);return'['.join(',',$r).']';}
function cmp($a,$b){if(is_numeric($a)&&is_numeric($b))return 1e-2<abs($a-$b);if(is_array($a)&&is_array($b)&&count($a)==count($b)){foreach($a as $v){$w = array_shift($b);if(cmp($v,$w))return true;}return false;}return strcmp($a,$b);}
function test($x,$e,$y){static $h='<table border=1><tr><th>input</th><th>output</th><th>expected</th><th>ok?</th></tr>';echo"$h<tr><td>",out($x),'</td><td>',out($y),'</td><td>',out($e),'</td><td>',cmp($e,$y)?'N':'Y',"</td></tr>";$h='';}
foreach($data as $v=>$e)
{
    $x=explode(',',$v);
    test($x,$e,t($x));
}

427? তুমি আছো!
জর্দান

@ জর্দান: এবং সেই 427 এর মধ্যে <?ওভারহেড অন্তর্ভুক্ত রয়েছে :)
টাইটাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.