স্টিক স্ট্যাক নম্বর


22

স্টিকস্ট্যাক একটি খুব সাধারণ স্ট্যাক-ভিত্তিক প্রোগ্রামিং ভাষা যা কেবল দুটি নির্দেশাবলীর সাথে:

  • | স্ট্যাকের উপরে স্ট্যাকের দৈর্ঘ্যটি ঠেলা দেয়
  • -স্ট্যাক থেকে শীর্ষ দুটি উপাদান পপ করে এবং তাদের পার্থক্যটি পুশ করে ( second topmost - topmost)

ভাষার বিবরণ

  • প্রোগ্রামটির শুরুতে স্ট্যাকটি খালি।
  • সমস্ত নির্দেশাবলী বাম থেকে ডানে ক্রমান্বয়ে সম্পাদিত হয়।
  • স্ট্যাকের 2 টিরও কম সংখ্যক থাকলে -নির্দেশনাটি অবৈধ।
  • সম্পাদন শেষে স্ট্যাকের ঠিক এক নম্বর থাকা উচিত ।

যে কোনও পূর্ণসংখ্যা স্টিকস্ট্যাক প্রোগ্রাম দ্বারা উত্পন্ন করা যেতে পারে। উদাহরণ স্বরূপ:

|||--||-- generates the number 2 through the following stack states:

[]
[0]
[0, 1]
[0, 1, 2]
[0, -1]
[1]
[1, 1]
[1, 1, 2]
[1, -1]
[2]    

আপনার স্টিকস্ট্যাক কোডটি মূল্যায়নের জন্য আপনি এই অনলাইন (সিজেএম) মূল্যায়নকারী ব্যবহার করতে পারেন । (কোডের জন্য @ মার্টিনের জন্য ধন্যবাদ।)

কাজটি

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

স্কোরিং

  • আপনার প্রাথমিক স্কোরটি নীচে প্রদত্ত পরীক্ষার ক্ষেত্রে স্টিকস্ট্যাক প্রোগ্রামগুলির মোট দৈর্ঘ্য । লো স্কোর আরও ভাল।
  • আপনি যদি সমস্ত পরীক্ষার ক্ষেত্রে আপনার প্রোগ্রাম চালিয়ে যান এবং আপনার স্কোর গণনা করেন তবেই আপনার জমা দেওয়া বৈধ।
  • আপনার গৌণ (টাইব্রেকার) স্কোরটি আপনার উত্পাদন প্রোগ্রাম বা ফাংশনের দৈর্ঘ্য।

ইনপুট পরীক্ষার মামলা

(প্রতিটি সংখ্যা পৃথক পরীক্ষার কেস)

-8607 -6615 -6439 -4596 -4195 -1285 -72 12 254 1331 3366 3956 5075 5518 5971 7184 7639 8630 9201 9730

আপনার প্রোগ্রামটি কেবলমাত্র প্রদত্ত পরীক্ষার ক্ষেত্রে নয় যে কোনও পূর্ণসংখ্যার (যা আপনার ডেটা-টাইপ হ্যান্ডেল করতে পারে) কাজ করে। পরীক্ষার নম্বরগুলির সমাধানগুলি আপনার প্রোগ্রামটিতে হার্ডকোড করা উচিত নয়। হার্ডকডিংয়ের সন্দেহ থাকলে পরীক্ষার নম্বর পরিবর্তন করা হবে।


আমি এমন একটি ধারা যুক্ত করার পরামর্শ দিচ্ছি যা বলিষ্ঠ শক্তি আটকাতে "এবং যুক্তিসঙ্গত সময়ে চালায়" বলে।

@ প্রারম্ভিকতা যা "সমস্ত পরীক্ষার ক্ষেত্রে আপনার প্রোগ্রামটি চালিত করলেই বৈধ"
নিহিত রয়েছে

উত্তর:


7

পাইথন 2 - 5188

বেশ কার্যকর সময়-ভিত্তিক, এবং মনে হয় (সম্ভবত) অনুকূল সমাধান। আমি লক্ষ্য করেছি যে যেমন একটি প্যাটার্ন

|||||-|||-|-|-|------ (25 এর জন্য সর্বোত্তম সমাধান)

হিসাবে বর্ণিত হতে পারে

 0  |
-1  |                  
+2   |                 -
-3    |               -
+4     | |           -
-5      - |         -
+6         | | | | -
-7          - - - -

যেখানে প্রতিটি শেষে মোট মান হল (প্রতিটি স্তরের মান '|' এর সংখ্যার গুণমান) এর যোগফল। সুতরাং উপরের উদাহরণস্বরূপ, আমাদের আছে -1*1 + 2*1 - 3*1 + 4*2 - 5*1 + 6*4 = 25। এটি ব্যবহার করে আমি এই সমাধানটি লিখেছিলাম যা অন্যান্য উত্তরের অনুরূপ আউটপুট তৈরি করে এবং একটি ক্ষুদ্র পরিমাণে।

আমি বিশ্বাস করি এটিই সর্বোত্তম সমাধান, কারণ আমি প্রতিটি সম্ভাব্য সর্বোত্তম উচ্চতা পরীক্ষা করে দেখি (আমি আসলে প্রয়োজনের তুলনায় আরও অনেক বেশি পরীক্ষা করি) এবং আমি নিশ্চিত যে সমাধানটি সর্বদা সর্বশেষ দুটি স্তরের সাথে দুটি স্তরের সাথে জড়িত থাকে (আমি পারি) ইতিবাচক সংখ্যার জন্য এটি গ্যারান্টিযুক্ত তবে নেতিবাচক সম্পর্কে 100% নিশ্চিত নয়)।

def solution(num):
    if num == 0:
        return '|'

    neg = num<0
    num = abs(num)
    high = int(num**0.5)

    def sub(high):
        counts = [1]*high
        total = num - (high+neg)/2

        if total%high == 0:
            counts[-1] += total/high
        else:
            counts[-1] += total/high
            if (total%high)%2==1 and not neg:
                counts[-1] += 1
                counts[-(total%high)-1] += 1
            elif (total%high)%2==0 and neg:
                counts[(total%high)-2] += 1
                counts[0] += 1
            else:
                counts[total%high-1] += 1

        string = ""
        for c in counts[::-1]:
            string = '|-'*(c-1)+'|'+string+'-'
        return '|'+string

    return min((sub(h) for h in range(2-neg,2*high+2,2)), key=lambda s: len(s))

এটি পরীক্ষার জন্য আমি যে কোডটি ব্যবহার করেছি তা এখানে

string = "-8607 -6615 -6439 -4596 -4195 -1285 -72 12 254 1331 3366 3956 5075 5518 5971 7184 7639 8630 9201 9730"
total = 0

def string_to_binary(string):
    total = 0
    for i,char in enumerate(string[::-1]):
        total += (char=='|')*(2**i)
    return total

def stickstack(bits,length):
    stack = []
    for i in range(length):
        d,bits = divmod(bits,2**(length-i-1))
        if d == 1:
            stack.append(len(stack))
        else:
            stack[-2] -= stack[-1]
            stack = stack[:-1]
    return stack

for num in string.split():
    s = solution(int(num))
    print '%s:' % num
    print s
    result = stickstack(string_to_binary(s),len(s))
    print 'Result: %s' % result
    print 'Length: %s' % len(s)
    total += len(s)
    print

print 'Total length: %s' % total

2
দুর্দান্ত সমাধান! আমি বিশ্বাস করি স্কোরটি সর্বোত্তম (আমার ব্রুটফোর্স গণনার উপর ভিত্তি করে) এবং আপনার বর্ণনার উপর ভিত্তি করে আমি মনে করি আপনার অ্যালগরিদম সর্বদা সেরা সমাধান দেয়।
এলোমেলো

@ আরন্দোমরা আমার মনে হয় এটি সম্ভবত এটিই তবে আমি কেবল নিষ্ঠুরভাবে প্রায় +/- ১০০ পর্যন্ত বাধ্য হয়েছি তাই আমি এটি বলতে সবচেয়ে বেশি প্রস্তুত ছিলাম না যে, এটি অবশ্যই সর্বোত্তম, তবে এখন যে আমি এটি সম্পর্কে ভাবছি তা আমি দেখতে পাচ্ছি না কিভাবে এটি আরও ভাল করা যেতে পারে।
কেএসব 15'11

+1 খুব সুন্দর। আমি কীভাবে এটি চেষ্টা করতে পারি? কি পাইটন? (আমি পাইথোনিস্ট নই, আমি আমার ল্যাপটপে দুর্ঘটনাবশত একটি পাইথন ৩.৪ ইনস্টল করেছি)।
edc65

@ edc65 আমি এটি পরীক্ষার জন্য কোড যুক্ত করেছি; এছাড়াও এটি পাইথন ২.7 ব্যবহার করছে, সুতরাং মুদ্রণ বিবরণীর মতো জিনিস পাইথন 3
KSab

এটির মূল্য কীসের জন্য, আমি নিশ্চিত করতে পারি যে এই ফলাফলটি সর্বোত্তম: একই ফলাফল আপনার।
edc65

12

জাভা, 5208 5240 5306 6152

এটি একটি পুনরাবৃত্ত ফাংশন যা লক্ষ্যটির আরও কাছাকাছি অবস্থিত, যখন বেসগুলির ক্ষেত্রে এটি 5 এর মধ্যে আসে (যা প্রায়শই কেবল এক ধাপ থাকে)।

মূলত, আপনি পেতে পারেন (a*b)+(a/2)জন্য (a+b)*2একটি সহজ প্যাটার্ন সঙ্গে লাঠি। যদি aবিজোড় হয় তবে ফলাফলটি নেতিবাচক হবে, যাতে কিছু অদ্ভুত যুক্তি বাড়ে।

ফল হিসাবে 185,367 দৈর্ঘ্য সহ এটি 31 -1 ডলারে এক মিনিট বা তার বেশি সময় নেয় । যদিও এটি সমস্ত পরীক্ষার ক্ষেত্রে প্রায় তাত্ক্ষণিকভাবে কাজ করে। এটি 4*(sqrt|n|)গড়ে স্কোর করে। দীর্ঘতম স্বতন্ত্র পরীক্ষার 9730কেসটি, যা 397-দৈর্ঘ্যের স্টিক স্ট্যাকের ফলস্বরূপ:

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||-|||||||||||||||||||||-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|--------------------------------------------------------------------------------------------------|-

হালনাগাদ:

বেসিক প্যাটার্ন থেকে যোগ / বিয়োগের একটি ছোট উপায় খুঁজে পেয়েছি। নেতৃত্বে ফিরে (এখন জন্য)!


জোতা এবং পরীক্ষার ক্ষেত্রে:

import static java.lang.Math.*;

public class StickStacker {

    public static void main(String[] args){
        StickStacker stacker = new StickStacker(); 
        int tests[] = {-8607,-6615,-6439,-4596,-4195,-1285,-72,12,254,1331,3366,3956,5075,5518,5971,7184,7639,8630,9201,9730};
        int sum = 0;
        for(int test : tests){
            String sticks = stacker.stickStack3(test);
            sum += sticks.length();
            System.out.println("In: " + test + "\t\tLength: " + sticks.length());
            System.out.println(sticks+"\n");
        }
        System.out.println("\n\nTotal: "+sum);          
    }

    String stickStack3(int n){return"|"+k(n);}
    String k(int n){
        String o="";
        int q=(int)sqrt(abs(n)),a,b,d=1,e=0,c=1<<30,
        z[]={232,170,42,10,2,0,12,210,52,844,212};
        a=n>0?q:-q;
        a-=n>0?a%2<1?0:1:a%2<0?0:-1;

        for(b=0;b<abs(a)+10;b++)
            if(abs(n-(a*b+a/2-(n>0?0:1)))<abs(a)&&abs(a)+b<c){
                    c=abs(a)+b;
                    d=a;e=b;
            }

        for(a=0;a++<e;)o+="-|";
        for(a=0;a++<abs(d);)o="|"+o+"-";

        c=n-(d*e+d/2-(n>0?0:1));
        if(c>0&&c<abs(d)){
            if(c%2==0)
                o=o.substring(0,c)+"-|"+o.substring(c);
            else
                o=o.substring(0,c+1)+"-|"+o.substring(c+1)+"|-";
            c=0;
        }else if(c<0&-c<abs(d)){
            if(c%2!=0)
                o=o.substring(0,-c)+"-|"+o.substring(-c);
            else
                o=o.substring(0,-c-1)+"-|"+o.substring(-c-1)+"|-";  
            c=0;
        }

        return n==0?"":n<6&&n>-6?
                Long.toBinaryString(z[n+5])
                .replaceAll("0","-")
                .replaceAll("1","|"):
                o+k(c);
    }
}

গল্ফ হবে (আরও) একটি সঠিক টাই হওয়ার সম্ভাবনা নেই।


আপনি কি 2 ^ 31 এর জন্য আপনার স্কোর সম্পর্কে নিশ্চিত? আমার 2 ^ 30 এর স্কোর 131099, এবং 185369 2 ^ 31-1 এর জন্য।
edc65

@ edc65 আমি অবশ্যই এটি ভুল টাইপ করেছি। আমি ভেবেছিলাম এটি কিছুটা কম মনে হয়েছে ... যাইহোক, লক্ষ্য করার জন্য এবং কিছু প্রতিযোগিতা দেওয়ার জন্য ধন্যবাদ। এখন দেখার সময় হয়েছে আমি আরও ভাল করতে পারি কিনা :)
জিওবিটস

4

জাভাস্ক্রিপ্ট (ES6) 5296 6572

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

2 টি বাগ সংশোধন করুন, একই ফলাফল। আমার একটা ধারণা আছে তবে তা পেরে উঠতে পারছি না।

বাইটস: 460 ডলার, বেশ গল্ফড। এটি 32 বিট পূর্ণসংখ্যার উপর কাজ করে, 0 টির কাছাকাছি সময় চালান।

কোডটি নীচে F ফাংশন (স্নিপেটে লুকানো)।
পরীক্ষার জন্য স্নিপেট চালান (ফায়ারফক্সে)।

ব্যাখ্যা

ইতিবাচক সংখ্যা, শুরু করার জন্য। একটি "বেস" দিয়ে শুরু করুন (চাইলে সিজেমে চেষ্টা করুন, ফাঁকা স্থান অনুমোদিত)

| gives 0  
||| -- gives 1
||||| ---- gives 2
||||||| ------ gives 3 

সংক্ষিপ্তসার: 1 স্টিক, তারপরে বি * 2 স্টিক, তারপরে বি * 2 ড্যাশ

তারপরে একটি বা একাধিক যোগ করার চেষ্টা করুন '- |' মাঝের বিভক্তিতে প্রত্যেকে একটি নির্দিষ্ট বর্ধিত পরিমাণ যুক্ত করে যা শুরুর ভিত্তিতে দ্বিগুণ হয় এবং বহুবার পুনরাবৃত্তি হতে পারে। সুতরাং আমাদের বি = বেস এবং আর = ইনক্রিমেন্ট পুনরাবৃত্তি ফ্যাক্টর সহ একটি সূত্র রয়েছে

v=b+r*2*b

b=1, r=0 to 3, inc=2
| || -- 1 
| || -| -- 3 
| || -| -| -- 5 
| || -| -| -| -- 7

b=3, r=0 to 3, inc=6
| |||||| ------ 3
| |||||| -| ------ 9
| |||||| -| -| ------ 15
| |||||| -| -| -| ------ 21

দেখুন? অ্যাডস মানটি দ্রুত বাড়ায় এবং প্রতিটি সংযোজন এখনও 2 টি অক্ষর। বেস ইনক্রিমেন্ট প্রতিটি সময় আরও 4 টি চর দেয়।

ভি এবং আমাদের সূত্রটি v = b + r * 2 * খ দেওয়া হয়েছে, আমাদের 2 টি ইনট বি এবং আর সন্ধান করতে হবে। আমি এই ধরণের সমীকরণের বিশেষজ্ঞ নই, তবে খ = ইন স্কয়ার্ট (v / 2) একটি ভাল সূচনা অনুমান।

তারপরে আমাদের একটি আর এবং বি রয়েছে যা একসাথে একটি মান দেয় v এর সাথে আমরা বারবার বর্ধিত (|| -) বা হ্রাস (| -) এর সাথে v তে পৌঁছায়।

নেতিবাচক সংখ্যার জন্য একই যুক্তি অনুসরণ করুন, হায় সূত্রটি সমান তবে সমান নয়।


1

জাভাস্ক্রিপ্ট, 398710

কোডের 94 বাইট / অক্ষর

আমি সমাধান নিয়ে এসেছি! ... এবং তারপরে স্পার এর উত্তর পড়ুন এবং এটি হুবহু একই ছিল।

জেএস সামান্য কম অক্ষরের জন্য মঞ্জুরি দেয় হিসাবে অনুভূত আমি যেভাবেই পোস্ট করব।

এখানে কোডের একটি অ-সংস্করণিত সংস্করণ দেওয়া হয়েছে:

function p(a){
    s = "";
    if(a<=0){
        for(i=0; i<-2*a-1;i++)
            s="|"+s+"-";
        return "|"+s;
    }
    return "|"+p(0-a)+"-";
}

1
ঠিক আছে, আমরা যদি 398710 সমাধানগুলি গল্ফ করছি, তবে গেমটি চলছে! কেউ সিজাম বা পাইথ নিয়ে আসবে এবং আমাদের উভয়কেই মারবে, যদিও :(
স্পার

1

পাইথন, 398710 (71 বাইট)

সহজতম সমাধান, আমি মনে করি। এন প্রতিনিধিত্ব করতে স্টিকস্ট্যাকের 4 * এন (+/- 1) অক্ষর ব্যবহার করে।

def s(n):return'|'*(n*2+1)+'-'*n*2 if n>=0 else'|'*(n*-2)+'-'*(n*-2-1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.