কারখানাটি অনুসন্ধান করুন!


74

সংক্ষিপ্ততম প্রোগ্রাম বা ফাংশন তৈরি করুন যা অ-নেতিবাচক পূর্ণসংখ্যার ফ্যাক্টরিয়ালটি আবিষ্কার করে ।

কল্পিত, প্রতিনিধিত্ব করে !যেমন হিসাবে সংজ্ঞায়িত করা হয়

এন!: ={1এন=0এন(এন-1)!এন>0

সরল ইংরেজিতে 0 এর ফ্যাক্টরিয়াল 1 এবং n এর ফ্যাক্টরিয়াল, যেখানে n 0 এর চেয়ে বড় হয় n এর চেয়ে কম এর ফ্যাক্টরিয়াল এর চেয়ে বহুগুণ বেশি।

আপনার কোডটির একটি মানক পদ্ধতি ব্যবহার করে ইনপুট এবং আউটপুট সঞ্চালন করা উচিত।

প্রয়োজনীয়তা:

  • কোনও অন্তর্নির্মিত লাইব্রেরি ব্যবহার করবেন না যা ফ্যাক্টরিয়াল গণনা করতে পারে (এতে কোনও রূপ অন্তর্ভুক্ত রয়েছে eval)
  • 125 পর্যন্ত সংখ্যার জন্য ফ্যাকটোরিয়াল গণনা করতে পারে
  • সংখ্যার জন্য ফ্যাক্টরিয়াল গণনা করতে পারে (সমান 1)
  • 125 পর্যন্ত সংখ্যার জন্য এক মিনিটের মধ্যে সম্পূর্ণ হয়

সংক্ষিপ্ততম জমাটি জয়লাভ করে, টাইয়ের ক্ষেত্রে সবচেয়ে বেশি ভোটের সাথে উত্তর জয়ের সময় জয় হয়।


10
প্রদত্ত উত্তরগুলির মধ্যে কতটি আসলে 125 টি পর্যন্ত গণনা করতে পারে! পূর্ণসংখ্যা ওভারফ্লো ছাড়া? এটি প্রয়োজনীয়তার মধ্যে একটি ছিল না? ক্ষতিকারক আনুমানিক হিসাবে ফলাফল গ্রহণযোগ্য (যেমন 125! = 1.88267718 × 10 ^ 209)?
অমি

6
@ শিঙ্কিরুও, এমনকি গল্ফস্ক্রিপ্টও 125 পরিচালনা করতে পারে! এক সেকেন্ডের 1/10 তম এর চেয়ে কম এবং এটি এবং ব্যাখ্যা করা ভাষার ব্যাখ্যা!
gnibbler

5
অন্যান্য প্রশ্নের দ্বি-চরিত্রের সমাধানটি ইউগোরেন একটি অন্তর্নির্মিত ফ্যাক্টরিয়াল ফাংশন ব্যবহার করে। চ্যালেঞ্জের এই সংস্করণে এটি অনুমোদিত নয়।
মাইকেল স্টারন

4
এক মিনিটের মধ্যে সম্পন্ন করা খুব হার্ডওয়ার-নির্ভর প্রয়োজন বলে মনে হয়। কোন হার্ডওয়্যার এক মিনিটের মধ্যে সম্পন্ন ?
সার্জিওল

4
@ সার্জিওল অবিশ্বাস্যভাবে গত 2 বছরে এটি কোনও সমস্যা হয়নি, আমি সন্দেহ করি বেশিরভাগ ভাষাগুলি এক মিনিটের মধ্যে এটি সম্পন্ন করতে পারে।
কেভিন ব্রাউন

উত্তর:


66

গল্ফস্ক্রিপ্ট - 12 টি অক্ষর

{,1\{)*}/}:f

গল্ফস্ক্রিপ্ট দিয়ে শুরু করা - ধাপে ধাপে কারখানা

গল্ফস্ক্রিপ্ট শেখার চেষ্টা করা লোকদের জন্য এখানে কিছু। পূর্বশর্ত হ'ল গল্ফস্ক্রিপ্টের প্রাথমিক ধারণা এবং গল্ফস্ক্রিপ্ট ডকুমেন্টেশন পড়ার ক্ষমতা।

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

# pseudocode: f(n){c=1;while(n>1){c*=n;n--};return c}
{:n;1:c;{n 1>}{n c*:c;n 1-:n;}while c}:f

গলফস্ক্রিপ্টে হোয়াইটস্পেস খুব কমই ব্যবহৃত হয়। সাদা স্থান থেকে মুক্তি পাওয়ার সহজ কৌশলটি বিভিন্ন ভেরিয়েবলের নাম ব্যবহার করা। প্রতিটি টোকেন একটি পরিবর্তনশীল হিসাবে ব্যবহার করতে পারেন ( সিনট্যাক্স পৃষ্ঠাটি দেখুন)। দরকারী টোকেন হিসাবে ভেরিয়েবল মত বিশেষ অক্ষর ব্যবহার করতে |, &, ?সাধারণত কোনো কিছু কোডে অন্যত্র ব্যবহৃত -। এগুলি সর্বদা একক অক্ষর টোকেন হিসাবে পার্স করা হয়। বিপরীতে, ভেরিয়েবলগুলি পছন্দ করেn স্ট্যাকের পরে কোনও সংখ্যা ঠেলে দেওয়ার জন্য একটি স্থানের প্রয়োজন হবে। নম্বরগুলি মূলত পূর্বনির্ধারিত পরিবর্তনশীল।

সর্বদা হিসাবে, এমন বক্তব্য থাকবে যা আমরা শেষ ফলাফলকে প্রভাবিত না করেই পরিবর্তন করতে পারি। Golfscript, সবকিছু ব্যতীত সত্য মূল্যায়ণ 0, [], "", এবং {}(দেখুন এই )। এখানে আমরা লুপের প্রস্থান শর্তটিকে সহজভাবে পরিবর্তন করতে পারি{n} (আমরা অতিরিক্ত সময় লুপ করব, এবং এন = 0 হলে শেষ করব)।

যে কোনও ভাষা গল্ফ করার মতো, এটি উপলব্ধ ফাংশনগুলি জানতে সহায়তা করে। ভাগ্যক্রমে তালিকাটি গল্ফস্ক্রিপ্টের জন্য খুব ছোট। আমরা অন্য একটি চরিত্র সংরক্ষণ করতে পরিবর্তন 1-করতে পারি (। বর্তমানে কোডটি এর মতো দেখাচ্ছে: (আমরা চাইলে আমরা এখানে 1পরিবর্তে ব্যবহার করতে পারতাম |, যা সূচনাটি নামিয়ে দেয়))

{:n;1:|;{n}{n|*:|;n(:n;}while|}:f

সংক্ষিপ্ততম সমাধানগুলি পাওয়ার জন্য স্ট্যাকটি ভালভাবে ব্যবহার করা গুরুত্বপূর্ণ (অনুশীলন অনুশীলন অনুশীলন)। সাধারণত, মানগুলি যদি কেবলমাত্র কোডের একটি ক্ষুদ্র অংশে ব্যবহৃত হয় তবে এগুলি ভেরিয়েবলগুলিতে সংরক্ষণ করার প্রয়োজন হবে না। চলমান পণ্য পরিবর্তনশীল অপসারণ করে এবং কেবল স্ট্যাক ব্যবহার করে, আমরা বেশ কয়েকটি অক্ষর সংরক্ষণ করতে পারি।

{:n;1{n}{n*n(:n;}while}:f

এখানে ভেবে দেখার মতো আরও কিছু। আমরা nলুপের বডির শেষে স্ট্যাক থেকে ভেরিয়েবলটি সরিয়ে দিচ্ছি , কিন্তু তারপরে এটির পরে তা চাপছি। আসলে, লুপটি শুরু হওয়ার আগে আমরা এটিকে স্ট্যাক থেকেও সরিয়ে ফেলি। পরিবর্তে আমাদের এটি স্ট্যাকের উপর ছেড়ে দেওয়া উচিত এবং আমরা লুপের শর্তটি ফাঁকা রাখতে পারি।

{1\:n{}{n*n(:n}while}:f

হতে পারে আমরা এমনকি সম্পূর্ণরূপে চলক অপসারণ করতে পারেন। এটি করার জন্য, আমাদের সর্বদা স্ট্যাকের মধ্যে পরিবর্তনশীল রাখতে হবে। এর অর্থ হ'ল কন্ডিশন চেক শেষে স্ট্যাকের উপরে আমাদের ভেরিয়েবলের দুটি কপি প্রয়োজন, যাতে চেকের পরে আমরা এটি হারাতে পারি না। যার অর্থ হ'ল আমাদের অতিরিক্ত কাজ হবে0 লুপ শেষ হওয়ার পরে আমাদের স্ট্যাকের মধ্যে হবে তবে এটি ঠিক করা সহজ।

এটি আমাদের সর্বোত্তম whileলুপ সমাধানের দিকে নিয়ে যায় !

{1\{.}{.@*\(}while;}:f

এখন আমরা এটি আরও খাটো করতে চাই। স্পষ্ট লক্ষ্য শব্দ হতে হবে while। ডকুমেন্টেশনের দিকে তাকানো, দুটি কার্যকর বিকল্প রয়েছে - উদ্ঘাটন এবং কর । যখন আপনার কাছে নিতে বিভিন্ন রুটের পছন্দ আছে, চেষ্টা করুন এবং উভয়ের সুবিধাগুলি বিবেচনা করুন। আনফোল্ডটি 'বেশ কিছুক্ষণ লুপ', সুতরাং অনুমান হিসাবে আমরা 5 টি চরিত্রকে while4 দ্বারা কেটে ফেলব /। হিসাবে do, আমরা while3 টি অক্ষর কেটেছি এবং দুটি ব্লক একত্রিত করতে পারি, যা অন্য একটি অক্ষর বা দুটি সংরক্ষণ করতে পারে।

doলুপটি ব্যবহারে আসলে একটি বড় ত্রুটি রয়েছে । যেহেতু একবার শরীরে একবার মৃত্যুদন্ড কার্যকর করার পরে শর্ত পরীক্ষা করা হয়, এর মানটি 0ভুল হবে, সুতরাং আমাদের যদি একটি বিবৃতি প্রয়োজন হতে পারে। আমি আপনাকে এখনই বলব যে উদ্ঘাটনটি ছোট is (এর সাথে কিছু সমাধানের doশেষে দেওয়া আছে)। এগিয়ে যান এবং এটি চেষ্টা করুন, আমাদের ইতিমধ্যে কোডটি ন্যূনতম পরিবর্তন প্রয়োজন।

{1\{}{.@*\(}/;}:f

গ্রেট! আমাদের সমাধানটি এখন সুপার-শর্ট এবং আমরা এখানে ঠিক করেছি, তাই না? নাঃ। এটি 17 টি অক্ষর এবং জে 12 টি অক্ষর রয়েছে। কখনও পরাজয় স্বীকার করবেন না!


এখন আপনি ... পুনরাবৃত্তি নিয়ে ভাবছেন

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

# pseudocode: f(n){return n==0?n*f(n-1):1}
{:n{n.(f*}1if}:f # taking advantage of the tokeniser

আচ্ছা এটি সহজ ছিল - আমরা যদি পূর্বে পুনরাবৃত্তি করার চেষ্টা করে থাকি তবে আমরা হয়ত কোনও whileলুপ ব্যবহার না করেও তাকিয়ে থাকতে পারি ! তবুও, আমরা কেবল 16 টি অক্ষরে আছি।


অ্যারেগুলির

অ্যারেগুলি সাধারণত দুটি উপায়ে তৈরি করা হয় - [এবং ]অক্ষরগুলি ব্যবহার করে বা ,ফাংশন দিয়ে। যদি স্ট্যাকের শীর্ষে কোনও পূর্ণসংখ্যার সাথে মৃত্যুদন্ড কার্যকর করা হয় তবে আর্টের সাহায্যে ,সেই দৈর্ঘ্যের একটি অ্যারের [i] = i প্রদান করে।

অ্যারেগুলিকে পুনরাবৃত্তি করার জন্য, আমাদের কাছে তিনটি বিকল্প রয়েছে:

  1. {block}/: ঠেলা, ব্লক, পুশ, ব্লক, ...
  2. {block}%: [পুশ, ব্লক, পুশ, ব্লক, ...] (এটির কিছু ঘনত্ব রয়েছে, যেমন প্রতিটি ধাক্কার আগে স্ট্যাক থেকে মধ্যবর্তী মানগুলি সরানো হয়)
  3. {block}*: ধাক্কা, ধাক্কা, ব্লক, ধাক্কা, ব্লক, ...

গল্ফস্ক্রিপ্ট ডকুমেন্টেশনের {+}*একটি অ্যারের সামগ্রীর যোগফল ব্যবহার করার উদাহরণ রয়েছে । এটি পরামর্শ দেয় আমরা {*}*কোনও অ্যারের পণ্য পেতে ব্যবহার করতে পারি।

{,{*}*}:f

দুর্ভাগ্যক্রমে, এটি বেশ সহজ নয়। সমস্ত উপাদান এক ( [0 1 2]পরিবর্তে [1 2 3]) দ্বারা বন্ধ রয়েছে । আমরা {)}%এই সমস্যাটি সংশোধন করতে ব্যবহার করতে পারি ।

{,{)}%{*}*}:f

বেশ ভাল না। এটি শূন্যটি সঠিকভাবে পরিচালনা করে না। এটি পুনরুদ্ধার করতে আমরা (n + 1)! / (N + 1) গণনা করতে পারি, যদিও এটির জন্য খুব বেশি খরচ হয়।

{).,{)}%{*}*\/}:f

আমরা একই বালতিতে এন = 1 হ্যান্ডেল করার চেষ্টা করতে পারি। এটি করার পক্ষে এটি খুব সংক্ষিপ্ত, চেষ্টা করতে পারেন এবং আপনার পক্ষে সবচেয়ে কম কাজ করতে পারেন work

তাই ভাল 7 টি অক্ষর বাছাই করা হয়: [1\]$1=। নোট করুন যে এই বাছাই করার কৌশলটির দরকারী উদ্দেশ্য রয়েছে যেমন একটি সংখ্যার উপর সীমানা চাপানো (যেমন `[0 \ 100] $ 1 =)
এখানে কেবলমাত্র 3 টি অক্ষর রয়েছে: বিজয়ী এখানে রয়েছে!

যদি আমরা একই ব্লকে ইনক্রিমেন্ট এবং গুণন করতে চাই তবে অ্যারের প্রতিটি উপাদান দিয়ে পুনরাবৃত্তি করা উচিত। যেহেতু আমরা কোনও অ্যারে তৈরি করছি না, এর অর্থ আমাদের ব্যবহার করা উচিত {)*}/, যা আমাদের ফ্যাকটোরিয়ালের সংক্ষিপ্ততম গল্ফস্ক্রিপ্ট বাস্তবায়নে নিয়ে আসে! দীর্ঘ 12 টি অক্ষর, এটি জে সঙ্গে বাঁধা!

{,1\{)*}/}:f


বোনাস সমাধান

লুপের ifজন্য একটি সরল সমাধান দিয়ে শুরু do:

{.{1\{.@*\(.}do;}{)}if}:f

আমরা এটির বাইরে আরও কিছু দাগতে পারি। কিছুটা জটিল, তাই আপনাকে নিজের কাজগুলি বোঝাতে হবে ones আপনি এই সমস্ত বুঝতে পেরেছেন তা নিশ্চিত করুন।

{1\.!!{{.@*\(.}do}*+}:f
{.!{1\{.@*\(.}do}or+}:f
{.{1\{.@*\(.}do}1if+}:f

আরও ভাল বিকল্প হ'ল গণনা করা (এন + 1)! / (এন + 1), যা ifকাঠামোর প্রয়োজনীয়তা দূর করে ।

{).1\{.@*\(.}do;\/}:f

তবে এখানে সংক্ষিপ্ততম doসমাধানটি 0 থেকে 1 ম্যাপ করার জন্য কয়েকটি অক্ষর এবং সমস্ত কিছু নিজের কাছে নিয়ে যায় - সুতরাং আমাদের কোনও শাখা প্রশস্তকরণের দরকার নেই। এই ধরণের অপ্টিমাইজেশন মিস করা অত্যন্ত সহজ।

{.!+1\{.@*\(.}do;}:f

আগ্রহীদের জন্য, উপরের মত একই দৈর্ঘ্য সহ কয়েকটি বিকল্প পুনরাবৃত্ত সমাধান এখানে সরবরাহ করা হয়েছে:

{.!{.)f*0}or+}:f
{.{.)f*0}1if+}:f
{.{.(f*}{)}if}:f

* দ্রষ্টব্য: আমি এই পোস্টে কোডের অনেকগুলি টুকরোগুলি আসলেই পরীক্ষা করে দেখিনি, তাই ত্রুটি আছে কিনা তা নির্দ্বিধায় জানান।


8
মজার বিষয়, আপনি যখন কোনও স্পোলারটিতে কোড ব্যবহার করেন তখন মনে হয় স্পোলার মার্কডাউনে একটি বাগ হ'ল ... কেও মেটাতে এটি উল্লেখ করতে আগ্রহী?
আইভো ফ্লিপস

5
আমি এটি আকর্ষণীয় মনে করি যে গল্ফস্ক্রিপ্ট - একটি গল্ফিং ভাষা - বহু-বর্ণের পরিবর্তনশীল নামগুলিকে অনুমতি দেয় এবং প্রয়োজনীয় সাদা
অংশের

44

হাস্কেল, 17

f n=product[1..n]

2
আমি হাস্কেলকে চিনি না ... তবে এটি কি 0
দ্য কিং

11
@ রাজা: হ্যাঁ তা হবে। [1..0] ==> []এবংproduct [] ==> 1
জেবি

5
আমি যুক্তি দিয়ে বলব যে এটি "বিল্ট-ইন লাইব্রেরি" ব্যবহার করে যা সমস্যাটি নিষিদ্ধ করে। তবুও, অন্য পদ্ধতিটি f 0=1;f n=n*f$n-117 টি অক্ষরও।
চিরকালীন

5
@ চিরন্তন: এই বিধিনিষেধের সেই অংশটি আমার কাছে অপ্রকাশিত। productএবং উভয়ই বলুন (*)বা (-)"ফ্যাক্টরিয়াল গণনা করতে পারেন" এবং এগুলি সব প্রিলিওডের মাধ্যমে সংজ্ঞায়িত করা হয়েছে। কেন একজন শীতল হবে এবং অন্যটি নয়?
জেবি

2
@ ইয়োইওইউনই: কম (বিষয়গত) পঠনযোগ্যতার জন্য আমি 17 টি অক্ষরও গণনা করি। মন্তব্যগুলিতে আইএমএইচও এটি ঠিক আছে।
জেবি

41

পাইথন - 27

কেবল সহজভাবে:

f=lambda x:0**x or x*f(x-1)

22
ভাল কৌতুক: 0**x
আলেকজান্দ্রু

কি হবে math.factorial? এটি বিল্ট-ইন না, তাই না?

1
@ জ্যাকবেটস যা বিল্টিন হিসাবে গণ্য হয়েছে, কারণ আপনি ফ্যাক্টরিয়াল গণনা করার জন্য কোডটি লিখেন নি।
ফ্লিপট্যাক

1
কেউ কি আমাকে বলতে পারেন পিছনে কৌশলটি কী 0**x?
পবিত্রা

1
@ চিত্রা: 0 0 = 1, এবং এটি প্রথম জিনিস যা মূল্যায়ন করে তাই এটি ফিরে আসে। অন্য কোনও এন, 0 এন = 0 এর জন্য, এভাবে প্রথম অপারেন্ড বা মিথ্যা, যেমন দ্বিতীয় অপারেন্ডকে মূল্যায়ন করা হয়।
মেগা ম্যান

29

এপিএল (4)

×/∘⍳

বেনামে ফাংশন হিসাবে কাজ করে:

    ×/∘⍳ 5
120

আপনি যদি এটির নাম দিতে চান তবে 6 টি অক্ষর:

f←×/∘⍳

আমি এপিএল বলি না, এখানে কী চলছে?
মাইকেল স্টারন

@ মিশেলস্টারন: একটি সূচক ভেক্টর তৈরি করে, অর্থাৎ ⍳5হয় 1 2 3 4 5×(স্পষ্টতই) গুণিত হয়, /হ্রাস করা হয়, এবং ফাংশন রচনা। সুতরাং, ×/∘⍳একটি ফাংশন যা আর্গুমেন্ট গ্রহণ করে xএবং সংখ্যার গুণফল দেয় [1..x]
মেরিনাস

আহ, @ ইয়ভস ক্লেটের ম্যাথেমেটিকা ​​সমাধানের মতো একই পদ্ধতি। খুব সুন্দর.
মাইকেল স্টারন

@ এনবিজেড: এই প্রশ্নটি যখন লেখা হয়েছিল তখন ২০১১ সালেও ছিল না, বা ২০১২ সালেও আমি এই উত্তরটি কখন লিখেছিলাম। 2014 সালে প্রকাশিত ডায়ালগ 14.0 এ কেবল ট্রেনগুলি যুক্ত করা হয়েছিল
মেরিনাস

19

জে (12)

জেতে একটি স্ট্যান্ডার্ড সংজ্ঞা:

f=:*/@:>:@i.

125 এর জন্য 1 সেকেন্ডের চেয়ে কম!

উদাহরণ:

 f 0
 1
 f 5
 120
  f 125x
 1882677176888926099743767702491600857595403
 6487149242588759823150835315633161359886688
 2932889495923133646405445930057740630161919
 3413805978188834575585470555243263755650071
 31770880000000000000000000000000000000

কেন শুধু * /> নয়: i। ?
অ্যান্ডব্রুডু

কারণ ওপি একটি ফাংশন জিজ্ঞাসা করে এবং জেতে সর্বোত্তমভাবে করতে পারি একটি ক্রিয়া সংজ্ঞা দেওয়া।
ইয়েলেক্স

2
এটি কোনও বেনামি কাজ হতে পারে না এমন কোনও কারণ নেই? ভালো লেগেছে ([:*/1+i.)10 পয়েন্ট, অথবা এমনকি 8 প্রথম বন্ধনী শুধুমাত্র জন্য প্রয়োজন হয় হিসাবে কলিং ফাংশন, সংজ্ঞা জন্য নয়।
jpjacobs

শেষ এক, f 125xকি করে x? এটি কি বিশেষ ধরণের সংখ্যা?
সাইয়েস

@ কিয়েস, হ্যাঁ, এটি প্রসারিত যথার্থ পূর্ণসংখ্যা।
এলেভেক্স

17

গল্ফস্ক্রিপ্ট - 13 টি অক্ষর ( এসওয়াইএম )

ফাংশন সংজ্ঞায়িত করে !

{),()\{*}/}:!             # happy robot version \{*}/ 

বিকল্প 13 চর সংস্করণ

{),()+{*}*}:! 

পুরো প্রোগ্রাম সংস্করণটি 10 টি অক্ষর

~),()+{*}*

টেস্টকেসগুলিতে 1/10 সেকেন্ডেরও কম সময় লাগে:

ইনপুট:

0!

আউটপুট

1

ইনপুট

125!

আউটপুট

188267717688892609974376770249160085759540364871492425887598231508353156331613598866882932889495923133646405445930057740630161919341380597818883457558547055524326375565007131770880000000000000000000000000000000

1
প্রতীকী গল্ফ প্রবেশের জন্য +1! আমি আশা করি আমি একাধিকবার upvote করতে পারে। :
ক্রিস জেস্টার-ইয়ং

@ ক্রিসজেস্টার-ইয়ং আমি এটি আপনার জন্য করব।
সাইয়েস

13

পার্ল 6: 13 অক্ষর

$f={[*]1..$_}

[*]হাস্কেলের মতো productএবং 1..$_এটি 1 থেকে শুরু করে $_, যুক্তি গণনা করে up


2
এটির পরে [*]আর কোনও স্থান ব্যবহার করার অনুমতি নেই ("এক সারি দুটি শব্দ" ত্রুটি বার্তা)।
কনরাড বোরোস্কি

আপনার কোনও ভেরিয়েবল সেট করার দরকার নেই, একটি বেয়ার কোড ব্লক একটি গ্রহণযোগ্য উত্তর কারণ এটি স্পষ্টভাবে একটি ফাংশন গঠন করে। এছাড়াও এটি এখনও 0 এর জন্য কাজ করে?
ফিল এইচ

10

মতলব, ১৫

f=@(x)prod(1:x)

পরীক্ষার মামলা

>> f(0)
ans =
     1
>> f(4)
ans =
    24
>> tic,f(125),toc
ans =
  1.8827e+209
Elapsed time is 0.000380 seconds.

10

পাইথন, 28 বাইট

f=lambda x:x/~x+1or x*f(x-1)

(আলেকজান্দ্রুর সমাধান ভিত্তিতে)


9

এমএটিএল , 2 বাইট

:p

ব্যাখ্যা:

:    % generate list 1,2,3,...,i, where i is an implicit input
p    % calculate the product of of all the list entries (works on an empty list too)

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


10
হে
Andras Deak

আমি ঠিক এই পোস্ট করতে যাচ্ছি :-) আপনি কোড এবং একটি উদাহরণ ইনপুট অন্তর্ভুক্ত করতে লিংকটি সংশোধন করতে চাইতে পারেন
লুইস মেন্ডো

আপনি আদেশ হিসাবে, হুজুর।
flawr

4
@ আন্দ্রেসডাইক, না, 1 থেকে i পর্যন্ত সমস্ত সংখ্যার আউটপুট
তুলবে

8

রুবি - 21 অক্ষর

f=->n{n>1?n*f[n-1]:1}

পরীক্ষা

irb(main):009:0> f=->n{n>1?n*f[n-1]:1}
=> #<Proc:0x25a6d48@(irb):9 (lambda)>
irb(main):010:0> f[125]
=> 18826771768889260997437677024916008575954036487149242588759823150835315633161
35988668829328894959231336464054459300577406301619193413805978188834575585470555
24326375565007131770880000000000000000000000000000000

8

জাভা, 85 চর

BigInteger f(int n){return n<2?BigInteger.ONE:new BigInteger(""+n).multiply(f(n-1));}

1
এটি আমদানিগুলি import java.math.*;বাদ দেয় : (সুতরাং, +১৯ বাইট)।
অলিভিয়ার

ন্যায্য বিন্দু. ............
st0le

7

পোস্টস্ক্রিপ্ট, 26 টি অক্ষর

/f{1 exch -1 1{mul}for}def

উদাহরণ:

GS> 0 f =
1
GS> 1 f =
1
GS> 8 f =
40320

ফাংশনটি নিজেই কেবল 21 টি অক্ষর গ্রহণ করে; বাকিটি এটি একটি ভেরিয়েবলের সাথে আবদ্ধ। বাইট সংরক্ষণ করতে, কেউ এটির মতো একটি সংখ্যায় বাঁধতেও পারে:

GS> 0{1 exch -1 1{mul}for}def
GS> 8 0 load exec =
40320

1
ঘোস্টস্ক্রিপ্ট 125 টি পরিচালনা করতে পারে না ;; 34 এর বাইরে কিছু! হিসাবে আসে 1.#INF। (আমি x64 উইন্ডোজের জন্য সংকলিত জিএনইউ ঘোস্টস্রিপ্ট 9.0.7 ব্যবহার করেছি।)
রস প্রেসার

7

জাভাস্ক্রিপ্ট, 25

function f(n)!n||n*f(n-1)

কফিস্ক্রিপ্ট, ১৯

f=(n)->!n||n*f(n-1)

trueএন = 0 এর ক্ষেত্রে ফিরে আসে , তবে জাভাস্ক্রিপ্ট যেভাবে যাইহোক 1 তে টাইপ-জোর করে।


returnআপনার জাভাস্ক্রিপ্ট ফাংশন বিবৃতি প্রয়োজন ?
জাস্টিন মরগান

আপডেট করুন: পবিত্র ধোঁয়া, আপনি না একটি প্রয়োজন return! কিন্তু কেন না?
জাস্টিন মরগান

এটি জাভাস্ক্রিপ্ট 1.8 ( বিকাশকারী.মোজিলা.আর.ইন / নতুন_ইন_ জাভাস্ক্রিপ্ট_1.8 )। সম্পূর্ণ প্রকাশ, এটি কেবল ফায়ারফক্সে কাজ করে!
কেসি চু

1
ভাল লাগল, আমি জাভাস্ক্রিপ্ট ১.৮ এর জন্য রিটার্নের স্টেটমেন্টটি ছেড়ে দেওয়ার বিষয়ে জানতাম না। এছাড়াও, আপনি একই দৈর্ঘ্যের কোড সহ এন = 0 কেসের ক্ষেত্রে সত্যের পরিবর্তে 1 function f(n)n?n*f(--n):1
টির

10
ES6, 17: f=n=>!n||n*f(n-1)কফিস্ক্রিপ্ট এটি নিন!
Ry-

6

রুবি - 30 29 টি অক্ষর

def f(n)(1..n).inject 1,:*end

পরীক্ষা

f(0) -> 1
f(5) -> 120

1
আপনি নিউ লাইন বা সেমিকোলন ছাড়াই endসরাসরি পরে রাখতে পারেন :*
sepp2k

1
# ইনজেক্ট কলটিতে 1 টি পাস করার দরকার নেই। (1..10).inject :*# => 3628800
Dogbert

1
@ ডগবার্ট, কী জন্য f(0)?
নিমো 157

@ নিমো 157, আহ! ভুলে গেছি।
ডগবার্ট

4
অপেক্ষাকৃত ছোট 1.9 ল্যামডা সিনট্যাক্স ব্যবহার করার জন্য: f=->n{(1..n).inject 1,:*}। সাথে কল করুন f[n]
মাইকেল কোহল

6

এফ #: 26 অক্ষর

এফ # তে কোনও ইনবিল্ট পণ্য ফাংশন নেই, তবে আপনি একটি ভাঁজ দিয়ে এটি তৈরি করতে পারেন

let f n=Seq.fold(*)1{1..n}

6

সি #, 20 বা 39 টি অক্ষর আপনার দৃষ্টিকোণের উপর নির্ভর করে

একটি traditionalতিহ্যবাহী উদাহরণ পদ্ধতি হিসাবে (39 অক্ষর; এখানে পরীক্ষিত ):

double f(int x){return 2>x?1:x*f(x-1);}

ল্যাম্বডা এক্সপ্রেশন হিসাবে (20 টি অক্ষর, কিন্তু অস্বীকার দেখুন; এখানে পরীক্ষিত ):

f=x=>2>x?1:x*f(x-1);

আমাদের ব্যবহার করতে হবে doubleকারণ 125! == 1.88 * 10 209 , যা এর চেয়ে অনেক বেশি ulong.MaxValue

ল্যাম্বডা সংস্করণটির অক্ষর গণনা সম্পর্কে অস্বীকৃতি:

আপনি যদি একটি সি # ল্যাম্বডায় পুনরাবৃত্তি করেন, আপনাকে অবশ্যই ল্যাম্বডাকে একটি নামযুক্ত ভেরিয়েবলের মধ্যে সঞ্চয় করতে হবে যাতে এটি নিজে কল করতে পারে। তবে (যেমন) জাভাস্ক্রিপ্টের বিপরীতে, একটি স্ব-রেফারেন্সিং ল্যাম্বডা অবশ্যই পূর্ববর্তী লাইনে ঘোষণা করা এবং আরম্ভ করা উচিত । আপনি একই বিবৃতিতে ফাংশনটি কল করতে পারবেন না যেখানে আপনি ভেরিয়েবলটি ঘোষণা এবং / অথবা আরম্ভ করেছিলেন।

অন্য কথায়, এটি কাজ করে না :

Func<int,double> f=x=>2>x?1:x*f(x-1); //Error: Use of unassigned local variable 'f'

তবে এটি করে :

Func<int,double> f=null;            
f=x=>2>x?1:x*f(x-1);  

যেহেতু এই নিষেধাজ্ঞার কোনও ভাল কারণ নেই f এটি চলমান সময়ে কখনই নিযুক্ত করা যায় না। Func<int,double> f=null;লাইনটির প্রয়োজনীয়তা সি # এর এক গল্ফ হয়। এটি চরিত্রের গণনায় এটিকে উপেক্ষা করা ন্যায্য করে কিনা তা পাঠকের উপর নির্ভর করে।

কফিস্ক্রিপ্ট, 21 সত্যিকারের জন্য 19 টি অক্ষর

f=(x)->+!x||x*f x-1

এখানে পরীক্ষিত: http://jsfiddle.net/0xjdm971/


6

ব্র্যাচল্যাগ , 7 6 বাইট

একটি পরিসীমা তৈরি করে এবং এটির গুণ করে

-1 বায়ু ট্যাঙ্কগুলি ovs সর্বাধিক () ফাংশনটি ব্যবহার করার ধারণা রাখে

;1⌉⟦₁×

ব্যাখ্যা

;1          --  If n<1, use n=1 instead (zero case)
  ⟦₁        --      Construct the range [1,n]
    ×       --      return the product of said range

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


ব্র্যাচল্যাগ , 10 9 বাইট

পুনরাবৃত্তির

≤1|-₁↰;?×

ব্যাখ্যা

            --f(n):
≤1          --  if n ≤ 1: return 1
|           --  else:
 -₁↰        --      f(n-1)
    ;?×     --            *n

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


1
এটি 6 বাইটের জন্য কাজ করে। সিঙ্গেলটন হিসাবে ইনপুট নেওয়া ডিফল্টরূপে অনুমোদিত।
ovs

@ ধন্যবাদ ধন্যবাদ। তবে ;পরিবর্তে ব্যবহার করা ,কেবল একটি নিয়মিত সংখ্যার ইনপুটের জন্য অনুমতি দেয়। -1 যাইহোক যাইহোক
ক্রপ্পেব

5

সি (39 টি)

double f(int n){return n<2?1:n*f(n-1);}

3
খুশী হলাম। তবে কিছু অক্ষর সংরক্ষণ করতে পারে: double f(n){return!n?1:n*f(n-1);}- 33 অক্ষর।
ugoren

2
f(125)উপচে পড়বে
jkabrg

4

ডি: 45 অক্ষর

T f(T)(T n){return n < 2 ? 1 : n * f(n - 1);}

আরও সুস্পষ্টভাবে:

T f(T)(T n)
{
    return n < 2 ? 1 : n * f(n - 1);
}

একটি কুলার (যদিও এটি দীর্ঘতর সংস্করণ) হ'ল টেম্প্লেটেইটেড যা এটি সমস্তই সংকলন করার সময় করে ( 64 অক্ষর ):

template F(int n){static if(n<2)enum F=1;else enum F=n*F!(n-1);}

আরও সুস্পষ্টভাবে:

template F(int n)
{
    static if(n < 2)
        enum F = 1;
    else
        enum F = n * F!(n - 1);
}

নামবিহীন টেমপ্লেটগুলি যদিও বেশ ভার্জোজ, তাই আপনি কোড গল্ফে খুব ভাল ব্যবহার করতে পারবেন না। ডি এর চরিত্র পরিপ্রেক্ষিতে ইতিমধ্যে বাগাড়ম্বরপূর্ণ যথেষ্ট বরং কোড গলফ জন্য দরিদ্র হতে গণনা (যদিও এটি আসলে না সত্যিই বড় প্রোগ্রাম জন্য সামগ্রিক প্রোগ্রাম আকার হ্রাস ভালো)। যদিও এটি আমার প্রিয় ভাষা, তাই আমি বুঝতে পারি যে আমি চেষ্টা করতে পারি এবং দেখতে পারি যে কোড গল্ফে এটি কতটা করতে পারি, এমনকি গল্ফস্ক্রিপ্টের পছন্দগুলি এটি ক্রিম করতে বাধ্য।


3
সাদা স্থানটি বের করুন এবং আপনি এটি 36 অক্ষরে নামতে পারেন
রাচেট ফ্রিক

@ কিয়োস আপনি কি ব্যাখ্যা করতে পারেন?
YoYoYonnY

সাইটটিতে আপনাকে স্বাগতম, @ ব্যবহারকারী272735। নোট করুন যে আমরা এখানে উন্নতি করতে লোকের সমাধানগুলি সম্পাদনা করি না। পরিবর্তে আমরা র‌্যাচেট ফ্রিক যেমন করেছিলাম তেমনি উন্নতিগুলির পরামর্শ দিয়ে আমরা মন্তব্যগুলি ছেড়ে দিই।
শেগি

4

পাওয়ারশেল - 36

সাদাসিধা:

filter f{if($_){$_*(--$_|f}else{1}}

টেস্ট:

> 0,5,125|f
1
120
1,88267717688893E+209

4

স্কেলা, 39 টি অক্ষর

def f(x:BigInt)=(BigInt(1)to x).product

বেশিরভাগ অক্ষরই নিশ্চিত করে যে BigIntব্যবহার করা হয়েছে যাতে 125 টি পর্যন্ত মানগুলির প্রয়োজনীয়তা পূরণ হয়।


কিছু সংক্ষিপ্ত বিকল্প:(x:Int)=>(BigInt(1)to x).product def f(x:Int)=(BigInt(1)to x).product def f(x:BigInt)=(x.to(1,-1)).product def f(x:BigInt)=(-x to-1).product.abs
এলআরুলুসেনা

4

জাভাস্ক্রিপ্ট, ES6 17

f=n=>n?n*f(n-1):1

ES6:

  • তীর ফাংশন

ES6 এই চ্যালেঞ্জের চেয়ে কম বয়সী যদি আমি সঠিকভাবে মনে করি এবং তাই যোগ্য না eligible
lirtosiast

শর্তসাপেক্ষ অপারেটরের সাথে অদ্ভুত কিছু আছে। দুটি কলোন কেন?
কিওয়ারটি

@ কিওয়ার্টি আপনি ঠিক বলেছেন, ধন্যবাদ এটি একটি টাইপো ছিল।
আফোনসো ম্যাটোস

4

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

( ফাংশনের পরিবর্তে ফিল্টার ব্যবহার করে 2 টি অক্ষর সংরক্ষণ করা হয়েছে )

filter f($x){if(!$x){1}else{$x*(f($x-1))}}

আউটপুট:

PS C:\> f 0
1
PS C:\> f 5
120
PS C:\> f 1
1
PS C:\> f 125
1.88267717688893E+209

1
এটি এখন বেশ পুরানো, তবে ... যদি / অন্যটি: বিপরীত করে আরও 1 টি চরিত্র সংরক্ষণ করতে পারে filter f($x){if($x){$x*(f($x-1))}else{1}}। এটি পাইপলাইনের মাধ্যমে ডাকলে এটি আরও 36 টি অক্ষরে কমিয়ে আনা যেতে পারে কারণ এটি ফিল্টার (যেমন 125|f):filter f{if($_){$_*($_-1|f)}else{1}}
অ্যান্ড্রু

4

র‌্যাকেট (স্কিম) 40 35 29 বাইট

গণনা 0! 1 হতে হবে, এবং গণনা 125! টাইমার অনুসারে 0 সেকেন্ডে নিয়মিত পুনরাবৃত্তি পদ্ধতির

(define(f n)(if(= n 0)1(* n(f(- n 1)))))

সাধারণ লিস্পকে হারিয়ে নতুন সংস্করণ: একটি তালিকার সমস্ত উপাদানকে গুণিত করে (হাস্কেল সমাধানের মতো)

(λ(n)(apply *(build-list n add1)))

প্রয়োগের পরিবর্তে ভাঁজ ব্যবহার করে এবং বিল্ডলিস্টের পরিবর্তে পরিসর ব্যবহার করে অন্যান্য স্কিম সমাধান এবং গণিতের জন্য অন্যান্য র‌্যাকেট সমাধানকে আরও নতুন সংস্করণ

(λ(n)(foldl * n(range 1 n)))

4

মর্নিংটন ক্রিসেন্ট , 1827 1698 চার্স

আমি আজকে নতুন ভাষা শেখার মতো অনুভব করেছি এবং এটিই আমি অবতরণ করেছি ... (আমি কেন নিজের সাথে এটি করব?) এই এন্ট্রিটি কোনও পুরস্কার জিতবে না, তবে এটি এখনও পর্যন্ত সমস্ত 0 টি জবাব মেরে ফেলেছে একই ভাষা!

Take Northern Line to Bank
Take Central Line to Holborn
Take Piccadilly Line to Heathrow Terminals 1, 2, 3
Take Piccadilly Line to Acton Town
Take District Line to Acton Town
Take District Line to Parsons Green
Take District Line to Bank
Take District Line to Parsons Green
Take District Line to Acton Town
Take District Line to Hammersmith
Take Circle Line to Aldgate
Take Circle Line to Aldgate
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Aldgate
Take Circle Line to Hammersmith
Take District Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Acton Town
Take District Line to Acton Town
Take District Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Parsons Green
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Bank
Take Circle Line to Temple
Take Circle Line to Aldgate
Take Circle Line to Aldgate
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Aldgate
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Bank
Take District Line to Upney
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Upney
Take District Line to Bank
Take Circle Line to Embankment
Take Circle Line to Embankment
Take Northern Line to Angel
Take Northern Line to Moorgate
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Moorgate
Take Circle Line to Moorgate
Take Northern Line to Mornington Crescent

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

যে কেউ লন্ডনের আশেপাশে ভ্রমণ করেছেন তিনি অবশ্যই তাৎক্ষণিকভাবে বুঝতে পারবেন, সুতরাং আমি নিশ্চিত যে আমার পুরো ব্যাখ্যা দেওয়ার দরকার নেই।

শুরুতে বেশিরভাগ কাজ 0 টি কেস পরিচালনা করে। 1 এ পণ্যটি আরম্ভ করার পরে, আমি 0 টি সত্যতার সুযোগ নিয়ে নতুন ইনপুট পেতে সর্বোচ্চ (ইনপুট, 1) গণনা করতে এটি ব্যবহার করতে পারি! = 1! তারপরে মূল লুপটি শুরু হতে পারে।

(সম্পাদনা: নিজেই ((সিস্টার) বিভাজন করে তৈরি করার পরিবর্তে "হিথ্রো টার্মিনাল 1, 2, 3" থেকে 1 টি সরিয়ে পুরো ট্রিপস সংরক্ষণ করা হয়েছে I আমি -1 জেনারেট করার জন্য একটি সস্তা পদ্ধতিও ব্যবহার করি শগ ফহ ​​ফগ.)

মর্নিংটন ক্রিসেন্টে হ্রাস হ্রাস ব্যয়বহুল (যদিও টিউবের চেয়ে কম ব্যয়বহুল)। জিনিসগুলিকে আরও দক্ষ করে তোলার জন্য আমি একটি পার্সড 0 এর নোট না নিয়ে একটি -1 উত্পন্ন করি এবং হ্যামারস্মিথে অনেক লুপের জন্য সঞ্চয় করি।


আমি এটিতে কিছু তাৎপর্যপূর্ণ কাজ রেখেছি, তবে যেহেতু এটি মর্নিংটন ক্রিসেন্টে (আসলে কোনও ভাষায় আমার প্রথম প্রচেষ্টা) গল্ফ করার প্রথম প্রচেষ্টা , তাই আমি আশা করি যে আমি এখানে এবং সেখানে কয়েকটি আশাবাদ হারিয়েছি। আপনি যদি নিজেরাই এই ভাষায় প্রোগ্রামিং করতে আগ্রহী হন (এবং আপনি কেন হবেন না?), এসোটেরিক আইডিই - এর ডিবাগ মোড এবং ওয়াচ উইন্ডো সহ - অবশ্যই আবশ্যক!


3

বেফঞ্জ - 2x20 = 40 টি অক্ষর

0\:#v_# 1#<\$v *\<
    >:1-:#^_$>\:#^_$

এটি এমন একটি ফাংশন যা এতে কোডটি স্ট্র্যাপলোন ব্লক যা মোড়ক ব্যবহার করে না। আপনাকে স্ট্যাকের শীর্ষে যুক্তিটি স্থাপন করতে হবে এবং উপরের বাম দিক থেকে ডানদিকে প্রবেশ করানো হবে, ফাংশনটি স্ট্যাকের শীর্ষে ফলাফলের সাথে ডানদিকে ডানদিকে যেতে হবে।

যেমন 125 এর ফ্যাক্টরিয়াল গণনা করা

555**   0\:#v_# 1#<\$v *\<
            >:1-:#^_$>\:#^_$    .@

পরীক্ষা 0

0   0\:#v_# 1#<\$v *\<
        >:1-:#^_$>\:#^_$    .@

আমি জানি এটি বেশ পুরানো, তবে আমি মনে করি এটি কিছুটা ছোট এবং তাত্পর্যপূর্ণ: &:!#@_>:# 1# -# :# _$>\# :#* _$.@ (যেখানে & ইনপুট দ্বারা প্রতিস্থাপন করা উচিত)। এটি 32 টি চর / বাইটস
11:58 এ ফ্লাইফি

3

জে - 6 টি অক্ষর

*/>:i.

এই কি গণনা? আমি জানি এটি পূর্ববর্তী জে উদাহরণের সাথে খুব মিল, তবে এটি সামান্য খাটো :)

আমি জেদের সাথে এক শিক্ষানবিস, তবে এ পর্যন্ত অনেক মজাদার!


3

সি তে (23 টি অক্ষর)

এটি জিসিসির "বৈশিষ্ট্য" কে আপত্তিজনকভাবে ব্যবহার করে যদি কোনও রিটার্ন নির্দিষ্ট না করা থাকে তবে শেষ হিসাবে অ্যাসাইনমেন্ট গণনা করে।

f(a){a=a>0?f(a-1)*a:1;}

যথাযথ সি, ২৮ টি অক্ষর

f(a){return a>0?f(a-1)*a:1;}

জিসিসি "বৈশিষ্ট্য" এর জন্য +1। আমার মনে হয় জিসিসি এমনকি একটি ব্লক রিটার্ন 0 == ({printf("Hello, world!"); 0;});
মানকেও

3

কোনা ( 11 6)

*/1.+!

কে কাজ করে ডান-থেকে-বামে (অধিকাংশ অংশ জন্য), তাই আমরা গনা x(ক তালিকা / থেকে সংখ্যার অ্যারের করতে 0করতে x-1), যোগ 1(তালিকা রেঞ্জ এটি 0করার জন্য x), তারপর সমস্ত নম্বর একসঙ্গে সংখ্যাবৃদ্ধি। যদি এটি গণনা করার প্রয়োজন না হয় তবে 125!আমি .পাশের অংশটি সরিয়ে আরও 1 টি বাইট সঞ্চয় করতে পারতাম 1। যে কোনও ইভেন্টে, 125! নিছক মিলিসেকেন্ডে গণনা করা হয়:

  */1.+!125.
1.882677e+209

আপনার এটার খুব দরকার নেই। কে কারিগরি করছে তাই পুরো উত্তরটি হয়ে যায় */1.+!: 6 বাইট।
kirbyfan64sos

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