Permutations সঙ্গে মজা


17

কে পুরোপুরি অনুমতি পছন্দ করে না, তাই না? আমি জানি, তারা আশ্চর্যজনক fun এত মজা!

আচ্ছা, কেন এই মজাটি না নিয়ে এটিকে মজাদার করে তুলবেন ?

এখানে চ্যালেঞ্জ:

সঠিক আকারে একটি ইনপুট দেওয়া হয়েছে:, পুলটি nPrকোথা nথেকে নেওয়া হয়েছে এবং rসেই পুল থেকে নির্বাচনের সংখ্যা রয়েছে (এবং nএবং rপূর্ণসংখ্যাগুলিও), আউটপুট / আদেশের সঠিক সংখ্যাটি ফেরত দেয়। আপনার মধ্যে যারা পরিভাষাটির সাথে কিছুটা মরিচা পড়ে আছেন: অনুমান, Def। 2 এ

তবে, এখানেই চ্যালেঞ্জটি খেলতে আসে (এটি খুব সহজ নয়):

আপনি আপনার অনুমতি ক্রিয়াকলাপের জন্য গ্রন্থাগার, ফ্রেমওয়ার্ক বা পদ্ধতিতে কোনও বিল্ট ব্যবহার করতে পারবেন না। আপনি কোনও ফ্যাক্টরিয়াল পদ্ধতি, ক্রমশক্তি পদ্ধতি বা বাছাইয়ের কোনও কিছু ব্যবহার করতে পারবেন না; আপনাকে অবশ্যই সবকিছু লিখতে হবে।

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


এখানে একটি I / O উদাহরণ রয়েছে:

নমুনা ফাংশন হয় permute(String) -> int

ইনপুট:

permute("3P2")

আউটপুট:

6

এটি কোড-গল্ফ, তাই সংক্ষিপ্ততম কোড জয়!


2
ওহো। আমি ভেবেছিলাম যে এই চ্যালেঞ্জটি বাতিলকরণ গ্রুপগুলিতে হবে । দুর্দান্ত জিনিস। এটি খুব দুর্দান্ত এবং ক্রমশক্তি গ্রুপগুলির সাথে ঘনিষ্ঠভাবে সম্পর্কিত। চ্যালেঞ্জ পছন্দ।
জাস্টিন

যখন আপনি কোনও অন্তর্নির্মিত বা লাইব্রেরি পদ্ধতি বলছেন না, আপনি কি অনুমতি বা কোনও কিছুর জন্য বোঝাচ্ছেন? আমি কি splitইনপুটটি বিভক্ত করতে অন্তর্নির্মিতটি ব্যবহার করতে পারি P? একটি ফাংশন সম্পর্কে কী যা একটি স্ট্রিংকে একটি সংখ্যায় রূপান্তর করে?
xnor

3
উত্তর কি ধরে নিতে পারে 0 <= r <= n?
পিটার টেলর

1
@Dopapp আপনি বলতে চাচ্ছি যে নয় তার চেয়ে অনেক বেশী এন ?
ডেনিস

1
@ রিটোকোরাদি - আমি মনে করি যে বেশিরভাগ পোস্টার তাদের উত্তরগুলি পুনরায় করতে বাধ্য করার প্রয়াসে আপনাকে কোনও ফ্যাক্টরিয়াল বা অনুক্রমের পদ্ধতি / ফাংশন ব্যবহার করার অনুমতি নেই।
ড্যানিয়েল

উত্তর:


4

সিজেম, 15 14 বাইট

r~\;~\),>UXt:*

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

কিভাবে এটা কাজ করে

r              e# Read a token ("nPr") from STDIN.
 ~             e# Evaluate. This pushes the numbers n, Pi and r on the stack.
  \;           e# Discard Pi.
    ~          e# Take the bitwise NOT of r. Pushes -(r+1).
     \)        e# Increment n.    
       ,       e# Turn n+1 into [0 ... n].
        >      e# Keep only the last r+1 elements.
         UXt   e# Replace the first element with 1.
               e# This avoid dealing with the egde case nP0 separately.
            :* e# Compute their product.

4

পার্ল, 27 বাইট

#!perl -pl61
$\*=$`-$%++for/P/..$'}{

শেবাংকে 4 হিসাবে গণনা করা, স্টিডিনের কাছ থেকে ইনপুট নেওয়া হয়।


নমুনা ব্যবহার

$ echo 3P2 | perl npr.pl
6

$ echo 7P4 | perl npr.pl
840

কী ধরণের বিকল্প l61?
feersum

@ ফেয়ারসাম এটি সেট $\করে 1( চতুর্থ 49, অক্টোবর 61)
প্রিমো

3

Haskell,, 71 66 বাইট

p s|(u,_:x)<-span(/='P')s,(n,k)<-(read u,read x)=product[n-k+1..n]

বেশ সোজা জিনিস: 'পি' তে বিভক্ত হয়ে তারপরে পণ্যটি (এন-কে + 1) এবং এন এর মধ্যে নিয়ে যান।

কোনও whereদফার পরিবর্তে প্যাটার্ন গার্ড ব্যবহার করার জন্য তাদের ধারণার জন্য নিমিকে ধন্যবাদ , এটি 5 বাইট বন্ধ করে দিয়েছে।


2

মিনকোলাং 0.11 , 13 25 19 বাইট

এটি সুপারিশ করার জন্য Sp3000 ধন্যবাদ !

1nnd3&1N.[d1-]x$*N.

এখানে চেষ্টা করুন।

ব্যাখ্যা

1        Push 1
n        Take integer from input (say, n)
n        Take integer from input (say, k); ignores non-numeric characters in the way
d3&1N.   Output 1 if k is 0
[   ]    Loop k times
 d1-     Duplicate top of stack and subtract 1
x        Dump top of stack
$*       Multiply all of it together
N.       Output as integer

এটি অ্যালেক্সের সমান অ্যালগরিদম ব্যবহার করে: n P k= n(n-1)(n-2)...(n-k+1)


2

জুলিয়া, 63 58 48 বাইট

s->((n,r)=map(parse,split(s,"P"));prod(n-r+1:n))

এটি একটি নামহীন ফাংশন তৈরি করে যা একটি স্ট্রিং গ্রহণ করে এবং পূর্ণসংখ্যা ফেরত দেয়। এটি কল করার জন্য, এটির একটি নাম দিন f=s->...

Ungolfed:

function f(s::AbstractString)
    # Get the pool and number of selections as integers
    n, r = map(parse, split(s, "P"))

    # Return the product of each number between n-r+1 and n
    return prod(n-r+1:n)
end

এটি ক্রমশক্তির সংখ্যা এন ( এন -1) ( এন -2) ... ( এন - কে +1) এর সত্যতা ব্যবহার করে ।

গ্লেন ওকে 10 বাইট সংরক্ষণ করা হয়েছে!


প্রয়োজন নেই Int, যাতে আপনি কেবল ব্যবহার করতে পারেন map(parse,...)
গ্লেন ও

@ GlenO আমার মন ফুঁকছে আমি বুঝতে পারি Intনা যে এই পরিস্থিতিতে প্রয়োজনীয় ছিল। অনেক ধন্যবাদ!
অ্যালেক্স এ।

2

বাশ + লিনাক্স ব্যবহারসমূহ, 33

jot -s\* ${1#*P} $[${1/P/-}+1]|bc

jotrপূর্ণসংখ্যার ক্রম শুরু করে n-r+1এবং তাদের সাথে পৃথক করে *bcপাটিগণিত মূল্যায়নের জন্য এই অভিব্যক্তিটি পাইপ করা হয়েছে।


1

ম্যাটল্যাব, 54 বাইট

[n,r]=strread(input(''),'%dP%d');disp(prod((n-r+1):n))

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

মোটামুটি স্ব বর্ণনামূলক কোড। %dP%dযেখানে% d একটি পূর্ণসংখ্যার আকারে ইনপুট পান । বিভক্ত করুন যে nএবং r। তারপর সীমার মধ্যে যে পূর্ণসংখ্যা গুণফল প্রদর্শন n-r+1করতে n। মজার ব্যাপার এই এমনকি জন্য কাজ করে xP01. সঠিক উত্তরের কারণ ম্যাটল্যাব মধ্যে দান prod()ফাংশন আয় 1 আপনি চেষ্টা করুন এবং একটি খালি অ্যারের পণ্যের না। যখনই rশূন্য হয়, ব্যাপ্তিটি খালি অ্যারে হবে, সুতরাং বিঙ্গো আমরা 1 পাই।


এটি অক্টাভা পাশাপাশি পুরোপুরি কাজ করে । আপনি এটি এখানে অনলাইনে চেষ্টা করতে পারেন ।


1

জাভাস্ক্রিপ্ট, 59 57 বাইট

s=>(f=(n,k)=>k?(n- --k)*f(n,k):1,f.apply(f,s.split('P')))

1

জাভা (594 - বাইট)

import java.util.*;import java.lang.*;public class Perm {private String a;private static int[] nr=new int[2];private static int sum=1;Scanner in=new Scanner(System.in);public String input(){a=in.nextLine();return a;}public void converter(String a){this.a=a;String b=a.substring(0,1);String c=a.substring(2);nr[0]=Integer.parseInt(b);nr[1]=Integer.parseInt(c);}public int param(){for(int counter=0; counter < nr[1]; counter++){sum=sum*nr[0]--;}return sum;}public static void main(String args[]){Perm a;a=new Perm();String k=a.input();a.converter(k);int ans=a.param();System.out.println(ans);}}

1

জে, 23 বাইট

^!._1/@(".;._1)@('P'&,)

একটি বেনামে ফাংশন। উদাহরণ:

   f =. ^!._1/@(".;._1)@('P'&,)
   f '10P4'
5040

ব্যাখ্যা:

       (  ;._1)@('P'&,)   Split over 'P', and on each slice,
        ".                read a number.
      @                   Then,
^!._1/                    fold (/) with the built-in "stope function" (^!.k) for k=1.

আমি যে স্টপ ফাংশনটি ব্যবহার করেছি এটি অন্তর্নির্মিত হিসাবে গণনার ক্ষেত্রে সীমানা হতে পারে ... এটি গুণক অপারেটরের সাধারণতা এবং ফ্যাক্টরিয়াল অপারেটরের নির্দিষ্টতার মধ্যে কোথাও স্থির থাকে।


1

এপিএল, 23

{{×/⍵↑⍳-⍺}/-⍎¨⍵⊂⍨⍵≠'P'}

স্ট্রিংটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে। ব্যাখ্যা:

              ⍵⊂⍨⍵≠'P'  ⍝ Split by 'P'.
           -⍎¨          ⍝ Convert to numbers and negate making a vector (−n −r)
 {       }/             ⍝ Reduce it by a defined function, which
      ⍳-⍺               ⍝ makes a vector of numbers from 1 to n (⍺)
    ⍵↑                  ⍝ takes r last elements (⍵←−r)
  ×/                    ⍝ and multiplies them together.

এটি কোন এপিএল? আমার ডায়ালগের অনুলিপিটিতে আমি একটি ত্রুটি পেয়েছি।
lirtosiast

1
@ থমাসকওয়া ডায়ালগে ব্যবহার করুন ⎕ML←3
ব্যবহারকারী46915

1

পাইথন 2, 66

def f(s):a,b=map(int,s.split('P'));P=1;exec"P*=a;a-=1;"*b;print P

অনেকটাই অকপট. হিসাবে নম্বর ইনপুট প্রক্রিয়া a,b। একটি চলমান পণ্য রাখে Pযা প্রথম bশর্তাবলী দ্বারা গুণিত হয় a, a-1, a-2, ...


2
আমি দেখছি না কীভাবে input()কোনও ত্রুটির ফলাফল হতে পারে না।
শুক্রবার

@ ফেয়ারসাম আমি এটি চেষ্টা করেছি এবং এটি প্রকৃতপক্ষে একটি সিনট্যাক্স ত্রুটি ছুঁড়েছে।
অ্যালেক্স এ।

আমি এই জাতীয় উক্তিগুলির সাথে ইনপুট নিচ্ছিলাম "3P2", যা আমার মনে হয় সাধারণত অনুমোদিত হয় তবে এখানে চ্যালেঞ্জটি "সঠিক আকারের একটি ইনপুট" বলে, তাই আমি এটিকে কোনও ফাংশনে পরিবর্তন করি যা একটি স্ট্রিং নেয়।
এক্সএনওর

1

টিআই-বেসিক, 52 বাইট

Ans→Str1
expr(sub(Ans,1,⁻1+inString(Ans,"P→P        ;n
1
If expr(Str1                               ;If n^2*r ≠ 0
prod(randIntNoRep(P,P+1-expr(Str1)/P²
Ans

টিআই-বেসিকের একটি "তালিকার একটি পণ্য" ফাংশন রয়েছে, তাই বিল্টিনগুলিতে সীমাবদ্ধতা অর্জন করা খুব বেশি কঠিন নয়। তবে, টিআই-বেসিক খালি তালিকা সমর্থন করে না - তাই আমাদের দরকার

দুটি সংখ্যা বের করতে, আমি প্রথম সংখ্যাটি সাবস্ট্রিং হিসাবে বের করি। এটি ব্যয়বহুল ; এটি পুরো দ্বিতীয় লাইনটি গ্রহণ করে। দ্বিতীয় সংখ্যাটির জন্য এটি পুনরায় করার দরকার থেকে বাঁচতে, আমি সেই সংখ্যায় ভেরিয়েবল পি সেট করেছিলাম এবং ব্যবহার করে পুরো স্ট্রিংটি মূল্যায়ন করি expr(, তারপরে P by দিয়ে ভাগ করুন ²

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


1

আওোবোরস , 47 45 বাইট

এর কয়েকটি বেশ কুৎসিত - আমি ভাবতে পারি এটি আরও গল্ফ করা যেতে পারে।

Sr.r-1(
)s.!+S1+.@@.@\<!@@*Ys.!+*S.!!4*.(sn1(

আওোবোরসের কোডের প্রতিটি লাইন সাপকে তার লেজ খাওয়ার প্রতিনিধিত্ব করে।

সাপ ঘ

Sভাগ করা স্ট্যাকে স্যুইচ করে। r.rএকটি নম্বর পড়ে, এটি সদৃশ করে এবং অন্যটি পড়ে। (সংখ্যার মতো অক্ষরগুলি Pএড়িয়ে যায়)) -দুটিকে বিয়োগ করে। যদি ইনপুট ছিল 7P2, আমরা এখন আছে 7, 5ভাগ স্ট্যাক। অবশেষে,1( সাপের চূড়ান্ত চরিত্রটি খায়। যেহেতু নির্দেশের নির্দেশকটি এই চরিত্রটি রয়েছে তাই সাপটি মারা যায়।

সাপ ঘ

)sপ্রথম মাধ্যমে কিছুই করে না। .!+সর্প 2 এর স্ট্যাকের শীর্ষটিকে নকল করে, এটি শূন্য কিনা তা যাচাই করে এবং যদি এটি 1 যুক্ত করে the প্রথম পুনরাবৃত্তির সময়, স্ট্যাকটি খালি থাকে এবং মনে হয় এটিতে অসীম শূন্য রয়েছে, তাই এই ধাক্কা দেয়1 ; পরবর্তী পুনরাবৃত্তির উপর, স্ট্যাকটিতে একটি ননজারো মান রয়েছে এবং এর কোনও প্রভাব নেই।

এরপরে, Sভাগ করা স্ট্যাকে স্যুইচ করে, যেখানে আমাদের কাছে nপণ্যটি গণনার জন্য নম্বর এবং একটি কাউন্টার রয়েছে। 1+পাল্টা বৃদ্ধি। .@@.@\<!উভয় সংখ্যার সদৃশ এবং 1 টি পুশ করে যদি nএখনও কাউন্টারের চেয়ে বড় বা সমান হয়, অন্যথায় 0।@@*Yতারপরে এই পরিমাণটি দিয়ে কাউন্টারকে গুণিত করে এবং সাপ 2 এর স্ট্যাকের একটি অনুলিপি ইয়ঙ্কস।

s.!+সর্প 2 এর স্ট্যাকের দিকে ফিরে যায় এবং শীর্ষ সংখ্যাটি 0 হয় এবং এটি অন্যথায় একই রাখলে 1 টি রূপান্তর করতে আগের মতো একই কোড ব্যবহার করে। তারপরে *এই স্ট্যাকটিতে বসে থাকা আংশিক পণ্য দ্বারা ফলাফলকে গুণিত করে।

আমরা এখন ভাগ করা স্ট্যাক ( S) -এ ফিরে যাই , কাউন্টার-বা-শূন্য ( .) প্রতিলিপি তৈরি করি এবং !!ননজারো কাউন্টারকে 1 তে রূপান্তর করতে দুবার ( ) এটিকে প্রত্যাখ্যান করি এবং এটিকে 4*.(4 টি, নকল, এবং এর থেকে অনেকগুলি অক্ষর খায় সাপের শেষ

  • যদি আমরা থামার অবস্থাতে না পৌঁছে যাই, আমরা স্ট্যাকের সাথে একটি 4 পেয়েছি। (খাওয়ার পরে চারটি অক্ষর এবং নিয়ন্ত্রণের কোডের শুরুতে লুপ হয়। এখানে )চারটি অক্ষর sপুনরুদ্ধার করে, সর্প 2 এর স্ট্যাকের দিকে ফিরে যায় এবং মৃত্যুদন্ড কার্যকর হয়।
  • যদি কাউন্টারটি পাস হয়ে যায় তবে nআমরা স্ট্যাকের জন্য 0 পেয়েছি এবং কিছুই খাওয়া হয় না। snসর্প 2 এর স্ট্যাকে স্যুইচ করে এবং শীর্ষস্থানকে একটি সংখ্যা হিসাবে আউটপুট করে; তারপরে 1(শেষ চরিত্রটি খায় এবং মারা যায়।

ফলাফল হ'ল পণ্যটি (r+1)*(r+2)*...*nগণনা করা হয় এবং আউটপুট হয়।

চেষ্টা কর

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