ব্রেনএফ কুইকসোর্ট কার্যকর করুন *** [বন্ধ]


32

স্ট্যাক ওভারফ্লোতে লাউঞ্জ রুমে আলোচিত:

আপনি যদি ন্যূনতম জ্ঞান রাখেন এমন কোনও ভাষায় এন.উইকিপিডিয়া.আর / উইকি / কুইকোর্টের দেওয়া কুইকোর্টস অ্যালগরিদমটি বাস্তবায়ন করতে না পারেন তবে আপনি অন্যরকম পেশা বিবেচনা করতে চাইতে পারেন। @sbi

তবে এসবিআই আরও উল্লেখ করেছে যে সম্ভবত ব্রেইনএফ *** ব্যতিক্রম ছিল।

সুতরাং, ধাঁধা / চ্যালেঞ্জ এখানে: ব্রেনএফ *** তে কুইকসোর্ট কার্যকর করুন । বাস্তবায়ন অবশ্যই

  • দ্বারা ব্যাখ্যা করা এই এবং / অথবা অনুবাদক (গুলি) দ্বারা এখানে (বড় স্ক্রিপ্ট জন্য)
  • উইকিপিডিয়ায় বর্ণিত অ্যালগরিদমটি বাস্তবায়িত করুন - যদি সম্ভব হয় তবে কোনও স্থানের ক্ষেত্রে বাছাই করুন
  • নিম্নলিখিত সংখ্যার তালিকাটি সাজান: [0,4,6,4,2,3,9,2,3,6,5,3] এবং ফলাফল মুদ্রণ করুন

কিছুটা অনুসন্ধান করে আমি একটি বাস্তবায়ন খুঁজে পেতে সক্ষম , তবে এটি 6 কেবি (এবং হাস্কেল থেকে সংকলিত)।
পিটার টেলর

@ পিটার আসলে মাইক্রোফাক বাস্তবায়ন সংরক্ষণাগারের অভ্যন্তরে 474.2 কে - যা আমার প্রত্যাশার চেয়ে কিছুটা বড় (এবং অন-লাইন ইন্টারপ্রেটারের পক্ষে খুব বড়)। হয়তো আমি লক্ষ্য অনুবাদক পরিবর্তন করা উচিত .. (কিন্তু আমি চাই ভালবাসেন দেখতে কিছু হাতে লেখা)
রোনাল্ড

22
আমি বাজি দিয়েছি যে পরিবর্তে আমি বুদ্বুদ সাজানোর কাজ করতে পারি এবং কোডটির দিকে নজর দেওয়া কেউই পার্থক্যটি জানতে পারে না ...
পিটার ওলসন

1
@ কিথের ধারণাটি হ'ল সত্যিকার অর্থেই কুইকসোর্ট বাস্তবায়ন করা, কেবল কোনও ধরণের কাজ করবে না ... :-)
রোনাল্ড

1
@ পিটার অফ কর্ন: আমরা খারাপ পারফরম্যান্সের মাধ্যমে বুদবুদ আবিষ্কার করব।
ব্যবহারকারী অজানা

উত্তর:


55

BrainF * (697 বাইট)

>>>>>>>>,[>,]<[[>>>+<<<-]>[<+>-]<+<]>[<<<<<<<<+>>>>>>>>-]<<<<<<<<[[>>+
>+>>+<<<<<-]>>[<<+>>-]<[>+>>+>>+<<<<<-]>[<+>-]>>>>[-<->]+<[>->+<<-[>>-
<<[-]]]>[<+>-]>[<<+>>-]<+<[->-<<[-]<[-]<<[-]<[[>+<-]<]>>[>]<+>>>>]>[-<
<+[-[>+<-]<-[>+<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<]<<[>>+<<-]>[>[>+>
>+<<<-]>[<+>-]>>>>>>[<+<+>>-]<[>+<-]<<<[>+>[<-]<[<]>>[<<+>[-]+>-]>-<<-
]>>[-]+<<<[->>+<<]>>[->-<<<<<[>+<-]<[>+<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]
<<]>[[-]<<<<<<[>>+>>>>>+<<<<<<<-]>>[<<+>>-]>>>>>[-[>>[<<<+>>>-]<[>+<-]
<-[>+<-]>]<<[[>>+<<-]<]]>]<<<<<<-]>[>>>>>>+<<<<<<-]<<[[>>>>>>>+<<<<<<<
-]>[<+>-]<+<]<[[>>>>>>>>+<<<<<<<<-]>>[<+>-]<+<<]>+>[<-<<[>+<-]<[<]>[[<
+>-]>]>>>[<<<<+>>>>-]<<[<+>-]>>]<[-<<+>>]>>>]<<<<<<]>>>>>>>>>>>[.>]

নীচে একটি টীকাযুক্ত সংস্করণ। এটি বিকাশকালে কী ঘটবে বলে মনে করা হয়েছিল সে সম্পর্কে নজর রাখার জন্য, আমি একটি মন্তব্য স্বরলিপি ব্যবহার করেছি যা দেখে মনে হচ্ছে:|a|b=0|c=A0|@d|A0|A1|```|

|a| represents a named cell
|b=X| means we know the cell has value X, where X can be a constant or a variable name
|@d|  means the data pointer is in this cell
|A0|A1|```| is variable length array. (using ``` for ... because . is a command)

বামদিকে প্রক্রিয়া করার জন্য পার্টিশনের একটি বাম-বর্ধমান স্ট্যাক, কেন্দ্রে একটি স্ক্র্যাচ স্পেস এবং ডানদিকে অ্যারেটি বাছাই করে মেমরিটি রেখে দেওয়া হয়েছে। অ্যারে সূচকটি সূচকযুক্ত একটি "ডেটা বাস" সরিয়ে এবং অ্যারের মাধ্যমে কাজের স্থানটি পরিচালনা করা হয়। উদাহরণস্বরূপ, একটি 3-প্রশস্ত বাস |i|data|0|A0|A1|A2, |A0|i-1|data|0|A1|A2একের পর এক স্থানান্তরিত হয়ে উঠবে । পার্টিশনটি উচ্চ এবং নিম্ন উপাদানগুলির মধ্যে বাস রেখে পার্টিশনটি সঞ্চালিত হয়।
এখানে সম্পূর্ণ সংস্করণ:

Get input
>>>>>>>> ,[>,]                      |A0|A1|```|An|@0|
Count items
<[ [>>>+<<<-]>[<+>-]<+ <]  |@0|n|0|0|A0|A1|```
Make 8wide data bus w/ stack on left
>[<<<<<<<<+>>>>>>>>-]  ```|K1=n|K0=0|Z=0|a|b|c|d|e|@f|g|X=0|A0|A1|```
K1 and K0 represent the first index to process (I) and one past the last (J)
Check if still partitions to process
<<<<<<<<[
  Copy K1 to a&c via Z
  [>>+>+>>+<<<<<-]>>[<<+>>-] ```|K1=J|K0=I|@Z=0|a=J|b|c=J|d|e|f|g|X=0|A0|A1|```
  Copy K0 to b&d via Z
  <[>+>>+>>+<<<<<-]>[<+>-] ```|K1|K0|@Z=0|a=J|b=I|c=J|d=I|e|f|g|X=0|A0|A1|```
  Check if J minus I LE 1 : Subtract d from c
  >>>>[-<->]                    |a=J|b=I|c=JminusI|@d=0|e|f|g|
  d= c==0; e = c==1
  +<[>- >+<<-[>>-<<[-]]]        |a=J|b=I|@c=0|d=c==0|e=c==1|f|g|
  if d or e is 1 then J minus I LE 1: partition empty
  >[<+>-]>[<<+>>-]<+<      |a=J|b=I|@c=isEmpty|d=1|e=0|f|g|
  If Partition Empty;
  [->-                      |a=J|b=I|@c=0|d=0|c=0|f|g|
    pop K0: Zero it and copy the remaining stack right one; inc new K0
    <<[-]<[-]<<[-]<[[>+<-]<]>>[>]<+    ``|K1|@Z=0|a=J|b=I|c=0|d=0|e|f|g|
  Else:
  >>>>]>[-                   Z|a=J|b=I|c=isEmpty=0|@d=0|e|f|g|X|A0|A1
    Move Bus right I plus 1 frames; leaving first element to left
    <<+[ -[>+<-]<-[>+<-]>>>>>>>>      (dec J as we move)
      [<<<<<<<<+>>>>>>>>-]<<<<<< ]      Z|Ai|a=J|@b=0|c=0|d|e|f|g|X|Aq
    first element becomes pivot Ap; store in b
    <<[>>+<<-]            Z|@0|a=J|b=Ap|c=0|d|e|f|g|X|Aq
    While there are more elements (J GT 0);
    >[                    Z|0|@a=J|b=Ap|c=0|d|e|f|g|X|Aq
      copy Ap to e via c
      >[>+>>+<<<-]>[<+>-]  Z|0|a=J|b=Ap|@c=0|d=0|e=Ap|f|g|X=0|Aq
       copy Aq to g via X
      >>>>>>[<+<+>>-]<[>+<-] |c|d=0|e=Ap|f|g=Aq|@X=0|Aq
      Test Aq LT Ap:  while e; mark f; clear it if g 
      <<<[ >+>[<-]<[<]           |@d=0|e|f=gLTe|g|
        if f: set d and e to 1; dec e and g 
        >>[<<+>[-]+>-]>-<<-]
      set g to 1; if d: set f 
      >>[-]+<<< [->>+<<]
      If Aq LT Ap move Aq across Bus
      >>[->- <<<<<[>+<-] <[>+<-] >>>>>>>>
        [<<<<<<<<+>>>>>>>>-] <<]  Z|0|Aq|a=J|b=Ap|c|d|e|@f=0|g=0|X=0|Ar
      Else Swap AQ w/ Aj: Build a 3wide shuttle holding J and Aq                
      >[[-] <<<<<<[>>+>>>>>+<<<<<<<-]>>[<<+>>-] |@c=0|d|e|f=0|g=0|X=J|Aq|Ar|```
      If J then dec J
      >>>>>[-
        & While J shuttle right
        [>>[<<<+>>>-]<[>+<-]<-[>+<-]>] |a=J|b=Ap|c|d|e|f|Ar|```|Aj|g=0|@X=0|Aq|
        Leave Aq out there and bring Aj back
        <<[ [>>+<<-] < ]              |a=J|b=Ap|c|d|e|@f=0|g|X=0|Ar|```|Aj|Aq|
      ]>]
    Either bus moved or last element swapped; reduce J in either case
    <<<<<<-]                 |Aq|@a=0|b=Ap|c|d|e|f|g|X|Ar|```|
    Insert Ap To right of bus
    >[>>>>>>+<<<<<<-]        |Aq|a=0|@b=0|c|d|e|f|g|Ap|Ar|```|
    Move the bus back to original location tracking pivot location
    <<[ [>>>>>>>+<<<<<<<-]>[<+>-]<+ <]     
    <[ [>>>>>>>>+<<<<<<<<-]>>[<+>-]<+ <<] |K1|K0|@Z=0|a=0|b=p|c|d|e|f|g|X|Ar|```
    if p is not 0:  put new partition on stack between K0 and K1:
    >+>[<-                                 |K1|K0|Z=0|@a=pEQ0|b=p|
      move K0 to Z; search for last K
      <<[>+<-] <[<]                           |@0|Kn|```|K1|0|Z=K0|a=0|b=p| 
      shift left until return to 0 at K0;
      >[ [<+>-] >]                            |Kn|```|K1|0|@0|Z=K0|a=0|b=p|
      put p one left of there making it K1; restore K0 from Z;
      >>>[<<<<+>>>>-]<<[<+>-]                 |Kn|```|K2|K1=p|K0|@Z=0|a=0|b=0|
    else increment K0 (special case when first partition empty) 
    >>]<[- <<+>>]              
  >>>]  End if !empty
<<<<<<] End If Partitions remaining   @K1=0|K0=0|Z=0|a|b|c|d|e|f|g|X=0|A0|A1|```
Print the Results
>>>>>>>>>>>[.>]

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

1
বিএফ-এর সমস্ত কিছু জটিল হয়ে ওঠে :) এমনকি দক্ষ হিসাবে কীভাবে আপাতদৃষ্টিতে সহজ জিনিসগুলি ঠিক if (i<j) {} else {}করার জন্য বেশ কয়েকটি প্রচেষ্টা নিয়েছিল। এবং প্রান্তের মামলা হত্যাকারীরা are আমি জানি না যে আমি কতবার "কেবলমাত্র এই একটি ছোট জিনিসটি রেখেছি ..." ভেবেছিলাম এবং তারপরে একটি পরীক্ষার কেস আবিষ্কার করেছি যার ফলে আরও কয়েক ঘন্টা কাজ পরিচালিত হয়েছিল। আমি মনে করি আমি কয়েক ডজন চরিত্রের মাধ্যমে এটি হ্রাস করতে পারি, তবে আমি নিশ্চিত হতে পারি না যে আমি চেষ্টাটি করতে চাই।
এশেলি

একটি শব্দ: বাহ! আমি সত্যই এটি মানবিকভাবে সম্ভব বলে মনে করি নি। আমি এটির মাধ্যমে কয়েকটি ইনপুট চালাতে যাচ্ছি এটি কীভাবে কাজ করে তা দেখতে :-)
রোনাল্ড

এপিক! শুধু মহাকাব্য!
বনাম

কেবলমাত্র "পবিত্র চ * সি কে!"
ম্যাথ চিলার

11

ব্রেনফাক (178 বাইট)

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

যথারীতি, আমার প্রথম কার্যকরী সংস্করণটি 392 ডলার বাইট হওয়ার দরকারের দ্বিগুণ ছিল। অসংখ্য পরিবর্তন এবং দুটি বা তিনটি নতুন লেখাগুলি এই তুলনামূলকভাবে করুণাময় 178-বাইট সংস্করণ তৈরি করেছে। (যদিও মজাদারভাবে একটি রৈখিক-সময় সাজানো কেবল 40 বাইট।

>+>>>>>,[>+>>,]>+[--[+<<<-]<[[<+>-]<[<[->[<<<+>>>>+<-]<<[>>+>[->]<<[<]
<-]>]>>>+<[[-]<[>+<-]<]>[[>>>]+<<<-<[<<[<<<]>>+>[>>>]<-]<<[<<<]>[>>[>>
>]<+<<[<<<]>-]]+<<<]]+[->>>]>>]>[brainfuck.org>>>]

ইনপুট মানগুলি প্রতি তিনটি কক্ষকে পৃথক করে: প্রতিটি (ভি) আলিউ সেলের জন্য, একটি (এল) আবেল ঘর (নেভিগেশনের জন্য ব্যবহৃত) এবং (এস) ক্র্যাচ স্পেসের জন্য আরও একটি ঘর রয়েছে। অ্যারের সামগ্রিক বিন্যাস হ'ল

0 1 0 0 0 এসভিএলএসভিএল ... এসভিএল 0 0 0 0 0 0 ...

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

সাববারে বিভাজন করতে আমরা পাইভট হিসাবে কাজ করতে তার ডানদিকের মানটি একটি এস কোষে টানুন এবং এটিকে সাববারেতে একে অপরের মানের সাথে তুলনা করে এবং প্রয়োজনীয় হিসাবে অদলবদল করে এটিকে (এবং সংশ্লিষ্ট খালি ভি সেল) বামে নিয়ে আসি। শেষে পিভটটি আবার অদলবদল করে, একই অদলবদল কোডটি ব্যবহার করে (যা 50 টি বাইট বাঁচায়)। বিভাজনের সময় দুটি অতিরিক্ত এল কোষ 0 তে সেট করা থাকে, যাতে দুটি কক্ষ একে অপরের সাথে অদলবদলের প্রয়োজন হতে পারে চিহ্নিত করে; পার্টিশন শেষে, বাম 0 টি 0 টি দিয়ে সুবারির বামে ফিউজ করবে এবং ডান 0 টি তার পিভট চিহ্নিত করবে। এই প্রক্রিয়াটি এল সেলটিতে সুব্রয়ের ডানদিকে অতিরিক্ত 1 রেখে দেয়; মূল লুপটি এই ঘরে শুরু হয় এবং শেষ হয়।

>+>>>>>,[>+>>,]>+[                      set up; for each subarray:
    --[+<<<-]<[                         find the subarray; if it exists:
        [<+>-]<[                        S=pivot; while pivot is in S:
            <[                          if not at end of subarray
                ->[<<<+>>>>+<-]         move pivot left (and copy it) 
                <<[>>+>[->]<<[<]<-]>    move value to S and compare with pivot
            ]>>>+<[[-]<[>+<-]<]>[       if pivot greater then set V=S; else:
                [>>>]+<<<-<[<<[<<<]>>+>[>>>]<-]     swap smaller value into V
                <<[<<<]>[>>[>>>]<+<<[<<<]>-]        swap S into its place
            ]+<<<                       end else and set S=1 for return path
        ]                               subarray done (pivot was swapped in)
    ]+[->>>]>>                          end "if subarray exists"; go to right
]>[brainfuck.org>>>]                    done sorting whole array; output it

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

এটাই; তবে 392 বাইটের 4 সংস্করণটিও মূর্খতাযুক্ত মস্তিষ্কের ফাক ছিল। এটি 39 বা তত সংস্করণ। :)
ড্যানিয়েল ক্রিস্টোফানি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.