ডাবল স্লিট এক্সপেরিমেন্ট


16

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


একটি বিজোড় ধনাত্মক পূর্ণসংখ্যা দেওয়া n( n >= 1এবং n % 2 == 1), সিমুলেশনটি সম্পাদন করুন।

কিভাবে এটা কাজ করে

আপনি একটি খালি ক্যানভাস দিয়ে শুরু করবেন এবং প্রতিটি ফ্রেম আলোর একক কণিকাটি স্লিটস এবং ক্যানভাসে অবতরণ করবে। কণাটি একটি ম্যাক্সিমায় অবতরণ করবে এমন সুযোগ নিয়ে:

n = 1:

+-----+
|     |
| 1/2 |
|     |
+-----+

n = 3:

+-----+ +-----+ +-----+
|     | |     | |     |
| 1/4 | | 1/2 | | 1/4 |
|     | |     | |     |
+-----+ +-----+ +-----+

n = 5:

+-----+ +-----+ +-----+ +-----+ +-----+
|     | |     | |     | |     | |     |
| 1/8 | | 1/4 | | 1/2 | | 1/4 | | 1/8 |
|     | |     | |     | |     | |     |
+-----+ +-----+ +-----+ +-----+ +-----+

প্রভৃতি

উদাহরণস্বরূপ n=5আমরা মধ্যবর্তী বাক্সটি পরীক্ষা করে দেখি, এটিতে পড়ার 50% সম্ভাবনা রয়েছে। যদি এটি ফ্রেমের শেষের দিকে পড়ে, পরের দুটিটিতে না সরানো হয় তবে 25% এর মধ্যে পড়ে যাওয়ার সম্ভাবনা রয়েছে। যদি এটি ফ্রেমের শেষের দিকে পড়ে, পরের দুটিটিতে না সরানো হয় তবে 12.5% ​​এর মধ্যে পড়ে যাওয়ার সম্ভাবনা রয়েছে। যদি এটি না পড়ে তবে এটি কোনও বিষয় নয়, এটি এখনও ফ্রেমের শেষ।

সম্ভাবনাগুলি কীভাবে গণনা করা যায় তা নিয়ে কিছু বিভ্রান্তি দেখা দিয়েছে, এর বেশিরভাগটি তাদের সম্ভাব্যতা হিসাবে বিবেচনা করা লোকদের কারণ যা তাদের 1 যোগ করা উচিত that

  • সর্বাধিক একটি কণা ফ্রেম প্রতি ল্যাড হবে, এর অর্থ একটি কণা সেই ফ্রেমে কিছুতেই অবতরণ করতে পারে না।
  • একটি কণা যে কোনও মুদ্রণযোগ্য চরিত্র দ্বারা প্রতিনিধিত্ব করা যেতে পারে।
  • কণাটি এলোমেলো সুযোগ নিয়ে বাক্সের যে কোনও জায়গায় অবতরণ করবে।
  • বাক্সগুলির প্রস্থটি 2n-1ক্যানভাসের আকার হওয়া উচিত । সুতরাং n=5তারা 1/9ক্যানভাস প্রস্থের হওয়া উচিত ।
  • বাক্সগুলির উচ্চতা ক্যানভাসের উচ্চতা হওয়া উচিত।
  • কণা বাক্সের বাইরে মোটেও অবতরণ করা উচিত নয়।
  • যদি কোনও কণা ইতিমধ্যে এমন কোনও স্থানে অবতরণ করে থাকে যেটিকে বেছে নেওয়া হয়েছে তবে এটি আবার সেখানে অবতরণ করতে পারে তাতে কোনও फरक নেই।
  • উপরের এসকি বাক্সগুলি স্পষ্টতার জন্য, সেগুলি আঁকানো উচিত নয়।
  • যুক্তিসঙ্গত হিসাবে আপনি নিজের ক্যানভাস আকারটি চয়ন করতে পারেন। উদাহরণস্বরূপ, এটি কেবল কয়েক পিক্সেল উচ্চ হতে হবে না। এটিতে এটিতে থাকা সমস্ত বাক্সই ফিট করতে সক্ষম হওয়া উচিত।
  • যদি আপনার কোড ফ্রেমের মধ্যে ঘুমায় তবে আপনার এটিকে আপনার বাইট গণনায় যুক্ত করার দরকার নেই।

ম্যাক্সিমার প্রতিটি, একটি মিনিমা মধ্যে ফাঁক হওয়া উচিত। এটি বাক্সের সমান প্রস্থ হওয়া উচিত তবে কোনও কণা সেখানে প্রবেশ করবে না। নিম্নলিখিত চিত্রটি দেখুন:

+---+---+---+---+---+
|   |   |   |   |   |
|max|min|max|min|max|
|   |   |   |   |   |
+---+---+---+---+---+

প্রোগ্রামটি ম্যানুয়ালি বন্ধ না হওয়া পর্যন্ত চলতে হবে।

বিধি

  • একটি সিউডো এলোমেলো নম্বর জেনারেটর (পিআরএনজি) ঠিক আছে।
  • স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ।
  • ইনপুট যে কোনও যুক্তিসঙ্গত ফর্ম্যাট দ্বারা নেওয়া যেতে পারে।
  • আপনার STDOUT এ আউটপুট করা উচিত।
  • এটি তাই সংক্ষিপ্ত উত্তর জেতে।

উদাহরণ

নিম্নলিখিত জিআইএফ জন্য চালানো একটি উদাহরণ n = 5। আমি কেবল এটিকে দ্রুত ছিটকেছি তাই সম্ভাবনাগুলি কিছুটা বন্ধ হয়ে যেতে পারে।

ডাবল চেরা উদাহরণ


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
মার্টিন এন্ডার

উত্তর:


4

পাইথন 2, 207 200 বাইট

এই পাগলামির একটি পদ্ধতি আছে, আমি প্রতিশ্রুতি দিই। সম্ভাব্যতার ব্যাখ্যা অনুসরণ করি যা আমি ওপিতে মন্তব্য করেছি।

সম্পাদনা করুন: কিছু চালাক অলস মূল্যায়নের মাধ্যমে -7 বাইট (এবং কিছু লক্ষণ অপসারণ)

import time  # not counted for byte total
import random as R,curses as C
r=R.randint
c=C.initscr()
h,w=c.getmaxyx()
n=input()
w/=2*n-1
while 1:
 all(r(0,1)or c.addch(r(0,h-1),(i*(2-4*r(0,1))+n)*w-r(1,w),42)for i in range(n/2+1))
 c.refresh()
 time.sleep(0.1)  # not counted for byte total

4

বেস, 396 - 11 = 385 বাইট

E='echo -en';$E "\e[2J\e[99A";while :;do sleep 0.01;for i in `seq $((($1+1)/2)) -1 1`;do p=$(((($1+1)/2 - $i)));[ $p -lt 0 ]&&p=$((-$p));p=$((2**(p+1)));if [ $RANDOM -lt $((32768/$p)) ];then [ $(($RANDOM%2)) -eq 1 ]&&i=$((($1+1)-i));sector=$(((i*2-1)-1));C=`tput cols`;R=`tput lines`;SS=$((C/($1*2-1)));SX=$((SS*sector));X=$((SX+(RANDOM%SS)));Y=$((RANDOM%R));$E "\e[$Y;${X}H*";break;fi;done;done

দুর্ভাগ্যক্রমে আমি ট্রাইআইটঅনলাইনটিতে এটি প্রদর্শন করতে পারছি না কারণ কার্সারকে সরানো অবিরাম লুপ এবং এএনএসআই অব্যাহতি সিকোয়েন্স রয়েছে তবে আপনি এখনও এটি আপনার টার্মিনালে অনুলিপি করতে পারেন!

স্বাক্ষরিত সংস্করণ:

E='echo -en'
$E "\e[2J\e[99A"

while :
do
    sleep 0.01
    for i in `seq $((($1+1)/2)) -1 1`
    do
        p=$(((($1+1)/2 - $i)))
        [ $p -lt 0 ] && p=$((-$p));
        p=$((2**(p+1)))
        if [ $RANDOM -lt $((32768/$p)) ]
        then
            [ $(($RANDOM%2)) -eq 1 ] && i=$((($1+1)-i));
            sector=$(((i*2-1)-1))
            C=`tput cols`
            R=`tput lines`
            SS=$((C/($1*2-1)))
            SX=$((SS*sector))
            X=$((SX+(RANDOM%SS)))
            Y=$((RANDOM%R))
            $E "\e[$Y;${X}H*"
            break
        fi
    done
done

1
ব্যাশে গল্ফ করার টিপস দেখুন । এখানে ফসল কাটাতে আপনার জন্য বেশ কয়েকটি সহজ কম-ঝুলন্ত ফল রয়েছে - যেমন $[ ]পরিবর্তে $(( ))। পরিবর্তে for i in `seq $((($1+1)/2)) -1 1`;do ...;done, চেষ্টা করুন for((i=($1+1)/2;i>0;i--));{ ...;}। পরিবর্তে [ $(($RANDOM%2)) -eq 1 ], চেষ্টা করুন ((RANDOM%2))sector, SSইত্যাদি ইত্যাদির পরিবর্তে 1 টি ভেরিয়েবলের নাম রাখা উচিত।
ডিজিটাল ট্রমা

3

গণিত, 231 বাইট

(R=RandomInteger;p=20(#+1)+10;s=Array[0&,{20,6p-3}];i=(#+1)/2;Monitor[While[1<2,y=RandomChoice[Join[q=Riffle[Array[2^#&,i,0],Table[0,i-1]],Reverse@Most@q]->Array[Range[4#+1]&,i,0][[i]]];s[[R@19+1,10y-R@9]]=1;s],Grid[s//. 0->" "]])&


ইনপুট

[5]

আউটপুট

এখানে চিত্র বর্ণনা লিখুন


এটি অবৈধ বলে মনে হচ্ছে, এন = 5 এর জন্য কেবলমাত্র 5 টি বাক্স থাকতে হবে, আপনার 9 টি রয়েছে
TheLethalCoder

আমি বুঝতে পেরেছি যে আমি {... 3,2,1,2,3 ... like এর মতো গণনা করেছি it এটি গৃহীত না হলে আমি এটি ঠিক করতে পারি
J42161217

2
@ দ্য লেথলকোডার স্থির! উন্নত! Golfed!
J42161217

দেখতে ভাল লাগছে, আমার কাছ থেকে
উড়িয়ে দেওয়া

2

সি # (.NET 4.5), 319 254 বাইট

65 বাইট সংরক্ষিত হয়েছে লেথলকোডারকে ধন্যবাদ!

namespace System{using static Console;n=>{for(var r=new Random();;)for(int w=WindowWidth/(2*n-1),i=(n-1)/2,c=0,m=2,l;i>-1;i--,c+=2)if((l=r.Next(0,(m*=2+1)*2))<2){SetCursorPosition((i+(l<1?c:0))*2*w+r.Next(0,w),r.Next(0,WindowHeight));Write('*');break;}}}

ভাই, এটি অনেক কাজ ছিল, তবে এটি কোনওভাবে কাজ করে।

যেহেতু এটি Consoleনির্দিষ্ট ফাংশন এবং থ্রেড স্লিপ ব্যবহার করে, এটি টিআইও-তে কাজ করবে না, দুঃখের বিষয়।


একটি কম্পাইল Action<int>বাইট বাঁচাতে while(true)-> ( while(1>0)-> for(;;)using C=Console;বা using static Console;
TheLethalCoder

সেই অ্যাপ্লিকেশনটির পাশাপাশি একজন প্রতিনিধি হওয়ার অনুমতি রয়েছে কি? তা জানতেন না। আমি এটি এক সেকেন্ডে আপডেট করব।
ইয়ান এইচ।

প্রোগ্রামগুলি / ফাংশনগুলিকে ডিফল্টরূপে এবং বেনাম ল্যাম্বডাস গণনাটিকে ফাংশন হিসাবে মঞ্জুরি দেওয়া হয় (যদিও তাদের কল করার সময় তাদের বিধিগুলি আরও গভীর হয়)।
TheLethalCoder

255 বাইটnamespace System{using static Console;n=>{for(var r=new Random();;)for(int w=WindowWidth/(2*n-1),i=(n-1)/2,c=0,m=2,l;i>-1;i--,c+=2)if((l =r.Next(0,(m*=2+1)*2))<2){SetCursorPosition((i+(l<1?c:0))*2*w+r.Next(0,w),r.Next(0,WindowHeight));Write('*');break;}}}
TheLethalCoder

@TheLethalCoder যে কোডটি কাজ করে না: / কেবল প্রচুর Variable is not existing in the current contextত্রুটি দেয় ।
ইয়ান এইচ।

1

Clojure + Quil, 394 বাইট

(use '[quil.core])(defn -main[n](let[w 999 h 100 c(/ w(-(* n 2)1))s(range 0 w c)a(vec(take-nth 2 s))v(fn[x](<(rand)x))q(fn[a b](+ a(rand-int(- b a))))g(for[i(range(int(/ n 2))-1 -1)][i(- n 1 i)])z(for[[j i](map vector(range 1(inc(count g)))g)][(/ 1(Math/pow 2 j))i])](defsketch m :size[w h]:draw #(loop[[[p i]& r]z](when p(if(v p)(let[o(a(rand-nth i))](point(q o(+ o c))(q 0 h)))(recur r)))))))

ঠিক আছে, আমি অবশ্যই জিততে পারি নি, তবে এটি ছিল একটি ভাল মস্তিষ্কের workout! আমি এটি করার জন্য অতিরিক্ত রাউন্ডআউট উপায় বেছে নিয়েছি তবে এটি কার্যকর! মূলত, এটি কীভাবে কাজ করে তা হল:

  1. প্রতিটি কলামের এক্স-মানগুলি ভিত্তিতে গণনা করা হয় n। তারপরে, "সক্রিয় কলমগুলি" যেগুলি বিন্দুগুলিকে ধারণ করবে তা ফিল্টার করা হয়। কলামগুলি তারপরে সম্ভাব্যতার সাথে জিপ করা হয় যেগুলি তাদের চয়ন করা হবে।

  2. অ্যানিমেশন শুরু হয়, এবং প্রতিটি ফ্রেম, একটি লুপ প্রবেশ করানো হয়। মাঝখান থেকে শুরু করে, প্রতিটি কলামের কলাম চেষ্টা করা হয়েছে। একবারে এক জোড়া কলাম নির্বাচন করা গেলে, জোড়া থেকে একটি কলাম এলোমেলোভাবে চয়ন করা হয়।

  3. নির্বাচিত কলামের মধ্যে একটি বিন্দু এলোমেলো অবস্থানে টানা হয়, অভ্যন্তরীণ লুপটি প্রস্থান করে এবং একটি নতুন ফ্রেম শুরু হয়।

কুইল গ্রাফিক্স লাইব্রেরি ব্যবহার করে যা মূলত ক্লোজারের জন্য একটি প্রসেসিং র‌্যাপার।

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

জিআইএফ

গভীরতর ব্যাখ্যার জন্য অরোগল্ফড কোডটি দেখুন:

(ns bits.golf.interference.interference
  (:require [quil.core :as q]))

; Canvas size
(def width 1800)
(def height 800)

(defn -main [n]
  (let [col-width (/ width (- (* n 2) 1))
        ; The left-most x of each column
        col-starts (range 0 width col-width)

        ; The columns that need to be drawn. Need "vec" so I can index it later.
        active-cols (vec (take-nth 2 col-starts))

        ; Function taking a decimal percentage, and returning whether or not it's satisfied.
        ; (chance? 0.5) would be used to simulate a coin toss.
        chance? (fn [perc] (< (rand) perc))

        ; Function that returns a random int between a and b
        r-int (fn [a b] (+ a (rand-int (- b a))))

        ; Generates index pairs for each complimentary column.
        indices (for [i (range (int (/ n 2)) -1 -1)]
                  [i (- n 1 i)])

        ; Zips each index pair from above with the chance that it will be" chosen"
        zipped-perc (for [[j i] (map vector (range 1 (inc (count indices))) indices)]
                      [(/ 1 (Math/pow 2 j)) i])]

    ; Animation boilerplate
    (q/defsketch Interference
      :size [width height]
      :draw
      ; The animation loop. It contains a loop over each complimentary column. It tries each column pair starting
      ;  from the middle, and works outward. Once it picks a pair of columns, it randomly chooses one of them.
      #(loop [[[p i] & r] zipped-perc]
         (when p
           ; Pick this column?
           (if (chance? p)
             ; Pick one of the column pairs
             (let [col (active-cols (rand-nth i))]
               ; Set the coloring and dot size
               (q/fill 0 0 0)
               (q/stroke-weight 5)
               ; And finally draw the dot
               (q/point (r-int col (+ col col-width))
                        (r-int 0 height)))

             ; If the column wasn't chosen, loop again to try the next one
             (recur r)))))))

0

সি #, 238 বাইট

namespace System{using static Console;n=>{for(var r=new Random();;)for(int i=0,p=1,w=WindowWidth/(2*n-1),x;i<n+1;i+=2)if(r.Next(p*=2)<1){SetCursorPosition(r.Next(x=(n-1+(r.Next(2)<1?i:-i))*w,x+w),r.Next(WindowHeight));Write("*");break;}}}

এটি অনলাইন চেষ্টা করুন! (এটি কাজ করবে না তবে আপনি জানেন)।

সম্পূর্ণ / ফর্ম্যাট সংস্করণ:

namespace System
{
    using static Console;

    class P
    {
        static void Main()
        {
            Action<int> f = n =>
            {
                for (var r = new Random(); ;)
                {
                    for (int i = 0, p = 1, w = WindowWidth / (2 * n - 1), x; i < n + 1; i += 2)
                        if (r.Next(p *= 2) < 1)
                        {
                            SetCursorPosition(r.Next(x = (n - 1 + (r.Next(2) < 1 ? i : -i)) * w, x + w), r.Next(WindowHeight));
                            Write("*");
                            break;
                        }

                    Threading.Thread.Sleep(25);
                }
            };

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