একটি ক্লাসিক বাছাই কোড-গল্ফ প্রশ্ন


11

এটি একটি কোড-গল্ফ প্রশ্ন।

ইনপুট

সর্বাধিক সুবিধাজনক যে বিন্যাসে অ-নেতিবাচক পূর্ণসংখ্যার একটি তালিকা।

আউটপুট

সাজানো ক্রমে একই তালিকাটি যে কোনও ফর্ম্যাটে সর্বাধিক সুবিধাজনক।

সীমাবদ্ধতা

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

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

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

In: [9, 8, 3, 2, 4, 6, 5, 1, 7, 0]
Out:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In: [72, 59, 95, 68, 84]
Out:[59, 68, 72, 84, 95]

In: [2, 2, 1, 9, 3, 7, 4, 1, 6, 7]
Out:[1, 1, 2, 2, 3, 4, 6, 7, 7, 9]

In: [2397725, 1925225, 3304534, 7806949, 4487711, 8337622, 2276714, 3088926, 4274324,  667269]
Out:[667269,1925225, 2276714, 2397725,3088926, 3304534, 4274324, 4487711, 7806949, 8337622]

তোমার উত্তর

দয়া করে আপনার প্রয়োগ করা বাছাই করা অ্যালগরিদম এবং আপনার উত্তরের শিরোনামে আপনার সমাধানের দৈর্ঘ্যটি লিখুন।

ও (এন লগ এন) সময় বাছাইয়ের অ্যালগরিদমগুলি

অনেকগুলি ও (এন লগ এন) সময় অ্যালগরিদম রয়েছে। এই টেবিলটিতে তাদের কয়েকটি তালিকা রয়েছে।


কিছু সেট ফাংশন যেমন intersectঅ্যারেটি স্বয়ংক্রিয়ভাবে বাছাই করে। আমার ধারণা আপনি এগুলিও বাতিল করতে চান। কীভাবে unique(ডুপ্লিকেটগুলি সরান, ফলাফলটি সাজান)?
লুইস মেন্ডো

@ ডোনমুসলি আমি করি .. আমার মনে হয় intersectযদি এটি স্বয়ংক্রিয়ভাবে অ্যারে বাছাই করে তবে "অনুরূপ" এর আওতায় আসে। যদি আপনি সদৃশগুলি অপসারণ করেন তবে আপনি ভুল আউটপুট দেবেন।

ভুল ইনপুট দেওয়ার সম্পর্কে, এটি আমার কাছে ছেড়ে দিন :-) তারপরে "নকলগুলি সরিয়ে সাজানো" ব্যবহার করা যাবে কি?
লুইস মেন্ডো

3
নিতপিক: 0 কোনও ধনাত্মক পূর্ণসংখ্যা নয়। ( ইনপুট অধীনে )
বেকার

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

উত্তর:


8

হাস্কেল, 87 80 89

s%[]=s
(x:a)%q|x<=q!!0=x:a%q
p%q=q%p
j(x:y:s)=x%y:j s
j a=a
r[x]=x
r s=r$j s
s=r.map(:[])

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

(%)একত্রীকরণ ফাংশন
jতালিকার একটি তালিকাতে মার্জ জোড়া
rমার্জ তালিকা একটি সম্পূর্ণ তালিকা
sবাছাই ফাংশন।

ব্যবহার: দোভাষী চালান এবং প্রবেশ করুন s [3,5,2,6,7]

সম্পাদনা করুন: আমি যেভাবে জিনিসগুলিতে মার্জ করছিলাম তার আগে সঠিক ক্রম ছিল না, সুতরাং এটি ঠিক করার জন্য আমার আরও 9 টি চরিত্রের প্রয়োজন ছিল।


1
@ যদি আপনি প্রোগ্রামটি পরীক্ষা করতে চান এবং লাম্বিক, এবং আপনি হাস্কেল ইনস্টল করতে চান না, আপনি আইডিয়োন ব্যবহার করতে পারেন এবং একটি লাইন যুক্ত করতে পারেন main = print (s [5,3,6,8]), যা বাছাইয়ের ফলাফল মুদ্রণের জন্য প্রধান সেট করবে।
গর্বিত হাসেল্লার

আমি মনে করি আপনার দরকার নেই []%s=s, কারণ যদি প্রথম উপাদানটি হয় []তবে (x:a)ম্যাচটি ব্যর্থ হয় এবং শেষের ক্ষেত্রে উপাদানগুলি ফ্লিপ হয়, যাতে s%[]সফল হয়।
নিমি

তুমি বিজয়ী হয়েছো! কম বাইট ব্যবহারের একমাত্র উত্তর ও (এন লগ এন) এ চালিত হয়নি।

@ ল্যাম্বিক রাইট, আমি ভুলে গিয়েছিলাম জেলি উত্তর মেনে চলেনি।
গর্বিত হাসেল্লার 19

1
এখন এটি মনে হচ্ছে :)

5

জাভাস্ক্রিপ্ট (ES6), 195 193 191 189 188 186 183 182 179 174 172 বাইট

এটি হিপসোর্ট বাস্তবায়ন। আমি প্রত্যাশা করি যে কেউ সংক্ষিপ্ত সংশ্লেষ নিয়ে আসবে তবে আমি এটি পছন্দ করি: পি

আপডেট: আর মার্জ করে মারল। রুবি আপ পরবর্তী: ডি

S=l=>{e=l.length
W=(a,b)=>[l[a],l[b]]=[l[b],l[a]]
D=s=>{for(;(c=s*2+1)<e;s=r<s?s:e)s=l[r=s]<l[c]?c:s,W(r,s=++c<e&&l[s]<l[c]?c:s)}
for(s=e>>1;s;)D(--s)
for(;--e;D(0))W(0,e)}

পরীক্ষা (ফায়ারফক্স)


আমি একটি হিপসোর্ট উত্তর লিখতে পছন্দ করতাম তবে হাস্কেলের সাথে এটি সত্যিই ভাল কাজ করে না। আমার পরের চেষ্টাটি জেএস হবে, তবে আপনি এটি করেছেন। যদিও আমি এখনও এটি করতে হবে। Idk
গর্বিত haskeller

@proudhaskeller অই হ্যাঁ .. আমি শুধু তাকিয়ে stackoverflow.com/a/2186785/2179021

3

পাইথন 3, 132 বাইট

def S(l):
 if len(l)<2:return l
 a,b,o=S(l[::2]),S(l[1::2]),[]
 while a and b:o.append([a,b][a[-1]<b[-1]].pop())
 return a+b+o[::-1]

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

পাইথন 3, 99 বাইট

def m(a,b):
 while a+b:yield[a,b][a<b].pop(0)
S=lambda l:l[1:]and list(m(S(l[::2]),S(l[1::2])))or l

এটি ও (এন লগ এন) নয় কারণ .pop(0)ও (এন) হ'ল, মার্জ ফাংশনটিকে ও (এন ^ 2) তৈরি করে। তবে এটি মোটামুটি কৃত্রিম, যেমন .pop(0)সহজে ও (1) হতে পারে।


এই জন্য আপনাকে ধন্যবাদ. আমি অবশ্যই আলগোরিদম বোঝাতে চাইছিলাম এবং বাস্তবায়ন হ'ল ও (এন লগ এন) হওয়া উচিত।

পরিষ্কার হয়ে যাওয়ার অর্থ, এর অর্থ 132 সংস্করণ ঠিক আছে তবে 99 বাইট সংস্করণটি মেনে চলে না।

2

জুলিয়া, 166 বাইট

m(a,b,j=1,k=1,L=endof)=[(j<=L(a)&&k<=L(b)&&a[j]<b[k])||k>L(b)?a[(j+=1)-1]:b[(k+=1)-1]for i=1:L([a;b])]
M(x,n=endof(x))=n>1?m(M(x[1:(q=ceil(Int,n÷2))]),M(x[q+1:n])):x

প্রাথমিক ফাংশন বলা হয় Mএবং এটি একটি সহায়ক ফাংশন বলে m। এটি মার্জ সাজান্ট ব্যবহার করে , যার ( n লগ এন ) এর নিকৃষ্টতম জটিলতা হিসাবে রয়েছে।

উদাহরণ ব্যবহার:

x = [9, 8, 3, 2, 4, 6, 5, 1, 7, 0]
println(M(x))              # prints [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
println(M(x) == sort(x))   # prints true

Ungolfed:

function m(a, b, i=1, k=1, L=endof)
    return [(j <= L(a) && k <= L(b) && a[j] < b[k]) || k > L(b) ?
            a[(j+=1)-1] : b[(k+=1)-1] for i = 1:L([a; b])]
end

function M(x, n=endof(x))
    q = ceil(Int, n÷2)
    return n > 1 ? m(M(x[1:q]), M([q+1:n])) : x
end

জুলিয়াকে এখানে দেখে ভাল লাগল। এখন আমাদের নিম এবং

1
@ লেলেবিক আমি মনে করি এসপি 3000 এবং ডুরকনব যথাক্রমে আমাদের বাসিন্দা নিম এবং মরিচ বিশেষজ্ঞ। আশা করি তারাও মজাতে যোগ দেবেন। ;)
অ্যালেক্স এ।

2

আর, 181 বাইট, Mergesort

L=length;s=function(S)if(L(S)<2){S}else{h=1:(L(S)/2);A=s(S[h]);B=s(S[-h]);Z=c();if(A[L(A)]>B[1])while(L(A)&L(B))if(A[1]<B[1]){Z=c(Z,A[1]);A=A[-1]}else{Z=c(Z,B[1]);B=B[-1]};c(Z,A,B)}

নতুন লাইনের সাথে ইন্ডেন্ট করা:

L=length
s=function(S)
    if(L(S)<2){
        S
    }else{
        h=1:(L(S)/2)
        A=s(S[h])
        B=s(S[-h])
        Z=c()
        if(A[L(A)]>B[1])
#Merge helper function incorporated from here ...
            while(L(A)&L(B))
                if(A[1]<B[1]){
                    Z=c(Z,A[1])
                    A=A[-1]
                }else{
                    Z=c(Z,B[1])
                    B=B[-1]
                }
#...to here. Following line both finishes merge function and handles 'else' case:
        c(Z,A,B)
    }

পরীক্ষার কেস:

> L=length;s=function(S)if(L(S)<2){S}else{h=1:(L(S)/2);A=s(S[h]);B=s(S[-h]);Z=c();if(A[L(A)]>B[1])while(L(A)&L(B))if(A[1]<B[1]){Z=c(Z,A[1]);A=A[-1]}else{Z=c(Z,B[1]);B=B[-1]};c(Z,A,B)}
> s(c(2397725, 1925225, 3304534, 7806949, 4487711, 8337622, 2276714, 3088926, 4274324,  667269))
 [1]  667269 1925225 2276714 2397725 3088926 3304534 4274324 4487711 7806949 8337622
> s(c(2, 2, 1, 9, 3, 7, 4, 1, 6, 7))
 [1] 1 1 2 2 3 4 6 7 7 9
> s(c(72, 59, 95, 68, 84))
 [1] 59 68 72 84 95
> s(c(9, 8, 3, 2, 4, 6, 5, 1, 7, 0))
 [1] 0 1 2 3 4 5 6 7 8 9

2

স্কালা, 243 বাইট ফাংশন (315 বাইট স্ট্যান্ড-একল অ্যাপ্লিকেশন), মার্জেসোর্ট

এই উত্তরটি কোনও ক্রিয়াকলাপের উদ্দেশ্যে করা হয়েছে তবে এটি স্ট্যান্ড-অ্যালোন অ্যাপ্লিকেশন হিসাবে বাড়ানো যেতে পারে।

কেবলমাত্র ফাংশন (243 বাইট):

object G{
type S=Stream[Int]
def m(f:(S,S)):S=f match{
case(x#::a,b@(y#::_))if x<=y=>x#::m(a,b)
case(a,y#::b)=>y#::m(a,b)
case(a,Empty)=>a
case(_,b)=>b}
def s(a:S):S=if(a.length>1)((q:S,w:S)=>m(s(q),s(w))).tupled(a.splitAt(a.length/2))else a
}

একা থাকা অ্যাপ্লিকেশন (315 বাইট):

object G extends App{
type S=Stream[Int]
def m(f:(S,S)):S=f match{
case(x#::a,b@(y#::_))if x<=y=>x#::m(a,b)
case(a,y#::b)=>y#::m(a,b)
case(a,Empty)=>a
case(_,b)=>b}
def s(a:S):S=if(a.length>1)((q:S,w:S)=>m(s(q),s(w))).tupled(a.splitAt(a.length/2))else a
println(s(args(0).split(",").map(_.toInt).toStream).toList)
}

ব্যবহার:

ফাংশন: G.s(List(**[Paste your array here]**).toStream).toList

অ্যাপ্লিকেশন: sbt "run **[Paste your array here]**"

উদাহরণ ইনপুট:

scala> G.s(List(10,2,120,1,8,3).toStream).toList

(OR)

$ sbt "run 5423,123,24,563,65,2,3,764"

আউটপুট:

res1: তালিকা [অন্তর্] = তালিকা (1, 2, 3, 8, 10, 120)

অথবা

তালিকা (2, 3, 24, 65, 123, 563, 764, 5423)

সীমাবদ্ধতা এবং বিবেচনাগুলি:

  • স্ক্যালজ প্রয়োজন (খুব সাধারণ পাঠাগার, এখানে বাছাই করার জন্য ব্যবহৃত হয় না)
  • 100% কার্যক্ষম (কিছুই পরিবর্তনযোগ্য নয়!)

অ্যাট্রিবিউশন:


2

জেলি, 29 বাইট, মার্জ সাজান

অরলপের পাইথন উত্তরের মতো, list.pop(0)এটি হুডের অধীনে ব্যবহার করে, যা O(n)বাস্তবায়িত হয় তবে এটি প্রয়োগটি আনুষ্ঠানিকভাবে হয় O(n log n)

ṛð>ṛḢð¡Ḣ;ñ
ç;ȧ?
s2Z߀ç/µL>1µ¡

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

ব্যাখ্যা

               Define f(x, y):    (merge helper)
                 Implicitly store x in α.
ṛ    ð¡          Replace it with y this many times:
 ð>ṛḢ              (x > y)[0].
       Ḣ         Pop the first element off that list (either x or y).
        ;ñ       Append it to g(x, y).

               Define g(x, y):    (merge)
  ȧ?             If x and y are non-empty:
ç                  Return f(x, y)
                 Else:
 ;                 Return concat(x, y).

               Define main(z):    (merge sort)
       µL>1µ¡    Repeat (len(z) > 1) times:
s2                 Split z in chunks of length two.   [[9, 7], [1, 3], [2, 8]]
  Z                Transpose the resulting array.     [[9, 1, 2], [7, 3, 8]]
   ߀              Apply main() recursively to each.  [[1, 2, 9], [3, 7, 8]]
     ç/            Apply g on these two elements.     [1, 2, 3, 7, 8, 9]

আপনি কিছু ব্যাখ্যা যোগ করতে দয়া করে দয়া করে।

অনেক কিছু ব্যাখ্যা করার আছে :) আমাকে দেখতে দিন আমি শেষ লাইনটি আরও খানিকটা বেশি গল্ফ করতে পারি কিনা
লিন

আপনি যখন বলছেন বাস্তবায়নটি হ'ল (এন লগ এন) তবে এটি হুডের অধীনে list.pop (0) ব্যবহার করে যা হে (এন) আমি বিভ্রান্ত হয়ে পড়েছি। আপনি কি বোঝাতে চেয়েছেন?

অর্প তার উত্তরে যা লিখেছিল ঠিক তার অর্থ: এটি ও (এন লগ এন) নয় কারণ .pop(0)এটি ও (এন), মার্জ ফাংশনকে ও (এন ^ 2) তৈরি করে। তবে এটি মোটামুটি কৃত্রিম, যেমন .pop(0)সহজে ও (1) হতে পারে।
লিন

জেলি পাইথনে প্রয়োগ করা হয় এবং হিসাবে বাস্তবায়ন করা হয় .pop(0)
লিন

1

রুবি, 167 বাইট

গল্ফড মার্জ সাজানোর অ্যালগরিদম, যা সবচেয়ে খারাপ ক্ষেত্রে আছে (এন লগ এন)

f=->x{m=->a,b{i,j,l,y,z=0,0,[],a.size,b.size
while i<y&&j<z
c=a[i]<b[j]
l<<(c ?a[i]:b[j])
c ?i+=1:j+=1
end
l+=a[i,y]+b[j,z]}
l=x.size
l>1?m[f[x[0,l/2]],f[x[l/2,l]]]:x}

এখানে পরীক্ষা!

কোডটি পরীক্ষা করতে, অনুলিপি করুন এবং উইন্ডোতে কোডটি আটকান এবং puts f[x]নীচে যুক্ত করুন, যেখানে এক্স ইনপুট সহ একটি অ্যারে। (নিশ্চিত হয়ে নিন যে আপনি অবশ্যই রুবি ভাষা হিসাবে বেছে নিয়েছেন) উদাহরণস্বরূপ,puts f[[2, 2, 1, 9, 3, 7, 4, 1, 6, 7]]


এই জন্য আপনাকে ধন্যবাদ! আপনি এটি কাজ করে দেখাতে পারেন?

1
আমি একটি লিঙ্ক যুক্ত করেছি যাতে আপনি এটি পরীক্ষা করতে পারেন।
মান কালি

1

রুবি, 297 বাইট

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

if $0==__FILE__;v=open(ARGV[0]).readlines.map{|e|e.to_i}.map{|e|[e]};v=v.each_slice(2).map{|e|a,b,r=e[0],e[1],[];while true;if(!a)||a.empty?;r+=b;break;end;if(!b)||b.empty?;r+=a;break;end;r<<(a[0]<b[0]?a:b).shift;end;r}while v.size>1;open(ARGV[1],"w"){|f|f.puts(v[0].join("\n"))if !v.empty?};end

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

আপনি যদি এটি কোনও ফাংশনের পরিবর্তে পুরো প্রোগ্রাম হিসাবে রাখছেন, তবে আমি কি যথাক্রমে ইনপুট / আউটপুট হিসাবে STDIN এবং STDOUT ব্যবহার করার পরামর্শ দেব? ওভারের সাথে $stdin.readlinesইতিমধ্যে কম বাইট রয়েছেopen(ARGV[0]).readlinesputsopen(ARGV[1],"w"){|f|f.puts
মান কালি

2
এবং if $0==__FILE__কোড গল্ফের মতো জিনিসগুলি সত্যই অপ্রয়োজনীয়। আপনি প্রতিটি ;নতুন লাইনের সাথে প্রতিস্থাপন করে কনডিজারও করতে পারেন - এটি একই বাইট গণনা এবং (সম্ভবত) কোডের অনুভূমিক স্ক্রোলটি সরিয়ে দেয়। এছাড়াও, আমি রুবিতে গল্ফ করার টিপস চেক করার পরামর্শ দেব ।
দানিরো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.