BrainF এ দ্রুততম বাছাই করুন ***


15

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

সুতরাং এখানে "দ্রুততম BrainF *** বাছাই রুটিন এভার" বাস্তবায়নের জন্য একটি চ্যালেঞ্জ। আমি নীচের দোভাষী ব্যবহার করে সমস্ত এন্ট্রি সময় করব। ইন্টারপ্রেটার স্বাক্ষরবিহীন অক্ষরের 16 কে টেপ ব্যবহার করে। সীমা ছাড়িয়ে অগ্রসর / বর্ধিত হলে টেপ এবং ঘর উভয়ই মোড়ানো হয়। ইওএফ পড়াটি বর্তমান ঘরে একটি 0 রাখে। পরিমাপকৃত সময়টিতে উত্স ফাইলটি পার্স করার সময় এবং সমস্ত ইনপুট ফাইল প্রক্রিয়া করার সময় উভয়ই অন্তর্ভুক্ত। দ্রুততম কোড জিতেছে।

পরীক্ষার ভেক্টরটি আস্কি ফাইলগুলির একটি সেট যা প্রকারের কেসগুলি বাছাইয়ের জন্য ডিজাইন করা হয়েছে including

  • ইতিমধ্যে সাজানো তালিকা: "অর্ডার করা"

    &#33;"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
    
  • একটি বিপরীত সাজানো তালিকা: "বিপরীত"

    ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!
    
  • কয়েকটি অনন্য মানগুলির অনেকগুলি অনুলিপি সমন্বিত একটি ফাইল: "কেবলমাত্র"

    ibbkninbkrauickabcufrfckbfikfbbakninfaafafbikuccbariauaibiraacbfkfnbbibknkbfankbbunfruarrnrrrbrniaanfbruiicbuiniakuuiubbknanncbuanbcbcfifuiffbcbckikkfcufkkbbakankffikkkbnfnbncbacbfnaauurfrncuckkrfnufkribnfbcfbkbcrkriukncfrcnuirccbbcuaaifiannarcrnfrbarbiuk
    
  • সম্পূর্ণ এলোমেলো আসকি ফাইল: "এলোমেলো"

    'fQ`0R0gssT)70O>tP[2{9' 0.HMyTjW7-!SyJQ3]gsccR'UDrnOEK~ca 'KnqrgA3i4dRR8g.'JbjR;D67sVOPllHe,&VG"HDY_'Wi"ra?n.5nWrQ6Mac;&}~T_AepeUk{:Fwl%0`FI8#h]J/Cty-;qluRwk|S U$^|mI|D0\^- csLp~`VM;cPgIT\m\(jOdRQu#a,aGI?TeyY^*"][E-/S"KdWEQ,P<)$:e[_.`V0:fpI zL"GMhao$C4?*x
    
  • ১.২55৫ এর মধ্যে একটি এলোমেলো ফাইল: "পুরোরেজ"

    öè—@œ™S±ü¼ÓuǯŠf΀n‚ZÊ,ˆÖÄCítÚDý^öhfF†¬I÷xxÖ÷GààuÈ©ÈÑdàu.y×€ôã…ìcÑ–:*‰˜IP¥©9Ä¢¬]Š\3*\®ªZP!YFõ®ÊÖžáîÓ¹PŸ—wNì/S=Ìœ'g°Ì²¬½ÕQ¹ÀpbWÓ³
    »y  »ïløó„9k–ƒ~ÕfnšÂt|Srvì^%ÛÀâû¯WWDs‰sç2e£+PÆ@½ã”^$f˜¦Kí•òâ¨÷ žøÇÖ¼$NƒRMÉE‹G´QO¨©l¬k¦Ó 
    

প্রতিটি ইনপুট ফাইলের সর্বাধিক 255 বাইট থাকে।

এখানে দোভাষী। এটি কনসোল-মোড উইন্ডোজের জন্য লেখা, তবে পোর্ট করা সহজ হওয়া উচিত: কেবল প্রতিস্থাপন করুন read_time()এবং sysTime_to_ms()প্ল্যাটফর্ম-নির্দিষ্ট সমতুল্য সহ।
ব্যবহার: bftime program.bf infile1 [infile2 ...]

#include <windows.h>
#include <stdio.h>

#define MS_PER_SEC  1000.0f
#define MAXSIZE  (0x4000)
#define MAXMASK  (MAXSIZE-1)

typedef  __int64 sysTime_t;
typedef unsigned char Uint8;
typedef unsigned short Uint16;

typedef struct instruction_t {
   Uint8 inst;
   Uint16 pair;
} Instruction;

Instruction prog[MAXSIZE] = {0};
Uint8 data[MAXSIZE] = {0};
const Uint8 FEND = EOF;

sysTime_t read_time() {
    __int64 counts;
    QueryPerformanceCounter((LARGE_INTEGER*)&counts);
    return counts;
}

float sysTime_to_ms(sysTime_t timeIn) {
    __int64 countsPerSec;
    QueryPerformanceFrequency((LARGE_INTEGER*)&countsPerSec);
    return (float)timeIn * MS_PER_SEC / (float)countsPerSec;
}

int main(int argc, char* argv[])
{
   FILE* fp;
   Uint8 c;
   Uint16 i = 0;
   Uint16 stack = 0;
   sysTime_t start_time;
   sysTime_t elapsed=0,delta;

   if (argc<3) exit(printf("Error: Not Enough Arguments\n"));
   fp = fopen(argv[1],"r");
   if (!fp) exit(printf("Error: Can't Open program File %s\n",argv[1]));

   start_time=read_time();
   while (FEND != (c = fgetc(fp)) && i <MAXSIZE) {
      switch (c)  {
      case '+': case '-': case ',': case '.': case '>': case '<':
         prog[++i].inst = c;
         break;
      case '[': 
         prog[++i].inst = c;
         prog[i].pair=stack;
         stack = i;
         break;
      case ']': 
         if (!stack) exit(printf("Unbalanced ']' at %d\n",i));
         prog[++i].inst = c;
         prog[i].pair=stack;
         stack = prog[stack].pair;
         prog[prog[i].pair].pair=i;
         break;
      }
   }
   if (stack) exit(printf("Unbalanced '[' at %d\n",stack));
   elapsed = delta = read_time()-start_time;
   printf("Parse Time: %f ms\n", sysTime_to_ms(delta));

   for (stack=2;stack<argc;stack++) {
      Instruction *ip = prog;
      fp = fopen(argv[stack],"r");
      if (!fp) exit(printf("Can't Open input File %s\n",argv[stack]));
      printf("Processing %s:\n", argv[stack]);
      memset(data,i=0,sizeof(data));

      start_time=read_time();
      //Run the program
      while (delta) {
         switch ((++ip)->inst) {
         case '+': data[i]++; break;
         case '-': data[i]--; break;
         case ',': c=getc(fp);data[i]=(FEND==c)?0:c; break;
         case '.': putchar(data[i]);  break;
         case '>': i=(i+1)&MAXMASK;   break;
         case '<': i=(i-1)&MAXMASK;   break;
         case '[': if (!data[i]) ip = prog+ip->pair; break;
         case ']': if (data[i])  ip = prog+ip->pair;  break;
         case 0: delta=0; break;
         }
      }
      delta = read_time()-start_time;
      elapsed+=delta;
      printf("\nProcessing Time: %f ms\n", sysTime_to_ms(delta));
   }
   printf("\nTotal Time for %d files: %f ms\n", argc-2, sysTime_to_ms(elapsed));
}

এখনও পর্যন্ত ফলাফল

ভেক্টর সম্পূর্ণ সেট 5 র গড় গড় সময় এখানে:

 Author    Program      Average Time    Best Set          Worst Set
 AShelly   Quicksort    3224.4 ms       reverse (158.6)   onlynine (1622.4) 
 K.Randall Counting     3162.9 ms       reverse (320.6)   onlynine  (920.1)
 AShelly   Coinsort      517.6 ms       reverse  (54.0)   onlynine  (178.5) 
 K.Randall CountingV2    267.8 ms       reverse  (41.6)   random     (70.5)
 AShelly   Strandsort    242.3 ms       reverse  (35.2)   random     (81.0)

ইনপুট উপাদানগুলির পরিসীমা কত?
কিথ রান্ডাল 3

এটি 0: 1-255 ব্যতীত কক্ষগুলির পরিসর।
অ্যাশেলি

আপনার আমার পুনর্বার সময় করা উচিত, আমি এটিকে কিছুটা দ্রুত করেছি।
কিথ র্যান্ডাল

এটি আমার সাম্প্রতিকতম চেয়ে 2x এর চেয়ে বেশি দ্রুত বলে মনে হচ্ছে - আমি যখন অন্যদের জন্য ব্যবহৃত মেশিনে ফিরে আসি তখন আমি অফিসিয়াল সময়টি করব।
এশেলি

উত্তর:


9

এখানে আমার ক্রিকোসোর্টের চেয়ে কমপক্ষে 6x দ্রুত একটি সাজানোর ব্যবস্থা রয়েছে। এটি একটি অ্যালগরিদম যা একটি traditionalতিহ্যগত ভাষায় সামান্য অর্থ উপস্থাপন করতে পারে, কারণ এটি ও (এন * মি) যেখানে এম সর্বাধিক ইনপুট মান। ইনপুট সংগ্রহ করার পরে, এটি অ্যারে দিয়ে চলে যায়, সেলগুলি 0 0 গণনা করে এবং তারপরে প্রতিটি হ্রাস করে। এরপরে countফলাফল ভেক্টরের প্রথম কক্ষে 1 যুক্ত করে । এটি গণনা 0 না হওয়া পর্যন্ত পাসগুলি পুনরাবৃত্তি করে
B

Get Input
>,[>>+>,]   
Count values GT 0 and decrement each
<[<[<<<+>>>-]<[-<<+>>>]>[<]<<]
While count: add 1 to results
<[[[<<+>>-]<+<-]
Seek back to end of input
>[>>]>>>[>>>]
Repeat counting step
<<<[<[<<<+>>>-]<[-<<+>>>]>[<]<<]<]
Seek to far end of results and print in reverse order 
<[<<]>>[.>>]

সি সমতুল্য অ্যালগরিদম:

 uchar A[MAX]={0}; uchar R[MAX]={0}; int count,i,n=0;
 while (A[n++]=getchar()) ;
 do { 
   count = 0;
   for (i=0; i<n; i++) count += (A[i]) ? (A[i]-->0) : 0;
   for (i=0; i<count; i++) R[i]++; 
 } while (count>0);
 for (i=0; R[i]; i++) ;
 for (i--; i>=0; i--) putchar(R[i]);

এখানে এটি 2x হিসাবে দ্রুত। এটি "স্প্যাগেটি সাজানোর" ভিত্তিতে আলগাভাবে ভিত্তি করে : প্রতিটি ইনপুট হিসাবে এটি দীর্ঘ 1 এস স্ট্রিং রাখে। প্রতিটি কক্ষের মান অন্ততঃ দীর্ঘ দীর্ঘ স্ট্র্যান্ডের সংখ্যা উপস্থাপন করে। (সুতরাং [3,2,1,2] হয়ে যায় |4|0|3|0|1|0|0|)। তারপরে এটি স্ট্র্যান্ডগুলি 'পরিমাপ' করা শুরু করে এবং প্রতিটি বারের প্রান্তটি খুঁজে পেলে দৈর্ঘ্যটি মুদ্রণ করে।

>,[ [-[>>+<<-]>+>] <[<<]>,]   build strand of 1s for each input
+>[>+<-]>[                    while there are strands
  >[>+<<->-]                  do any strands end here?
  <[<<.>>-]                   print length of all that do  
  <<[>>+<<-]>>+>>]            shift right 1; inc length 

কাঁচা:

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

গণনা বাছাইয়ের ধাক্কা না! এটি আমার প্রিয় ধরণের, একসময় আমি এটির কাছ থেকে এক বিশাল জয় পেয়েছিলাম: যদি আমি ছোট হিসাবে পরিচিত হয় তবে আপনি অন্যথায় "দ্রুত" অ্যালগরিদমগুলিতে বিশাল স্পিডআপ পেতে পারেন। একইভাবে, বুদ্বুদ বাছাই বেশিরভাগ সাজানো ডেটাতে কুইকোর্টকে মারধর করে। কোনও ___ অ্যালগরিদম প্রতিটি প্রসঙ্গেই সেরা নয়।
বুথবি

আমি মনে করি না এটি ঠিক একটি গণনা বাছাই sort আপনার মন্তব্য আমাকে আরও কিছু গবেষণা করতে বাধ্য করেছে। আমি মনে করি এটি আরও পুঁতি সাজানোর মতো । তবে আমি নিশ্চিত না যে এটি ঠিক।
আশেল্লি

না, আপনি ঠিক বলেছেন। এটি একটি অদ্ভুত সাজান। লিঙ্কযুক্ত তালিকাগুলির তালিকা জড়িত কিছু অ্যাপ্লিকেশনের জন্য দরকারী হতে পারে ... তবে আমি এটির জন্যও সন্দেহজনক।
বুথবি

4
শারীরিক সাদৃশ্যটি হ'ল আপনার কাছে বিভিন্ন আকারের কয়েনের এন স্ট্যাক রয়েছে। অন্য একটি এন স্ট্যাকের জন্য স্থান আলাদা করুন। আপনি প্রতিটি স্ট্যাকের শীর্ষে একটি মুদ্রা ফেলেন যার মুদ্রা রয়েছে এবং তারপরে নতুন সেটটিতে ডান থেকে বামে প্রতিটি স্ট্যাকের সাথে 1 টি যুক্ত করুন আপনার হাত খালি না হওয়া পর্যন্ত। সমস্ত আসল স্ট্যাক খালি না হওয়া পর্যন্ত পুনরাবৃত্তি করুন। এখন নতুন সেট বাম থেকে ডানদিকে সাজানো আছে orted
আশেল্লি

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

এই অ্যালগরিদমটি কার ধারণা ছিল তা আমার মনে নেই। হয়ত বার্ট্রাম ফেলগেনহয়ের? এটি এক দশক আগে, ব্রেইনফাক গল্ফ প্রতিযোগিতা # 2 কাছাকাছি আলোচনার মধ্য দিয়ে এসেছিল।

নমুনা ইনপুটগুলিতে এটি এখনও দ্রুততম।

এটি দৈর্ঘ্যের ইনপুট <256 এর মধ্যেও সীমাবদ্ধ নয়, তবে নির্বিচারে দীর্ঘ ইনপুট পরিচালনা করতে পারে।

এই দুটি জিনিসই নীচে আলবার্টের উত্তরগুলির ক্ষেত্রে সত্য ছিল। এটির সম্পর্কে দুর্দান্ত জিনিসটি হ'ল চলমান সময়টি ইনপুট দৈর্ঘ্যে ও (এন) হয়। হ্যাঁ, এই জিনিসটি আসলে রৈখিক সময়ে চলে। এটি ইতিমধ্যে একটি নাস্তা হিসাবে 255 এর ধ্রুবক ফ্যাক্টরটি খেয়েছে।


3

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

process input
,[

while input is not zero
[

decrement input
-

copy input over to next bucket
[->>>+<<<]

mark next bucket as not the first
>>>>+<

repeat until input is zero
]

increment count for this bucket
>>+

rewind using markers
<[-<<<]<

process next input
,]

generate output
>+[>[<-.+>-]<[->>>+<<<]>>>+]

মন্তব্যবিহীন:

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


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