লুয়া, 562 535 529 513 507 504 466 458 বাইট
এই মুহুর্তে আমার সবচেয়ে বড় গল্ফ, আমি মনে করি আমি এখনও 100 বাইট কেটে ফেলতে পারি, যার দিকে আমি কাজ করব, তবে এটি ইতিমধ্যে কিছুটা সময় নিয়েছে বলে উত্তর হিসাবে পোস্ট করছি :)। আমি ঠিক বলেছি, আমি 100 টিরও বেশি বাইট কেটে ফেলেছি! আমি মনে করি না উন্নতির অনেক জায়গা আছে।
এই ফাংশনটিতে প্রতি ঘরের মধ্যে একটি অক্ষর সমন্বিত 2D অ্যারে যুক্ত করতে হবে।
@ কেনি লাউয়ের সাথে কাজ করার সময় 40 বাইট সংরক্ষণ করা হয়েছে , তাকে ধন্যবাদ!
সাব্বাস! 500 বছরের নিচে!
function f(m)t=2u=1i=1j=1s=" "::a::if s~=m[i][j]and(i<#m and m[i+1][j]~=s)~=(j<#m[i]and m[i][j+1]~=s)~=(i>1 and m[i-1][j]~=s)~=(j>1 and m[i][j-1]~=s)then goto b end
i,t=i%t+1,#m>t and t==i and t+1or t j=j>1 and j-1or u u=u<#m[1]and j==1 and u+1or u goto a::b::io.write(m[i][j])m[i][j]=s
i,j=i<#m and s~=m[i+1][j]and i+1or i>1 and s~=m[i-1][j]and i-1or i,j<#m[i]and s~=m[i][j+1]and j+1or j>1 and s~=m[i][j-1]and j-1or j
if s==m[i][j]then return end goto b end
Ungolfed
আমি একবার এই গল্ফিং সম্পন্ন করার পরে ব্যাখ্যাগুলি আসবে, মুহুর্তের জন্য, আমি আপনাকে এই উত্স কোডটির একটি পঠনযোগ্য সংস্করণ দেব: ডি এখানে ব্যাখ্যা আসে!
সম্পাদনা করুন: সর্বশেষ পরিবর্তন সহ আপডেট করা হয়নি, আপডেট করার আগেও গল্ফ করছে। একই ব্যাখ্যা জন্য যায়
function f(m) -- declare the function f which takes a matrix of characters
t=2 -- initialise the treshold for i
-- when looking for the first end of the snake
u=1 -- same thing for j
i,j=1,1 -- initialise i and j,our position in the matrix
s=" " -- shorthand for a space
::a:: -- label a, start of an infinite loop
if m[i][j]~=s -- check if the current character isn't a space
and(i<#m -- and weither it is surrounded by exactly
and m[i+1][j]~=s) -- 3 spaces or not
~=(j<#m[i]
and m[i][j+1]~=s) -- (more explanations below)
~=(i>1
and m[i-1][j]~=s)
~=(j>1
and m[i][j-1]~=s)
then goto b end -- if it is, go to the label b, we found the head
i,t= -- at the same time
i%t+1, -- increment i
#m>t and t==i and t+1or t -- if we checked all chars in the current range, t++
j=j>1 and j-1or u -- decrement j
u=u>#m[1]and j==1 and u+1or u-- if we checked all chars in the current range, u++
goto a -- loop back to label a
::b:: -- label b, start of infinite loop
io.write(m[i][j]) -- output the current char
m[i][j]=s -- and set it to a space
i,j=i<#m -- change i and j to find the next character in the snake
and m[i+1][j]~=s -- this nested ternary is also explained below
and i+1 -- as it takes a lot of lines in comment ^^'
or i>1
and m[i-1][j]~=s
and i-1
or i,
j<#m[i]
and m[i][j+1]~=s
and j+1
or j>1
and m[i][j-1]~=s
and j-1
or j
if m[i][j]==s -- if the new char is a space
then -- it means we finished
return -- exit properly to avoid infinite
end -- printing of spaces
goto b -- else, loop back to label b
end
সুতরাং এখানে এই প্রোগ্রামটি কীভাবে কাজ করে সে সম্পর্কে কিছু বিশদ বিবরণ আসে।
প্রথমত, লেবেলযুক্ত লুপটি বিবেচনা করুন a
, এটি আমাদের উপরের-বাম কোণার নিকটতম প্রান্তটি সন্ধান করতে দেয়। এটি শেষ না হলে চিরতরে লুপ হয়ে যাবে, তবে এটি কোনও সমস্যা নয়: ডি।
একটি 4x4 গ্রিডে এটি এখানে সাপের দূরত্ব (বাম) এবং তাদের ক্রমটি (ডানদিকে) দেখানো হয়
1 2 3 4 | 1 2 4 7
2 3 4 5 | 3 5 8 11
3 4 5 6 | 6 9 12 14
4 5 6 7 | 10 13 15 16
এই চরিত্রটির প্রতিটিটির জন্য, শেষ হতে, এটি দুটি শর্ত পরীক্ষা করতে হবে: - কোনও স্থান নয় - প্রায় 3 স্পেস দ্বারা ঘিরে থাকা (বা ঠিক 1 অ-স্থান)
এই শর্তাদি নীচের কোডের টুকরাটি পরীক্ষা করা হয়
r=m[i][j]~=s
and(i<#m and m[i+1][j]~=s)
==not(j<#m[i] and m[i][j+1]~=s)
==not(i-1>0 and m[i-1][j]~=s)
==not(j-1>0 and m[i][j-1]~=s)
and m[i][j]
or r
-- special note: "==not" is used as an equivalent to xor
-- as Lua doesn't know what is a xor...
চরটি কোনও স্থান নয় কিনা তা পরীক্ষা করা এক্সপ্রেশন দ্বারা অর্জিত হয় m[i][j]~=s
।
আমাদের আশেপাশের জন্য উপরোক্ত শর্তগুলিতে কেবলমাত্র 1 অ-স্থান দিয়ে ঘেরাও করা হয়েছে কিনা তা পরীক্ষা করা হচ্ছে, এটি লিখিত হতে পারে
m[i+1][j]~=" " ⊕ m[i][j+1]~=" " ⊕ m[i-1][j]~=" " ⊕ m[i][j-1]~=" "
এবং পরিশেষে, উপরের সমস্তটি যদি সত্য হিসাবে মূল্যায়ন করা হয়, তবে তার্নারি শেষ and
-> এ ফিরে আসবে m[i][j]
। অন্যথায়, আমরা r
আনসেট করতে দিন :)
এখন যেহেতু আমাদের সাপের মাথা আছে, আসুন আমরা অন্য প্রান্তে আসি! সাপটি আটকানো প্রধানত নিম্নলিখিত নীড়যুক্ত অঞ্চলগুলি দ্বারা অর্জন করা হয়:
i,j=i<#m and m[i+1][j]~=s and i+1or i-1>0 and m[i-1][j]~=s and i-1or i,
j<#m[i]and m[i][j+1]~=s and j+1or j-1>0 and m[i][j-1]~=s and j-1or j
আমরা পুনরায় সেট করেছি i
এবং j
একই সাথে পুরাতন মানগুলি সংরক্ষণের জন্য ডামিগুলির প্রয়োজনীয়তা এড়াতে তাদের উভয়েরই সঠিক কাঠামো রয়েছে এবং সহজ শর্তাদি ব্যবহার করা হয়, তাই আমি এগুলি নেস্ট আকারে উপস্থাপন করব if
, এটি আপনাকে সেগুলি পড়ার অনুমতি দেবে আরও সহজে। :)
i=i<#m and m[i+1][j]~=s and i+1or i-1>0 and m[i-1][j]~=s and i-1or i
অনুবাদ করা যেতে পারে:
if(i<#m)
then
if(m[i+1][j]~=" ")
then
i=i+1
end
elseif(i-1>0)
then
if(m[i-1][j]~=" ")
then
i=i-1
end
end
এটা পরীক্ষা করো!
এটি চালানোর জন্য আমি যে কোডটি ব্যবহার করি তা এখানে, আপনি এটি অনুলিপি-পেস্ট করে অনলাইনে পরীক্ষা করতে পারেন ।
function f(m)t=2u=1i=1j=1s=" "::a::if s~=m[i][j]and(i<#m and m[i+1][j]~=s)~=(j<#m[i]and m[i][j+1]~=s)~=(i>1 and m[i-1][j]~=s)~=(j>1 and m[i][j-1]~=s)then goto b end
i,t=i%t+1,#m>t and t==i and t+1or t j=j>1 and j-1or u u=u<#m[1]and j==1 and u+1or u goto a::b::io.write(m[i][j])m[i][j]=s
i,j=i<#m and s~=m[i+1][j]and i+1or i>1 and s~=m[i-1][j]and i-1or i,j<#m[i]and s~=m[i][j+1]and j+1or j>1 and s~=m[i][j-1]and j-1or j
if s==m[i][j]then return end goto b end
test1={}
s1={
" tSyrep ",
" r p ",
" in Sli ",
" g Sile",
" Snakes n",
"Ser ylt",
"a eh ilS ",
"fe w t ",
" emo h ",
" Sre ",
}
for i=1,#s1
do
test1[i]={}
s1[i]:gsub(".",function(c)test1[i][#test1[i]+1]=c end)
end
f(test1)