বাম দিকে চারটি পদক্ষেপ: ভাইপার্স। ডানদিকে চারটি ধাপ: একটি শিলা। মরে না!


28

ভূমিকা

মনে করুন এক মুহুর্তের জন্য ভাইপার্স এবং ক্লিফ তিনটির পরিবর্তে মাত্র দুই ধাপ দূরে রয়েছে।

            o
           ---
Hsss!       |
 ';;' ___  /_\  ___  _
                      |

দুর্ভাগ্যক্রমে, আপনি একজন ধর্মান্ধ নির্যাতনের বন্দী a আপনি আবশ্যক পারেন বাম প্রত্যেক পালা অথবা ডান দিকে একটি পদক্ষেপ গ্রহণ করা। আপনি যদি তা না করেন তবে তাত্ক্ষণিকভাবে তারা আপনাকে মেরে ফেলেছে। আপনাকে আগেই আপনার পদক্ষেপগুলি পরিকল্পনা করার অনুমতি দেওয়া হয়েছে তবে একবার আপনি প্রথম পদক্ষেপ নিলে আপনি নিজের পরিকল্পনা পরিবর্তন করতে পারবেন না। (এবং কোনও অবাক হয় না; তারা আপনাকে গুলি করবে।)

হঠাৎ, একটি উজ্জ্বল ধারণা মাথায় আসে ...

আহ! আমি ঠিক ডান এবং বামে বিকল্প স্টেপিং করতে পারি! পদক্ষেপ ডান, পদক্ষেপ বাম, পদক্ষেপ ডান, পদক্ষেপ বাম, এবং আরও ...

আহ আহ আহ, এত তাড়াতাড়ি না। যেমনটি আমি বলেছিলাম, নির্যাতনকারী দুঃখজনক। আপনি প্রতিটি পদক্ষেপ, বা প্রতিটি দ্বিতীয় পদক্ষেপ, বা প্রতিটি তৃতীয় পদক্ষেপ এবং আরও কি না তা তারা বেছে নিতে পারে। সুতরাং আপনি যদি নির্লিপ্তভাবে ক্রমটি চয়ন করেন RLRLRL...তবে তারা আপনাকে প্রতিটি দ্বিতীয় পদক্ষেপ নিতে বাধ্য করতে পারে, যা শুরু হয় LL। আহ ওহ! আপনি ভাইপার দ্বারা কামড়েছি! কৃষ্ণতা আপনার উপরে ছড়িয়ে পড়ে এবং অন্য সবগুলি ম্লান হয়ে যায় ...

আসলে না, আপনি এখনও মারা যান নি। আপনার এখনও আপনার পরিকল্পনা নিয়ে আসতে হবে। কয়েক মিনিট এটি সম্পর্কে চিন্তা করার পরে, আপনি বুঝতে পারছেন যে আপনি ধ্বংসপ্রাপ্ত। এমন কয়েকটি পদক্ষেপের পরিকল্পনা করার কোনও উপায় নেই যা আপনার বেঁচে থাকার নিশ্চয়তা দেয় will আপনি সবচেয়ে ভাল আসতে পারেন RLLRLRRLLRR1 এগারোটি নিরাপদ পদক্ষেপ এবং আর কিছু নয়। দ্বাদশ পদক্ষেপটি যদি হয় Rতবে অত্যাচারী আপনাকে প্রতিটি পদক্ষেপ নিতে এবং তারপরে শেষ তিনটি পদক্ষেপ আপনাকে খাড়া থেকে বের করে দেবে। যদি দ্বাদশ পদক্ষেপটি হয় L, তবে নির্যাতনকারী আপনাকে প্রতি তৃতীয় পদক্ষেপ ( LRLL) গ্রহণ করতে বাধ্য করবে , যা আপনাকে ভাইপার্স এবং তাদের মারাত্মক কামড়ের ডানায় ফেলে দেয়।

Rযতটা সম্ভব আপনার মৃত্যুর বিলম্বের আশায় আপনি দ্বাদশ পদক্ষেপ হিসাবে বেছে নিয়েছেন। আপনার কানে বাতাস গর্জন করার সাথে আপনি নিজেরাই অবাক হন ...

যদি আমার তিনটি ধাপ থাকে?


ভক্ষক সতর্কতা!

আপনি এখনও মারা হবে। যেমনটি দেখা যাচ্ছে যে আপনার কতগুলি পদক্ষেপ রয়েছে তা বিবেচনা না করেই কিছু পয়েন্ট আসবে যেখানে আপনি যে কোনও পছন্দই করুন না কেন, আপনার মারাত্মক ভাগ্য পূরণের বিষয়টি নিশ্চিত করার জন্য আপনার নির্যাতনকারী যে পদক্ষেপ নিতে পারে তার একটি ক্রম রয়েছে। 2 তবে, যখন ভাইপার্স এবং ক্লিফটি তিন ধাপ দূরে রয়েছে, আপনি মোট 1160 টি নিরাপদ পদক্ষেপ নিতে পারেন এবং যখন তারা চার ধাপ দূরে থাকে, সেখানে কমপক্ষে 13,000 নিরাপদ পদক্ষেপ পাওয়া যায়! 3

চ্যালেঞ্জ

একটি একক পূর্ণসংখ্যা দেওয়া , ক্লিফ এবং ভাইপারগুলি চার ধাপ দূরে রয়েছে বলে ধরে n < 13000নিয়ে nনিরাপদ পদক্ষেপগুলির ক্রম আউটপুট করুন ।

বিধি

  • হয় পুরো প্রোগ্রাম বা একটি ফাংশন হতে পারে।
  • ইনপুটটি STDIN বা সমমানের মাধ্যমে বা কোনও ফাংশন আর্গুমেন্ট হিসাবে নেওয়া যেতে পারে।
  • আউটপুট থাকতে হবে দুটি স্বতন্ত্র অক্ষর (হতে পারে যা +/-, R/L, 1/0, ইত্যাদি)।
  • আউটপুটে কোনও সাদা জায়গা স্পষ্ট করে না।
  • হার্ড-কোডিং কোনও সমাধান অনুমোদিত নয়। এটি এই চ্যালেঞ্জকে তুচ্ছ করে তুলবে।
  • আপনার প্রোগ্রামটি (তত্ত্ব অনুসারে) একটি শালীন সময়ে শেষ করা উচিত। হিসাবে হিসাবে, n=13000এক মাসের মতো লাগতে পারে তবে এটি এক হাজার বছর বা তার বেশি সময় নেয় না। অর্থাত্ কোনও নিষ্ঠুর শক্তি নয়। (আচ্ছা, অন্তত এড়াতে চেষ্টা করুন ।)
  • লাইফ বোনাস:2000 নিরাপদ পদক্ষেপের একটি সিরিজ সরবরাহ । আপনি যদি এটি করেন তবে নির্যাতনকারী আপনার দৃacity়তা, অধ্যবসায় এবং ভবিষ্যদ্বাণী দ্বারা এতটাই মুগ্ধ হবেন যে তারা আপনাকে বাঁচতে দেবে। এই এক বার। (এই ক্রমটিকে বাইনারি সংখ্যা হিসাবে বিবেচনা করুন এবং যাচাইয়ের জন্য দশমিক সমতুল্য সরবরাহ করুন answers উত্তরগুলি খুব দীর্ঘ সময় নিতে অনুমতি দেওয়া হওয়ায় দ্রুত উত্তরগুলি পুরষ্কারের উদ্দেশ্যে এটি করা হয়।)
  • স্কোর: বাইটস , আপনি বোনাসের জন্য যোগ্য না হলে - ০.৫৫ দ্বারা গুণ করুন

টেকা!


1 এই সমস্যাটির একটি ভাল ব্যাখ্যা আছে এবং তার সমাধানের সমাধান "সমাধান" এখানে তার ইউটিউব চ্যানেলে জেমস গ্রিম নামে একটি তারকা তারার মাধ্যমে করেছেন: https://www.youtube.com/watch?v=pFHsrCNtJu4

2 80 বছর বয়সী এই অনুমান যা এরদোসের তাত্পর্যপূর্ণ সমস্যা হিসাবে পরিচিত, এটি টেরেন্স টাও খুব সম্প্রতি প্রমাণ করেছিলেন। কোয়ান্টা ম্যাগাজিন সম্পর্কে এটি সম্পর্কে একটি খুব সুন্দর নিবন্ধ: https://www.quantamagazine.org/20151001-tao-erdos-discrepancy-problem/

3 সূত্র: বোরিস কোনেভ এবং আলেক্সি লিসিতার রচনা, এরদোসের তাত্পর্যপূর্ণ ধারণার উপর একটি স্যাট অ্যাটাক । এখান থেকে পুনরুদ্ধার করা হয়েছে: http://arxiv.org/pdf/1402.2184v2.pdf


1
সুতরাং, যদি আমি এর জন্য কোনও সমাধান করি, তবে n=13000এর প্রথম 2000 টি নির্দেশাবলী কোনও বোনাস জিতবে? অর্থহীন বলে মনে হচ্ছে, তাই আপনি সম্ভবত অন্য কিছু বোঝাতে চেয়েছিলেন?
অ্যানাটলিগ

@ অ্যান্টোলিগ: সমস্ত সমাধান তাত্ত্বিকভাবে n=13000এক বছরের মতো দশ বছরের মধ্যে পরিচালনা করতে সক্ষম হবে । আপনি কি এক মাস অপেক্ষা করতে যাচ্ছেন n=2000? সম্ভবত না। এবং যদি আপনি তা করেন তবে আপনার বোনাস প্রাপ্য।
এল'েন্ডিয়া স্টারম্যান

উত্তর:


6

জাভা, 915 * 0.75 = 686.25

import java.util.*;class E implements Comparable<E>{static
int n,m,t,u;byte[]a;int k=2,b,d;E(){a=new byte[5];a[1]=13;}E(E
x){a=Arrays.copyOf(x.a,n+1);k=x.k;d=x.d;b=x.b;}int
g(int x){return(a[x]+1)%3-1;}void s(int x,int y){a[x]=(byte)(a[x]/3*3+(y+3)%3);}void
S(int x,int y){a[x]=(byte)(a[x]%3+(y+3)*3);}E
w(int x){if(g(k)==-x)return null;E e=new E(this);e.s(k,x);e.S(e.k++,x);for(m=0;++m<k;)if(k%m<1){u=e.a[m]/3-3+x;if(u==(k<9?2:4)*x)return
null;e.S(m,u);if(u==3*x){e.b++;if(k+m<=n){if(e.g(k+m)==x)return
null;e.s(k+m,-x);}}}return e;}public int compareTo(E o){m=d-o.d+(b-o.b)/60+(o.k-k)/150;return
m==0?o.k-k:m;}public static void main(String[]a){n=Integer.valueOf(a[0]);Queue<E>q=new PriorityQueue<>();q.add(new
E());for(;;){E x=q.remove(),y;if(x.k>n){for(t=0;++t<x.k;)System.out.print((x.g(t)+1)/2);return;}t=x.g(x.k<9?1:x.k%9==0?x.k/9:x.k%9);y=x.w(t);if(y!=null)q.add(y);y=x.w(-t);if(y!=null){y.d++;q.add(y);}}}}

কমান্ড-লাইন আর্গুমেন্ট হিসাবে ইনপুট নেওয়া হয়।

এটি প্রায় সমস্ত সম্ভাবনার চেষ্টা করে (একমাত্র সীমাবদ্ধতাটি হ'ল প্রথম 8 টি ধাপটি কেবল -1..1 এর মধ্যে যেতে হবে), ধাপে ধাপে এগিয়ে যাওয়া, কোন ম্যাজিক ভুডু হিউরিস্টিক ব্যবহার করে প্রথমে কোন উপায়টি বেছে নিতে হবে তা বেছে নিতে।

এটি আমার (মোটামুটি দ্রুত) কম্পিউটারে 1 সেকেন্ডের মধ্যে 2000 এবং এমনকি 4000 সমাধান করে। বড় সংখ্যার জন্য আরও র‌্যামের প্রয়োজন; 8 জিবি-র মধ্যে আমি যে বৃহত্তম ইনপুট সমাধান করেছি তা 5023 এবং এটি প্রায় 30 সেকেন্ড সময় নিয়েছিল।

2000 টি পদক্ষেপের জন্য সমাধানের দশমিক প্রতিনিধিত্ব, যেমন বোনাসের জন্য প্রয়োজনীয়:

67629177464446960798008264442022667063957880432486338092706841703491740570274032860458934082821213021464065304260003487277917407152662394728833698812373924467640518368465012204980858438160127647802572983143425507448999967241207186701518207195015015739598846687434709056793597015487555707466358473564611432637890414593517116857771284711814076853125419306285869381974622557155019992727242896503018802441210966188045211779436703341152749688824296759097963388158731237092792251164105828728858516951458791084595247591674731645830905744761534078963607725435881491831508342871545788662307953494333833994658998

বাইনারিতে রূপান্তর করতে সিজেমেYb এটি যুক্ত করুন ।

তাত্ত্বিক সম্পর্কে: প্রথমত, আমি ব্যবহার করছি এমন একটি প্যাটার্ন রয়েছে: প্রতি 9 টি পদক্ষেপ প্রথম 9 টি পুনরাবৃত্তি করার চেষ্টা করে, প্রতিটি (9 * x) তম ধাপে x'th ধাপটি পুনরাবৃত্তি করার চেষ্টা করে। এটি আমার অজগর উত্তরটিতে ডাউনলোড এবং ব্যবহার (হার্ডকোডযুক্ত) সমাধান থেকে অনুপ্রাণিত।

আমি প্যাটার্নটি থেকে কতবার বিচ্যুত হয়েছিল এবং আমি "প্রান্ত" (মরার 1 পদক্ষেপ) এ গিয়েছিলাম তার সংখ্যাও আমি রাখছি। হিউরিস্টিক ফাংশনটি মূলত সেই 2 সংখ্যার এবং এখনও অবধি নেওয়া পদক্ষেপের সংমিশ্রণ।

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

অবহেলিত এবং মন্তব্য করেছেন:

import java.util.*;

public class Erdos implements Comparable<Erdos> {
    static int n; // input (requested number of steps)
    static int m, t, u; // auxiliary variables

    byte[] a; // keeps each step and sum combined into 1 byte
    int k = 2; // number of steps + 1 (steps are 1-based)
    int edge; // number of times we got to an edge
    int diff; // number of differences from the expected pattern

    // start with one step
    Erdos() {
        a = new byte[5];
        set(1, 1);
        setSum(1, 1);
    }

    // copy constructor
    Erdos(Erdos x) {
        a = Arrays.copyOf(x.a, n + 1);
        k = x.k;
        diff = x.diff;
        edge = x.edge;
    }

    // get the x'th step (can be -1, 0 or 1)
    int get(int x) {
        return (a[x] + 1) % 3 - 1;
    }

    // set the x'th step
    void set(int x, int y) {
        a[x] = (byte) (a[x] / 3 * 3 + (y + 3) % 3);
    }

    // get the sum of every x'th step (should be within -3..3)
    int getSum(int x) {
        return a[x] / 3 - 3;
    }

    // set the sum of every x'th step
    void setSum(int x, int y) {
        a[x] = (byte) (a[x] % 3 + (y + 3) * 3);
    }

    // try to add a step with value x (1 or -1)
    Erdos grow(int x) {
        if (get(k) == -x) // predetermined step doesn't match
            return null;
        Erdos e = new Erdos(this);
        e.set(k, x);
        e.setSum(e.k++, x);
        for (m = 0; ++m < k;)
            if (k % m < 1) { // check all divisors of k
                u = e.getSum(m) + x; // updated sum
                if (u == (k < 9 ? 2 : 4) * x) // use limit 2 for the first 8 steps, 4 for the rest
                    return null; // dead
                e.setSum(m, u);
                if (u == 3 * x) { // we're at an edge
                    e.edge++;
                    if (k + m <= n) { // predetermine future step - should be going back
                        if (e.get(k + m) == x) // conflict
                            return null;
                        e.set(k + m, -x);
                    }
                }
            }
        return e;
    }

    public int compareTo(Erdos o) { // heuristic function
        m = diff - o.diff + (edge - o.edge) / 60 + (o.k - k) / 150;
        return m == 0 ? o.k - k : m;
    }

    public static void main(String[] a) {
        n = Integer.valueOf(a[0]);
        Queue<Erdos> q = new PriorityQueue<>();
        q.add(new Erdos());
        for (;;) {
            Erdos x = q.remove(), y;
            if (x.k > n) { // we made it
                for (t = 0; ++t < x.k;)
                    System.out.print((x.get(t) + 1) / 2);
                return;
            }
            t = x.get(x.k < 9 ? 1 : x.k % 9 == 0 ? x.k / 9 : x.k % 9); // next step based on the pattern
            y = x.grow(t);
            if (y != null)
                q.add(y);
            y = x.grow(-t);
            if (y != null) {
                y.diff++;
                q.add(y);
            }
        }
    }
}

"পরে" এক বছর ধরে অপেক্ষা করে
ক্যালকুলেটরফলাইন

1

পাইথন 2, 236 বাইট

n=input();r=len;u=[("",[0]*(n//4))]
while n>r(u[-1][0]):
 y,t=u.pop()
 for c in 0,1:
  s=t[:];u+=(y+"LR"[c],s),
  for i in range(r(s)):
   if-~r(y)//-~i*-~i==-~r(y):s[i]+=2*c-1;
   if abs(s[i])>3:u.pop();break;
print(u[-1][0])

এটি একটি নিষ্ঠুর-বল-ইশ পদ্ধতির জন্য মোটামুটি দ্রুত, কেবল n = 223 এর জন্য কয়েক সেকেন্ড সময় নেয় তবে n> = 224 এর জন্য অনেক বেশি সময় লাগে।

ব্যাখ্যা: স্ট্রিং-তালিকা জোড়া (গুলি, ইউ) এর তালিকাকে রাখুন, যেখানে তালিকাটি এমন যে আপনি [i] স্ট্রিংয়ের প্রতিটি আইথ স্টেপ অনুসরণ করার পরে বর্তমান অবস্থান। তালিকার প্রতিটি স্ট্রিংয়ের জন্য, "এল" বা "আর" যুক্ত করার চেষ্টা করুন, তারপরে তালিকার মানগুলিকে পরিবর্তন করুন। (যেমন যদি ফলাফলের স্ট্রিংয়ের দৈর্ঘ্য 10 হয় তবে আপনি সরানো দিকনির্দেশ অনুসারে 1,2,5 এবং 10 অবস্থান থেকে 1 যোগ বা বিয়োগ করুন)। যদি আপনি 3 বা -3 অতিক্রম করে নতুন জুটি ফেলে দেন তবে অন্যথায় এটি তালিকায় রাখুন। দীর্ঘতম স্ট্রিংগুলি শেষে রাখা হয়। আপনার দৈর্ঘ্যের এন স্ট্রিং হয়ে গেলে এটি ফিরে আসুন।


অজগর 2/3 কেন?
Rɪᴋᴇʀ

এটি উভয় একটিতে একই কাজ করে। আমি কি তাদের একটি নির্দিষ্ট করা উচিত?
কাল্পনিক মেলুন

সম্ভবত আপনার উচিত। আমি শুধু কারণ আমি জানতাম না যে হতাশ ছিল //পাইথন 2. উপলদ্ধ ছিল
Rɪᴋᴇʀ

-2

পাইথন 2, 729 বাইট

n=0
for x in"eJytVU2LwyAQPWzTvZjjspcsxFYTBdNuQSEF+///1jp+p5o0hYVSBl9nfOObNz1MlAgqzMcEEwQkDyIkFpDYCW0UnChbyZJiK2sfhDcYmu9hT0GdIPQvLduAmoCvvqEssvq84CVCpLzrNcOOspLhY6/KswB6FmoSxGPBcWts7lsMp/0q83da1hgC6k7GoqBir1ruAFIVvWIdTi++oGIAyZw8mkuG03uDDc+rEsSWTmFBwbLgtTF8hl1e/lpCigR7+pM5V9lIqVJBjStzKNRRQDp6UOrvwga6VFrGcWz6YHwLNYWUYeZfWO/DQTq7i4dAxixeszmtFEw7Cr5v9R3lRVF55TDzY6QRrSfzF9NLE7lAZ+vLnGgYLZ/FlCuoRcOugeFduHTqRWmyh1J91XpIndIbEk8jifL8hs8qQ8vjAVoGqhK5Tm/O5svpXd82QH4Azq05kYnhj93PzLbcTisFzXWfDqIC5zsq3jU7UUhSh1R3L4+i4HCXKlrGyywSBttPr2zpL4gCDPtk2HPN5tgZFomzSDPfGAlASus+e4KlLcjS0vPQ0f5/mR/r1s4PcxsgMLRSMp617AveCuup2OCAPBT6yltWrPO9azsbp6fphR87Lc7VzcbEt5F4Ydg/NzhXTA==".decode("base64").decode("zip"):n=n*64+ord(x)
print bin(n)[2:input()+2]

আমি মনে করি এই বোনাসের জন্যও যোগ্যতা অর্জন করবে যদি এই ধারণাটি "উত্তরগুলি পুরস্কৃত করা হয় যা দ্রুত শেষ হয়"।

যাইহোক, এটি একটি কঠোর কোডেড উত্তর, যা চ্যালেঞ্জের চেতনাতে নেই (যদিও আমি এটি লেখার সময় স্পষ্টতই বারণ করা হয়নি)।


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