কোড-গল্ফ: অনুগমন


21

ইনপুট হিসাবে পূর্ণসংখ্যার একটি সেট (একটি তালিকা, অ্যারে বা স্বতন্ত্র সংখ্যাগুলির সাথে অন্য কোনও ধারক হতে পারে) লিখুন এবং এর সমস্ত আদেশের তালিকা আউটপুট করে।

পাইথন (95 টি চর) :

p=lambda s:s and sum(map(lambda e:map(lambda p:[e]+p,p(filter(lambda x:x!=e,s))),s),[]) or [[]]

একই ভাষায় মারধর করা ভাল লাগবে, তবে অন্যান্য ভাষায় বাস্তবায়ন স্বাগত অপেক্ষা বেশি!

উত্তর:


10

পাইথন - 76 টি অক্ষর

জিনিবলারের চেয়ে দীর্ঘ, তবে স্ক্র্যাচ থেকে জিনিস প্রয়োগ করে।

p=lambda x:x and[[a]+b for a in x for b in p([c for c in x if c!=a])]or[[]]

আমি এখানে বোঝার ব্যবহার পছন্দ করি। এটি সত্যিই আমি প্রচুর পোস্ট করা কোডটি সহজতর করে!
zxul767


9

জে, ১১ টি অক্ষর

(i.@!@#A.[)

ব্যবহার:

   (i.@!@#A.[) 1 3 5
1 3 5
1 5 3
3 1 5
3 5 1
5 1 3
5 3 1

ব্যাখ্যা:

i.@!@# 0 থেকে (! n) -1 থেকে একটি তালিকা ফিরে আসতে তিনটি ক্রিয়া ব্যবহার করে যেখানে n প্রদত্ত তালিকার আইটেমের সংখ্যা।

[তালিকাটি নিজেই ফেরত দেয়। উদাহরণস্বরূপ যে দেয় 0 1 2 3 4 5 A. 1 3 5

A.প্রথম তালিকার প্রতিটি আইটেমের জন্য দ্বিতীয় তালিকার একটি সম্ভাব্য সারমিটেশন প্রদান করে (ধরণের - যথাযথ ব্যাখ্যা এখানে দেওয়া আছে )।


জে সম্পর্কে তথ্যের একটি লিঙ্ক সরবরাহ করবেন?
স্পার


8

পাইথন - 55 টি অক্ষর

from itertools import*
p=lambda x:list(permutations(x))

ভাবেন যে লোকেরা লিখবে ঠিক ঠিক তেমন নয় ... তবে পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতে এরকম দরকারীতা রয়েছে তা জেনে রাখা কার্যকর।
zxul767

4
@ zxul767: কেন চাকা পুনরুদ্ধার? স্ট্যান্ডার্ড লাইব্রেরিটি ব্যবহার করা অবিশ্বাস্যভাবে দক্ষ প্রমাণিত হবে ... (এবং এই ক্ষেত্রে গল্ফ করার সময় সংক্ষিপ্ত কোড তৈরি করে ;-)
ক্রিস্টোফিড

8

হাস্কেল, 44 43

p[]=[[]]
p l=[e:r|e<-l,r<-p$filter(/=e)l]

মূলত উগোরেনের সমাধান হিসাবে একই, তবে হাস্কেল তালিকা বোঝার ক্ষেত্রে আরও ভাল!


অবশ্যই, এটি করতে পারে

30

import Data.List
p=permutations


আরও দক্ষ পদ্ধতির জন্য, যেটির জন্য সাম্যের তুলনার প্রয়োজন নেই:

92

import Data.List
p[]=[[]]
p l=(\(l,(e:r))->map(e:)$p(l++r))=<<(init$zip(inits l)(tails l))

ফলস্বরূপ, তালিকায় সদৃশ উপাদান উপস্থিত থাকলে এটিও কাজ করে।


4
এর সর্বোত্তম অংশটি হল যে তালিকা বোধগম্যতার সাথে 44 লাইনের হ্যাশেল সমাধানটি পাইথন সমাধানের চেয়ে সংক্ষিপ্ত যা কেবলমাত্র স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে।
monadic

p=Data.List.permutations। যদিও তা প্রতারণার মতো অনুভূত হয়। এছাড়াও, Data.List.permutationsলিক্সোগ্রাফিক ক্রমে ক্রমানুসারে আউটপুট দেয় না।
জন ডিভোরাক

1
p[]=[[]]পরিবর্তে একটি বেস কেস হিসাবে লিখতে পারেন , দুটি বাইট সংরক্ষণ করুন।
লিন

@ মরিস: ঠিক! আমি একরকম ধরে নিয়েছি যে শূন্য তালিকার সংজ্ঞা অনুসারে শূন্য ক্রমশক্তি থাকবে তবে 0 থেকে! = 1 যা স্পষ্টভাবে কোনও অর্থবোধ করে না। খালি বেস কেস থাকা অনেক সুন্দর।
বন্ধ হয়ে গেছে

3

প্রশ্নে (48)

g:{$[x=1;y;raze .z.s[x-1;y]{x,/:y except x}\:y]}

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

q)g[3;1 2 3]
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

2

রুবি - 23 অক্ষর

f=->x{p *x.permutation}

উদাহরণস্বরূপ এটি f[[1,2,3]] আউটপুট

তবে ব্যবহার করে [].permutationপ্রতারণার মতো বোধ হয়, তাই:

রুবি - 59 অক্ষর

f=->a{a.size<2?[a]:a.flat_map{|x|f[(a-x=[x])].map{|y|x+y}}}

পরীক্ষিত

100.times.all?{arr=(1..99).to_a.sample(rand(5)); arr.permutation.to_a==f[arr]}
=> true

আপনি যদি চান, আপনি আইডিওনের মতো সাইট ব্যবহার করে আপনার কোড ডেমো করতে পারেন: আদর্শ one.com/crvtD
মিঃ

1
অন্তর্নির্মিত ভাষা বৈশিষ্ট্যগুলি কেন প্রতারণামূলক হবে?
মার্ক থমাস

@ মার্ক সম্ভবত প্রতারণা করছে না, তবে খুব মজাও করছে না, এমন একটি ফাংশন লিখতে যা কেবল একটি বিল্ট-ইন ফাংশন বলে calls উদাহরণস্বরূপ পছন্দ করুন: "একটি অ্যারে বাছাই করার জন্য একটি ফাংশন লিখুন" ->f(array) { return array.sort(); }
jsvnm

2

পাইথন - 58 টি অক্ষর

ইনপুট হিসাবে একটি সেট নিয়ে ugoren এর চেয়ে সামান্য খাটো:

p=lambda x:x and[[y]+l for y in x for l in p(x-{y})]or[[]]

2

সি, 270 243 239 টি অক্ষর

#define S t=*a;*a=a[i];a[i]=t;
#define R o=p(n,r-1,a+1,o,r-2,0)
int*p(n,r,a,o,i,t)int*a,*o;{if(!r)for(;n;--n)*o++=*--a;else{R;for(;i;--i){S R;S}}return o;}
P(n,a)int*a;{int N=1,i=n;for(;i;N*=i--);return p(n,n,a,malloc(N*n*8),n-1,0)-N*n;}

পি (এন, এ) ফাংশনটি এনকে একটি পয়েন্টার দেয়! এর একের ক্রমবিন্যাস, একের পর এক বিশাল আকারের অ্যারে প্যাক করা।


1
কিছু টিপস: <malloc.h> isn't needed (ignore the warnings). মাপের এনওটি 4 ( ভেরিয়েবল হিসাবে অতিরিক্ত পরামিতি ব্যবহার করুন (যেমন p(n,a,N,i))। int*p(..)int*a,o;। প্যারামিটারগুলির পরিবর্তে গ্লোবাল ভেরিয়েবলগুলি ব্যবহার এবং রিটার্ন মানগুলি প্রায়শই সহায়তা করে।
ugoren

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


1

জেএস - 154 146 অক্ষর

function f(x){var a=[],m;(m=x.length)>1?f(x.slice(1)).map(function(y){for(l=m;l--;a.push(y.slice(0,l).concat(x[0],y.slice(l))));}):a=[x];return a}

টেস্ট: f([1,2,3,4,5]).map(function(a){return a.join('')}).join('\n')ফেরৎ এই


1

আর

যেহেতু আমরা অনুমতি সম্পর্কে কথা বলছি আমাকে আরয়ে কমপক্ষে একটি সমাধান দেখাতে দিন:

library(gtools);v=c(3,4,5);permutations(length(v),length(v),v)

1

পার্ল 188

কোনও গ্রন্থাগারের রুটিন নেই, পুনরাবৃত্তি হবে না

sub p{$l=(@_=sort split'',shift)-1;while(print@_){$k=$j=$l;--$k while($_[$k-1]cmp$_[$k])>=0;$k||last;--$j while($_[$k-1]cmp$_[$j])>=0;@_[$j,$k-1]=@_[$k-1,$j];@_[$k..$l]=reverse@_[$k..$l]}}

1

স্কেল 30:

def p(s:Seq[_])=s.permutations 

Scala 195, quick'n'dirty ছাড়া একাধিক বিন্যাসন লাইব্রেরি থেকে:

def c(x:Int,t:List[_]):List[_]={val l=t.size
val o=x%l
if(l>1){val r=c(x/l,t.tail)
r.take(o):::(t.head::r.drop(o))}else
t}
def p(y:List[_])=(0 to(1 to y.size).product).foreach(z=>println(c(z,y)))

val y=List(0,1,2,3)
p(y)

স্কেল 293, পূর্ণ বয়স্ক, নিরাপদ পুনরাবৃত্তকারী টাইপ করুন:

class P[A](val l:Seq[A])extends Iterator[Seq[A]]{
var c=0
val s=(1 to l.size).product
def g(c:Int,t:List[A]):List[A]={
val n=t.size
val o=c%n
if(n>1){val r=g(c/n,t.tail)
r.take(o):::(t.head::r.drop(o))
}else
t}
def hasNext=c!=s
def next={c+=1
g(c-1,l.toList)}
}
for(e<-new P("golf"))println(e)


1

পাইথ, 4 বাইট

L.pb

হ্যাঁ, এই চ্যালেঞ্জটি পোস্ট করার পরে পাইথ তৈরি হয়েছিল এবং সমস্ত কিছু। এটি এখনও সত্যিই দুর্দান্ত। : ডি

জীবন্ত উদাহরণ.

স্টিডিনের কাছ থেকে পড়া একটি বাইট সংক্ষিপ্ত:

.pQ

1

জাভাস্ক্রিপ্ট 143 136 134 123

function p(s,a="",c="",i,z=[]){a+=c,i=s.length
!i?z.push(a):0
for(;i--;s.splice(i,0,c))p(s,a,c=s.splice(i,1),0,z);return z}

var perms = p([1,2,3]);

document.getElementById('output').innerHTML = perms.join("\n");
<pre id="output"></pre>


আমি মনে করি আপনি এটি করে 8 টি বাইট অর্জন করতে পারেন: js function p(s,a="",c="",i,z=[]){ পরিবর্তে js function p(s,a,c,i,z){if(!z)a=c="",z=[]
কোল্ডকে

ধন্যবাদ কোল্ডকে এটি কাজ করেছে এবং এখন 8 বাইট সংক্ষিপ্ত।
উলফহ্যামার


0

পাইথন, 53 বাইট

from itertools import*;lambda x:list(permutations(x))

1
এটি মূলত অন্য জমা দেওয়া উত্তরের একটি সদৃশ । আমি ধরে নিয়েছি আপনি স্বাধীনভাবে এটি নিয়ে এসেছেন (এবং আপনি এটি আরও ভালভাবে গল্ফ করেছিলেন) তবে আমি মনে করি এটি নকলটি দেখানোর পক্ষে উপযুক্ত।


0

কে (ওকে) , 3 বাইট

সমাধান

prm

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

ব্যাখ্যা:

এটি নিম্নলিখিত অন্তর্নির্মিত 47 বাইট ফাংশনের একটি 3 বাইট অন্তর্নির্মিত শর্টকাট :

{[x]{[x]$[x;,/x ,''o'x ^/:x;,x]}@$[-8>@x;!x;x]}

... যা ইনপুট হিসাবে ইনটগুলির একটি তালিকা পাচ্ছি যদি আমরা জানতে পারি যে 23 বাইটে সংক্ষিপ্ত করা যায়:

{$[x;,/x,''o'x^/:x;,x]} / golfed built in
{                     } / lambda function with implicit input x
 $[ ;             ;  ]  / if[condition;true;false]
   x                    / if x is not null...
             x^/:x      / x except (^) each-right (/:) x; create length-x combinations
           o'           / call self (o) with each of these
       x,''             / x concatenated with each-each of these results (this is kinda magic to me)
     ,/                 / flatten list
                    ,x  / otherwise enlist x (enlisted empty list)

0

এক্সিয়াম, 160 বাইট

p(a)==(#a=0=>[[]];r:=[[a.1]];r:=delete(r,1);n:=#a;m:=factorial n;m>1.E7=>r;b:=permutations n;for j in 1..m repeat(x:=b.j;r:=concat([a.(x.i)for i in 1..n],r));r)

ungolfed

--Permutation of a
pmt(a)==
     #a=0=>[[]]
     r:=[[a.1]]; r:=delete(r,1) -- r has the type List List typeof(a)
     n:=#a
     m:=factorial n
     m>1.E7=>r
     b:=permutations(n)         --one built in for permutation indices 
     for j in 1..m repeat
        x:=b.j
        r:=concat([a.(x.i) for i in 1..n],r)
     r

এই সমস্ত কল লাইব্রেরির ফাংশন যা সূচকে অনুমতি দেয় (কেবলমাত্র [1]-এ অনুমানের হিসাবে অনুচ্ছেদ হিসাবে পূর্ণসংখ্যা, [1,2] এর অনুক্রম, [1,2,3] ইত্যাদিতে অনুমতি) ইত্যাদি। সুতরাং এই সেটগুলি পেতে যথেষ্ট? সূচকের এবং তালিকা তৈরি; একটি নোট করতে হবে যে এটি X টাইপের প্রতিটি তালিকার জন্য ভাল সংকলিত বলে মনে হয়

(4) -> p([1,2,3])
   Compiling function p with type List PositiveInteger -> List List
      PositiveInteger
   (4)  [[1,2,3],[1,3,2],[3,1,2],[2,1,3],[2,3,1],[3,2,1]]
                                          Type: List List PositiveInteger
(5) -> p([x^2,y*x,y^2])
   Compiling function p with type List Polynomial Integer -> List List
      Polynomial Integer
   (5)
      2      2    2  2        2  2            2  2        2  2    2      2
   [[x ,x y,y ],[x ,y ,x y],[y ,x ,x y],[x y,x ,y ],[x y,y ,x ],[y ,x y,x ]]
                                       Type: List List Polynomial Integer
(6) -> p([sin(x),log(y)])
   Compiling function p with type List Expression Integer -> List List
      Expression Integer
   (6)  [[sin(x),log(y)],[log(y),sin(x)]]
                                       Type: List List Expression Integer
(7) -> m:=p("abc")::List List Character
   Compiling function p with type String -> Any
   (7)  [[a,b,c],[a,c,b],[c,a,b],[b,a,c],[b,c,a],[c,b,a]]
                                                Type: List List Character
(8) -> [concat(map(x+->x::String, m.j))  for j in 1..#m]
   (8)  ["abc","acb","cab","bac","bca","cba"]
                                                        Type: List String

আপনার কী অ্যাক্সিয়োম দোভাষীর একটি লিঙ্ক আছে? আমি এটি অনলাইনে চেষ্টা করে যুক্ত করতে চাই ! , এটি একটি আকর্ষণীয় ভাষার মতো দেখাচ্ছে।
কেয়ারড কোইনারিংহিংহিং

0

জাপট , 1 বাইট

á

জাপট দোভাষী

এটি ধাক্কা খেয়েছে এবং জ্যাপের কোনও উত্তর নেই, সুতরাং আমি বুঝতে পেরেছিলাম যে আমি এগিয়ে গিয়ে একটি যুক্ত করব। áযখন অ্যারেতে প্রয়োগ করা হয় এবং কোনও যুক্তি ছাড়াই "সমস্ত অনুমতি পান" এর জন্য অন্তর্নির্মিত। -Rপতাকা অনুবাদক লিঙ্কটি কেবলমাত্র মডিফাই কিভাবে ফলাফলের ছাপা হয় ব্যবহার করা হয়।


0

এপিএল (এনএআরএস), 39 টি অক্ষর, 78 বাইট

{1≥k←≢w←,⍵:⊂w⋄↑,/{w[⍵],¨q w[a∼⍵]}¨a←⍳k}

পরীক্ষা:

  q←{1≥k←≢w←,⍵:⊂w⋄↑,/{w[⍵],¨q w[a∼⍵]}¨a←⍳k}
  q 1 2 3
1 2 3  1 3 2  2 1 3  2 3 1  3 1 2  3 2 1 
  q 'abcd'
abcd abdc acbd acdb adbc adcb bacd badc bcad bcda bdac bdca cabd cadb cbad cbda cdab cdba dabc dacb dbac dbca dcab dcba 

0

05AB1E - 2 1 বাইট এস

œ

ইনপুট অবশ্যই একটি অ্যারে / তালিকা হতে হবে।

ব্যাখ্যা:

œ //Takes all the permutations of the elements in the top of the stack (the input is a list, so it would work)

আউটগলফার এরিকের কাছে একটি বাইট ধন্যবাদ সংরক্ষণ করা


আপনি একক তালিকা হিসাবে ইনপুট নিতে পারেন, এটি নতুন লাইনের দ্বারা আলাদা করার দরকার নেই।
এরিক দ্য আউটগল্ফার

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