চরম হোয়াইটওয়াটার ক্যানোইং


28

আপনি মোটামুটি দ্রুত সাদা পানির নদীতে একটি ক্যানো প্যাডেলিং করছেন। হঠাৎ, আপনার প্যাডেলগুলি বিস্ফোরিত হয় এবং আপনি নিজেকে কোনও ঝুঁকিপূর্ণ পরিস্থিতিতে কোনও নদীর পাদদেশ ছাড়াই দ্রুত নদীর তলদেশে ঝুঁকিপূর্ণ অবস্থায় দেখতে পান। ভাগ্যক্রমে, আপনার এখনও আপনার প্রোগ্রামিং দক্ষতা রয়েছে, তাই আপনি র‌্যাপিডগুলি থেকে বাঁচতে সহায়তা করার জন্য আপনার ক্যানির পাশে একটি প্রোগ্রাম খোদাই করার সিদ্ধান্ত নিয়েছেন। যাইহোক, আপনার প্রোগ্রামটি দিয়ে লিখতে ক্যানির পাশে খুব বেশি পৃষ্ঠতল অঞ্চল নেই, সুতরাং আপনাকে অবশ্যই প্রোগ্রামটি যতটা সম্ভব সংক্ষিপ্ত করে তুলতে হবে।

নদীটি 8 বাই 16 গ্রিড হিসাবে প্রতিনিধিত্ব করা যায়। আমরা সংখ্যার কলাম লেবেল হবে 0থেকে 7এবং সংখ্যার সঙ্গে সারি 0থেকে 15

        y
--------15
--------14
--------13
--------12
--------11
--------10
--------9
--------8
--------7
--------6
--------5
--------4
--------3
--------2
--------1
--------0
01234567
x

উপরে: একটি সম্পূর্ণ শান্ত, সাধারণ নদী যার কোনও বাধা নেই। স্বাভাবিকভাবেই, আপনি যে নদীটি চালু আছেন এটি এটি নয়।

আপনি স্থানাঙ্ক থেকে শুরু করুন (4, 0) এবং সেখান থেকে অনিয়ন্ত্রিতভাবে নদীর উপরে উঠে যান (অর্থাত্ ভেক্টর (0,1)) যতক্ষণ না আপনি কোনও শিলাটিকে আঘাত করেন ( oএই উদাহরণগুলির মধ্যে একটি দ্বারা উপস্থাপিত )। আপনি যখন কোনও শিলাকে আঘাত করেন, আপনার কাছে পাথরটি বাম দিকে এগিয়ে যাওয়ার 55% সম্ভাবনা থাকবে (অর্থাত্ ভেক্টর (-1,1)) এবং পাথরটি পেরিয়ে ডান দিকে (অর্থাৎ ভেক্টর (1,1)) যাওয়ার 45% সম্ভাবনা রয়েছে । ক্যানো যদি খুব বাম বা ডান কলামে থাকে তবে এটি সর্বদা কেন্দ্রের দিকে চলে যাবে। যদি কোনও শিলা না থাকে তবে এটি সোজা উপরের দিকে চলে যাবে।

        y
----x---15
----xo--14
-o--x---13
----x---12
---ox---11
---x----10
---xo---9
---ox---8
----xo--7
-----x--6
----ox--5
-o--x---4
----x---3
----xo--2
----x---1
----x---0
01234567

উপরে: একটি সম্ভাব্য পথ ক্যানোটি গ্রহণ করতে পারে, এটি চরিত্রটি ব্যবহার করে প্রতিনিধিত্ব করে x

নদীর মানচিত্র দেওয়া, একটি প্রোগ্রাম লিখুন যা একটি নির্দিষ্ট কলামে ক্যানো সমাপ্তির সম্ভাবনা আউটপুট করবে।

আপনার প্রোগ্রামের জন্য যে কোনও পদ্ধতিতে ইনপুট গ্রহণ করুন (যেমন STDIN, কমান্ড লাইন আর্গুমেন্ট, raw_input()কোনও ফাইল থেকে পড়া ইত্যাদি) etc ইনপুটটির প্রথম অংশটি 0 থেকে 7 এর মধ্যে একটি একক পূর্ণসংখ্যা, যা কলামটি উপস্থাপন করে প্রোগ্রামটির সম্ভাবনাটি খুঁজে পাবে। এর পরে x,yপাথরের অবস্থানের প্রতিনিধিত্ব করে ফর্মের টিপলগুলির একটি তালিকা ।

একটি উদাহরণ:

ইনপুট:

4 4,1 5,5 3,5

এটি (4,1), (5,5) এবং (3,5) পজিশনে পাথর সহ একটি নদী নির্দেশ করবে এবং চতুর্থ কলামে ক্যানো শেষ হওয়ার সম্ভাবনা জিজ্ঞাসা করবে।

আউটপুট:

0.495

মনে রাখবেন যে এই উদাহরণে, শিলাগুলির অবস্থানগুলি প্রতিসম ছিল, দ্বিপদী বিতরণের মাধ্যমে সমস্যাটি সমাধান করার অনুমতি দেয়। এটি সবসময় হবে না!

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

এটি কোড গল্ফ, তাই সবচেয়ে কম সংখ্যক অক্ষর জিতেছে। স্পেসিফিকেশনটি পরিষ্কার না হলে মন্তব্যগুলিতে নির্দ্বিধায় প্রশ্ন করুন।


8
হাস্যকর বিষয় হ'ল প্রোগ্রামটি আসলে কাউকে র‌্যাপিডগুলিতে বাঁচতে সহায়তা করে না। এটা তোলে তাদের বলুন কিভাবে এটি সম্ভবত তারা যদিও টেকা করব না।
সোমরস

1
দুই বা ততোধিক শিলার একপাশে পাশাপাশি থাকলে কী হয়? উদাহরণস্বরূপ, মানচিত্রটি যদি "0,0 1,1" হয় তবে নখটি 1,1 এ শৈলটিতে বিধ্বস্ত হবে। (ক) শর্তটি অনুমোদিত নয়, বা (খ) কোর্সটি সম্পন্ন করার সম্ভাবনা ০.
গ্লেন র্যান্ডার্স-পেহারসন

1
আহ, ঠিক আছে. দুঃখিত, আমি সেই অংশটি মিস করেছি।
ডুরকনব

3
চূড়ান্ত চিন্তাভাবনা: "সম্ভবত একটি প্রোগ্রামযোগ্য ক্যানো তৈরি করা বিস্ফোরক প্যাডেল ব্যবহারের সমস্যার সর্বোত্তম সমাধান ছিল না।"
কাই

2
আমি যখন কোনও প্যাডেল বিস্ফোরিত হয় তখন এটি দেখতে কেমন দেখতে চাই।
রবি ডাব্লিজিজে

উত্তর:


4

গল্ফস্ক্রিপ্ট, 105 অক্ষর

~](\2/:A;8,{4=}%15,{:B;{20*}%A{~B={[\\,.1,*\[2$=..20/9*:C-\~)C]+(1,\+1,6*2$8>+]zip{{+}*}%.}*;}/}/=20-15?*

একটি গল্ফস্ক্রিপ্ট সংস্করণ যা উদ্দিষ্টের চেয়ে অনেক বেশি দীর্ঘ হয়ে গেছে - তবে আলাদা পদ্ধতির সাথে প্রতিটি প্রচেষ্টা আরও দীর্ঘ ছিল। ইনপুটটি অবশ্যই STDIN এ দেওয়া উচিত।

উদাহরণ:

> 4 4,1 5,5 3,5
99/200

টীকাবিহীন কোড:

# Evaluate the input
#  - stack contains the first number (i.e. column)
#  - variable A contains the rock coordinates (pairs of X y)
#    where X is an array of length x (the coordinate itself)
~](\2/:A;

# Initial probabilities
#  - create array [0 0 0 0 1 0 0 0] of initial probabilities
8,{4=}%

# Loop over rows 
15,{:B;           # for B = 0..14
  {20*}%          #   multiply each probability by 20
  A{              #   for each rock 
    ~B={          #     if rock is in current row then
                  #       (prepare an array of vectors [v0 vD vL vR] 
                  #       where v0 is the current prob. before rocks,
                  #       vD is the change due to rocks,
                  #       vL is a correction term for shifting out to the left
                  #       and vR the same for the right side)
      [\\         #       move v0 inside the array
      ,           #       get x coordinate of the rock
      .1,*        #       get [0 0 ... 0] with x terms
      \[2$=       #       get x-th item of v0
      ..20/9*:C-  #       build array [0.55P -P 0.45P]
      \~)C]+      #       and append to [0 0 ... 0]
      (1,\+       #       drop the leftmost item of vD and prepend [0] again
                  #       which gives vL
      1,6*2$8>+   #       calculate vR using the 8th item of vD
      ]           #       
      zip{{+}*}%  #       sum the columns of this list of vectors
      .           #       dummy dup for end-if ;
    }*;           #     end if
  }/              #   end for
}/                # end for

# take the n-th column and scale with 20^-15
=
20-15?*

11

রুবি, 204 191 172 টি অক্ষর

c,*r=gets.split
o=[0]*8
s=->x,y,p{y>14?o[x]+=p :(r.index("#{x},#{y+=1}")?(x<1?s[x+1,y,p]:(x>6?s[x-1,y,p]:(s[x-1,y,p*0.55]+s[x+1,y,p*0.45]))):s[x,y,p])}
s[4,0,1]
p o[c.to_i]

প্রতিটি স্বতন্ত্র ফলাফলের সম্ভাবনার উপর নজর রাখার সময় এটি পুনরাবৃত্তভাবে সমস্ত সম্ভাব্য ফলাফলগুলি সিমুলেট করে, তারপরে এটি যখন সম্ভাব্যতাকে একটি সংযোজক কাউন্টারে যুক্ত করে y == 15

অভিনব কৌশল:

  • c,*r=gets.split- "splat" অপারেটর ( *) এর সমস্ত অবশিষ্ট উপাদান লাগে gets.splitএবং তাদের লাঠি rঅ্যারে

  • next {something} if {condition}: মূলত সমতুল্য

    if {condition}
        {something}
        return
    end
    

    থেকে নব্য দ্বারা "আবিষ্কৃত" if condition; something; return; endকরতে return something if conditionকরতে break something if condition, এবং তারপর আমি মূর্ত আমি এটা কাজ করবে দেখতে (যা এটা অবশ্যই, করেনি) একটি সংক্ষিপ্ত "লুপ অপারেটর" চেষ্টা করবে।

  • শৃঙ্খলযুক্ত টের্নারি অপারেটরগুলি (যা উপরের গল্ফড কোডের মধ্যে বিশাল তৃতীয় লাইনে পরিণত হয়েছিল) এবং উপরের পয়েন্টটি (যা ১৯ (!) অক্ষর সংরক্ষণ করেছিল) সরিয়ে দেওয়ার পরামর্শ দেওয়ার জন্য @ মার্টিনব্যাটনারকে ধন্যবাদ জানায়

    আমি তাদের সাথে কিছুটা অভিনব কৌশল ব্যবহার করেছি, যদিও: আমি বুঝতে পেরেছি যে s[foo],s[bar]একটি বিবৃতিতে দুটি পদ্ধতি কলের জন্য রুবি কাজ করে না। সুতরাং প্রথম আমি তা পরিবর্তিত (_=s[foo],s[bar])(ক ডামি পরিবর্তনশীল), কিন্তু তারপর আমি আমি শুধু যোগ করতে পারেন এবং রিটার্ন মান বর্জন করা যেতে পারে উপলব্ধি: s[foo]+s[bar]। এটি কেবলমাত্র কাজ করে কারণ কলগুলি sকেবল কখনও অন্য কল sবা কোনও সংখ্যায় ( o[x]+=p) কল করে "ফেরত" দেয় , তাই আমাকে চেক করার বিষয়ে চিন্তা করতে হবে না nil

  • অন্যান্য বিভিন্ন অপ্টিমাইজেশন: pপরিবর্তে putsসংখ্যার মুদ্রণ জন্য <1পরিবর্তে ==0অন্যত্র, এবং অনুরূপ তুলনা (যেহেতু শাল্তি কখনো নদী ছেড়ে) [0]*8সবসময় "মান পাস" হয় রুবি এর সংখ্যা হিসেবে প্রাথমিক সম্ভাব্যতা জন্য

Ungolfed:

column, *rocks = gets.chomp.split
outcomes = Array.new(8, 0)
simulate = -> x, y, probability {
    if y == 15
        outcomes[x] += probability
    elsif rocks.index("#{x},#{y + 1}")
        case x
        when 0 then simulate[x + 1, y + 1, probability]
        when 7 then simulate[x - 1, y + 1, probability]
        else
            simulate[x - 1, y + 1, probability * 0.55]
            simulate[x + 1, y + 1, probability * 0.45]
        end
    else
        simulate[x, y + 1, probability]
    end
}
simulate[4, 0, 1.0]
p outcomes
puts outcomes[column.to_i]

next X if Yনেস্টেড টার্নারি অপারেটরগুলিতে এই সমস্ত সংগ্রহ করা কি আরও ছোট হবে না ? ভাল লাগছে তবে আপনি এটি রুবির টিপসে যুক্ত করতে চাইতে পারেন!
মার্টিন এন্ডার

@ মার্টিনব্যাটনার হ্যাঁ, এটি আসলে পুরো 19 টি অক্ষর ছোট! ধন্যবাদ, যদিও এটি একটি হাস্যকর দীর্ঘ লাইনের দুর্ভাগ্যজনক পার্শ্ব প্রতিক্রিয়া দেখায়: পি
ডোরকনব

5

সি # 418 364 বাইটস

সম্পূর্ণ সি # প্রোগ্রামটি এসটিডিআইএন থেকে ইনপুট আশা করে। নদীর সমস্ত অবস্থানের অ্যারেতে শিলাগুলি পড়ে কার্যকরভাবে একটি মানচিত্র তৈরি করে কাজ করে এবং এরপরে ফলাফলটি আউটপুট দেওয়ার আগে এটি 8-প্রস্থের দশমিক অ্যারের চারদিকে চলমান সম্ভাবনার 16 টি পুনরাবৃত্তি সম্পাদন করে।

using C=System.Console;class P{static void Main(){var D=C.ReadLine().Split();int i=0,j=D.Length;var R=new int[8,16];var p=new decimal[8];for(p[4]=1;--j>0;)R[D[j][0]-48,int.Parse(D[j].Substring(2))]=1;for(;i<16;i++){var n=new decimal[j=8];for(;j-->0;)if(R[j,i]>0){n[j<1?1:j-1]+=p[j]*0.55M;n[j>6?6:j+1]+=p[j]*0.45M;}else n[j]+=p[j];p=n;}C.WriteLine(p[D[0][0]-48]);}}

ফর্ম্যাট কোড:

using C=System.Console;

class P
{
    static void Main()
    {
        var D=C.ReadLine().Split();
        int i=0,j=D.Length;
        var R=new int[8,16];
        var p=new decimal[8];

        for(p[4]=1;--j>0;) // read rocks into map (R)
            R[D[j][0]-48,int.Parse(D[j].Substring(2))]=1;

        for(;i<16;i++) // move up the river
        {
            var n=new decimal[j=8];
            for(;j-->0;)
                if(R[j,i]>0)
                { // we hit a rock!
                    n[j<1?1:j-1]+=p[j]*0.55M;
                    n[j>6?6:j+1]+=p[j]*0.45M;
                }
                else
                    n[j]+=p[j];
            p=n; // replace probability array
        }

        C.WriteLine(p[D[0][0]-48]); // output result
    }
}

"যান" অপারেটর ( for(;j-->0;)) ব্যবহার করার জন্য +1 । সর্বশেষ C.WriteLineদ্বারা প্রতিস্থাপন করে আপনি কয়েকটি চরিত্র থেকে মুক্তি পেতে পারেন C.Write। এছাড়াও, আপনি যদি এর floatপরিবর্তে ব্যবহার করেন তবে decimalআরও কয়েকটি বাইট সংরক্ষণ করতে পারেন।
ক্রিস্টোফ বাহ্মওয়ালদার

@ হ্যাকারকো স্ট্যান্ডার্ড অনুশীলন;) আপনার লুপগুলি থেকে সর্বাধিক সুবিধা অর্জন করতে পারে! আমি ব্যবহার করছি decimalকারণ floatসুনির্দিষ্ট হবে না, তবে দশমিক এই সমস্যার জন্য করা উচিত, তবে সম্ভবত আপনি যা বলছেন তা থেকে দূরে সরে যেতে পারে। আমি C.Writeযদি এটিকে আরও গল্ফ করার জন্য পরিচালনা করি তবে এটি সম্ভবত C.WriteLine
অনুমানের

2

হাস্কেল, 256 বাইট

import Data.List
m=map;v=reverse
a p n x=take n x++(x!!n+p:drop(n+1)x)
l=abs.pred
o[_,n]s=n#(s!!n)$s
n#p=a(11*p/20)(l n).a(9*p/20)(7-(l$7-n)).a(-p)n
b=0:0:0:0:1:b
k(c:w)=(foldl1(.)$m o$v$sort$m(v.read.('[':).(++"]"))w)b!!read c
main=getLine>>=print.k.words

এখানে ব্যবহৃত কিছু কৌশলগুলির সাথে একটি খুব অদম্য সংস্করণ রয়েছে:

import Data.List

-- Types to represent the distribution for the canoe's location
type Prob = Double
type Distribution = [Prob]

-- Just for clarity..
type Index = Int

-- An Action describes some change to the probability distribution
-- which represents the canoe's location.
type Action = Distribution -> Distribution

-- Helper to add k to the nth element of x, since we don't have mutable lists.
add :: Index -> Prob -> Action
add n k x = take n x ++ [p] ++ drop (n + 1) x
    where p = k + x!!n  

-- A trick for going finding the index to the left of n,
-- taking the boundary condition into account.
leftFrom n = abs (n - 1)

-- A trick for getting the other boundary condition cheaply.
rightFrom = mirror . leftFrom . mirror
    where mirror = (7 -)

-- Make the action corresponding to a rock at index n.
doRock :: Index -> Action
doRock n p = (goLeft . goRight . dontGoForward) p
    where goLeft  =  (leftFrom n) `add` (p_n * 11/20)
          goRight = (rightFrom n) `add` (p_n * 9/20)
          dontGoForward =  (at n) `add` (-p_n)
          p_n = p!!n
          at = id

initialProb = [0,0,0,0,1,0,0,0]

-- Parse a pair "3,2" ==> (3,2)
readPair :: String -> (Index,Index)
readPair xy = read $ "(" ++ xy ++ ")"

-- Coordinate swap for the sorting trick described below.
swap (x,y) = (y,x)

-- Put it all together and let it rip!
main = do
    input <- getLine
    let (idx : pairs) = words input
    let coords = reverse . sort $ map (swap . readPair) pairs
    let rockActions = map (doRock . snd) coords
    let finalProb = (foldl1 (.) rockActions) initialProb
    print $ (finalProb !! read idx)

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

সুতরাং প্রোগ্রামটি প্রতিটি শৈলটির অবস্থান সম্ভাবনার বন্টন ট্রান্সফর্মারে রূপান্তরিত করে, রকের y কান্ডিনেট দ্বারা আদেশ করা। ট্রান্সফর্মারগুলি কেবলমাত্র क्रमবদ্ধভাবে বেঁধে রাখা হয় এবং প্রাথমিক সম্ভাবনা বিতরণে প্রয়োগ করা হয়। আর এটাই!


2

পার্ল 169 বাইট

এসটিডিআইএন থেকে পড়ে।

$_=<>;s/ (.),(\d+)/$s{$1,$2}=1/eg;/./;$x{4}=1.0;for$y(1..15){for$x(0..7){if($s{$x,$y}){$x{$x-1}+=$x{$x}*($x%7?.55:1);$x{$x+1}+=$x{$x}*($x%7?.45:1);$x{$x}=0}}}print$x{$&}

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


2

পিএইচপি, 358

সম্ভাব্য পথগুলি এবং তাদের সম্ভাব্যতাগুলি নির্ধারণের জন্য মস্তিষ্কের শক্তি ব্যবহার করা শক্ত, এবং সম্ভবত ১,০০,০০০ ন্যূ দুর্ঘটনার অনুকরণের চেয়ে আরও কোডের প্রয়োজন হবে। আহ! মনুষ্যত্ব!

define('MX',7);
define('MY',16);
define('IT',1000000);
error_reporting(0);

function roll(){return rand()%100 > 44;}

function drift($rocks,$print=false) {
    for($px=4,$py=0;$py<MY;$py++) {
        if(isset($rocks[$px][$py])){
            if(roll()) $px--;
            else $px++;
        }
        else if($px==0) $px++;
        else if($px==MX) $px--;
        if($print) {
            for($i=0;$i<MX;$i++){
                if($i==$px) echo 'x';
                else if(isset($rocks[$i][$py])) echo 'o';
                else echo '-';
            }
            echo " $py\n";
        }
    }
    return $px;
}

$input = $argv[1];
$tmp = explode(' ',$input);
$end_target = array_shift($tmp);
$rocks = array();
array_map(function($a) use(&$rocks) {
    list($x,$y) = explode(',',$a);
    $rocks[$x][$y]=1;
}, $tmp);

$results=array();
for($i=0;$i<IT;$i++) {
    $results[drift($rocks)]++;
}

drift($rocks, true); // print an example run

foreach($results as $id=>$result) {
    printf("%d %0.2f\n", $id, $result/IT*100);
}

উদাহরণ:

php river.php "4 4,1 5,5 3,3 6,2 9,4 12,3 13,5"
----x-- 0
---xo-- 1
---x--o 2
--xo--- 3
--x---- 4
--x--o- 5
--x---- 6
--x---- 7
--x---- 8
--x---- 9
--x---- 10
--x---- 11
--x---- 12
--x---- 13
--x---- 14
--x---- 15
4 49.53
2 30.18
6 20.29

Golfed:

<? function d($r){for($x=4,$y=0;$y<16;$y++){if(isset($r[$x][$y])){if(rand()%100>44)$x--;else $x++;}elseif($x==0)$x++;elseif($x==7)$x--;}return $x;}$t=explode(' ',$argv[1]);$e=array_shift($t);$r=array();array_map(function($a)use(&$r){list($x,$y)=explode(',',$a);$r[$x][$y]=1;},$t);$c=0;for($i=0;$i<1000000;$i++){if(d($r)==$e)$c++;}printf("%.4f", $c/1000000);

এই সংস্করণটি কোনও সুন্দর মুদ্রণ করে না এবং নির্দিষ্ট অবস্থানে ক্যানো অবতরণের সম্ভাব্যতা আউটপুট করে।

# php river_golf.php "4 4,1 5,5 3,3 6,2 9,4 12,3 13,5"
0.4952

আমি মনে করি যে এখানে ইনপুট ফর্ম্যাটটি কিছুটা বন্ধ রয়েছে, যেমন রিভার.এইচপিপি "5,4,4 1,5 5,3 3,6 2,9 4,12 3,13"
ম্যাট

@ ম্যাটনুনন এটি গতকাল মোটামুটি দিন ছিল। আমার এটি ঠিক করতে সক্ষম হওয়া উচিত ...
সামমিতাচ

2

পিএইচপি, 274

আমি আমার জীবন বাঁচাতে গল্ফস্ক্রিপ্টটি পড়তে / লিখতে পারি না, তবে @ হাওয়ার্ডের জমা দেওয়ার প্রতি লক্ষ্য রেখে আমাকে কেবল 1 মিলিয়ন ক্যানো দুর্ঘটনার সীমাবদ্ধ করার চেয়ে আরও ভাল দিকে নির্দেশ করেছেন।

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

function psplit($i){ return array(.55*$i,.45*$i); }
function pt($a) {
    foreach($a as $p) {
        printf("%1.4f ", $p);
    }
    echo "\n";
}

$input = $argv[1];
$tmp = explode(' ',$input);
$end_target = array_shift($tmp);
$rocks = array();
array_map(function($a) use(&$rocks) {
    list($x,$y) = explode(',',$a);
    $rocks[$x][$y]=1;
}, $tmp);

$state = array(0,0,0,0,1,0,0,0);
pt($state);
for($y=1;$y<16;$y++){
    for($x=0;$x<8;$x++){
        if(isset($rocks[$x][$y])){
            echo('   o   ');
            list($l,$r)=psplit($state[$x]);
            $state[$x]=0;
            $state[$x-1]+=$l;
            $state[$x+1]+=$r;
        } else { echo '   -   '; }
    }
    echo "\n";
    pt($state);
}

উদাহরণ আউটপুট:

# php river2.php "4 4,1 5,5 3,3 6,2 9,4 12,3 13,5"
0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000
   -      -      -      -      o      -      -      -
0.0000 0.0000 0.0000 0.5500 0.0000 0.4500 0.0000 0.0000
   -      -      -      -      -      -      o      -
0.0000 0.0000 0.0000 0.5500 0.0000 0.4500 0.0000 0.0000
   -      -      -      o      -      -      -      -
0.0000 0.0000 0.3025 0.0000 0.2475 0.4500 0.0000 0.0000
   -      -      -      -      -      -      -      -
0.0000 0.0000 0.3025 0.0000 0.2475 0.4500 0.0000 0.0000
   -      -      -      -      -      o      -      -
0.0000 0.0000 0.3025 0.0000 0.4950 0.0000 0.2025 0.0000
   -      -      -      -      -      -      -      -
0.0000 0.0000 0.3025 0.0000 0.4950 0.0000 0.2025 0.0000
   -      -      -      -      -      -      -      -
0.0000 0.0000 0.3025 0.0000 0.4950 0.0000 0.2025 0.0000
   -      -      -      -      -      -      -      -
0.0000 0.0000 0.3025 0.0000 0.4950 0.0000 0.2025 0.0000
   -      -      -      -      -      -      -      -
0.0000 0.0000 0.3025 0.0000 0.4950 0.0000 0.2025 0.0000
   -      -      -      -      -      -      -      -
0.0000 0.0000 0.3025 0.0000 0.4950 0.0000 0.2025 0.0000
   -      -      -      -      -      -      -      -
0.0000 0.0000 0.3025 0.0000 0.4950 0.0000 0.2025 0.0000
   -      -      -      -      -      -      -      -
0.0000 0.0000 0.3025 0.0000 0.4950 0.0000 0.2025 0.0000
   -      -      -      -      -      -      -      -
0.0000 0.0000 0.3025 0.0000 0.4950 0.0000 0.2025 0.0000
   -      -      -      -      -      -      -      -
0.0000 0.0000 0.3025 0.0000 0.4950 0.0000 0.2025 0.0000
   -      -      -      -      -      -      -      -
0.0000 0.0000 0.3025 0.0000 0.4950 0.0000 0.2025 0.0000

Golfed:

<? $t=explode(' ',$argv[1]);$e=array_shift($t);$r=array();foreach($t as $n){list($j,$k)=explode(',',$n);$r[$j][$k]=1;}$s=array(0,0,0,0,1,0,0,0);for($y=1;$y<16;$y++){for($x=0;$x<8;$x++){if(isset($r[$x][$y])){$s[$x-1]+=$s[$x]*.55;$s[$x+1]+=$s[$x]*.45;$s[$x]=0;}}}echo $s[$e];

উদাহরণ রান:

# php river2_golf.php "4 4,1 5,5 3,3 6,2 9,4 12,3 13,5"
0.495

1

হাস্কেল, 237

আমি কেবল আশা করি ক্যানোটি জিএইচসি ইনস্টল করে ...

অসীম তালিকার কৌশলটি ম্যাট নুনন থেকে চুরি হয়ে গেছে, তার কাছে কুডোস!

import Data.List
r=reverse
(a:b:x)%0=0:a+b:x
x%7=r(r x%0)
x%n=take(n-1)x++(x!!(n-1)+x!!n*0.55:0:x!!(n+1)+x!!n*0.45:drop(n+2)x)
q=0:0:0:0:1:q
u(w:x)=(foldl(%)q.map last.sort.map(r.read.('[':).(++"]"))$x)!!read w
main=interact$show.u.words

আমি আশা করি আমি যুক্তিটি সঠিকভাবে পেয়েছি তবে ম্যাট উদাহরণের "5 4,4 1,5 5,3 3,6 2,9 4,12 3,13"ফলস্বরূপ 0.5613750000000001এবং ওপির উদাহরণ "4 4,1 5,5 3,5"ফলন হয়েছে 0.49500000000000005যা কিছু ভাসমান বিন্দু ত্রুটিগুলি ছাড়াও সঠিক বলে মনে হচ্ছে।

এখানে এটি কার্যকর হয়:

>>> echo 5 4,4 1,5 5,3 3,6 2,9 4,12 3,13 | codegolf
0.5613750000000001
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.