লাইফ তীরচিহ্নগুলির খেলা


26

পটভূমি

এই চ্যালেঞ্জটি অ্যাপিলারদের সম্মানে , যিনি তাদের চ্যালেঞ্জের সাথে বেস্ট অফ পিপিসি ২০১ in-তে বিভাগের মতো দেখতে সহজ হিসাবে নট জিতলেন , আমার 4 নোটের সংগীত বাক্সটি কি সেই গানটি খেলতে পারে? অভিনন্দন!

তাদের "আমার সম্পর্কে" পৃষ্ঠায়, এই ব্যবহারকারীর গেম অফ লাইফ সেলুলার অটোমেটনের জন্য সত্যই ঝরঝরে সিমুলেটর রয়েছে । (সিরিয়াসলি, এটি পরীক্ষা করে দেখুন)) অন্যদিকে, এসপিলেরা শব্দটি "তীরচিহ্ন" এর জন্য স্প্যানিশ। এই তথ্যের আলোকে, এই চ্যালেঞ্জটি গেম অফ লাইফের তীরচিহ্নগুলি সম্পর্কে।

লাইফ তীরচিহ্নগুলির খেলা

জিএল-তে, আমরা একটি গ্লাইডার দ্বারা একটি তীর এবং ব্লকের অনুক্রমের দ্বারা একটি প্রাচীর উপস্থাপন করব । একটি একক গ্লাইডার উপরের দিক থেকে প্রাচীরের কাছে পৌঁছায় এবং প্রাচীরের একটি ফাঁক (অ্যারোস্লিট) দিয়ে উড়ে যাওয়ার চেষ্টা করে। আপনার কাজটি গ্লাইডারটি অ্যারোস্লিট দিয়ে প্রবেশ করেছে বা প্রাচীরের মধ্যে ক্র্যাশ করেছে কিনা তা পরীক্ষা করা।

ইনপুট

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

ইনপুটটিতে বেশ কয়েকটি সম্পত্তি থাকার নিশ্চয়তা রয়েছে। প্রথমত, এর উচ্চতা কিছু N ≥ 6 এর জন্য 2N , এবং এর প্রস্থ কমপক্ষে 2N + 2 । ইনপুট সব হতে হবে , s শীর্ষ তিন সারি উপর কোথাও ছাড়া একটি গ্লাইডার, এবং দুই মধ্যম সারি উপর ব্লক একটি প্রাচীর নেই। গ্লাইডারটি দক্ষিণ-পশ্চিম বা দক্ষিণ-পূর্ব দিকে যাবে এবং এর অবস্থানটি এমন যে যদি দেয়ালগুলি সরিয়ে ফেলা হয় তবে নীচের প্রান্তে পৌঁছানোর আগে এটি কোনও পাশের প্রান্তের মধ্য দিয়ে যাবে না (তবে এটি গ্রিডের কোনও কোণে পৌঁছে যেতে পারে)। গ্লাইডারটি প্রথমে বাম এবং ডান প্রান্ত থেকে কমপক্ষে এক ধাপের এস দ্বারা আলাদা করা হয় । এটি যে কোনও পর্যায়ে হতে পারে।..

প্রাচীরটি ব্লকগুলি নিয়ে গঠিত যা .একটি স্থানে ব্যতীত s এর একটি কলাম দ্বারা পৃথক করা হয়েছে , যেখানে সেগুলি কমপক্ষে দুটি কলাম দ্বারা আলাদা করা হবে .। গ্লাইডারের মতো, বামে এবং ডানদিকের ব্লকগুলিও এক ধাপে প্রান্তগুলি থেকে পৃথক করা হয় .। বাম প্রান্তে সর্বদা কমপক্ষে একটি ব্লক এবং ডান প্রান্তে একটি ব্লক থাকবে।

এখানে একটি বৈধ ইনপুট গ্রিডের উদাহরণ রয়েছে:

....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................

আউটপুট

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

...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##

...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##

গ্লাইডারটি যদি দেয়ালের মধ্য দিয়ে উড়ে যায় তবে আপনি সত্যবাদী মান এবং অন্যথায় মিথ্যা মান আউটপুট করতে পারেন। উপরের উদাহরণের জন্য, সঠিক আউটপুটটি মিথ্যা, কারণ গ্লাইডারটি প্রাচীরের বাম অংশে ক্রাশ হবে।

এই চ্যালেঞ্জের উদ্দেশ্যে, আপনি ধরে নিতে পারেন যে আপনি যদি 2 * (উচ্চতা - 3) পদক্ষেপের জন্য ইনপুটটিতে জিওএল অনুকরণ করেন তবে গ্লাইডারটি প্রত্যাশিত অবস্থানে নীচের সারিতে এবং প্রাচীরটি অক্ষত থাকে, তবে আউটপুট সত্যই ।

বিধি এবং স্কোরিং

আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন। সর্বনিম্ন বাইট গণনা জিতেছে।

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

আমি পরীক্ষাগুলির কেসগুলি একটি গিটহাবের সংগ্রহস্থলে সংগ্রহ করেছি , কারণ সেগুলি বেশ বড়। পৃথক ফাইলগুলির লিঙ্কগুলি এখানে:


ইনপুটটিতে দেয়ালের নীচে খালি সারিগুলি অন্তর্ভুক্ত করার কোনও কারণ আছে কি?
মার্টিন এন্ডার

@ মার্টিনএন্ডার তারা সমাধান করে যেখানে আপনি প্রকৃতপক্ষে ইনপুটটিতে জিওএলকে আরও বেশি সম্ভাবনামূলকভাবে অনুকরণ করেন (কমপক্ষে আমিও আশা করি)।
জাগারব

গ্লাইডারটি সর্বদা শীর্ষ সারিতে শুরু হবে?
রড

@ রড হ্যাঁ, এটি দক্ষিণ-পশ্চিমে বা দক্ষিণ-পূর্ব দিকে যেতে হবে শীর্ষ সারিতে।
জাগারব

জীবনের আর একটি খেলা: পি
ক্রিস্টোফার

উত্তর:


15

পাইথন 2 , 142 136 135 বাইট

-6 বাইটস এলপেড্রো
-1 বাইট ধন্যবাদ টুকুকএক্সকে ধন্যবাদ

p=input()
z=p[2].index(1)
m=(p[1][z]-p[1][z+1]<1)*2-1
k=i=0
for b in p[3:]:x=p[2][::m].index(1)+i;k|=1in b[::m][x-2:x+8];i+=1
print 1-k

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

ওরিয়েন্টেশন চেক করা হচ্ছে (পূর্ব / পশ্চিম):

পশ্চিম পূর্ব
ব্যবহার z=p[2].index(1)3rd সারিতে প্রথম স্কয়্যার (লাল বর্গক্ষেত্র দ্বারা প্রতিনিধিত্ব) পেতে, এবং তারপর m=(p[1][z]-p[1][z+1]<1)*2-1এই ভাবে ডান বাম (নীল) উপর এক থেকে (সবুজ) উপর মান বিয়োগ, সব 4 গ্লাইডার রাজ্যের করতে যাচ্ছি দক্ষিণ-পশ্চিমের ফলাফল 1(চিত্রের উপরের সারি), অন্যদিকে দক্ষিণ-পূর্ব দিকে যাওয়ার ফলাফল 0বা হয় -1
তারপরে রূপান্তর করুন: 1 -> -1এবং 0,-1 -> 1পশ্চিমের সাথে কাজ করার সময় তালিকাগুলি উল্টো করতে প্যারামিটারে ব্যবহার করতে হবে। এভাবে দক্ষিণ-পশ্চিমে গ্লাইডারগুলি দক্ষিণ-পূর্ব দিকে যাওয়ার মতো নিক্ষিপ্ত হয়।

গ্লাইডার চলাচল

গ্লাইডিং
এই গ্লাইডারটি দক্ষিণ-পূর্ব দিকে গ্লাইডারটি করে, এটির একটি "মই" প্যাটার্ন রয়েছে এবং তৃতীয় লাইনের বাম দিকের ব্লকটি প্রতিটি প্যাটার্নের কাছে ধ্রুবক। এটিকে প্রারম্ভের পয়েন্ট হিসাবে ব্যবহার করে, বাম এবং ডানদিকে আশেপাশের 3 টি ব্লক এবং মাঝের 4 টি ব্লকের 1গুলি উপস্থিতির জন্য পরীক্ষা করা হয় (এটি প্রাচীর হবে)।
arrowslits
arrowslits_path


আমার মনে হয় আপনি একটি পরিবর্তনশীল সেটিং দ্বারা 4 বাইট হারাতে পারেন iকরতে 0বাহিরে forলুপ প্রতিটি পাস তারপর এটি এটি 1 যোগ এবং তাই পরিত্রাণ পেতে enumerate। আমি যখন আপনার টিআইও দিয়ে চেষ্টা করেছিলাম তখন কাজ করে মনে হচ্ছে। আমি সঠিক বা ভুল কিনা তা শীতল উত্তরের জন্য +1।
এলপেড্রো

নিস! আপনি সাদা জায়গা থেকে মুছে ফেলা একটি বাইট সংরক্ষণ করতে পারেন 1 in। +1 টি।
ইয়াতসি


4

অক্টাভা, 123 122 108 বাইট

@ লুইস মেন্ডোকে ধন্যবাদ 2 বাইট সংরক্ষণ

B=A=input("");B(1:3,:)=0;do;until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5;any(A(end,:))

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

অথবা

সমস্ত পরীক্ষার কেস যাচাই করুন

রড পরীক্ষার কেস প্রস্তুত করার জন্য ধন্যবাদ।

B=A=input("");
B(1:3,:)=0;
do
until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5
any(A(end,:))

পূর্ববর্তী উত্তর:

B=A=input("");
B(1:3,:)=0;
while nnz(A~=B)==5
    s=conv2(A,(m=-1:1)|m','same');
    x=~A;
    A&=~A|~(s<2|s>3);
    A|=x&s==3;
end;
any(A(end,:))

ভেরিয়েবল হিসাবে প্রথমে প্রাচীরের নিদর্শন বের করুন B
ওয়াল প্যাটার্ন এবং সিমুলেটেড প্যাটার্নে 5 / এরও কম কম কোষ না পাওয়া পর্যন্ত GoL সিমুলেশন করুন।
গ্লাইডারটি যদি শেষ সারিটি পেয়ে থাকে তবে ফাংশনটি সত্য হয়।


1
প্রাচীর প্যাটার্ন এবং সিমুলেটেড প্যাটার্নে 5 / এরও কম আলাদা কোষ রয়েছে। এতো চালাক!
লুইস মেন্ডো

@ লুইস মেন্ডো ধন্যবাদ, একটি বাইট সংরক্ষিত করেছেন
rahnema1

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