একটি চৌম্বক পার্স করুন


27

আপনি যদি ইতিমধ্যে জানেন না, তবে একটি চৌম্বকটি মূলত একটি 4-অংশ সংখ্যা। এই চ্যালেঞ্জের উদ্দেশ্যে, এর একটি আসল উপাদান এবং তিনটি কাল্পনিক উপাদান রয়েছে। কাল্পনিক উপাদান প্রত্যয় দ্বারা প্রতিনিধিত্ব করা হয় i, j, k। উদাহরণস্বরূপ, 1-2i+3j-4kসঙ্গে একটি চার বস্তুর সমষ্টি হল 1বাস্তব উপাদান হচ্ছে এবং -2, 3এবং -4কাল্পনিক উপাদান হচ্ছে।

এই চ্যালেঞ্জে আপনাকে একটি কোয়ার্টেরিয়নের স্ট্রিং ফর্ম (উদাহরণস্বরূপ "1+2i-3j-4k") সহগের একটি তালিকা / অ্যারেতে বিভক্ত করতে হবে (প্রাক্তন [1 2 -3 -4])। তবে, কোয়ার্টারিয়ন স্ট্রিংটি বিভিন্নভাবে ফর্ম্যাট করা যায় ...

  • এটি স্বাভাবিক হতে পারে: 1+2i-3j-4k
  • এটা তোলে অনুপস্থিত পদ থাকতে পারে: 1-3k, 2i-4k(আপনি অনুপস্থিত পদ থাকে, তাহলে আউটপুট 0যারা পদ জন্য)
  • এটা তোলে কোফিসিয়েন্টস অনুপস্থিত থাকতে পারে: i+j-k(এই ক্ষেত্রে, এই সমতূল্য 1i+1j-1kঅন্য কথায়, ক। i, jঅথবা kসামনে একটি সংখ্যা একটি আছে বলে ধরা হয় ছাড়া 1ডিফল্টরূপে সামনে)
  • এটি সঠিক ক্রমে নাও থাকতে পারে: 2i-1+3k-4j
  • গুণফলগুলি কেবল পূর্ণসংখ্যা বা দশমিক হতে পারে: 7-2.4i+3.75j-4.0k

বিশ্লেষণ করার সময় কয়েকটি বিষয় লক্ষণীয়:

  • সর্বদা একটি +বা -শর্তাবলীর মধ্যে থাকবে
  • আপনাকে সর্বদা কমপক্ষে 1 টি মেয়াদ সহ বৈধ ইনপুট দেওয়া হবে এবং পুনরাবৃত্তি হওয়া অক্ষর ( j-jগুলি) ছাড়াই
  • সমস্ত সংখ্যাটি বৈধ বলে ধরে নেওয়া যেতে পারে
  • আপনি পার্স যদি আপনি চান তাহলে পরে অন্য ফর্ম মধ্যে সংখ্যার পরিবর্তন করতে পারেন (উদা। 3.0 => 3, 0.4 => .4, 7 => 7.0)

পার্সিং / কোয়ার্টারিয়ন বিল্টিনগুলি এবং মানক লুফোলগুলি অনুমোদিত নয়। এর মধ্যে evalকীওয়ার্ড এবং ফাংশন অন্তর্ভুক্ত রয়েছে । ইনপুটটি একটি একক স্ট্রিং হবে এবং আউটপুট হবে একটি তালিকা, একটি অ্যারে, শ্বেত স্পেস দ্বারা পৃথক করা মান ইত্যাদি be

এটি , বাইট জেতে সংক্ষিপ্ততম কোড।

টন ও 'পরীক্ষার মামলা

1+2i+3j+4k             => [1 2 3 4]
-1+3i-3j+7k            => [-1 3 -3 7]
-1-4i-9j-2k            => [-1 -4 -9 -2]
17-16i-15j-14k         => [17 -16 -15 -14]

7+2i                   => [7 2 0 0]
2i-6k                  => [0 2 0 -6]
1-5j+2k                => [1 0 -5 2]
3+4i-9k                => [3 4 0 -9]

42i+j-k                => [0 42 1 -1]
6-2i+j-3k              => [6 -2 1 -3]
1+i+j+k                => [1 1 1 1]
-1-i-j-k               => [-1 -1 -1 -1]

16k-20j+2i-7           => [-7 2 -20 16]
i+4k-3j+2              => [2 1 -3 4]
5k-2i+9+3j             => [9 -2 3 5]
5k-2j+3                => [3 0 -2 5]

1.75-1.75i-1.75j-1.75k => [1.75 -1.75 -1.75 -1.75]
2.0j-3k+0.47i-13       => [-13 0.47 2.0 -3] or [-13 .47 2 -3]
5.6-3i                 => [5.6 -3 0 0]
k-7.6i                 => [0 -7.6 0 1]

0                      => [0 0 0 0]
0j+0k                  => [0 0 0 0]
-0j                    => [0 0 0 0] or [0 0 -0 0]
1-0k                   => [1 0 0 0] or [1 0 0 -0]

ইনপুটটিতে কি কখনও অপ্রয়োজনীয় +লক্ষণ থাকবে? ভালো লেগেছে: +1k?
FryAmTheEggman

@ ফ্রাইআমTheEggman নং ইনপুটগুলি কখনই একটি দিয়ে শুরু হবে না +
GamrCorps

1
কি -0গত দুটি উদাহরণ জন্য আইনি আউটপুট একটি অংশ?
isaacg

1
@ আইসএইচজি হ্যাঁ এটি ঠিক আছে
গামারকম্পস

1
@ এলএলএএমএনওয়াইপি আপনি একটি ভাল বিষয় নিয়ে এসেছেন। evalস্ট্রিংয়ের মধ্যে থাকা বিধিনিষেধটিকে সংজ্ঞায়িত করতে দেয় , কোড এবং / অথবা ইনপুট হিসাবে ব্যাখ্যা করে। কোনও রূপান্তর এর অধীনে গণনা করা হয় না কারণ আপনি পাস করতে পারবেন না, উদাহরণস্বরূপ, "test"একটি পূর্ণসংখ্যা গ্রহণের জন্য স্ট্রিংটি একটি পূর্ণসংখ্যার রূপান্তর ফাংশনটিতে স্ট্রিং করে তবে testএকটি সাধারণ evalফাংশনে কোড হিসাবে ব্যাখ্যা করা হবে । TLDR: eval: না, রূপান্তর টাইপ করুন: হ্যাঁ।
GamrCorps

উত্তর:


5

পাইথ, 48 বাইট

jm+Wg\-K--e|d0G\+K1+]-I#GJczfT.e*k<b\.zm/#dJ"ijk

বিক্ষোভের পরীক্ষার স্যুট

আউটপুট ফর্ম্যাটটি নিউলাইনটি পৃথক। পরীক্ষার স্যুট কোডটি পড়ার স্বাচ্ছন্দ্যের জন্য স্পেস বিভাজন ব্যবহার করে, তবে অন্যথায় এটি একই রকম।

-0সর্বশেষ 2 টি ক্ষেত্রে আউটপুট দেয় , যা আমি আশা করি ঠিক আছে।

অনুসরণ করার ব্যাখ্যা।


9

রেটিনা, 115

\b[ijk]
1$&
^(?!.*\d([+-]|$))
0+
^(?!.*i)
+0i+
^(?!.*j)
0j+
^(?!.*k)
0k+
O$`[+-]*[\d.]*(\w?)
$1
-
+-
^\+

S`[ijk+]+

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

1 ক্রিস জাস্টার-ইয়ংকে ধন্যবাদ 1 বাইট সংরক্ষিত হয়েছে ।

একটি বাগ ফিক্সড এবং 6 মার্টিন বাটনারকে ধন্যবাদ 6 টি বাইট সংরক্ষণ করেছে

কিছু কিনার সাথে জড়িত কয়েকটি দম্পতি বাগ পাওয়া গেছে, বাইট গণনাটি বেশ খানিকটা বিছিন্ন করে।

পৃথক পৃথক সংখ্যাগুলি ফিরিয়ে দেয়। যাইহোক, এর বেশিরভাগ মার্জিত সমাধান রয়েছে যা সাজানোর ধরণের প্রান্তগুলি দ্বারা ধ্বংস হয়ে যায় তবে আরে আমি সাজানোর মোডটি ব্যবহার করতে পেরেছি, তার মানে আমি কাজের জন্য সঠিক সরঞ্জামটি ব্যবহার করেছি, তাই না?

ব্যাখ্যা:

যথারীতি মঞ্চে মঞ্চ।

\b[ijk]
1$&

ইনপুট একমাত্র অক্ষর আছে যা শব্দ সীমানা তৈরি করতে পারেন হয় -+.। এর অর্থ হ'ল আমরা যদি কোনও চিঠির পরে সীমানা খুঁজে পাই তবে আমাদের একটি অন্তর্ভুক্ত রয়েছে 1যা আমরা প্রতিস্থাপনের সাথে যুক্ত করব। $&জন্য প্রতিশব্দ $0

^(?!.*\d([+-]|$))
0+

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

^(?!.*i)
+0i+

পরবর্তী 3 টি ধাপগুলি সমস্ত বর্ণের মতো একই, তারা কোন অক্ষরকে প্রভাবিত করে। তাদের সকলে এই বিষয়টি দেখার জন্য অপেক্ষা করছে যে আমরা এই চিঠির সাথে মেলে না, এবং যদি আমরা 0এটির জন্য একটি পদ যোগ করতে পারি না । এর সহগের সাথে আসল মানটি অপঠনযোগ্য হতে বাধা দেওয়ার একমাত্র কারণের iঅতিরিক্ত কারণ রয়েছে , অন্যান্য সংখ্যাগুলি তাদের জটিল ভেরিয়েবল দ্বারা পৃথক করা হয়।+i

O$`[+-]*[\d.]*(\w?)
$1

আহ, মজার অংশ। এটি Oবিকল্প বিভাজক ব্যাকটিক এর আগে চিহ্নিত দ্বারা নতুন সাজানোর মঞ্চটি ব্যবহার করে । এখানে কৌশলটি হ'ল একটি শব্দের চরিত্র অনুসারে numberচ্ছিকভাবে পুরো সংখ্যাটি দখল করা, যা এই ক্ষেত্রে কেবল কোনও একটির সাথে মিলবে ijk। ব্যবহৃত অন্য বিকল্পটি হ'ল $যা এই ম্যাচগুলিকে সারণ করতে ব্যবহৃত মানটিকে প্রতিস্থাপনের কারণ হিসাবে দেখায়। এখানে আমরা কেবল আমাদের সাজানো মান হিসাবে রেখে দেওয়া alচ্ছিক অক্ষরটি ব্যবহার করি। যেহেতু রেটিনা ডিফল্টরূপে ডিক্সিকোগ্রাফিকভাবে সাজান, মানগুলি যেমন একটি অভিধানে থাকে তার অনুসারে বাছাই করা হয় যার অর্থ আমরা ম্যাচগুলি "", "i", "j", "k"ক্রমে পেয়েছি ।

-
+-

এই পর্যায়ে +সমস্ত বিয়োগ চিহ্নের সামনে একটি চিহ্ন রাখে i, বিভাজনের পর্যায়ে যদি পরে আমাদের জন্য নেতিবাচক মান থাকে তবে এটি প্রয়োজন ।

^ \ + +

আমাদের +কোনও অতিরিক্ত শীর্ষস্থানীয় নিউলাইন নেই তা নিশ্চিত করার জন্য আমরা নেতৃস্থানীয়গুলি সরিয়ে ফেলি।

S`[ijk+]+

জটিল ভেরিয়েবল বা প্লাস চিহ্নের রানগুলিতে অবশিষ্ট রেখাগুলি বিভক্ত করুন। এটি সুন্দরভাবে আমাদের প্রতি লাইনে একটি মান দেয়।


3

পার্ল 5, 125 বাইট

#!perl -p
%n=(h,0,i,0,j,0,k,0);$n{$4//h}=0+"$1@{[$3//$5//1]}"while/([+-]?)(([\d.]+)?([ijk])|([\d.]+))/g;s/.*/@n{qw(h i j k)}/

1
@ কেনি লাউ দুঃখের বিষয়, আপনার প্রস্তাবিত পরিবর্তনটি আপনি যা প্রত্যাশা করেছেন তা তা করে না। আমি আমার উত্তর পোস্ট করার আগে এটি চেষ্টা করেছি। ;-)
ক্রিস জেস্টার-ইয়ং

@ কেনি লাউ এই প্রস্তাবিত পরিবর্তনের বিষয়ে , পার্লের \aমিলগুলি "অ্যালার্ম" তে বর্ণানুক্রমিক নয়। আছে \wশব্দ-অক্ষর (আলফানিউমেরিক এবং আন্ডারস্কোর) জন্য, কিন্তু যে এখানে কাজ করবে না; আমাদের এটি দরকার একটি সংখ্যার সাথে মেলে না।
ক্রিস জেস্টার-ইয়ং

3
@ কেনি লাউ বিটিডাব্লু, আপনার আড্ডায় কথা বলার মতো যথেষ্ট প্রতিনিধি রয়েছে । ক্রমাগত আপনার সম্পাদনা পরামর্শ প্রত্যাখ্যান করার পরিবর্তে সেখানে ধারণাগুলি নিয়ে আলোচনা করতে দ্বিধা বোধ করবেন না। ;-)
ক্রিস জেস্টার-ইয়ং

আমার কাছে এখন মন্তব্য করার মতো যথেষ্ট প্রতিনিধি রয়েছে। পার্লের কি [আজ] জন্য নিদর্শন নেই?
লিকি নুন

1
পছন্দ করেছেন
ক্রিস জেস্টার-ইয়ং

3

লুয়া , 185 187 195 183 166 বাইট ( এটি অনলাইনে চেষ্টা করুন ) [ব্যবহৃত রেজেক্স]

উন্নত রেজেক্সের জন্য @ ক্রিস জেসেস্টার-ইয়ংকে ধন্যবাদ ।

এটি 166 বাইটে নামিয়ে আনার জন্য @ কেটেনকিওকে ধন্যবাদ ।

Golfed:

r={0,0,0,0}for u in(...):gsub("([+-])(%a)","%11%2"):gmatch("-?[%d.]+%a?")do n,i=u:match("(.+)(%a)")r[i and(" ijk"):find(i)or 1]=(n or u)end print(table.concat(r," "))

Ungolfed:

n = "42i+j-k+0.7"

result = {0,0,0,0}

for unit in n:gsub("([+-])(%a)","%11%2"):gmatch("-?[%d.]+%a?") do
  num, index = unit:match("(.+)(%a)")
  if index == "i" then
    result[2] = num
  elseif index == "j" then
    result[3] = num
  elseif index == "k" then
    result[4] = num
  else
    result[1] = unit
  end
end

print(table.concat(result," "))

2
হাই কেনি, সমাধানের জন্য ধন্যবাদ। সাধারণত আমরা কোনও চলক (যেমন nএই ক্ষেত্রে) থেকে ইনপুট শুরু করার অনুমতি দিই না , সুতরাং আপনার ইনপুটটি পড়ার জন্য কোডটি যুক্ত করা উচিত।
isaacg

তুমি তোমার ইনপুট পরিবর্তে, যুক্তি stdin থেকে পরিবর্তন করে কিছু বাইট সংরক্ষণ করতে সক্ষম হওয়া উচিত io.read(), ব্যবহার (...)। এটি প্রথম কমান্ড-লাইন আর্গুমেন্টের দিকে ইঙ্গিত করবে এবং আপনাকে আরও 4 টি বাইট সংরক্ষণ করার অনুমতি দেবে :)
ক্যাটেনকিও

1
এছাড়াও, জিজ্ঞাসা করা আউটপুট যে কোনও কিছু হতে পারে, যতক্ষণ না এটি তালিকা হিসাবে মানুষের দ্বারা ব্যাখ্যা করা যায়, তাই আপনি অতিরিক্ত বিন্যাস অপসারণ করতে পারেন। আপনি শেভ করতে পারেন এমন আরও কিছু সাদা জায়গা সহ আপনার কোডটি 166 বাইটে নামতে পারে ->r={0,0,0,0}for u in(...):gsub("([+-])(%a)","%11%2"):gmatch("-?[%d.]+%a?")do n,i=u:match("(.+)(%a)")r[i and(" ijk"):find(i)or 1]=(n or u)end print(table.concat(r," "))
কেটেনকিয়ো

3

সি, 236 বাইট

char j,n[9][9],s[9],y[9],i=8,k,*p=n[8];main(c){for(**n=48;c=getchar(),c+1;)c-32&&(c<46&&(k&&(y[1]=i),k=0,s[--i]=c-43,p=n[i])||c>57&&(k||(*p=49),k=0,y[c-103]=i)||(*p++=c,k=1));for(k&&(y[1]=i);++j<5;)printf("%c%s ",s[y[j]]?45:0,n[y[j]]);}

(-০ বা -০.০ এর মতো মানগুলির জন্য, বিয়োগ চিহ্নটি আউটপুটেও মুদ্রিত হয়, তবে যেহেতু চ্যালেঞ্জটি বলে যে "আপনি চান পার্স করার পরে আপনি সংখ্যাকে অন্য আকারে পরিবর্তন করতে পারেন", এবং যদি -0 ইনপুটটিতে উপস্থিত হয়, এটি অনুসরণ করে যে এটি আউটপুটটিতেও গ্রহণযোগ্য @ @ গ্যামার কর্পস এখন স্পষ্ট করে দিয়েছে যে এটি ঠিক)


3

জাভাস্ক্রিপ্ট (ES6), 103 100 বাইট

f=s=>s.replace(/(?=.)(\+|-|)([\d.]*)(\w?)/g,(_,s,x,c)=>a[c.charCodeAt()&3]=+(s+(x||1)),a=[0,0,0,0])&&a

সম্পাদনা করুন: এ থেকে স্যুইচ করে 3 বাইট সংরক্ষণ করা parseIntহয়েছে charCodeAt, যা সুবিধাজনকভাবে &3আমাকে সঠিক অ্যারে সূচক পাওয়া দরকার।


চমৎকার ধারণা পার্সেন্ট + মোড। বেস এবং উপসর্গ সম্পর্কে
ভাবা

1

জাভাস্ক্রিপ্ট (ES6) 106

s=>(s.replace(/([+-]?)([\d.]*)(\w?)/g,(a,b,c,d)=>a&&(s[d||9]=b+(c||1)),s={}),[...'9ijk'].map(i=>+s[i]||0))

পরীক্ষা

f=s=>(s.replace(/([+-]?)([\d.]*)(\w?)/g,(a,b,c,d)=>a&&(s[d||9]=b+(c||1)),s={}),[...'9ijk'].map(i=>+s[i]||0))

function Test()
{
  var t,k,r,ts=TS.value.split('\n')
  
  O.textContent=ts.map(x=>x.trim()&&(
    [t,k]=x.split('=>').map(x=>x.trim()),
    console.log(t,'*',k),
    k=k.match(/[\d+-.]+/g).map(x=>+x),
    r=f(t),
    t+' => '+r+(r+''==k+''?' OK':' KO (check: '+k+')')
  )).join('\n')
}    

Test()
#TS { width:90%; height:10em}
<pre id=O></pre>

Test data (modify if you like)<button onclick='Test()'>repeat test</button>
<textarea id=TS>
1+2i+3j+4k             => [1 2 3 4]
-1+3i-3j+7k            => [-1 3 -3 7]
-1-4i-9j-2k            => [-1 -4 -9 -2]
17-16i-15j-14k         => [17 -16 -15 -14]
  
7+2i                   => [7 2 0 0]
2i-6k                  => [0 2 0 -6]
1-5j+2k                => [1 0 -5 2]
3+4i-9k                => [3 4 0 -9]
  
42i+j-k                => [0 42 1 -1]
6-2i+j-3k              => [6 -2 1 -3]
1+i+j+k                => [1 1 1 1]
-1-i-j-k               => [-1 -1 -1 -1]
  
16k-20j+2i-7           => [-7 2 -20 16]
i+4k-3j+2              => [2 1 -3 4]
5k-2i+9+3j             => [9 -2 3 5]
5k-2j+3                => [3 0 -2 5]
  
1.75-1.75i-1.75j-1.75k => [1.75 -1.75 -1.75 -1.75]
2.0j-3k+0.47i-13       => [-13 0.47 2.0 -3]
5.6-3i                 => [5.6 -3 0 0]
k-7.6i                 => [0 -7.6 0 1]
  
0                      => [0 0 0 0]
0j+0k                  => [0 0 0 0]
-0j                    => [0 0 0 0]
1-0k                   => [1 0 0 0]
</textarea>


0

পাওয়ারশেল, 178 বাইট

param($a);$p="(-?)([\d.]+)?";$g={param($s)if($a-match"$p$s"){if(($r=$matches)[2]){$r[1]+$r[2]}else{$r[1]+1}}else{0}};$a-match"$p(\+|-|$)">$null;+$matches[2];"i","j","k"|%{&$g $_}

ব্যাখ্যার সাথে নিরপেক্ষ

# Get the whole string into a variable
param($a)
# Pattern shared getting both imaginary and real numbers. 
$p="(-?)([\d.]+)?"
# Anonymous function that will locate a imaginary number using a letter sent as a parameter. 
# If no value is assigned a signed 1 is returned. If no value is matched 0 is returned
$g={param($s)if($a-match"$p$s"){if(($r=$matches)[2]){$r[1]+$r[2]}else{$r[1]+1}}else{0}}
# Locate the real component if any. Null is converted to 0
$a-match"$p(\+|-|$)">$null;+$matches[2]
# Call the anonymous function using each of the imaginary suffixes.                                               
"i","j","k"|%{&$g $_}

সুপার মুগ্ধ নয় তবে এটি ফলস্বরূপ।


0

পিএইচপি, 179 বাইট

$a=[''=>0,'i'=> 0,'j'=>0,'k'=>0];preg_match_all("/([-+]?)(\d*(\.\d+)?)([ijk]?)/",$argv[1],$m,2);foreach($m as$n)if($n[0])$a[$n[4]]=$n[1].($n[2]===''?1:$n[2]);echo implode(',',$a);

পরীক্ষা স্যুট চেষ্টা করুন ।


0

পাইথন 3.5 - 496 বাইট [নিয়মিত এক্সপ্রেশন ব্যবহার করে]:

from re import*
def wq(r):
 a=sub('[+](?![0-9])','+1',sub('[-](?![0-9])','-1',r));q=lambda x:(not x.isdigit(),''.join(filter(str.isalpha,x)))
 for z in findall('(?<![0-9])[a-z]',a):a=a.replace(z,('+1{}'.format(z)))
 if not str(sorted(((sub('[.]','',sub('[+-]',' ',a))).split(' ')),key=q)[0]).isdigit():a+='+0, '
 for i in list(set(findall('[a-z]',a))^{'i','j','k'}):a+='+0{}, '.format(i)
 print(findall('[-]?\d+(?:\.\d+)?',''.join(sorted(sub('(?<=[A-Za-z0-9])(?=[+-])',', ',a).split(' '),key=q))))

এটি দীর্ঘ হতে পারে, তবে আমার প্রতিরক্ষা হিসাবে, ওপি যা চায় তা করতে এটি পুরোপুরি কাজ করে, যেহেতু প্রদত্ত সমস্ত পরীক্ষার মামলাগুলি আমার কোড ব্যবহার করে সফল হয়েছিল।

ব্যাখ্যা সহ বর্ণহীন সংস্করণ অন্তর্ভুক্ত:

from re import*
def w(r):
    # Substitute all minus (-) and plus (+) signs NOT followed by a number  (if there are any) with a "-1"/"+1", respectively.
    a=sub('[+](?![0-9])','+1',sub('[-](?![0-9])','-1',r))
    # Lambda function created for later use to sort the Quaternion. This function, when given as a key to the "sorted" function, arranges the input Quaternion in the order where the whole number comes first, and then the rest are placed in order of increasing letter value (i,j,k in this case) 
    q=lambda x:(not x.isdigit(),''.join(filter(str.isalpha,x)))
    # The following "for" loop replaces the letters NOT preceded by a number with a one followed by that letter
    for z in findall('(?<![0-9])[a-z]',a):
        a=a.replace(z,('+1{}'.format(z)))
    # The following first substitutes all pluses and minuses (+ and -) with a space, and then that new string is split at those spaces, and returned as a list. After that, the list is sorted according the the "lambda" function shown above. Then, the first item in that list, which is supposed to be a lone number, is checked to make sure that it indeed is a lone number. If it isn't, then "+0, " is appended to the Quaternion. 
    if not str(sorted(((sub('[.]','',sub('[+-]',' ',a))).split(' ')),key=q)[0]).isdigit():
        a+='+0, '
    # The following "for" loop finds ALL the letters NOT in the list, by finding the symmetric difference between a set of all the letters found, and a set containing all the letters needed. For the letters not in the list, a '+0' is added the quaternion, followed by that letter, and then a comma and a space.
    for i in list(set(findall('[a-z]',a))^{'i','j','k'}):
        a+='+0{}, '.format(i)
    # Finally, in this last step, a ", " is added IN BETWEEN unicode characters and pluses/minuses (+/-). Then, it splits at those spaces, and the commas separate different parts of the Quaternion from each other (otherwise, you would get something like `12i+3j+4k` from `2i+3j+4k+1`) in a returned list. Then, that list is sorted according to the lambda expression "q" (above), and then, finally, the NUMBERS (of any type, courtesy to Regex) are extracted from that joined list, and printed out in the correct order.
    print(findall('[-]?\d+(?:\.\d+)?',''.join(sorted(sub('(?<=[A-Za-z0-9])(?=[+-])',', ',a).split(' '),key=q))))

উপরেরটি পড়তে যদি খুব বেশি কষ্ট হয় তবে মূলত যা ঘটছে তা হ'ল:

  1. যদি কোনও থাকে তবে সমস্ত + বা - চিহ্নগুলি অনুসরণ না করে যথাক্রমে একটি "+1" / "- 1" দ্বারা প্রতিস্থাপিত হয়।

  2. একটি lambdaফাংশন সংজ্ঞায়িত করা হয়, যা, যখন একটি sortedফাংশনে কী হিসাবে ব্যবহৃত হয় , পুরো সংখ্যাটি প্রথমে রাখার তালিকা অনুসারে বাছাই করে এবং তারপরে বাকী ক্রমবর্ধমান অক্ষরের মানকে অর্ডার করে ("i", তারপরে "জ", তারপরে "কে" এই উদাহরণে)।

  3. কোয়ার্টারিয়ন, এখন প্রয়োজন অনুসারে 1 + দিয়ে সমস্ত +/- চিহ্নগুলি প্রতিস্থাপিত থাকলে, কমপক্ষে একটি সংখ্যার আগে না থাকা সমস্ত অক্ষরের জন্য নিয়মিত এক্সপ্রেশন ব্যবহার করে অনুসন্ধান করা হয়, এবং সেই অক্ষরগুলির সাথে মিলিত একটি "+1" পরিবর্তিত হয় যে চিঠি।

  4. "যদি" বিবৃতিটি একটি স্থানের সাথে সমস্ত +/- চিহ্নগুলিকে প্রতিস্থাপন করে এবং তারপরে পরিবর্তিত কোয়ার্টেরিয়ন এখন সেই স্পেসগুলিতে "বিভক্ত" হয়ে যায় এবং একটি তালিকায় ফিরে আসে। তারপরে, তালিকাটি আগে বর্ণিত ল্যাম্বদা ফাংশন অনুসারে বাছাই করা হয়েছে। অবশেষে, তালিকার প্রথম আইটেমটি এটি একটি সংখ্যা, এটি যেহেতু অনুমিত হওয়ার কথা তা নিশ্চিত করার জন্য পরীক্ষা করা হয় এবং যদি এটি না হয় তবে কোয়ার্টেরিয়নে একটি "+0" যুক্ত করা হবে।

  5. দ্বিতীয় "ফর" লুপটি কোয়ার্টেরিয়নে সমস্ত অক্ষর খুঁজে না পেয়ে অভিব্যক্তিতে পাওয়া অক্ষরের একটি সেটের মধ্যে একটি প্রতিসম পার্থক্য খুঁজে বের করে এবং তারপরে প্রয়োজনীয় সমস্ত অক্ষর সহ একটি সেট খুঁজে পায়। যদি কোনওটি পাওয়া যায়, তবে একটি "+0" অনুপস্থিত অক্ষর এবং কোয়ার্টেরিয়নে একটি স্থান যুক্ত করা হবে।

  6. অবশেষে, এই শেষ পদক্ষেপে, প্রতিটি অক্ষরের মধ্যে একটি +/- চিহ্নের পরে একটি "," যুক্ত হবে এবং তারপরে কোয়ার্টেরিয়নটি সেই স্পেসগুলিতে বিভক্ত হবে, তারপরে ফিরে পাওয়া তালিকাটি শেষ বারের মতো সাজানো হবে, অনুযায়ী lambda ফাংশনটি আগে "q" হিসাবে সংজ্ঞায়িত করা হয়েছিল। অভিব্যক্তিতে কমাগুলি চতুর প্রতিটি অংশকে আলাদা করে দেয় (অন্যথায়, আপনি এর 14i+5j+6kথেকে কিছু পেয়ে যাবেন 4i+5j+6k+1)। সর্বশেষে, এখন অনুসারে সাজানো তালিকা একটি স্ট্রিং মধ্যে একসঙ্গে যোগদান করা হয়, এবং শুধুমাত্র সংখ্যার যেকোনো ধরনের (রেগুলার এক্সপ্রেশন সৌজন্যে) নিষ্কাশিত হয়, এবং পরিশেষে, প্রতি একক সময় একটি তালিকাতে ফিরে সঠিক অনুক্রমে।

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