গল্ফস্ক্রিপ্ট, 59 51 50 অক্ষর
প্রতিটি চরিত্রটি হারানো অত্যন্ত কঠিন:
0[2.{).,2>{\.@%!},{.2$-.4$>{].p~\[}{;\;}if..}or}do
আউটপুট :
[2 3 1]
[3 5 2]
[7 11 4]
[23 29 6]
[89 97 8]
[113 127 14]
...
ব্যাখ্যা :
স্ট্যাক সেট আপ করা হয়েছে যাতে প্রতিটি পুনরাবৃত্তি স্ট্যাক দিয়ে শুরু হয়, শীর্ষটি ডানদিকে রয়েছে to [
বর্তমান অ্যারের মার্কার ইঙ্গিত, যার অর্থ যখন অনুবাদক একটি encounters ]
, শীর্ষে চিহ্ন থেকে স্ট্যাক সবকিছু একটি অ্যারের পুরা করা হয়।
g [ last | cur
g
এখন পর্যন্ত সর্বোচ্চ ফাঁক। উপর থেকে নিচে:
command | explanation
-----------------+----------------------------------------
0[2. | initialize vars g=0, last=2, cur=2
{...}do | loop forever...
লুপের ভিতরে:
) | cur += 1
.,2>{\.@%!}, | put all divisors of cur into a list
{...}or | if the list is empty, cur is prime, so
| the block is executed. otherwise,
| 'do' consumes the stack, sees it is truthy,
| and loops again
এটি কীভাবে সমস্ত বিভাজনকারীকে একটি তালিকায় রাখে? ধাপে ধাপে এটি করা যাক
Command | explanation | stack
-----------------+----------------------------------------------+----------------
| initial stack | n
., | make list of 0..n-1 | n [0,1,...,n-1]
2> | take elements at index 2 and greater | n [2,3,...,n-1]
{...}, | take list off stack, then iterate through |
| the list. on each iteration, put the current |
| element on the stack, execute the block, and |
| pop the top of the stack. if the top is |
| true then keep the element, else drop it. |
| when done, push list of all true elements |
| So, for each element... | n x
\. | Swap & dup | x n n
@ | Bring x around | n n x
% | Modulo | n (n%x)
! | Boolean not. 0->1, else->0. Thus this is 1 |
| if x divides n. | n (x divides n)
| So only the divisors of n are kept | n [divisors of n]
বিভাজক খালি থাকলে এটি কী করবে?
Command | explanation | stack
-----------------+----------------------------------------------+----------------
| initial stack | g [ last | cur
. | dup | g [ l | c | c
2$ | copy 3rd down | g [ l | c | c | l
- | sub. This is the current gap, cur-last | g [ l | c | c-l
. | dup | g [ l | c | c-l | c-l
4$ | copy 4th down | g [ l | c | c-l | c-l | g
> | is cur gap > max gap so far? | g [ l | c | c-l | c-l>g
{#1}{#2}if.. | #1 if c-l > g, #2 otherwise, and do ".." in | ... | g [ c | c | c
| either situation |
দুটি পথ: হ্যাঁ এবং না। যদি হ্যাঁ (লক্ষ্য করুন যে if
স্ট্যাকের উপরের মানটি গ্রাস করে):
Command | explanation | stack
-----------------+----------------------------------------------+----------------
| initial stack. note that now the old `g` is | XX [ l | c | g
| garbage and `c-l` is the new `g`. |
] | close the array | XX [l, c, g]
.p | duplicate it and print it, consuming the dup | XX [l, c, g]
~ | pump array back onto the stack. Note now the | XX | l | c | j
| array marker [ is gone. |
\ | swap. | XX | l | g | c
[ | mark the array | XX | l | g | c [
. | this is the part after the if. dups the top, | XX | l | g [ c | c
| but it does this in two steps, first popping |
| c then putting two copies on top, so the |
| array marker moves |
. | dup again | XX | l | g [ c | c | c
কোন যদি:
Command | explanation | stack
-----------------+----------------------------------------------+----------------
| initial stack. In this case g is still the | g [ l | c | c-l
| max gap so far |
;\; | dump top of stack, swap, and dump again | g [ c
.. | the part after the if. dup twice | g [ c | c | c
উভয় ক্ষেত্রে নোট করুন, আমাদের স্ট্যাক এখন ফর্ম হয় ... | g [ c | c | c
।
এখন do
সর্বদা c
- এবং ধনাত্মক হলে লুপগুলি সর্বমোট স্ট্যাকের বাইরে থাকা পপগুলি শীর্ষস্থানীয় হয় । যেহেতু c
সর্বদা বর্ধমান, এটি সর্বদা সত্য, তাই আমরা চিরকালের জন্য লুপ করি।
একবার পপড হয়ে গেলে, স্ট্যাকের শীর্ষটি হ'ল g [ c | c
অর্থটি সর্বশেষে আপডেট হয়েছে c
, অ্যারে চিহ্নটি একই জায়গায় রয়েছে, এবং g
এখনও আমরা এটি প্রত্যাশা করি।
এগুলি গল্ফস্ক্রিপ্টের সংশ্লেষিত ক্রিয়াকলাপ। আমি আশা করি আপনি পাশাপাশি অনুসরণ উপভোগ করেছেন!