সি ( জিসিসি ) , 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 এর উদাহরণ এখানে