ইউনিভার্সাল (নিয়ম-নমন) কোড গল্ফ সলভার


14

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

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

আমাদের আউটপুট করতে হবে কেবল এমন একটি ক্রম যা প্রতিটি সম্ভাব্য অনুচ্ছেদটি অন্তর্ভুক্ত করার গ্যারান্টিযুক্ত। এই কোড গল্ফের জন্য, এটি হবে এহরনফুচ্ট-মাইসেলস্কি ক্রম :

ক্রমটি তিনটি বিট 010 দিয়ে শুরু হয়; প্রতিটি ধারাবাহিক অঙ্কটি সিক্যুয়েন্সের দীর্ঘতম প্রত্যয়টি সন্ধান করে গঠিত হয় যা ক্রমগুলির মধ্যেও আগে দেখা যায় এবং সেই প্রত্যয়টির সাম্প্রতিকতম উপস্থিতির পরে কিছুটা পরিপূরক হয়।

বিটগুলির প্রতিটি সীমাবদ্ধ অনুপাতটি স্বতঃস্ফূর্তভাবে ক্রমগুলির মধ্যে প্রায়শই ঘটে

ক্রমের প্রথম কয়েকটি সংখ্যা হ'ল:

010011010111000100001111 ... ( ওইআইএসে ক্রম A038219 )।

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

নির্ভুলতার পরীক্ষার জন্য, ক্রমের প্রথম 256 বাইটের জন্য এখানে হ্যাশ রয়েছে:

MD5: 5dc589a06e5ca0cd9280a364a456d7a4
SHA-1: 657722ceef206ad22881ceba370d32c0960e267f

হেক্সাডেসিমাল নোটেশনে ক্রমের প্রথম 8 বাইটগুলি হ'ল:

4D 71 0F 65 27 46 0B 7C

নিয়মাবলী:

  • আপনার প্রোগ্রামটি অবশ্যই ব্রেট / এএসসিআইআই চরিত্রের সাথে 8 বিট সংযুক্ত করে এহরনফুচ্ট-মাইসেলস্কি ক্রম (অন্য কিছু নয়) আউটপুট করতে হবে।

  • সংক্ষিপ্ততম প্রোগ্রাম (চরিত্রের গণনা) জিতেছে। আপনি যদি প্রতি উত্পন্ন বাইটে রৈখিক সময়ে ক্রম উত্পন্ন করতে পরিচালনা করেন তবে আপনার অক্ষর গণনা থেকে 512 বিয়োগ করুন ।


010 এর দীর্ঘতম প্রত্যয়টি যা আগে এই ক্রমটিতে দেখা গিয়েছিল 0, তাই না? এবং সর্বাধিক সাম্প্রতিক উপস্থিতিটি কেবল দ্বিতীয় ২ And। আমি নেটিভ ইংলিশ স্পিকার নই - সম্ভবত আমার এটি ভুল হয়েছে। উইকিপিডিয়া নিবন্ধটিতে একই শব্দ ব্যবহার করা হয়েছে তবে এর দীর্ঘতর ক্রম রয়েছে তাই আমি এটিকে "অতি সাম্প্রতিক ... যার অনুসারী রয়েছে" নাম রাখব।
ব্যবহারকারী অজানা

8
পেডেন্টিক কুইবল: পাই কখনই উপস্থিত হবে না - কেবলমাত্র প্রতিটি সীমাবদ্ধ স্ট্রিং আউটপুটে থাকবে।
কিথ র্যান্ডাল

আমার আরও একটি প্রশ্ন আছে: একটি পুনরাবৃত্তি ওভারল্যাপ হতে পারে? উদাহরণস্বরূপ 111, (1 [1) 1]?
ব্যবহারকারী অজানা

@ কিথরান্ডাল: আমি এমন একটি ক্রম পছন্দ করব যা গ্যারান্টিযুক্ত যে 'কখনও তোমাকে ছেড়ে দেবে না' এবং একই ধরণের প্রযোজনা রয়েছে।
ব্যবহারকারীর অজানা

2
এটি উল্লেখ করার মতো হতে পারে যে অসীম স্ট্রিংয়ের একটি অনির্দিষ্ট স্থানে এমবেড করা "উত্তর" এর উপস্থিতি অবশ্যই সেই উত্তরটিকে "আউটপুট" হিসাবে বিবেচনা করা যায় না। এছাড়াও, এই নির্দিষ্ট ক্রমটি একটি বিচ্ছিন্ন ক্রমের কেবল একটি উদাহরণ - এর মতো অসীম বহু সিকোয়েন্স রয়েছে।
মাঝামাঝি

উত্তর:


7

সি, –110 অক্ষর

প্রোগ্রামটির এই সংস্করণটি অনুক্রমটি তৈরি করতে লিনিয়ার-রানটাইম অ্যালগরিদম ব্যবহার করে। প্রোগ্রামের 402 টি চর থেকে 512 বাদ দিয়ে মোট 110 টি নেতিবাচক দেয়।

#define C v=calloc(7,8),v->p=p
#define G(F,K)u->F[d[K]]
#define S(F,T)G(f,T)=F,G(t,T)=T,G(n,T)=
struct{int p,f[2],t[2];void*n[2];}r,*u,*v,*w;char*d,c;p,b,h,i,j,k;
main(s){for(;d=++p-s?d:realloc(d,s*=2);){d[i=p]=b;c+=c+b;p%8||putchar(c);
for(u=&r;b=u->p,u->p=p,w=G(n,k=i);S(i,k)v=G(n,k),u=v)for(h=G(f,k),j=G(t,k);j>h;--i,--j)
if(d[i]-d[j]){S(i,k)C;u=v;S(h,j)w;S(0,i)C;b=w->p;goto x;}S(0,i)C;x:b=1-d[b+1];}}

সমস্যা হিসাবে, প্রোগ্রামটি একটি অসীম লুপে সঞ্চালিত হয়, যা প্রচুর মেমরি বরাদ্দের প্রয়োজন হয়, এবং realloc()ক্রমটি সামঞ্জস্য রাখতে ব্যবহার হিপ বিভাজনে অবদান রাখতে পারে। আপনি calloc(7,8)প্রথম লাইনে প্রতিস্থাপন করে প্রোগ্রামটির মেমরির ব্যবহার উন্নত করতে পারেন calloc(1,sizeof*v)। এটি বিশেষত একটি 32-বিট মেশিনে সহায়তা করবে, যেখানে 56 টি দুটির একটি কারণের দ্বারা খুব বড়।

কোডটি একধরনের অপঠনযোগ্য, এবং আকর্ষণীয় উপায়ে নয়; তার জন্য আমি ক্ষমা চেয়ে নিচ্ছি। সত্যি কথা বলতে কি, অদৃশ্য সংস্করণও ভয়ঙ্করভাবে পরিষ্কার নয়:

#include <stdio.h>
#include <stdlib.h>

typedef struct branch branch;
typedef struct node node;

struct branch {
    int from, to;
    node *next;
};

struct node {
    int pos;
    branch br[2];
};

static node root = { 0 };

static unsigned char *data = NULL;
static int endpos = 0;
static int size = 1;

static node *mknode(void)
{
    node *n;

    n = calloc(1, sizeof *n);
    n->pos = endpos;
    return n;
}

static branch *getbranch(node *n, int p)
{
    return &n->br[data[p]];
}

static void setbranch(node *n, int from, int to, node *next)
{
    n->br[data[to]].next = next;
    n->br[data[to]].from = from;
    n->br[data[to]].to = to;
}

int main(void)
{
    node *u, *v, *w;
    int follower, from, i, i0, j;
    int out, b;

    out = b = 0;
    for (;;) {
        ++endpos;
        if (endpos == size) {
            size *= 2;
            data = realloc(data, size);
        }
        data[endpos] = b;
        out = (out << 1) | b;
        if (endpos % 8 == 0) {
            putchar(out);
            out = 0;
        }

        i = endpos;
        u = &root;
        for (;;) {
            follower = u->pos + 1;
            u->pos = endpos;
            w = getbranch(u, i)->next;
            if (!w)
                break;
            i0 = i;
            from = getbranch(u, i0)->from;
            for (j = getbranch(u, i0)->to ; j > from ; --j) {
                if (data[i] != data[j]) {
                    /* divide branch */
                    v = mknode();
                    setbranch(u, i, i0, v);
                    u = v;
                    setbranch(u, from, j, w);
                    setbranch(u, 0, i, mknode());
                    follower = w->pos + 1;
                    goto bitfound;
                }
                --i;
            }
            v = getbranch(u, i0)->next;
            setbranch(u, i, i0, v);
            u = v;
        }
        /* extend branch */
        setbranch(u, 0, i, mknode());

      bitfound:
        b = 1 - data[follower];
    }
}

(উপরে বর্ণহীন কোডটি গ্রাজেগার্জ হারম্যান এবং মাইকেল সল্টিস দ্বারা লিখিত কোডের উপর ভিত্তি করে, সমস্যার বিবরণে উল্লেখ করা হয়েছে এবং সল্টিসের হোম পৃষ্ঠা থেকে ))

প্রাথমিক সংস্করণে বাগ রিপোর্ট করার জন্য @ শ্যাঙ্কাডার এবং @ রিসকে ধন্যবাদ।


নিস! আমি -512 বোনাস দিয়ে এটি প্রত্যাশা করেছি।
schnaader

কোনও ধারণা কেন এটি সিস্টেমে ক্র্যাশগুলির কারণ হয়? গল্ফড, অলোভিত ও mallocসংশোধিত সংস্করণগুলির সমস্তই প্রায় 10000 বাইটের পরে আউটপুট থামায় এবং মেমরি বরাদ্দ করতে থাকে, prog > out.datকেবলমাত্র ~ 700 কেবি মেমরির ব্যবহারের সাথে তাত্ক্ষণিক ক্রাশ দেয়। আমি যদি printf("\n%i\n", size);পরে reallocsertোকান তবে সবচেয়ে বড় আউটপুট 4। সিস্টেম: উইন্ডোজ 7 প্রফেসর -৪-বিট, ৪ জিবি র‌্যাম, জিসিসি ৪.6.১
স্কেনাডার

(+1) আমি দেখতে পেয়েছি যে উবুন্টু १२.০৪ / জিসিসি সহ আপনার উভয় প্রোগ্রামই সঠিকভাবে আউটপুট সংকলন করে এবং উত্পাদন করে ... উইন / / মিংডাব্লু / জিসিসি সহ, উভয় প্রোগ্রামই সংকলন করে তবে বিভাজন ত্রুটি তৈরি করে ... উইন 7 / এলসিসি সহ, অগল্ফড সংস্করণ কাজ করে তবে গল্ফযুক্ত সংস্করণ বিভাজন ত্রুটি তৈরি করে।
মাঝামাঝি

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

দুর্দান্ত, এখন কবজির মতো কাজ করে।
schnaader

6

রুবি, 109 104 101 94 টি অক্ষর

s=?0
loop{s=(s[/(.*).*\1/][/.#{$1}/]<?1??1:?0)+s
s.size&7<1&&$><<[s.reverse.to_i(2)].pack(?C)}

প্রত্যয় অনুসন্ধানের জন্য নিয়মিত এক্সপ্রেশন ব্যবহার করে রুবিতে বাস্তবায়ন। যেহেতু স্মৃতি বহির্ভূত হওয়া পর্যন্ত এটি বেশ দীর্ঘ সময় নেয় প্রোগ্রামটি ব্যবহারকারী দ্বারা সমাপ্ত করতে হয়।

সম্পাদনা: আমি কেবল লক্ষ্য করেছি যে সিকোয়েন্সটি শুরু করার জন্য এটি যথেষ্ট 0

সম্পাদনা 2: রেজিসের প্রস্তাবনা 2 টি অক্ষর সংরক্ষণ করে, কিছু অন্যদের কারণ আমাদের আগে কোনও একক বাইট কাটাতে হবে না pack


ব্যবহার করা s=(s[/(.*).*\1/][/.#{$1}/]<?1??1:?0)+sহলে আরও দুটি অক্ষর সাশ্রয় হবে।
মাঝামাঝি

@ সত্যই এটি কার্যকরভাবে কাজ করে। ধন্যবাদ.
হাওয়ার্ড

আপনি কাছাকাছি বন্ধনী পরিত্রাণ পেতে পারেন ?C?
ফান্ড মনিকার লসুইট

4

পার্ল, 95 টি অক্ষর

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

$|=$_="010";
y///c%8||print pack"B*",/(.{8})$/while/(.+)$(?(?{m|.*$^N(.)|})(?{$_.=1-$^N})|(?!))/

প্রথম তিনটি অক্ষর ( $|=) প্রয়োজন হয় না, কঠোরভাবে বলতে হয় ... তবে তা ছাড়া, আপনাকে আউটপুটটি দেখতে পাওয়ার আগে সাধারণত 4096 বাইট পূর্ণ 4096 বাইট তৈরির জন্য স্ক্রিপ্টটির জন্য অপেক্ষা করতে হবে। এবং এটি কয়েক ঘন্টা সময় নিতে হবে। সম্ভবত শতাব্দী; আমি নিশ্চিত নই. আমি কি উল্লেখ করেছি যে সময়ের সাথে সাথে এই প্রোগ্রামটির পারফরম্যান্সের ধরণের অবনতি ঘটে? সুতরাং এর কারণেই আমি তাদেরকে গণনায় অন্তর্ভুক্ত করতে বাধ্য হলাম।

অন্যদিকে, এই স্ক্রিপ্টটিতে আমি তৈরি করেছি এমন কুরুচিপূর্ণ রেগেক্সগুলির মধ্যে একটি রয়েছে, তাই আমি মনে করি এটি নিয়ে আমি গর্বিত।


1
পারফরম্যান্স সম্পর্কে চিন্তা করবেন না, অ্যালগরিদমটি অপটিমাইজেশন ছাড়াই ও (এন ^ 3)। আমার লেখা সহজ ডেল্ফি প্রোগ্রামটি 256 বাইটের জন্য প্রায় 30 সেকেন্ড সময় নিয়েছে, তবে 1024 বাইটের জন্য প্রায় এক ঘন্টা, তাই আমি এক বা বেশ কয়েক দিন সময় নিতে 4096 বাইট ধরে নেব। অবশ্যই, রেজেক্স এবং স্পেস অপ্টিমাইজেশনের এটি আরও খারাপ করার সম্ভাবনা রয়েছে :)
schnaader

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