নির্বিচারে দৈর্ঘ্য কারি


53

একটি ফাংশন লিখুন f, এটি একটি ধনাত্মক পূর্ণসংখ্যার সময় নেয় এবং একটি ফাংশন প্রদান করে।

নতুন ফাংশনটি একই রকম হওয়া উচিত f। যাইহোক, যখন "সমাপ্তি কল" হয়, fতার পরিবর্তে সমস্ত পূর্ণসংখ্যার যোগফলটি প্রদান করা উচিত।

উদাহরণস্বরূপ, g=f(4)(যদি fপ্রথম ফাংশন হয়) gঅন্য ফাংশনে সেট করা উচিত । h=g(3)একই কাজ করবে। যাইহোক, আপনি যখন hকোনও যুক্তি ছাড়াই কল করেন (বিশদগুলির জন্য নীচে দেখুন), এটি output টি আউটপুট দেয়, কারণ এটি পূর্ববর্তী ফাংশন আর্গুমেন্টের যোগফল। অন্য উপায় রাখুন f(3)(4)() == 7,।

মনে রাখবেন যে এটির মতো নয় f(3,4)()

"টার্মিনেশন কল" নিম্নলিখিত বিকল্পগুলির মধ্যে একটি (আপনার পছন্দ):

  • ডাব্লু / ও আর্গুমেন্ট কল করুন
  • যুক্তি হিসাবে নাল
  • যে কোনও অ-ধনাত্মক মান

ফাংশন কলগুলির নির্বিচারে পরিমাণ সমর্থন করা উচিত, কোনও পূর্বনির্ধারিত সীমা নেই।

এটি গ্যারান্টিযুক্ত যে মোট যোগফল 1'000 এর চেয়ে বড় হবে না।

আমরা ধরে নিতে পারি যে "টার্মিনেশন কল" এর আগে কমপক্ষে একটি কল করা হয়েছিল।

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

উদাহরণ:

f(1)() == 1
f(4)(2)(7)() == 13
f(4)(2)(7)(5)(2)() == 20

4
@ লুইস মেন্ডো এর সাধারণ অর্থ হল f(4)একটি নতুন ফাংশন ফেরত। যদি সেই নতুন ফাংশনটি তর্ক ছাড়াই ডাকা হয়, এটি ফিরে আসে 4, তবে যদি এটি অন্য যুক্তি দিয়ে ডাকা হয় তবে এটি আবার একই শব্দার্থতন্ত্রের সাথে আবার নতুন যুক্তি যুক্ত করে আবার যুক্ত করবে 4
মার্টিন ইন্ডার

6
@ লুইসমেন্দো এটি ইউজিনের পক্ষে সত্যই, তবে আমি মনে করি যে বারবার কল করার অনুমতি দেওয়া চ্যালেঞ্জ থেকে উল্লেখযোগ্যভাবে দূরে সরে যাবে, কারণ আকর্ষণীয় অংশটি একটি রাষ্ট্রীয় ফাংশন করা নয় বরং উচ্চতর অর্ডার ফাংশন করা।
মার্টিন ইন্ডার

6
@ মার্টিনএেন্ডার এটি অনেক অর্থবোধ করে। ইউজিন, যদি এটি উদ্দেশ্য হয় তবে দয়া করে চ্যালেঞ্জটির শব্দ পরিবর্তন করুন। এমন একটি ফাংশন লিখুন যা অনন্তভাবে বলা যেতে পারে ফাংশনটি জোরে কোনও ফাংশন ফিরিয়ে দেয় তা মোটেই বোঝায় না
লুইস মেন্ডো

4
আমরা কি ধরে নিতে পারি যে একবারে কল চেইনের কেবলমাত্র একটি উদাহরণ থাকবে? যেমন না q = f(2)(3); b = f(1)(2)(3); q(); b()?
কনর ও'ব্রায়ান

3
সবেমাত্র হাস্কেলকে বাছাই করার পরে আমি হাস্কেলের ক্ষেত্রে এটি সম্ভব কিনা তা নিয়ে আগ্রহী। শক্তিশালী টাইপ সিস্টেমটি আমাকে মনে করে যে এটি নাও হতে পারে।
CAD97

উত্তর:


49

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

f=n=>m=>m?f(m+n):n

যোগফলটি পুনরুদ্ধার করতে একটি মিথ্যা মানটি পাস করুন। জিরোসকে 2 বাইট দামের জন্য অনুমোদিত হতে পারে।

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

Ungolfed:

f = function(n) {
    return function(m) {
        if (m) {
            return f(m+n);
        } else {
            return n;
        }
    }
}

জমকালো জমা!
ইউজিন ডি গুবেনকভ

21

হাস্কেল (জিএইচসি), 118 বাইট

এটি কোডের জন্য 98 বাইট এবং জিএইচসি সংকলক পতাকার 20 টি বাইট -XFlexibleInstancesযা কোনও প্রকারের সিস্টেমের প্রসারকে সক্ষম করে।

class F a where f::Int->a
instance F(()->Int)where f n()=n
instance F a=>F(Int->a)where f=(f.).(+)

এটি একটি "ফাংশন" সংজ্ঞায়িত করে f, যাকে ইউনিট অনুসারে একটি নির্বিচার সংখ্যার পূর্ণসংখ্যার সাথে ডাকা যেতে পারে, যার ()পরে এটি একটি পূর্ণসংখ্যা ফেরত দেয়। প্রকারের টীকাগুলি প্রয়োজনীয়। এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

হাস্কেলের কঠোর প্রকারের ব্যবস্থাকে জোর করার জন্য কিছু জাদু প্রয়োজন, যথা, নমনীয় টাইপক্লাস উদাহরণগুলির জন্য জিএইচসি এক্সটেনশন সক্ষম করে। এটি কীভাবে কাজ করে তা fকোনও ধরণের শ্রেণিবদ্ধ দ্বারা সীমাবদ্ধ একটি প্যারাম্যাট্রিকલી পলিমারফিক ফাংশন: এটির ধরণ F a => Int -> a। এর অর্থ এটি টাইপক্লাসের সাথে সম্পর্কিত যে কোনও প্রকারের জন্য fএকটি পূর্ণসংখ্যা নেয় এবং টাইপের মান প্রদান করে । কেবলমাত্র টাইপক্লাসের নাম যা ফাংশন সরবরাহ করে ; এটি প্রথম লাইনে ঘোষণা করা হয়েছে।aaFFf

আগামী দুই লাইনের দুই স্থানেই হয় Fবিভিন্ন ধরনের জন্য a। দ্বিতীয় রেখায় বলা হয়েছে যে ()পূর্ণসংখ্যার থেকে ফাংশনের ধরণেরটি F(যেখানে ()একক ধরণের একমাত্র সদস্য যার মূল্য হ'ল ()), এবং বাস্তবায়ন হয় f n () = n; ফাংশনটি তার প্রথম যুক্তি ফিরিয়ে দেয়। শেষ লাইনটি উল্লেখ করে যে যদি এটির aঅন্তর্গত হয় F, তবে পূর্ণসংখ্যা থেকে ফাংশনের ধরণটি এমনভাবে হয় a: একটি ফাংশন থেকে f :: Int -> aআমরা অন্য ফাংশন তৈরি করতে পারি f :: Int -> Int -> a। বাস্তবায়নটি হ'ল f m n = f (m+n)(কোডটি সংক্ষিপ্ততর করার জন্য সংযুক্তকারীগুলি ব্যবহার করে), যেখানে fবামদিকে নতুনটি নতুন এবং fডানদিকে পুরানোটি। এটি মূলত দেয়fএকটি নতুন পূর্ণসংখ্যার যুক্তি, যা পরেরটিতে যুক্ত করা হয়। একাধিক যুক্তি এইভাবে একত্রে সংযুক্ত করা হয়:

  f  a1   a2   a3   a4   a5  ()
= f (a1 + a2)  a3   a4   a5  ()
= f (a1 + a2 + a3)  a4   a5  ()
= f (a1 + a2 + a3 + a4)  a5  ()
= f (a1 + a2 + a3 + a4 + a5) ()
=    a1 + a2 + a3 + a4 + a5

fপ্রতিটি লাইনে একটি ভিন্ন ধরনের হয়েছে।

হাস্কেল ফাংশনগুলি স্বয়ংক্রিয়ভাবে ক্রিষ্ট হয়, সুতরাং আপনি fকেবল পূর্ণসংখ্যা দিলে আপনি একটি ফাংশন পান।


1
হতে পারে আমি নিটপিক করছি, তবে চ্যালেঞ্জটি যা চাচ্ছে এটি তেমন নয়। আপনি দুটি (!) ফাংশন সংজ্ঞায়িত করছেন, উভয়ই বলা হয় f, কাজটি করে এমন একটি ফাংশন নয়। যাইহোক, এটি হ্যাসকেলে যেতে পারার কাছাকাছি। কঠোর টাইপ সিস্টেমের কারণে একক ফাংশন দিয়ে কাজটি সমাধান করা সম্ভব বলে আমি মনে করি না।
নিমি

3
@ নিমিমি এটি দুটি বলা ফাংশন সংজ্ঞায়িত করে না f, তবে অসীমভাবে অনেকগুলি ক্রিয়াকলাপ বলে f। (প্রতিটি সম্ভাব্য সংখ্যক আর্গুমেন্টের জন্য একটি।) এই ফাংশনগুলির (এই অসীম পরিবার থেকে) দুটি ধরণের সংজ্ঞা রয়েছে, একটি ধরণের যখন আর্গুমেন্টের সংখ্যা শূন্য হয় এবং অন্যটি যখন তা হয় না।
শ্রীভাতসার আর

@ শ্রীভাতসার: আমি দুটি সংজ্ঞা দেখতে পাচ্ছি, f n()=nএবং f=(f.).(+)তাই আমি এটিকে দুটি ফাংশন সংজ্ঞায়িত করে ডাকব।
নিমি

7
@ নিমিমি দুটি সংজ্ঞা রয়েছে তবে দুটি কার্য নয়। সংজ্ঞার সংখ্যার ফাংশনের সংখ্যা হওয়া উচিত নয়। উদাহরণস্বরূপ, আপনি দুটি সংজ্ঞা g 0 = 1এবং g n = g (n-1) * nযেখানে দুটি সংজ্ঞা আছে কিন্তু কেবল একটি ফাংশন দিয়ে ফ্যাক্টরিয়াল ফাংশনটি সংজ্ঞায়িত করতে পারেন । এখানে আমাদের দুটি সংজ্ঞা রয়েছে তবে অসীম বহু কার্য রয়েছে। (প্রতিটি আলাদা ধরণের।)
শ্রীভাতসার

1
ghciউপরের লোডে নিমিম বিটিডাব্লু এবং চেষ্টা করুন :t f- এটি বলবে f :: F a => Int -> a(এর অর্থ যদি aশ্রেণীর উদাহরণ হয় fতবে fএকটি ফাংশন Int -> a)। সুতরাং আমরা এটিকে একটি ফাংশন বা অসীম অনেক হিসাবে বিবেচনা করতে পারি, তবে যদিও এর দুটি ধরণের সংজ্ঞা রয়েছে (ঠিক তাত্ত্বিক ফাংশনের মতো) এটি দুটি ফাংশন হিসাবে বিবেচনা করার জন্য আমি কোনও ভাল ভিত্তি দেখতে পাচ্ছি না।
শ্রীভাতসার

15

পাইথন 2, 42 41 36 বাইট

পাইথন স্বেচ্ছাসেবী-নির্ভুলতা পূর্ণসংখ্যার সমর্থন করে, কারণ এই দ্রবণটির কখনই ওভারফ্লো হবে না। জিরো হল "বিশেষ মান"।

f=lambda n:lambda m:m and f(m+n)or n

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

Ungolfed:

def f(n):
    def g(m=''):
        return f(m+n)if m<''else n
    return g

14

সি, 62 58 বাইট, প্রতিযোগিতা সীমান্তরেখা

কেভিনের জন্য 4 টি বাইট সংরক্ষণ করা হয়েছে! (এখনও টাইপিডেফ অপসারণ করছে না কারণ এটি কল করার জন্য কিছু প্রয়োজন))

typedef(*(*B)(_))(_);q;f(x,o,_){x=x?(q+=x,f):(x=q,q=0,x);}

কল করার ফাংশনটি হ'ল f; আপনি এটি কল করা বন্ধ করুন এবং ইতিবাচক নম্বরের মতো কল করে ফলাফলটি পাবেন 0অনলাইনে একটি পরীক্ষার জোতা ব্যবহার করে দেখুন!

সুতরাং, আমি যতদূর বলতে পারি, "কারি" ফাংশনগুলির একাধিক উপায় যা একাধিক রিটার্ন টাইপ করে থাকে তা হল নিম্নলিখিতগুলির একটি:

  1. আপনি ফলাফলটি আবার কল করতে চান এমন সংকলকটি বলতে কোনও ফাংশনে ফলাফল Castালুন;
  2. বা একটি union/ structটাইপ তৈরি করুন যা একটি intএবং ফাংশন / স্ব-রেফারেন্সিয়াল সাব টাইপস রয়েছে।

আমি চেষ্টা করেছিলাম (2), তবে এটি প্রশ্নের আত্মার বিরুদ্ধে কিছুটা মনে হয়েছিল এবং, খুব স্পষ্টভাবে, নিকটে ফিরতে পারা যায় না। সুতরাং, চ্যালেঞ্জের চেতনার সাথে তাল মিলিয়ে আমি বিকল্প (1) বেছে নিয়েছি। এর জন্য প্রতিটি ফেরত ফাংশন একটি ফাংশনে কাস্ট করা প্রয়োজন, এটি ব্যবহৃত হতে পারে।

এই "কারিরিং" সিনট্যাক্সটি কিছুটা অদ্ভুত দেখাচ্ছে তবে বেশ মিল similar অনুকরণ করতে f(21)(1), একটি লিখতে হবে ((B)((B)f(21))(1))(0)। আমি টাইপটিকে Bকোনও ক্রিয়া হিসাবে সংজ্ঞায়িত করে যা একটি পূর্ণসংখ্যা নেয় এবং কোনও ফাংশনে একটি পয়েন্টার দেয় যা একটি পূর্ণসংখ্যা নেয়। প্রসারিত, দেখে মনে হচ্ছে:

   ( (B)( (B) f(21) )(1) )(0)
//            f(21)            - call f with 21
//        (B)                  - cast to B, a function pointer
//      (           )(1)       - call with 1
//   (B)                       - cast to a function pointer
// (                     )(0)  - call with 0

যদি আপনি বলে থাকেন যে এটি কেবল 0 এ শেষ হয়, আপনি castালাই প্রয়োজন যাচ্ছেন (যা আপনি সিতে করেন কারণ সি কোনও ফাংশন সঠিকভাবে সংজ্ঞা দিতে পারে না যা সি নিজেই ফিরে আসে), এবং আপনি কলারের কাছে রান (যা কোনটি রান করার মধ্যে গ্লোবাল সাফ করে দেন) আমি পুরোপুরি যুক্তিযুক্ত বলে মনে করি), আপনি সম্পূর্ণ জিনিসটি এটিকে সহজ করতে পারেন q;f(x){return x?(q+=x,f):q;}
কেভিন


1
@ কেভিন এখনও সাইটের নিয়ম অনুসারে একটি ফাংশন অবশ্যই পুনরায় ব্যবহারযোগ্য হবে। আমি যদি qপ্রতিটি রানের পরে শূন্য না হয়ে থাকি তবে ফাংশনটি আর ব্যবহারযোগ্য হবে না
কনার ও'ব্রায়ান

ফাংশন পয়েন্টার হতে পারে? আপনাকে প্রতিবার রেফারেন্স দিতে হবে তবে এটি পরীক্ষা করার মতো হতে পারে
ডাউনগোট

1
@ কনরও ব্রায়েন আমি কেবল আপনার ইউনিয়ন পদ্ধতির প্রয়োগ করেছি। এটি এর চেয়ে দীর্ঘ, তবে এটি খুব বেশি দূরে নয়।
Jakob

13

গণিত, 25 বাইট

f[x_]@y_=f[x+y]
f[x_][]=x

এটি অনলাইন চেষ্টা করুন! (গণিত ব্যবহার করে।)

জাভাস্ক্রিপ্ট উত্তরটি পোর্ট করে তিনটি বাইট কম করা সম্ভব, তবে আমি আরও একটি প্রতিচ্ছবিযুক্ত গণিতের সমাধান উপস্থাপন করতে চেয়েছিলাম। @শুধু অন্বিত চিনি, যা সমতুল্য সমাধান করে তোলে একটি বিট হল:

f[x_][y_]=f[x+y]
f[x_][]=x

সুতরাং হ্যাঁ ধারণাটি হল যে গাণিতিকায় আপনি কেবল একটি ফাংশন সংজ্ঞায়িত করতে পারবেন না f[x_]তবে আপনি আরও একটি জটিল জটিল অভিব্যক্তির সাথে সরাসরি একটি মান সংযুক্ত করতে পারেন f, যেমন f[x_]অন্য কোনও যুক্তি পাস করা passed এর জন্য দুটি সংজ্ঞা স্থাপন করে আমরা পছন্দসই আচরণটি পেতে পারি:

  • প্রথম সংজ্ঞাটি একটি f[x][y]কলকে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে f[x+y]যুক্ত হয়ে একটি "কল" গ্রহন করে inside আমাদের বিদায় না দেওয়া পর্যন্ত এই বিধিটি প্রযোজ্য f[sum][]
  • দ্বিতীয় সংজ্ঞাটি সম্পূর্ণরূপে মূল্যায়ন করার জন্য সংজ্ঞা দিয়ে এই চূড়ান্ত কেসটিকে আনপ্যাক করে sum

1
<3 প্রতীকী প্রোগ্রামিং
জুলিয়ান ওল্ফ

8

সি ++, 72 বাইট

#define O(P)operator()(P){return{P+a};}int
struct F{F O(int(m))O()a;}f;

এটি Fঅনুরোধকৃত ফাংশন হিসাবে কাজ করে এমন ধরণের সংজ্ঞা দেয় এবং অনুরোধ করার fজন্য এই ধরণের একটি পরিবর্তনশীল । এটি সি ++ 11 হিসাবে বৈধ এবং জিসিসি, ঝনক, আইসিসি এবং ভিসি ++ এর অনলাইন সংস্করণগুলির সাথে কাজ করে।

ব্যবহার:

int main() {
  return f(1)(2)(3)(); // returns 6
}

ব্যাখ্যা:

প্রিপ্রোসেসিং এবং পুনরায় ফর্ম্যাট করার পরে দেখে মনে হচ্ছে:

struct F {
  F operator()(int(m)) { return{int(m)+a}; }
  int operator()() { return {+a}; }
  int a;
} f;

এটি সাধারণত লেখা হবে:

struct F {
  F operator()(int m) { return {m+a}; }
  int operator()() { return a; }
  int a;
} f;

return a;এবং return {+a};একই জিনিসটি করুন, যেমন অ্যানারি +মান পরিবর্তন করে না এবং রিটার্ন মানটির চারপাশে অপ্রয়োজনীয় ধনুর্বন্ধকে অনুমতি দেওয়া হয়। int mএবং int(m)একই জিনিসটি করুন, যেমন ভেরিয়েবলের চারপাশের অপ্রয়োজনীয় বন্ধনীগুলি যেমন ফাংশন প্যারামিটার সহ অনুমোদিত। return {m+a};এবং return {int(m)+a};একই জিনিস করে, একটি ঢালাই যেমন mথেকে intথেকে intএর মান পরিবর্তন করে না। এই পরিবর্তনগুলি operator()সিনট্যাক্সের সাথে দুটি ওভারলোডগুলি আরও কাছাকাছি পায়, যার ফলে একটি একক ম্যাক্রো সংজ্ঞাটি দু'বার চাওয়া যায়। তিন সদস্যের জন্য সঠিক ক্রমটি বাছাইয়ের ফলে পরবর্তী লাইনের প্রথম শব্দটি ( int) ম্যাক্রো সংজ্ঞাতেও অন্তর্ভুক্ত হতে পারে।


1
সুন্দর। এবং কেবল গল্ফযুক্ত সমাধান নয় ... operator()এই কাজটি করতে ওভারলোডিং বিশেষত দুর্দান্ত ছিল।
রায় তোয়াল

6

রুবি, 23 বাইট

f=->n{->m{m ?f[n+m]:n}}

ব্যবহার:

f[1][2][3][nil]
=> 6

6

সি, 104 96 বাইট

#define a(i)s(i)|b
#define b(i)u(i)|c
#define c(i)u(i)|b
b,c,d;s(i){b=c=i;i=d;}u(i){c=b+=i;i=d;}

@ জুলিয়ানওয়াল্ফ যে লিঙ্কটি ভাগ করেছে তা থেকে পদ্ধতিটি ব্যবহার করে। শেষ যুক্তিটি 0 হতে হবে।

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


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ডেনিস

4

ম্যাথ.জেএস, 38 বাইট

f(x)=i(x,0)
i(x,y)=x<0?y:j(z)=i(z,y+x)

সাথে কল করুন f(number_a)(number_b)(...)(negative_number)

যদি আমাদের প্রাথমিক কল নির্দিষ্ট করার অনুমতি দেওয়া হয় তবে 12 বাইট ( f(x)=i(x,0)\n) বাদ দেওয়া যায় এবং এটি দিয়ে কল করা যেতে পারেi(number_one,0)(number_two)(...)(negative_number)

চেষ্টা করে দেখুন!

Explination

ক্ষীর!

উপরোক্ত আলোচনা ক্ষীর দেখানো হয়েছে, f(x)কেবল কল i(x,0)হলে, i(x,y)এর মান yযদি x0 কম হয়, অথবা ফাংশন j(z)=i(z,x+y), যা এক যুক্তি, যা loops লাগে। এর মান যুক্ত করা হচ্ছে y


4

সি, 232 206 বাইট

#include<string.h>
#include<stdlib.h>
#define f(X)s(""#X)?0:g
#define g(X)u(""#X)?0:h
#define h(X)u(""#X)?0:g
g=0,h=0;s(char*s){g=h=atoi(s);return 0;}u(char*s){char*a=strlen(s)?s:"0";g=h+=atoi(a);return 0;}

এটি সম্ভবত তাত্পর্যপূর্ণভাবে গল্ফ করা যেতে পারে তবে কোনও যাদুর মান না দিয়ে যুক্তি ছাড়াই কল করে এই সমস্যার সমাধান করতে কোনও ভাষা এক্সটেনশন * ছাড়াই সি ব্যবহার করা যেতে পারে এমন ধারণার প্রমাণ হিসাবে কাজ করা উচিত।

* @ এইচভিডি উল্লেখ করেছে যে, এটি জিসিসি ব্যবহার করে বাক্সের বাইরে চলে গেলে, কিছু আচরণ সি স্ট্যান্ডার্ডে সংজ্ঞায়িত করা হয়নি, যার অর্থ এটি পোর্টেবল হতে পারে না। আপনার নিজের ঝুঁকিতে ব্যবহার করুন!

Ungolfed:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define f(X) start("" #X) ? 0 : f0
#define f0(X) update("" #X) ? 0 : f1
#define f1(X) update("" #X) ? 0 : f0

long f0 = 0;
long f1 = 0;

int start(const char *s) {
    f0 = f1 = strtol(s, NULL, 10);

    return 0;
}

int update(const char *s) {
    const char *a = strlen(s) ? s : "0";
    f0 = f1 += strtol(a, NULL, 10);

    return 0;
}

int main() {
    printf("f(1)()          -> %ld\n", f(1)());
    printf("f(1)(2)(0)(3)() -> %ld\n", f(1)(2)(0)(3)());
    printf("f(1)(-2)(3)()   -> %ld\n", f(1)(-2)(3)());
    printf("f()             -> %ld\n", f());

    return 0;
}

gcc arbitrary-length-currying.c -o arbitrary-length-currying && ./arbitrary-length-curryingআউটপুটগুলি সংকলন এবং চলমান (কিছু সতর্কতার পরে)

f(1)()          -> 1
f(1)(2)(3)(0)() -> 6
f(1)(-2)(3)()   -> 2
f()             -> 0

"কোনও ভাষার এক্সটেনশন ছাড়াই" - ম্যাক্রো অনুরোধগুলির একটি শৃঙ্খলের মধ্যে পরিবর্তন gএবং hচালিয়ে যাওয়ার কৌশলটি কাজ করার গ্যারান্টিযুক্ত নয়, কারণ এটি gপ্রথমটির সম্প্রসারণের প্রসঙ্গে পরবর্তীটি প্রদর্শিত হবে কিনা তা অনির্ধারিত g। সি 11 এটিকে অনির্ধারিত বলে বানান করতে 6.10.3.4 এ একটি উদাহরণ যুক্ত করেছে। (আইআইআরসি, টেনডিআরএর প্রিপ্রোসেসর এমনটি যা আপনার ইচ্ছা মতো এটি প্রসারিত করে না)) এগুলি ছাড়াও, ভাষার কোনও সংস্করণ খালি ম্যাক্রো যুক্তি এবং অন্তর্নিহিত উভয় সমর্থন করে না, সুতরাং একটি বৈধ সি প্রোগ্রাম উভয়ই ব্যবহার করতে পারে না। :) তবুও, সুন্দর উত্তর। আপনি কি আরও গল্ফ খুঁজছেন?
এইচডিভি

@ এইচভিডি: হ্যাঁ, সম্ভবত কয়েকদিনের মধ্যে এটি ফিরে আসবে এবং দেখুন আমি এটি গল্ফ করতে পারি কিনা। আপনি স্পষ্টতই ঠিক বলেছেন যে এটি অনির্দিষ্ট আচরণ, তবে আমি মনে করি যে এখানে মানক চিকিত্সা হ'ল ভাষাগুলি তাদের প্রয়োগের মাধ্যমে সংজ্ঞায়িত করা হয়, যতক্ষণ না এটি জিসিসি দিয়ে কাজ করে আমি খুশি।
জুলিয়ান ওল্ফ

আমি আপনার উত্তরে যে মন্তব্যটি অন্তর্ভুক্ত করেছি কেবল সেটিকেই সম্বোধন করছিলাম যে এটি কোনও ভাষা বর্ধনের উপর নির্ভর করে না। হ্যাঁ, এমনকি ভাষা বর্ধনের সাথেও, এটি এখানে উত্তর হিসাবে পুরোপুরি বৈধ, অন্যথায় প্রস্তাব দেওয়ার অর্থ নয়।
এইচডিভি

আহ, এটা অবশ্যই ন্যায্য। আপনি ঠিক বলেছেন যে আমার এটি নির্ধারণ করা উচিত, যখন কোনও অতিরিক্ত পতাকা প্রয়োজন হয় না, এটি পোর্টেবল নাও হতে পারে।
জুলিয়ান ওল্ফ

আপনার সাথে খালি স্ট্রিং জন্য পরীক্ষা করতে পারেন *sপরিবর্তে strlen(s)। সি স্ট্রিং অন্তর্নিহিত দৈর্ঘ্যের, একটি দ্বারা সমাপ্ত charমান 0। কোনও আর্গ দিয়ে / ছাড়াই কল করার অনুমতি দেওয়ার জন্য দুর্দান্ত ম্যাক্রো হ্যাক!
পিটার কর্ডেস

4

8086 মেশিন কোড, 27 বাইট

00000000  bb 00 00 85 c0 74 13 01  d8 be 00 01 89 e7 47 47  |.....t........GG|
00000010  57 b9 1b 00 f3 a4 5b 89  47 01 c3                 |W.....[.G..|
0000001b

এই মেশিন কোডটি অবশ্যই 0x100 ঠিকানায় হওয়া উচিত এবং এটি ক্ষুদ্র কোড মডেল (সিএস = ডিএস = এস = এসএস) গ্রহণ করবে। অতিরিক্ত বাইট ব্যয় না করেই ফাংশনটির অবস্থান পরিবর্তন করা যেতে পারে। এটি অফসেটে রেখে 0দেওয়া একটি বাইট ( xor si,siপরিবর্তে mov si, 0x100) সংরক্ষণ করবে

প্রয়োজনীয় কলিং কনভেনশন

এটি ধরে নেয় কলার স্ট্যাকের কমপক্ষে 27 বাইট প্রাক-বরাদ্দ করেছে। এটি একটি সংখ্যা নেয় axএবং এতে একটি ফাংশন পয়েন্টার দেয় bx। এই পয়েন্টারটির সাথে কল করা ax=0চেইনটি সমাপ্ত করে, এবং যোগফলটি যোগ করে bx
সুতরাং প্রথম কল জন্য:

mov bp, sp
sub sp, 28
mov ax, number_to_add
call function
; new function pointer in bx

তারপরে, পরবর্তী প্রতিটি কলের জন্য:

sub sp, 28
mov ax, number_to_add
call bx
; new function pointer in bx

বিনষ্ট:

mov ax, 0
call bx
; result in bx
mov sp, bp

অবহেলিত (মেশিনের কোডটি পৃথকীকরণের মন্তব্য করেছে):

00000000  BB0000            mov bx,0x0      ; 0 is replaced after copying
00000003  85C0              test ax,ax
00000005  7413              jz 0x1a         ; if(ax==0) ret (with value in bx)
00000007  01D8              add ax,bx       ; arg += total
00000009  BE0001            mov si,0x100    ; address of the original: ds:0x100
0000000C  89E7              mov di,sp
0000000E  47                inc di
0000000F  47                inc di          ; dst = sp+2 = above return address
00000010  57                push di
00000011  B91B00            mov cx,0x1b
00000014  F3A4              rep movsb         ; copy the function code.
00000016  5B                pop bx            ; bx = start of copy destination
00000017  894701            mov [bx+0x1],ax   ; update total in the copied code
0000001A  C3                ret               ; with bx = function pointer

এটিকে শূন্য-অ্যাক্সের সাথে কল করার পরে bx = spএবং বাফারটি মেশিন কোডের একটি পরিবর্তিত অনুলিপি থেকে ভরে গেছে function। প্রথম নির্দেশে তাত্ক্ষণিকভাবে 16-বিট মোটটি ধারণ করে। (এটি পূর্বের নির্দেশের আগে লেখা হয়েছিল ret))

push di/ এর pop bxসাথে mov bx, di(আগে rep movsb) প্রতিস্থাপন করা যেতে পারে , এটি সহজ করে তবে কোনও সঞ্চয় নেই।

আহ্বানকারী প্রয়োজন মধ্যে DST বাফার একটি পয়েন্টার পাস diএটি আপেক্ষিক গণক বনাম 4 বাইট বাঁচাতে হবে sp

ফাংশন শুরুর ঠিকানাটি ফাংশন আকারের সমান করা বাইট ( mov cx, si) বাঁচাতে পারে ।


আপনি যদি মেশিন-কোড বাইটগুলি ছিন্ন করার অন্তর্ভুক্ত করেন তবে এটি আরও ভাল উত্তর হবে। মেশিন কোডের উত্তরগুলির অবশ্যই একটি অদ্বিতীয় সংস্করণ দরকার। উদাহরণস্বরূপ ব্যবহার objdump -b binaryকরুনhexdump -C
পিটার কর্ডেস

মন্তব্য বিযুক্তির সাথে আপডেট হয়েছে। সম্ভাব্য সঞ্চয়: কলারটির জন্য ডিস্ট পয়েন্টার di(4 বাইট) পাস করতে হবে । ফাংশন শুরু করার ঠিকানা = আকার তৈরি করুন: mov cx, siপরিবর্তে mov cx, 0x1b
পিটার কর্ডেস

2

সি #, 62 বাইট

dynamic f(int n)=>(System.Func<int,dynamic>)(m=>m<0?n:f(n+m));

Passণাত্মক সংখ্যাতে কল পাস শেষ করতে যেমন

f(1)(2)(3)(-1) == 6

আমি এটিকে কাজ করতে চাই nullবা কোনও পরামিতি শেষ না করেই কাজ করতে চাই । তবে, আমি যেভাবে চেষ্টা করেছি
সেগুলি

আপনি !mপরিবর্তে m<0এবং পাস nullবা 0শেষ পরামিতি হিসাবে ব্যবহার করতে পারেন ?
betseg

সি # তে বিটসগ নং-তে কেবল একটি Booleanহিসাবে ব্যবহার করা যেতে পারে Boolean... আমি চেষ্টা করেছি nullতবে এটি আরও দীর্ঘ হয়েছে। আমি ??যার অর্থটি ব্যবহার করতে চেয়েছিলাম যদি এলএইচএস নাল হয় তবে আরএইচএস করতে পারেন, তবে আমার যেমন প্রয়োজন যদি এলএইচএস নাল না হয় তবে এই আরএইচএস করুন আমি পারিনি।
TheLethalCoder

2

স্কালা, 58 টি অক্ষর

case class f(n:Int){def apply(m:Int)=f(n+m)
def apply()=n}

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

Ungolfed:

case class f(n:Int){
  def apply(m:Int)=f(n+m)
  def apply()=n
}

ব্যাখ্যা:

এই কোডটি case classএকটি কনট্রাক্টর দ্বারা একটি ইনট নেওয়ার সাথে একটি কল করা f নির্ধারণ করে । কেস শ্রেণি নির্ধারণ করুন যা newকিওয়ার্ড ছাড়াই অবজেক্ট তৈরি করতে সক্ষম করার জন্য সমান, হ্যাশকোড, টোস্ট্রিং এবং অনুলিপি পদ্ধতি এবং একই নাম সহ কোনও সহযোগী অবজেক্ট তৈরি করবে ।

এই শ্রেণীর একটি ওভারলোডেড প্রয়োগ পদ্ধতি রয়েছে: এক যোগ করতে আরেকটি পূর্ণসংখ্যা নিয়ে যায় এবং আপডেট হওয়া যোগ দিয়ে একটি নতুন অবজেক্ট তৈরি করে, এবং যোগফল ছাড়াই একটি যোগফল পাওয়ার জন্য without

স্কালায়, প্রয়োগ পদ্ধতিযুক্ত যে কোনও অবজেক্টকে একটি পদ্ধতির মতো বলা যেতে পারে, এটি o.apply(x)হিসাবে লেখা যেতে পারে o(x)। এটি অ্যারে, তালিকা, মানচিত্র এবং বেনাম Function1ফাংশন দ্বারা প্রয়োগ করা বৈশিষ্ট্যের জন্য স্ট্যান্ডার্ড লিবারিতে ব্যবহৃত হয়



2

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

sub f{my$n=pop;sub{@_?f($n+pop):$n}}

say f(1)->(); # 1
say f(1)->(2)->(3)->(); # 6

এর কী দরকার -M5.016? দেখে মনে হচ্ছে আপনার -M5.016কয়েকটি ড্রপ করতে হবে এবং তারপরে myএকটি কয়েকটি বাইট ফেলে এবং সংরক্ষণ করতে হবে। যদি এটি ঠিক হয় তবে sayআপনি এর -Eপরিবর্তে পতাকাটি ব্যবহার করতে পারেন যা সক্রিয় হয় না use strict, তাই আপনি এখনও ড্রপ করতে পারেন my
ক্রিস

@ ক্রিস আপনি ঠিক বলেছেন, এটির 5.16 দরকার নেই, আমার প্রাথমিক পুনর্বিবেচনাটি (ব্যবহার করে __SUB__) করেছে তবে আমি জমা দেওয়ার আগে এটি পরিবর্তন করেছি এবং 5.16 এর বিটটি সরিয়ে নেই। আমি তা সরিয়ে দেব। আমি মনে করি না myযদিও ড্রপিং সঠিক হবে।
hobbs

(এবং না, আমি sayকোডের অংশ হিসাবে গণনা করছি না , এটি কেবল
চিত্রণমূলক

1
আপনি মুছে ফেলেন myছাড়া use strict, $nপরোক্ষভাবে একটি বিশ্বব্যাপী পরিবর্তনশীল। এটি সঠিক পার্ল স্ক্রিপ্টগুলিতে খারাপ ফর্ম, তবে এটি ওয়ান-লাইনারে খুব সাধারণ এবং এটি এখানে কাজ করে বলে মনে হচ্ছে।
ক্রিস

2

মস্তিষ্ক-ফ্লাক , 6 বাইট

প্রকৃতপক্ষে আমি কেবল লক্ষ্য করেছি যে যেহেতু টোস 0 টি পপিংয়ের জন্য একটি বৈধ রিটার্ন ফর্ম্যাট তাই 2 বাইট সংরক্ষণ করে যা সত্যই প্রয়োজন হয় না:

({{}})

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

আসল জমা (গুলি), 8 বাইট

0বিশেষ মান হিসাবে ব্যবহার করে :

({{}}{})

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

ব্যাখ্যা

একটি আর্গুমেন্ট 1 , একটি 2 ,…, একটি এন , 0 দেওয়া প্রথমদিকে স্ট্যাকটি দেখতে এরকম দেখাচ্ছে:

                                                       একটি এন

                                                       

                                                       a 2

                                                       a 1

                                                       0

কোড তারপর যায় উপর, যে পপ একটি আমি তাদের accumulates, পপ 0 তাদের যোগ করা হয়েছে এবং ফলাফলের পাহাড় জমে:

(      )  -- push the following value:
 {  }     --   while ToS ≠ 0 (sums the runs):
  {}      --     pop 1 element
     {}   --   pop the remaining 0 & add it

বিকল্প সমাধান, 8 বাইট

0 টি পপিং এবং এটি যোগফলকে যুক্ত করার পরিবর্তে, ডানটি প্রাথমিকভাবে খালি থাকায় আমরা স্ট্যাকগুলিও অদলবদল করতে পারি:

({{}}<>)

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

ব্যবহার -rপতাকা 0 স্ট্যাকের উপরে হয়, তাই আমরা এটি প্রথম পপ পারে:

({}{{}})

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

{}({{}})

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


ওহ আমার সদাপ্রভু ... দুর্দান্ত এক!
ইউজিন ডি গুবেঙ্কভ

2

সি (জিসিসি), 83 বাইট

আমার প্রথম সি গল্ফ! অন্যান্য কয়েকটি সি সমাধান রয়েছে, তবে এটির থেকে কিছুটা আলাদা। প্রাক প্রসেসরের ব্যবহার নিখুঁতভাবে প্রসাধনী। এই পন্থাটি এখানে কনর ও ব্রায়ানের উত্তরে প্রথমে আলোচনা করা হয়েছিল ।

#define r union r
t=0;r{int v;r(*f)();};r e;r f(a){t+=a;e.v=a?f:t;t*=a>0;return e;}

টার্মিনাল মান শূন্য। রিটার্ন মান হ'ল একটি ইউনিয়ন, সুতরাং ফলাফলটি কল করতে, ক্ষেত্রটি ব্যবহার করুন fএবং চূড়ান্ত মানটি অ্যাক্সেস করতে ক্ষেত্রটি ব্যবহার করুন v, যেমন

f(1).f(2).f(3).f(0).v

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

সীমাবদ্ধতা

একটি বৈশ্বিক চলক চলমান মোট ধরে রাখে। যদিও এটি সুস্পষ্টভাবে অনুমোদিত নয়, জমাটি বারবার অনুরোধকে সমর্থন করে (মোট টার্মিনাল কলটিতে পুনরায় সেট করা হয়), এটি বিশ্বব্যাপী রাষ্ট্র নিষেধাজ্ঞার কারণ বলে মনে হয়।

একটি পয়েন্টার সদস্যের fমাধ্যমে ফেরত ইউনিয়নে সংরক্ষণ করা হয় int, সুতরাং এটি স্পষ্টভাবে পোর্টেবল নয়। আমি নিশ্চিত নই যে এটি সমস্ত প্ল্যাটফর্মগুলিতে বা কেবল লিনাক্সে বা কেবল x86 বা কেবল ইএলএফ এর সাথে কাজ করে বা ... যদি কেউ এই সম্পর্কে কোনও বিবরণ জানেন তবে দয়া করে মন্তব্য করুন বা একটি বার্তা প্রেরণ করুন!


2

এপিএল (ডায়ালগ ক্লাসিক) , 48 47 46 44 32 বাইট

r←(a f)x
r←⍎'(a+x)f'↓⍨-0=x

0f

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

শূন্যে পাস করে শেষ হয়। সিনট্যাক্স কল করুন:((0 f 1) 2) 0

-15 বাইটস @ জিএনএনকে ধন্যবাদ

প্রয়োজন ⎕IO←0

কোনও গল্ফিং টিপস স্বাগত!


আপনি যদি 0 টি টার্মিনেটর মান হিসাবে ব্যবহার করতে পারেন তবে "যদি" এবং "অন্য" ধারাগুলি পরিবর্তন :If x<0করতে :If×xএবং অদলবদল করতে পারেন
ngn

Derp। আমি দেখতে পেলাম না যে এটি "অ-ইতিবাচক"
বলেছে

আপনি কি এই কৌশল জানেন? r←⍎condition⊃'else' 'then'
এনজিএন




1

ডাইভিল , 34 বাইট

infix int apply(i:int,j:int=0)=i+j

ব্যবহার :

0() // = 0
0(1)() // = 1
0(1)(2)() // = 3

পেছনটি ()বাদ দেওয়া যেতে পারে।

ব্যাখ্যা :

একটি জুস্টেপেজ অবস্থান অপারেটর সংজ্ঞায়িত করে যা দুটি ইনট নেয় এবং সেগুলি যুক্ত করে। আর্গুমেন্ট ছাড়াই কলটিকে সমর্থন করার জন্য প্যারামিটারটির jডিফল্ট মান 0থাকে। 0উদাহরণ উপরে নাম, কিন্তু একটি আক্ষরিক নয়।


1

জুলিয়া v0.5 +, 52 বাইট

type F n end
F()=0
(f::F)()=f.n
(f::F)(x)=(f.n+=x;f)

যেমন কল F। কম ওও পদ্ধতি অবলম্বন করে এটি সম্ভবত আরও খাটো করা যেতে পারে তবে আমি সর্বদা এই প্রতিমাটি ব্যবহারের সুযোগটি পেতে চাই।

যদি এটি ধরে নেওয়া যায় যে "টার্মিনেশন কলের আগে কমপক্ষে একটি কল করা হবে", তবে দ্বিতীয় লাইনটি 6 বাইট সংরক্ষণ করার জন্য সরানো যেতে পারে।



1

আর, 40 বাইট

f=function(x)function(y)`if`(y,f(x+y),x)

0 এখানে স্টপ মান হিসাবে কাজ করে। আরও দুটি বাইটের জন্য, আমরা এটি বাদ দিতে পারি।

সমস্যাটি হ'ল আর এর মধ্যে সংক্ষিপ্ত অন্তর্নির্মিত ল্যাম্বডার অভাব রয়েছে। তবে আমরা যদি একটি যোগ করি , আমরা 26 বাইটে কোডটি পেতে পারি :

f=x->(y->`if`(y,f(x+y),x))

(হ্যাঁ, এটি বৈধ আর। এটির জন্য কেবল একটি আমদানি দরকার))


1

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

@ ব্যবহারকারী 63956 থেকে একটি আইডিয়া

সমাপ্তি কল 0

function f($i){return[$_GET[0]+=$i][$i]?:f;}

অনলাইন সংস্করণ

NULLসমাপ্তির কল সহ একটি সিস্ট [$i]প্রয়োজন[+$i]

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

function f($i){global$s;return$i?f.!$s+=$i:$s;}

অনলাইন সংস্করণ

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

টার্মিনেশন কল NULLবা অন্য কোনও মান যা পিএইচপি-তে মিথ্যা

function f($i){global$s;$i?$s+=$i:print$s;return f;}

যদি প্রোগ্রাম আউটপুট পর বিনষ্ট আবশ্যক প্রতিস্থাপন print$sসঙ্গে die("$s")+2 বাইট

অনলাইন সংস্করণ


1
আমি মনে করি ফাংশনটি ফিরে আসবে (মুদ্রণ নয়) $s। যাতে আপনি return$i?f:$sশেষে যেমন কিছু করতে পারেন
কনর

@ কনরও ব্রায়ান আমি নিশ্চিত নই তবে আপনার চিন্তাভাবনা ঠিক থাকলে এটি 5 বাইট বাঁচাতে পারে আপনাকে ধন্যবাদ
জার্গ হ্যালসারম্যান

1
কয়েক বাইট superglobal হয় ভেরিয়েবল দিয়ে সংরক্ষিত করা যেতে পারে: function f($i){return[$_GET[0]+=$i][$i]?:f;}
ব্যবহারকারী 63956

@ ব্যবহারকারী 63956 একটি খুব সুন্দর ধারণা
জার্গ হালসারম্যান

1

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

$f={$n=$args[0];$f=(gv f).value;{if($args){&$f($args[0]+$n)}else{$n}}.getnewclosure()}

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

পরীক্ষার কোড:

&(&(&(&(&(&$f 4)2)7)5)2)

আউটপুট: 20


খুব সুন্দর. পিপিসিজিতে আপনাকে স্বাগতম! $n="$args"পরিবর্তে না করে আপনি একটি বাইট সংরক্ষণ করতে পারেন $n=$args[0]। এটি অন্যটিতে কাজ করবে না $args[0], যদিও, তারপরে আপনি সংযোজনের পরিবর্তে স্ট্রিং সংমিশ্রণ পাবেন।
অ্যাডমবার্কবার্ক


1

পাইথন, 69 বাইট

def f(a=0,s=[]):
    if a:
        return lambda b=0:f(b,s+[a])
    return sum(s)

1
আমি ধরে নিচ্ছি এটি কি অজগর? আপনার উত্তরে ব্যবহৃত ভাষাটি আপনার উচিত।
corvus_192

আপনি কি আরও উত্তর গল্ফ চেষ্টা করতে পারেন? এটি যেমন দাঁড়িয়ে আছে, এটি খুব ভাল গল্ফ হয় না।
Rɪᴋᴇʀ


1

আর, 54 52 বাইট

f=function(x){g=function(y='')'if'(y>'',f(x+y),x);g}

2 বাইট সংরক্ষণ করেছেন মিকিটিকে ধন্যবাদ!

পাইথন উত্তরের একটির মতো। Ungolfed:

f=function(x){
  g=function(y=''){
    if(y>''){
      f(y+x)
      }
      else{x}
  }
  g
}

হিসাবে চালায়

> f(1)(2)(4)()
[1] 7

1
চমৎকার কাজ. আপনি যদি ক্লজটির চারপাশে অভ্যন্তরীণ বন্ধনীগুলি পরিত্রাণ পেতে পারেন। f=function(x){g=function(y='')'if'(y>'',f(x+y),x);g}
মিকিটি

আমি আপনার "উজ্জীবিত" সংস্করণটি কেন বিস্মিত হয়েছি returnreturnআর এ অন্য ভাষার মতো একই নয়, এটি অকাল প্রবণতা সম্পাদন করে। ব্যবহার না returnকরা অজ্ঞানী। অন্যদিকে আপনার অরগোল্ফড সংস্করণটিতে এখনও গল্ফ রয়েছে if
কনরাড রুডল্ফ

@ কনরাড রুডল্ফ গল্ফটি ifঅলসতা ছিল, তবে এটি returnকেবল পাঠযোগ্যতার জন্য - এটি একই সাথে ফলাফল দেয় বা না করে দেয় return
বিএলটি

@ বিএলটি এইচএম আমি দৃ strongly়রূপে অনুভব করি যে আর-এ return গ্র্যাচুয়াস পাঠযোগ্যতা হ্রাস করে কারণ এটি ভুল জিনিস (অকাল প্রস্থান) এবং এটি কার্গো কাল্ট প্রোগ্রামিংয়ের একটি উদাহরণ ।
কনরাড রুডল্ফ

শান্ত, আমি আবার নতুন কিছু শিখেছি। আমি ফিরে আসা চালিয়ে যাওয়ার এক কারণ। ধন্যবাদ @ কনরাড রুডল্ফ, এছাড়াও এই স্ট্যাক ওভারফ্লো প্রশ্ন আকর্ষণীয়: stackoverflow.com/questions/11738823/…
বিএলটি

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