প্রোগ্রামিং টেট্রিস ব্লক (আক্ষরিক)


33

টেট্রিস গেমটিতে types ধরণের ইট বা টেটর আই মিনো রয়েছে যা গাণিতিকভাবে টেটার মিনো নামে পরিচিত কারণ এগুলি সবগুলি 4 টি বর্গক্ষেত্র দিয়ে তৈরি:

টেট্রিস ইট

আমি, জে, এল, ও, এস, টি এবং জেড নামগুলি তাদের আনুমানিক আকারের সাথে মিলে যায়। 90 ° ঘূর্ণন গণনা করা হচ্ছে, মোট 19 টি অনন্য আকার রয়েছে:

I
I
I
I

IIII

 J
 J
JJ

JJJ
  J

JJ
J
J

J
JJJ

L
L
LL

  L
LLL

LL
 L
 L

LLL
L

OO
OO

 SS
SS

S
SS
 S

TTT
 T

T
TT
T

 T
TTT

 T
TT
 T

ZZ
 ZZ

 Z
ZZ
Z

চ্যালেঞ্জ

কোডের একটি আয়তক্ষেত্রাকার ব্লক লিখুন যা এই 19 টি আকার থেকে তৈরি বেস অংশ হিসাবে কাজ করে। যখন এই কোডটি কোনও একটি আকারে সাজানো হয়, এমন একটি প্রোগ্রাম গঠন করা উচিত যা সেই আকারের সাথে যুক্ত একক বড় হাতের অক্ষরকে আউটপুট করে। এটি অবশ্যই 19 টি আকারের জন্য কাজ করবে।

19 টি আকারের কিছুতে উপস্থিত খালি অঞ্চলগুলি পুরোপুরি শূন্যস্থান ( ) দিয়ে পূর্ণ হয় । চলমান খালি অঞ্চলগুলি কোনও কিছুর সাথে ভরাট হয় না (সুতরাং প্রোগ্রামগুলি সর্বদা সঠিকভাবে আয়তক্ষেত্রাকার হয় না)।

উদাহরণ

মনে করুন এটি আপনার কোড ব্লক ছিল:

ABC
123

তারপরে এস টেট্রিস খণ্ডে ব্লকের ব্যবস্থা করা হ'ল একটি প্রোগ্রাম যা মুদ্রণ করে S:

   ABCABC
   123123
ABCABC
123123

ABC
123
ABCABC
123123
   ABC
   123

(লক্ষ্য করুন যে সমস্ত নেতৃস্থানীয় ফাঁকা স্থান স্পেস ক্যারেক্টারে পূর্ণ এবং কোনও লাইনের কোনও পেছনের স্থান নেই))

একই ধারণাটি অন্যান্য 6 টি টুকরা এবং তাদের নিজ নিজ আবর্তনের ক্ষেত্রে প্রযোজ্য।

নোট

  • সমস্ত 19 চূড়ান্ত প্রোগ্রাম একই প্রোগ্রামিং ভাষায় চালানো হবে।
  • যদি ইচ্ছা হয় তবে আপনি সমস্ত প্রোগ্রামগুলিতে একক ট্রেলিং নিউলাইন যুক্ত করতে পারেন (কেবল কিছু নয়, সমস্ত বা কোনওটিই নয়)।
  • আপনার কোড ব্লকে এমন কোনও অক্ষর থাকতে পারে (স্পেস সহ) যা লাইন টার্মিনেটর নয়
  • স্ট্যান্ডআউটে চিঠিটি আউটপুট করুন (বা আপনার ভাষার নিকটতম বিকল্প) একটি বিকল্প traচ্ছিক নতুন লাইনের সাহায্যে।

স্কোরিং

জমা দেওয়ার কোড কোডটিতে সবচেয়ে ছোট ক্ষেত্রের (প্রস্থের দৈর্ঘ্যের উচ্চতা) জয়ী হয়। এর অর্থ হ'ল সংক্ষিপ্ততম কোড জয়, যার জন্য এটি ট্যাগ । টাইব্রেকার সর্বাধিক ভোট দেওয়া উত্তরের দিকে যায় ।

ABC\n123উদাহরণস্বরূপ এলাকায় 3 × 2 = 6 হয়েছে।

টুকিটাকি

একটি কোড ব্লক দেওয়া, এই স্নিপেট সমস্ত 19 টি প্রোগ্রাম উত্পন্ন করবে:

<script>function drawShape(X,n,v){for(var t="",e=0;e<v.length;e++)for(var l=0;l<n.length;l++){for(var r=0;r<v[e].length;r++)t+="X"===v[e][r]?n[l]:X[l];t+="\n"}return t}function go(){var X=document.getElementById("input").value;if(0!=X.length){var n=X.replace(/./g," ").split("\n");X=X.split("\n");for(var v="I (v1):|I (v2):|J (v1):|J (v2):|J (v3):|J (v4):|L (v1):|L (v2):|L (v3):|L (v4):|O:|S (v1):|S (v2):|T (v1):|T (v2):|T (v3):|T (v4):|Z (v1):|Z (v2):".split("|"),t="X\nX\nX\nX|XXXX| X\n X\nXX|XXX\n  X|XX\nX\nX|X\nXXX|X\nX\nXX|  X\nXXX|XX\n X\n X|XXX\nX|XX\nXX| XX\nXX|X\nXX\n X|XXX\n X|X\nXX\nX| X\nXXX| X\nXX\n X|XX\n XX| X\nXX\nX".split("|"),e="",l=0;l<v.length;l++)e+=v[l]+"\n\n"+drawShape(n,X,t[l].split("\n"))+"\n";e=e.substring(0,e.length-2),document.getElementById("output").value=e}}</script><style>html *{font-family: monospace;}</style>Code Block:<br><textarea id='input' rows='8' cols='64'>ABC&#010;123</textarea><br><button type='button' onclick='go()'>Go</button><br><br>All 19 Programs:<br><textarea id='output' rows='24' cols='64'></textarea>


তাহলে দৈর্ঘ্য-প্রস্থের অনুপাত 2 থেকে 3? বা এটি অন্য কোনও আকার হতে পারে? এছাড়াও, প্রোগ্রামটি কি করতে হবে, সর্বনিম্ন? ধরে নেওয়া খালি প্রোগ্রাম গণনা করা হয় না, তবে এমন প্রোগ্রামগুলি যা কিছুই করে না।
ASCIIThenANSI

@ এসসিআইথেনানসী যে কোনও প্রস্থ এবং উচ্চতা ঠিক আছে। আমি কল্পনা করি 2 * 3 এর চেয়ে বড় কিছু প্রয়োজনীয় হবে। এখানে 19 টি প্রোগ্রাম রয়েছে, ব্লকের প্রতিটি ব্যবস্থার জন্য একটি 19 টি পৃথক টেট্রোমিনো আকারের একটিতে into যখন এই প্রোগ্রামগুলির মধ্যে একটি চালানো হয়, তখন এটি সংশ্লিষ্ট টেট্রিস পিস লেটারটি আউটপুট করে।
ক্যালভিনের শখ

কি দারুন! কি দারুণ চ্যালেঞ্জ! আমরা কোন ভাষাটি ব্যবহার করি তাতে কী फरक আসে?
theonlygusti

@ থিওনলিগুস্টি এই সাইটে প্রায় সব প্রশ্নই যে কোনও ভাষার অনুমতি দেয়। এটিও এর ব্যতিক্রম নয়।
ক্যালভিনের

@ ক্যালভিনের শখ হ্যাঁ, আমি জানি; আমি জাভাস্ক্রিপ্ট-উত্তরগুলি চালনার জন্য একটি নিয়ামক হিসাবে স্নিপেটের ভুল ব্যাখ্যা দিয়েছি। স্পষ্টতই এটি কেবল কোড ব্লকের ব্যবস্থা করে।
theonlygusti

উত্তর:


16

<> <(মাছ) - 12 * 32 = 384

আমি আরও মার্জিত সমাধানের জন্য যাবার পরিকল্পনা করছিলাম, তবে আমি একরকম এটিকে শেষ করেছিলাম, যা বেশ নিষ্ঠুর-জোর:

c  0  g84*%\
c2*0  g84*%\
0  84*g84*%\
c  84*g84*%\
c2*84*g84*%\
0  88*g84*%\
c  88*g84*%\
?v         \
;>?v~~?vv   
"L" o;  >   
"S" o; >~?v 
"T" o;    > 
;  >~?v"L"o 
;     >"J"o 
?v         \
 >~?v~~?vv  
"I"  o;  >  
"J"  o; >   
    \~~?vv  
"T"  o;  >  
"Z"  o; >   
?v         \
 >?v"J"o;   
   >?v"Z"o; 
"L"o;>?!v   
"J"o;   >?v 
"T"o;     > 
?v?v"I"o;  >
   >"L"o;   
 >?v"T"o;   
   >?v"O"o; 
     >"S"o; 

এটি বেশ সহজ, এটি পাঠ্যের জন্য একটি 3x3 স্কোয়ারে কোডটি পরীক্ষা করে এবং ফলাফলটি ব্যবহার করে যে টিট্রিমিনো কোডটির আকারের সাথে মিল রাখে তা দেখতে। এটি এখনও গল্ফ করার জন্য আমি অনেক চেষ্টা করি নি।

কোডটি এখানে চেষ্টা করে দেখুন (স্নিপেটটি এটিকে টেট্রিমিনোর মতো আকার দেওয়ার জন্য)

আকারে কোডের উদাহরণ জেড (ভি 1) এখানে


14

সি ( জিসিসি ) , 26x20 = 520 25x19 = 475 23x17 = 391

#ifndef M            //
#define M(a,b)a##b   //
#define W(z,x)M(z,x) //
char*s,*S[]={"!!!!c",//
"8M !7! M8 878","77",//
"7!!MO887","788OM!!7"//
,"N7!78","7N87!"},r[5//
],*p=r;i=7;main(){for//
(;i--;)strstr(S[i],r)//
&&putchar("ITOJLSZ"[i//
]);}                 //
#endif               //
__attribute__((      //
constructor(__LINE__)//
))W(f,__LINE__)(){s= //
"                     \
";*p++=strlen(s)+12;}//

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

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

একটি ফাংশন সংজ্ঞায়িত করে attribute((constructor(x)))এটি তৈরি করে যাতে ফাংশনটি main()প্রবেশের আগে চালিত হয়, al xচ্ছিক অগ্রাধিকার হিসাবে (নিম্ন মানে এটি আগে চালানো হয়)। এটি ফাংশন পয়েন্টারগুলির প্রয়োজনীয়তা সরিয়ে দেয়, যা আমাদেরকে ম্যাক্রো, কিছু ঘোষণা এবং কলিং চেইন ফেলে দেয় drop

__LINE__অগ্রাধিকারের জন্য ব্যবহার করা যদি না হয় তবে অগ্রাধিকার স্তর 0-100 সংরক্ষিত থাকে। তবে এটির ফলে ত্রুটি হয় না, কেবল সতর্কতা হয় এবং গল্ফ করার সময় এগুলি প্রচুর হয়, সুতরাং আরও কয়েকটি কী?

এটি অগ্রাধিকারটি একেবারে ব্যবহার না করার জন্য অন্য কলামটি শেভ করতে সহায়তা করেছিল, তবে মৃত্যুদণ্ডের ক্রমটি সংজ্ঞায়িত করা হয়নি বলে মনে হয়। (এ ক্ষেত্রে এগুলি বিপরীত হয়েছে, তবে অন্যান্য পরীক্ষাগুলি সিদ্ধান্তহীন)

এল ভি 2 এর উদাহরণ এখানে

পুরানো, আরও বহনযোগ্য, পদ্ধতির

#ifndef M              //
#define M(a,b) a##b    //
#define W(z,x)M(z,x)   //
#define F W(f,__LINE__)//
#define A W(a,__LINE__)//
char r[5],*S[]={"####k"//
,";<<US##;",";##SU<<;",//
";;",";T<;#","<S #;# S"//
"< <;<","T;#;<"},*s,*p=//
r;i;typedef(*T)();T a17//
,a36,a55,a74;main(){for//
(a17(),a36&&a36(),a55&&//
a55(),a74&&a74();i--;) //
strstr(S[i],r)&&putchar//
("ILJOZTS"[i]);}i=7;   //
#endif                 //
F();T A=F;F(){s=       //
"                       \
";*p++=strlen(s)+12;}  //

আমার পছন্দের সমস্যাগুলির মধ্যে একটি আমি এই সাইটে সমাধান করেছি।

আমি প্রতিটি ব্লকটি তার নিজস্ব স্থানাঙ্কগুলিকে একরকম divineশ্বরিকভাবে চিহ্নিত করে শুরু করেছি। সারিগুলি এর সাহায্যে সহজ __LINE__, এবং অনুভূমিকভাবে সংলগ্ন ব্লকের সংখ্যা একটি স্ট্রিং আক্ষরিক দৈর্ঘ্য ব্যবহার করে খুঁজে পাওয়া যেত:

char*s=//char*s=//
"       ""       "
;        ;        

ফলাফলযুক্ত স্ট্রিংয়ের দৈর্ঘ্য নিন এবং একটি যথাযথ সংখ্যা দ্বারা ভাগ করুন এবং আপনার প্রস্থ হবে the দুঃখের বিষয়, ব্লকের আগে কোনও ফাঁকা জায়গা এই পদ্ধতি দ্বারা অদৃশ্য। আমি এখনও সন্দেহ করেছিলাম যে স্ট্রিংগুলি সমাধান হয়ে যাবে, যেহেতু হোয়াইটস্পেসের কেবল স্ট্রিংগুলির বাইরে খুব কমই, a+++bবনাম এর মতো জিনিস রয়েছে a+ ++b। আমি সংক্ষেপে এরকম কিছু বিবেচনা করেছি, তবে দরকারী কিছু নিয়ে আসতে পারিনি। অন্য সম্ভাবনাটি হ'ল চিহ্নিতকারীদের একসাথে "আঠালো" হতে দেওয়া যেখানে ব্লকগুলি দেখা হয়েছিল:

A  BA  B

এটি যদি এখনও একটি আকর্ষণীয় সমাধানের জন্য তৈরি করতে পারে তবে আমি অবাক হব না।

এর সরলতা সত্ত্বেও, স্ট্রিং সমাধানটি পেতে আমাকে বেশ কিছুটা সময় নিয়েছিল যা এই ব্লক খণ্ডটির উপর ভিত্তি করে:

s=//
"  \
";//

যদি খণ্ডটির কোনও অনুভূমিক প্রতিবেশী না থাকে তবে দ্বিতীয় লাইনে থাকা নতুন লাইনটি ব্যাকস্ল্যাশ দ্বারা পালিয়ে যায় এবং দৈর্ঘ্যের একটি স্ট্রিং তৈরি করে If পরবর্তী ব্লকের 2:

s=//s=//
"  \"  \
";//";//

এটি দৈর্ঘ্য 5 এর স্ট্রিং "\" তৈরি করবে।

আরও গুরুত্বপূর্ণভাবে, এটি ব্লকের আগে খালি জায়গা সনাক্ত করার অনুমতি দেয়:

    s=//
    "  \
    ";//

আবার, নতুন লাইনটি অব্যাহতিপ্রাপ্ত এবং বামে খালি ব্লকের শ্বেত স্থানটি দৈর্ঘ্যের 6 "" এর ফলাফলের স্ট্রিংয়ের অন্তর্ভুক্ত।

সামগ্রীতে ব্লকের সাতটি আলাদা কনফিগারেশন রয়েছে যা সম্পর্কে আমাদের চিন্তিত হওয়া উচিত এবং সেগুলি সমস্ত অনন্য দৈর্ঘ্যের স্ট্রিং তৈরি করে:

2 "  "
---
s=//
"  \
";//

5 "  \"  "
---
s=//s=//
"  \"  \
";//";//

6 "      "
---
    s=//
    "  \
    ";//

9 "  \"      "
----
    s=//s=//
    "  \"  \
    ";//";//

10 "          "
---
        s=//
        "  \
        ";//

8 "  \"  \"  "
---
s=//s=//s=//
"  \"  \"  \
";//";//";//

11 "  \"  \"  \"  "
----
s=//s=//s=//s=//
"  \"  \"  \"  \
";//";//";//";//

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

এটি একবার বাছাই হয়ে গেলে, পরবর্তী বড় সমস্যাটি ছিল প্রতিটি ব্লকের প্রতিটি সারি "কীভাবে" দেখার জন্য। সি তে, আমরা ফাংশনগুলির বাইরে কী করা যায় তা সীমাবদ্ধ। আমাদেরও main()উপস্থিত হওয়া দরকার , তবে কেবল একবার। পরেরটি সহজেই কিছু #defineগুলি দ্বারা অর্জন করা হয় , তবে আমরা যদি পরবর্তী ব্লকগুলির কোডটির অভ্যন্তরে main()থাকতে চাই তবে চূড়ান্ত সমাপনী কোঁকড়া বন্ধনী কখন রাখব তা কীভাবে তা জানতে সমস্যা। সর্বোপরি, আমরা জানি না যে কতগুলি সারি ব্লক আসলে ব্যবহৃত হবে। সুতরাং আমাদের main()অচল থাকতে হবে এবং অন্যভাবে গতিশীল হতে হবে।

অন্যান্য ব্লক-সারিগুলি যদি স্ব-অন্তর্ভুক্ত থাকে তবে সেগুলি কার্যকরী হওয়া দরকার তবে আমাদের প্রতিটি ফাংশনের একটির নাম রয়েছে যা অনন্য main()। আমাদের কোন ক্রিয়াকলাপ ডাকা দরকার তা জানার জন্য আমাদেরও একটি প্রক্রিয়া প্রয়োজন। সহায়ক ম্যাক্রোগুলির দ্বারা অনন্য নাম তৈরি করা সমাধান করা হয়েছে:

#define M(a,b) a##b     //
#define W(z,x)M(z,x)    //
#define F W(f,__LINE__) //
#define A W(a,__LINE__) //

কলিং Fএকটি সনাক্তকারী তৈরি করবে যার নাম একটি চ দিয়ে শুরু হয় এবং লাইন নম্বর দিয়ে শেষ হয়। Aএকই হিসাবে কিন্তু উপসর্গ হিসাবে, যা সমাধানের দ্বিতীয় অংশের জন্য ব্যবহৃত হয়, যা ফাংশন পয়েন্টার। আমরা এই জাতীয় চারটি পয়েন্টার ঘোষণা করি:

typedef(*T)();T a17,a36,a55,a74;

এগুলি বৈশ্বিক চলক হিসাবে ঘোষিত হওয়ায় এগুলি সহজেই NULL এ সেট করা আছে। পরে, প্রতিটি ব্লক-সারিতে নিম্নলিখিত কোডের টুকরা থাকবে:

F();T A=F;F()

এটি প্রথমে কোনও ফাংশন ঘোষণা করবে, সেই ফাংশনটির দিকে নির্দেশ করতে উপযুক্ত ফাংশন পয়েন্টারটি সংজ্ঞায়িত করবে (আমরা কেবল একবার গ্লোবালগুলিই সংজ্ঞায়িত করতে পারি, তবে পূর্বের ঘোষণাকে একটি সংজ্ঞা হিসাবে গণনা করা হয়নি, এমনকি এটি এনইউএল থেকে শুরু করে হলেও) এবং তারপরে প্রকৃত সংজ্ঞা দেবে ফাংশন। এটি main()এমন কোনও ফাংশন পয়েন্টারকে কল করতে দেয় যা নন-নুল নয় (এ 17 কখনই নুল হবে না):

a17(),a36&&a36(),a55&&a55(),a74&&a74()

এটি করার ফলে স্ট্রিংটি তৈরি হবে rযা তারপরে স্ট্রিংয়ের সারণীতে সন্ধান করা হয় এবং যদি পাওয়া যায় তবে উপযুক্ত অক্ষরটি আউটপুট is

কেবলমাত্র অবশিষ্ট কৌশলটি হল যে যখনই অস্পষ্টতা এড়ানো যায়, বা ওভারল্যাপিং স্ট্রিংগুলিকে সঙ্কুচিত করা যায় তার বিরুদ্ধে ম্যাচের স্ট্রিংগুলির তালিকা সংক্ষিপ্ত করা হয়েছিল।

এল ভি 2 এর উদাহরণ এখানে


6

x86 অপকোড (.কম), 86 82 বাইট

পরীক্ষক:

org 100h
macro e {
db $F6,$04,$DF,$78,$13,$75,$08,$00,$C0,$40,$83,$C6,$52,$EB,$F1,$88
db $C2,$00,$D0,$00,$D0,$46,$EB,$E8,$05,$02,$40,$73,$ED,$E8,$26,$00
db $50,$08,$43,$4D,$2C,$0C,$1C,$15,$A5,$14,$10,$13,$3F,$27,$20,$0F
db $51,$1D,$29,$49,$49,$4A,$4A,$4A,$4A,$4C,$4C,$4C,$4C,$4F,$53,$53
db $54,$54,$54,$54,$5A,$5A,$5F,$AE,$75,$FD,$8A,$55,$12,$B4,$02,$CD
db $21,$C3
}

macro n { db 82 dup $20 }

macro s { db 10 }

n
e
s
n
e
s
e
e  

সূত্র:

BOF:    ;mov bx, 100h
p:      test [si], byte $DF
        js _a ; exist
        jnz _b ; newline
_z:     add al, al
        inc ax
q:      add si, EOF-BOF
        jmp p
_b:     mov dl, al
        add al, dl
        add al, dl
        inc si
        jmp p
_a:     add ax, 4002h
        jnc q
        call y
        db 80,8,67,77,44,12,28,21,165,20,16,19,63,39,32,15,81,29,41
        db 'IIJJJJLLLLOSSTTTTZZ'
y:      pop di
        scasb
        jnz y+1
        mov dl,[di+18]
        mov ah,2
        int $21
        ret
EOF:

Win7dos এ চালান যেখানে init AX = 0, SI = 100, BX = 0 তথ্যসূত্র


আপনি যদি সমর্থিত পরিবেশের সংখ্যা কিছুটা হ্রাস করতে স্বাচ্ছন্দ্য বোধ করেন তবে আপনি এসআই = 100 এইচ ধরে নিতে পারেন এবং সূচনার জন্য বিএক্সের পরিবর্তে সেই নিবন্ধটি ব্যবহার করতে পারেন, mov bx, 100hশুরুতে নেমে 3 বাইট সংরক্ষণ করতে ।
গ্যাস্ট্রোপনার

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