রেটিনা , 108 102 94 87 82 64 63 বাইট
আমাকে আমার আসল পদ্ধতির অনুসরণ করার জন্য Sp3000 ধন্যবাদ, যা বাইট গণনাটি 108 থেকে কমিয়ে 82 এ নিয়েছে।
কোবিকে প্রচুর ধন্যবাদ, যিনি আরও অনেক মার্জিত সমাধান পেয়েছিলেন, যা আমাকে তার উপরে আরও 19 বাইট সংরক্ষণ করতে দেয়।
S_`(?<=^(?<-1>.)*(?:(?<=\G(.)*).)+)
.
$0
m+`^(?=( *)\S.*\n\1)
<space>
যেখানে <space>
একটি একক স্থানের অক্ষর উপস্থাপন করে (যা অন্যথায় এসই দ্বারা ছড়িয়ে দেওয়া হবে)। গণনা উদ্দেশ্যে, প্রতিটি লাইন পৃথক ফাইলে যায় এবং একটি \n
আসল লাইনফিড অক্ষর দিয়ে প্রতিস্থাপন করা উচিত। সুবিধার জন্য, আপনি -s
পতাকা সহ একটি একক ফাইল থেকে কোড চালাতে পারেন ।
এটি অনলাইনে চেষ্টা করুন।
ব্যাখ্যা
ঠিক আছে ... যথারীতি আমি এখানে ভারসাম্যপূর্ণ গ্রুপগুলিতে সম্পূর্ণ পরিচয় দিতে পারি না। প্রাইমারের জন্য আমার স্ট্যাক ওভারফ্লো উত্তরটি দেখুন ।
S_`(?<=^(?<-1>.)*(?:(?<=\G(.)*).)+)
প্রথম স্তরটি একটি S
প্লিট পর্যায়, যা ক্রমবর্ধমান দৈর্ঘ্যের লাইনে ইনপুট বিভক্ত করে। _
ইঙ্গিত করে যে খালি খন্ডে বিভাজন (যা শুধুমাত্র শেষ প্রভাবিত করে, কারণ সেখানে গত অবস্থানে কোনো মিল হতে হবে) থেকে বাদ দেওয়া হবে। রেজেক্স নিজেই সম্পূর্ণ চেহারাতে অন্তর্ভুক্ত থাকে তাই এটি কোনও অক্ষরের সাথে মেলে না, তবে কেবল অবস্থানগুলি।
এই অংশটি আমি খুঁজে পেয়েছি এমন কিছু অতিরিক্ত গলফিউডের সাথে কোবির সমাধানের ভিত্তিতে তৈরি। নোট করুন যে লুকের পিছনের অংশগুলি .NET- র ডান থেকে বামে মিলছে, সুতরাং নীচের ব্যাখ্যাটি নীচে থেকে সেরাে পড়া উচিত। আমি \G
স্পষ্টতার জন্য ব্যাখ্যায় আরও একটি প্রবেশ করিয়েছি, যদিও প্যাটার্নটি কাজ করার জন্য এটি প্রয়োজনীয় নয়।
(?<=
^ # And we ensure that we can reach the beginning of the stack by doing so.
# The first time this is possible will be exactly when tri(m-1) == tri(n-1),
# i.e. when m == n. Exactly what we want!
(?<-1>.)* # Now we keep matching individual characters while popping from group <1>.
\G # We've now matched m characters, while pushing i-1 captures for each i
# between 1 and m, inclusive. That is, group <1> contains tri(m-1) captures.
(?:
(?<=
\G # The \G anchor matches at the position of the last match.
(.)* # ...push one capture onto group <1> for each character between here
# here and the last match.
) # Then we use a lookahead to...
. # In each iteration we match a single character.
)+ # This group matches all the characters up to the last match (or the beginning
# of the string). Call that number m.
) # If the previous match was at position tri(n-1) then we want this match
# to happen exactly n characters later.
আমি এখনও এখানে কোবির কাজের প্রশংসা করছি। এটি প্রাইম টেস্টিং রেগেক্সের চেয়ে আরও মার্জিত। :)
পরবর্তী পর্যায়ে চলে আসা যাক:
.
$0
সরল: প্রতিটি অ-লাইনফিড অক্ষরের পরে একটি স্থান সন্নিবেশ করান।
m+`^(?=( *)\S.*\n\1)
<space>
এই শেষ পর্যায়ে ত্রিভুজ গঠনের জন্য সমস্ত লাইন সঠিকভাবে প্রবেশ করে। m
করতে আপনাকে মাত্র চলিত একাধিক লাইন মোড ^
একটি লাইন শুরুতে মেলে। +
এই পর্যায়ে পুনরাবৃত্তি অক্ষিপট বলে যতক্ষণ না স্ট্রিং পরিবর্তন স্টপ (যা, এই ক্ষেত্রে উপায়ে যে Regex আর ম্যাচ)।
^ # Match the beginning of a line.
(?= # A lookahead which checks if the matched line needs another space.
( *) # Capture the indent on the current line.
\S # Match a non-space character to ensure we've got the entire indent.
.*\n # Match the remainder of the line, as well as the linefeed.
\1 # Check that the next line has at least the same indent as this one.
)
সুতরাং এটি কোনও লাইনের শুরুর সাথে মেলে যা পরের চেয়ে বড় ইনডেন্ট নেই। এই জাতীয় কোনও অবস্থাতেই আমরা একটি স্থান সন্নিবেশ করি। এই প্রক্রিয়াটি শেষ হয়ে যায়, একবার লাইনগুলি একটি ঝরঝরে ত্রিভুজটিতে সাজানো হয়, কারণ এটি ন্যূনতম লেআউট যেখানে প্রতিটি লাইনের পরের চেয়ে বড় ইন্ডেন্ট থাকে।