ফ্যাট-অ্যার ফাংশনগুলি ছোট করার কোনও উপায় আছে কি?


15

আমি এখানে আমার সময়জুড়ে পিপিসিজিতে যা দেখেছি, সেখান থেকে বেশিরভাগ জাভাস্ক্রিপ্ট এন্ট্রি ফ্যাটযুক্ত তীর ফাংশনগুলির সাথে জড়িত দুটি শিবিরের একটি হতে থাকে:

  1. সাধারণ যেগুলি একক বিবৃতি হিসাবে দৌড়াতে এবং উত্তর ফেরত দিতে সক্ষম, সরাসরি ব্যাট থেকে সরানো পছন্দ করে x=(a,b)=>a*a+b

  2. লুপ ব্যবহারের কারণে সাধারণত আরও জটিল যেগুলি কোঁকড়ানো ধনুর্বন্ধনী হয় এবং ফলস্বরূপ একটি returnবিবৃতি ব্যবহার করা প্রয়োজন .. লাইকp=b=>{m=b;for(a=1;~-m;)--m,a*=m*m;return a%b}

প্রবন্ধের ধারণা হিসাবে কোঁকড়ানো ধনুর্বন্ধনী ধারণার সাথে বিভাগ 2 থেকে উপরোক্ত উদাহরণটি গ্রহণ করা ... কোঁকড়া ধনুর্বন্ধনী বন্ধনের পাশাপাশি এই কোডটিকে (বা অনুরূপ) পুনরায় গল্ফ করার কোনও উপায় থাকবে কি return? আমি কেবল এটিই জিজ্ঞাসা করছি কারণ এটি সম্ভাব্যভাবে হতে পারে (এটি সবসময় ঘটবে বলে না) একটি জেএস গল্ফারের কোড থেকে 8 বাইট মুছে ফেলবে। এই পদ্ধতিতে যে কোনও কৌশল ব্যবহার করা যেতে পারে? আমি পুনরাবৃত্তি চেষ্টা করেছি, কিন্তু m=bবিবৃতিটি কিছুটা বাগবার হিসাবে প্রমাণিত হয়েছে, যেহেতু আমি এটিকে নাড়াচ্ছি বলে মনে হচ্ছে না।

উপরের returnকোডটির জন্য, কোনও গল্ফ কীভাবে আরও বিবৃতি নির্মূল করতে পারে , তা গল্ফটি সংক্ষিপ্ত বা না হয় নির্বিশেষে কীভাবে হবে?

উত্তর:


18

পুনরাবৃত্তি ব্যবহার করুন

আমি খুঁজে পেয়েছি যে পুনরাবৃত্তি (প্রায়) সর্বদা eval+ এর চেয়ে কম থাকে for। থেকে রূপান্তর করার সাধারণ উপায়টি হ'ল:

for(a=n;b;c);d
(f=a=>b?f(c):d)(n)

সুতরাং আসুন আপনার উদাহরণটি দেখুন:

b=>{m=b;for(a=1;~-m;)--m,a*=m*m;return a%b}

আমরা প্রথমে এটি সহজ করতে পারি:

for(m=b,a=1;~-m;--m,a*=m*m)a%b;

আমরা এখানে কি করেছি? ঠিক আছে আমরা forবিবৃতিতে সমস্ত কিছু কেবল স্থানান্তরিত করেছি , এটি আমাদের সেমিকোলনের পরিমাণ হ্রাস করতে সহায়তা করে যা সরাসরি ভাল না তবে প্রায় সর্বদা কিছু গল্ফের দিকে পরিচালিত করে।


আসুন এটি এওল এ রাখুন এবং এটি পুনরাবৃত্তির সংস্করণটির সাথে তুলনা করুন:

b=>{m=b;for(a=1;~-m;)--m,a*=m*m;return a%b}
b=>eval('for(m=b,a=1;~-m;--m,a*=m*m)a%b')
b=>(f=a=>~-m?(--m,f(a*=m*m)):a%b)(1,m=b)

লুপের জন্য প্রথম অংশ ( a=n), আমরা সেই পরিবর্তনগুলি আর্গুমেন্ট হিসাবে পাস করে এটি শুরু করতে পারি। শর্তটি সহজ: ফেরতের মানটি b?(c,f(a)):dকোথায় d। সাধারণত cএটি পরিবর্তন করে aতাই এটি এতে একীভূত হতে পারে। সুতরাং আমি যা উল্লেখ করেছি তা ব্যবহার করে আমরা আরও গল্ফ করতে পারি:

b=>(f=a=>~-m?(--m,f(a*=m*m)):a%b)(1,m=b)
b=>(f=a=>~-m?f(a*=--m*m):a%b)(1,m=b) // --m moved into a*=
b=>(f=a=>--m?f(a*=m*m):a%b)(1,m=b) // --m moved to condition

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


1
আপনি আসল কোডটি সরল করে একটি বড় সঞ্চয় মিস করেছেন। ~-mহ'ল m-1, তাই লুপটি হতে পারে for(m=b,a=1;--m;a*=m*m)a%b;এবং পুনরাবৃত্ত সংস্করণ হতে পারে (অচিহ্নিত)b=>(f=a=>--m?f(a*=m*m):a%b)(1,m=b)
পিটার টেলর

1
কখনও কখনও আপনাকে কেবল আলাদা অ্যালগরিদম ব্যবহার করতে হয় তবে এই ক্ষেত্রে আমি সবচেয়ে ভাল যা করতে পারতাম @ পিটারটেলারের উত্তরের সমান দৈর্ঘ্য ছিল:b=>b>1&(f=a=>--a<2||b%a&&f(a))(b)
নীল

11

অপব্যবহার eval।

ইহা সহজ. পরিবর্তে:

f=n=>{for(i=c=0;i<n;i++)c+=n;return c}

ব্যবহার

f=n=>eval("for(i=c=0;i<n;i++)c+=n;c")

ইভাল সর্বশেষ মূল্যায়িত বিবৃতি প্রদান করে। এক্ষেত্রে, সর্বশেষ মূল্যায়িত বিবৃতিটি যেহেতু হবে c+=n, তাই আমরা cকোনওভাবেই দুটি বাক্স বাঁচিয়ে রেখে যাব ।

f=n=>eval("for(i=c=0;i<n;i++)c+=n")

সাধারণভাবে:

f=n=>eval("code;x")

এটির চেয়ে ছোট, বাইট দ্বারা:

f=n=>{code;return x}

একটি দ্রষ্টব্য হিসাবে, সম্ভবত বাইটগুলি সংরক্ষণ করতে কল কল করতে কবর ব্যবহার করা কার্যকর হয় না, যেহেতু:

eval`string`

সমতুল্য

["string"]

অবসন্নতার জন্য সহায়ক! কোড গল্ফের জন্য এতটা নয়।


2
foo`string`সর্বদা সমতুল্য foo(["string"]), এটি ঠিক যে অনেকগুলি ফাংশন তারপরে অ্যারেটিকে পছন্দসই স্ট্রিংয়ে ফেলে দেয়।
নীল

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