Galton box animation: Difference between revisions
m
→{{header|EasyLang}}
No edit summary |
|||
(11 intermediate revisions by 8 users not shown) | |||
Line 30:
=={{header|AutoHotkey}}==
Uses an edit box for the (text based) animation
<
; User settings
bottompegs := 6
Line 118:
StringTrimRight, out, out, 1 ; removes the last newline
return out
}</
<pre>
*
Line 136:
=={{header|BASIC256}}==
[[File:Galton box BASIC-256.gif|right|150px|thumb|Galton box animation created with BASIC-256]]
<
fastgraphics
color black
Line 251:
iters = iters + 1
refresh
return</
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
[[Image:quincunx_bbc.gif|right]]
<
DIM ballX%(maxBalls%), ballY%(maxBalls%)
Line 304:
NEXT
tick% += 1
UNTIL FALSE</
=={{header|C}}==
<
#include <stdlib.h>
#include <string.h>
Line 396:
return 0;
}</
Sample out put at begining of a run:<pre>
*
Line 411:
=={{header|C++}}==
Windows GDI version.
<
#include "stdafx.h"
#include <windows.h>
Line 630:
return myWnd.Run( hInstance );
}
</syntaxhighlight>
=={{header|Clojure}}==
<syntaxhighlight lang="clojure">(def n 8)
(def balls* (atom [{:x n :y 0}]))
(def board* (atom (vec (repeat (inc n) (vec (repeat (inc (* 2 n)) " "))))))
(doseq [y (range (inc n))
i (range y)]
(swap! board* assoc-in [y (+ (- n y) (* 2 i) 1)] "^"))
(def histogram* (atom (vec (repeat (inc (* 2 n)) 0))))
(loop [frame 0]
(print "\033[0;0f\033[2J")
(doseq [row @board*] (println (apply str row)))
(let [depth (inc (apply max (map #(quot % 8) @histogram*)))]
(dotimes [y depth]
(doseq [i @histogram*]
(print (nth " ▁▂▃▄▅▆▇█" (min 8 (max 0 (- i (* (- depth y 1) 8)))))))
(print "\n")))
(println "\n")
(flush)
(doseq [[i {:keys [x y]}] (map-indexed vector @balls*)]
(swap! board* assoc-in [y x] " ")
(let [[new-x new-y] [(if (< 0.5 (rand)) (inc x) (dec x)) (inc y)]]
(if (> new-y n)
(do (swap! histogram* update x inc)
(swap! balls* assoc i {:x n :y 0}))
(do (swap! board* assoc-in [new-y new-x] "*")
(swap! balls* assoc i {:x new-x :y new-y})))))
(Thread/sleep 200)
(when (< (count @balls*) n) (swap! balls* conj {:x n :y 0}))
(when (< frame 200) (recur (inc frame))))
</syntaxhighlight>
Sample output:
<pre>
^*
^*^
^ ^ ^
^ ^ ^*^
^*^ ^ ^ ^
^ ^ ^*^ ^ ^
^ ^ ^ ^*^ ^ ^
^ ^ ^*^ ^ ^ ^ ^
▅ ▅
█ █ ▂
█ █ █
▃ █ █ █
█ █ █ █ █
▁ ▇ █ █ █ █ █ ▃ ▁
</pre>
=={{header|D}}==
To keep the code simpler some corner cases are ignored.
<
enum int boxW = 41, boxH = 37; // Galton box width and height.
Line 737 ⟶ 787:
b.doStep;
}
}</
{{out}}
<pre>
Line 860 ⟶ 910:
| o o o o o o o o o o o |
+---------------------------------------+</pre>
=={{header|EasyLang}}==
[https://easylang.dev/show/#cod=dVNdc4IwEHzPr9iZvqgMlCDYOlP8Ix0f+IhtFBMnYIV/3wkEJIAvcLcc2d27S9mUqOStYKeKvIHclMyQq+Rx46KEB48AOEkFjkpirzMDnDXADQDgKv8YVjSCC77GBls4OGODHXj7dBA8izOusoLB9z4M1vJ4xCOZLKRCFEWkV0HSJLv8KHkXOVyqRRZMIJX19xHUb5NR2HRhb6X8lY9U1jMn1DfENeJBII2m/jQLP05M1qC+D7d1Fy76CqauWi1c8Oq1kI4KMQZlo1Sf8Ya+OeGWSIGKX5nSH/kJ6b1sdC0SkUMlIueiQogYtD+9K6AjgzZ9d85EgiUk/LTQpkMDC0wVSy4DS9+B/s2Kktl6jDnduYIlrRszsdfTGk1EK8YBtodW2FeMaDfX60wF9/VXmWM3s9MyOjG22GDVtzXABgFcbNez2q4ltYV7z2zk37Dn2tCqhgsarfGOZcnhouRDjP0Obrc4eX3U2/hCkT/Fh3+ceDytgWD4frA25FkieLUAz8Y/a4GdjUJzsxrrui1fJ6DbffgeJR4xMSH/ Run it]
<syntaxhighlight>
sys topleft
#
proc drawpins . .
for i to 9
for j to i
move (15 - i) * 3 + j * 6 i * 6 + 2
circle 0.7
.
.
.
color 555
drawpins
background -1
#
len box[] 10
len x[] 10
len y[] 10
#
proc showbox . .
for i to 10
x = i * 6 + 15
for j to box[i]
move x 100 - j * 4 + 2
circle 2
.
.
.
proc init . .
for i to 10
box[i] = 0
x[i] = 0
.
.
#
color 543
on timer
if busy = 0 and randint 4 = 1
busy = 1
for i to 10
if x[i] = 0
x[i] = 48
y[i] = 2
break 1
.
.
else
busy = 0
.
clear
showbox
for i to 10
x = x[i]
if x > 0
if y[i] <= 56
y[i] += 2
if y[i] mod 6 = 2
x += 3 * (randint 2 * 2 - 3)
x[i] = x
.
else
idx = (x - 15) / 6
y[i] += 4
if y[i] >= 96 - box[idx] * 4
x[i] = 0
box[idx] += 1
if box[idx] > 10
init
break 1
.
.
.
move x y[i]
circle 2
.
.
timer 0.1
.
timer 0
</syntaxhighlight>
=={{header|Elm}}==
<
import Time exposing (Time, every, millisecond)
import Color exposing (Color, black, red, blue, green)
Line 1,071 ⟶ 1,205:
, update = update
, subscriptions = subscriptions
}</
Link to live demo: http://dc25.github.io/galtonBoxAnimationElm/ . Follow the link, enter a number and press the GO button.
Line 1,077 ⟶ 1,211:
=={{header|Factor}}==
{{works with|Factor|0.99 development release 2019-03-17}}
<
combinators.short-circuit fonts fry generalizations kernel
literals locals math math.ranges math.vectors namespaces opengl
Line 1,185 ⟶ 1,319:
{ window-controls
{ normal-title-bar close-button minimize-button } }
} <galton-gadget> >>gadgets ;</
{{out}}
Image taken from the program mid-animation: [https://i.imgur.com/E2ge7LE.png]
Line 1,191 ⟶ 1,325:
=={{header|Go}}==
{{trans|D}}
<
import (
Line 1,317 ⟶ 1,451:
}
}
}</
{{out}}
Line 1,363 ⟶ 1,497:
=={{header|Haskell}}==
<
import Graphics.Gloss
import Control.Monad.Random
Line 1,409 ⟶ 1,543:
where balls = mapM makeBall [1..]
makeBall y = Ball (0, y) <$> randomTurns
randomTurns = filter (/=0) <$> getRandomRs (-1, 1)</
=={{header|Icon}} and {{header|Unicon}}==
Line 1,415 ⟶ 1,549:
[[File:Galtonbox-Unicon.PNG|thumb|right]]
<
global pegsize, pegsize2, height, width, delay
Line 1,479 ⟶ 1,613:
initial ballcounts := table(0)
FillArc(x, height-(ballcounts[x] +:= 1)*pegsize, pegsize, pegsize)
end</
=={{header|J}}==
Line 1,485 ⟶ 1,619:
First, we need to represent our pins:
<
For example:
<
*
* *
* * *
* * * *</
Note that we could introduce other pin arrangements, for example a Sierpinski triangle:
<
... but this will not be too interesting to use, because of the lack of interior pins for the balls to bounce off of.
Line 1,503 ⟶ 1,637:
Anyways, once we have that, we can add balls to our picture:
<
For example:
<
o
o
Line 1,515 ⟶ 1,649:
* *
* * *
* * * * </
Now we just need some way of updating our datastructure.
Line 1,521 ⟶ 1,655:
We will need a mechanism to shift a ball left or right if it's above a pin:
<syntaxhighlight lang="text">bounce=: (C.~ ] <"1@:+ 0 1 -~/~ ? @: (2"0))"1 [: I. 'o*'&E."1&.|:</
And, a mechanism to make the balls fall:
<syntaxhighlight lang="text">shift=: 4 :0
fill=. {.0#,y
x |.!.fill y
)</
And then we need to separate out the balls from the pins, so the balls fall and the pins do not. Note also that in this representation, balls will have to fall when they bounce because they cannot occupy the same space that a pin occupies.
Line 1,534 ⟶ 1,668:
We will also want some way of preventing the balls from falling forever. For this task it's probably sufficient to introduce a baseline just deep enough to hold the stacks (which have passed through the pins) and have later balls instantly fall as close as they can to the baseline once they are passed the pins.
<
balls=: 'o'&=
Line 1,543 ⟶ 1,677:
clean2=: ({. , -.&' '"1&.|:&.|.@}.)~ 1 + >./@(# | '*' i:~"1 |:)
clean1=: #~ 1 1 -.@E. *./"1@:=&' '
clean=: clean1@clean2</
For example:
<
o
Line 1,555 ⟶ 1,689:
* * *
* * * *
</
Or, showing an entire animation sequence:
<
┌─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┐
│ o │ │ │ │ │ │ │ │ │ │ │ │ │ │
Line 1,575 ⟶ 1,709:
│ * * * * * │ * * * * * │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┘</
=={{header|Java}}==
The balls keep track of where they are, and we just have to move them down and print. You might easily adjust this to take command line input for the numbers of pins and balls. I'm sure that this could be a lot shorter...
<
import java.util.List;
import java.util.ArrayList;
Line 1,709 ⟶ 1,843:
return result;
}
}</
{{out}}
When only five balls have begun to fall through the pins:
Line 1,825 ⟶ 1,959:
=={{header|JavaScript}}==
Works with NodeJs
<
/**
Line 1,950 ⟶ 2,084:
};
galtonBox(12, 50);</
{{out}}
<pre>
Line 1,990 ⟶ 2,124:
{{works with|Julia|1.0}}
<
function drawball(timer)
global r, c, d
Line 2,016 ⟶ 2,150:
while r < 15 sleep(0.01) end
print("\e[40;1H") # move cursor far down
end</
{{out}}
<pre>
Line 2,050 ⟶ 2,184:
=={{header|Kotlin}}==
{{trans|D}}
<
import java.util.Random
Line 2,151 ⟶ 2,285:
for (b in balls) b.doStep()
}
}</
Sample output (showing final step only):
Line 2,197 ⟶ 2,331:
=={{header|Liberty BASIC}}==
User can choose the number of balls to run through the simulation.
<syntaxhighlight lang="lb">
[setup]
nomainwin
Line 2,321 ⟶ 2,455:
unloadbmp "bg"
end
</syntaxhighlight>
=={{header|Lua}}==
Uses Bitmap class [[Bitmap#Lua|here]], with an ASCII pixel representation, then extending..
<syntaxhighlight lang="lua">Bitmap.render = function(self)
for y = 1, self.height do
print(table.concat(self.pixels[y], " "))
end
end
-- globals (tweak here as desired)
math.randomseed(os.time())
local W, H, MIDX = 15, 40, 7
local bitmap = Bitmap(W, H)
local AIR, PIN, BALL, FLOOR = ".", "▲", "☻", "■"
local nballs, balls = 60, {}
local frame, showEveryFrame = 1, false
-- the game board:
bitmap:clear(AIR)
for row = 1, 7 do
for col = 0, row-1 do
bitmap:set(MIDX-row+col*2+1, 1+row*2, PIN)
end
end
for col = 0, W-1 do
bitmap:set(col, H-1, FLOOR)
end
-- ball class
Ball = {
new = function(self, x, y, bitmap)
local instance = setmetatable({ x=x, y=y, bitmap=bitmap, alive=true }, self)
return instance
end,
update = function(self)
if not self.alive then return end
self.bitmap:set(self.x, self.y, AIR)
local newx, newy = self.x, self.y+1
local below = self.bitmap:get(newx, newy)
if below==PIN then
newx = newx + (math.random(2)-1)*2-1
end
local there = self.bitmap:get(newx, newy)
if there==AIR then
self.x, self.y = newx, newy
else
self.alive = false
end
self.bitmap:set(self.x, self.y, BALL)
end,
}
Ball.__index = Ball
setmetatable(Ball, { __call = function (t, ...) return t:new(...) end })
-- simulation:
local function spawn()
if nballs > 0 then
balls[#balls+1] = Ball(MIDX, 0, bitmap)
nballs = nballs - 1
end
end
spawn()
while #balls > 0 do
if frame%2==0 then spawn() end
alive = {}
for _,ball in ipairs(balls) do
ball:update()
if ball.alive then alive[#alive+1]=ball end
end
balls = alive
if frame%50==0 or #alive==0 or showEveryFrame then
print("FRAME "..frame..":")
bitmap:render()
end
frame = frame + 1
end</syntaxhighlight>
{{out}}
<pre>FRAME 50:
. . . . . . . . . . . . . . .
. . . . . . . ☻ . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . ☻ ▲ . . . . . . .
. . . . . . . . . . . . . . .
. . . . . ☻ ▲ . ▲ . . . . . .
. . . . . . . . . . . . . . .
. . . . . ▲ ☻ ▲ . ▲ . . . . .
. . . . . . . . . . . . . . .
. . . . ▲ . ▲ . ▲ ☻ ▲ . . . .
. . . . . . . . . . . . . . .
. . . ▲ . ▲ ☻ ▲ . ▲ . ▲ . . .
. . . . . . . . . . . . . . .
. . ▲ . ▲ . ▲ ☻ ▲ . ▲ . ▲ . .
. . . . . . . . . . . . . . .
. ▲ . ▲ . ▲ . ▲ ☻ ▲ . ▲ . ▲ .
. . . . . . . . . . . . . . .
. . . . ☻ . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . ☻ . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . ☻ . . . .
. . . . . . . . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . . . . . . . . . .
. . . . ☻ . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . ☻ . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . ☻
. . . . . . . . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . ☻ . . . ☻ . . . ☻ . . . .
. . ☻ . . . ☻ . ☻ . ☻ . . . .
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
FRAME 100:
. . . . . . . . . . . . . . .
. . . . . . . ☻ . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . ☻ ▲ . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . ▲ ☻ ▲ . . . . . .
. . . . . . . . . . . . . . .
. . . . . ▲ ☻ ▲ . ▲ . . . . .
. . . . . . . . . . . . . . .
. . . . ▲ . ▲ . ▲ ☻ ▲ . . . .
. . . . . . . . . . . . . . .
. . . ▲ . ▲ . ▲ ☻ ▲ . ▲ . . .
. . . . . . . . . . . . . . .
. . ▲ . ▲ ☻ ▲ . ▲ . ▲ . ▲ . .
. . . . . . . . . . . . . . .
. ▲ ☻ ▲ . ▲ . ▲ . ▲ . ▲ . ▲ .
. . . . . . . . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . . . . . . . . . .
. . . . ☻ . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . ☻ . . . . . .
. . . . . . . . . . . . . . .
. . . . . . ☻ . ☻ . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . ☻ . ☻ . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . ☻ . ☻ . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . ☻ . ☻ . . . . . . . .
. . . . . . ☻ . ☻ . . . . . .
. . . . . . ☻ . ☻ . . . . . .
. . . . . . ☻ . ☻ . ☻ . . . .
. . . . ☻ . ☻ . ☻ . ☻ . . . .
. . ☻ . ☻ . ☻ . ☻ . ☻ . . . .
. . ☻ . ☻ . ☻ . ☻ . ☻ . . . .
☻ . ☻ . ☻ . ☻ . ☻ . ☻ . . . ☻
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
FRAME 147:
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . ▲ . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . ▲ . ▲ . . . . . .
. . . . . . . . . . . . . . .
. . . . . ▲ . ▲ . ▲ . . . . .
. . . . . . . . . . . . . . .
. . . . ▲ . ▲ . ▲ . ▲ . . . .
. . . . . . . . . . . . . . .
. . . ▲ . ▲ . ▲ . ▲ . ▲ . . .
. . . . . . . . . . . . . . .
. . ▲ . ▲ . ▲ . ▲ . ▲ . ▲ . .
. . . . . . . . . . . . . . .
. ▲ . ▲ . ▲ . ▲ . ▲ . ▲ . ▲ .
. . . . . . ☻ . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . ☻ . . . . . . . .
. . . . . . ☻ . ☻ . . . . . .
. . . . . . ☻ . ☻ . . . . . .
. . . . . . ☻ . ☻ . . . . . .
. . . . . . ☻ . ☻ . . . . . .
. . . . . . ☻ . ☻ . . . . . .
. . . . ☻ . ☻ . ☻ . . . . . .
. . . . ☻ . ☻ . ☻ . . . . . .
. . . . ☻ . ☻ . ☻ . . . . . .
. . . . ☻ . ☻ . ☻ . ☻ . . . .
. . ☻ . ☻ . ☻ . ☻ . ☻ . . . .
. . ☻ . ☻ . ☻ . ☻ . ☻ . . . .
. . ☻ . ☻ . ☻ . ☻ . ☻ . . . .
. . ☻ . ☻ . ☻ . ☻ . ☻ . . . .
☻ . ☻ . ☻ . ☻ . ☻ . ☻ . ☻ . ☻
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
</pre>
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<
MakePathFunction[{path_, acumpath_}] :=
Module[{f1, f2, f3, pf, n = Length[path]},
Line 2,377 ⟶ 2,713:
Disk[#, r] & /@ MakeScene[pfs, zfinals, n, t]},
PlotRange -> {{-n, n}, {Min[zfinals] - 1, n + 2}},
ImageSize -> 150], {t, 0, Total[n - zfinals] - 0.001}]</
=={{header|Nim}}==
{{trans|Go}}
<
const
Line 2,489 ⟶ 2,825:
# Frozen balls are kept in balls slice for simplicity.
for ball in balls:
box.doStep(ball)</
{{out}}
Line 2,536 ⟶ 2,872:
Output shows of final state for a run with 50 coins.
{{trans|Raku}}
<
use warnings;
Line 2,673 ⟶ 3,009:
? not 0 == ($x - $y) % 2
: 0
}</
{{out}}
<pre> ^
Line 2,697 ⟶ 3,033:
=== native Perl ===
Runs until a bottom column overflows.
<
use strict; # https://rosettacode.org/wiki/Galton_box_animation
Line 2,728 ⟶ 3,064:
$changes or last;
select undef, undef, undef, 0.05;
}</
{{out}}
<pre>
Line 2,769 ⟶ 3,105:
=== console ===
First, a console version:
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- clear_screen(), text_color(), position(), sleep(), get_key()...</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">balls</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">80</span>
<span style="color: #7060A8;">clear_screen</span><span style="color: #0000FF;">()</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">screen</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">,</span><span style="color: #000000;">23</span><span style="color: #0000FF;">),</span><span style="color: #000000;">12</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">&</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">':'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">12</span><span style="color: #0000FF;">)),</span><span style="color: #000000;">12</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">&</span> <span style="color: #0000FF;">{</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'.'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">23</span><span style="color: #0000FF;">)},</span>
<span style="color: #000000;">Pxy</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">({</span><span style="color: #000000;">12</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},</span><span style="color: #000000;">balls</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">peg</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">10</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">screen</span><span style="color: #0000FF;">[</span><span style="color: #000000;">peg</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">][</span><span style="color: #000000;">13</span><span style="color: #0000FF;">-</span><span style="color: #000000;">peg</span><span style="color: #0000FF;">..</span><span style="color: #000000;">11</span><span style="color: #0000FF;">+</span><span style="color: #000000;">peg</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'.'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">peg</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">screen</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">text_color</span><span style="color: #0000FF;">(</span><span style="color: #000000;">BRIGHT_RED</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">bool</span> <span style="color: #000000;">moved</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span>
<span style="color: #004080;">integer</span> <span style="color: #7060A8;">top</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">' '</span> <span style="color: #000080;font-style:italic;">-- (new drop every other iteration)</span>
<span style="color: #008080;">while</span> <span style="color: #000000;">moved</span> <span style="color: #008080;">or</span> <span style="color: #7060A8;">top</span><span style="color: #0000FF;">!=</span><span style="color: #008000;">' '</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">moved</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">balls</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">Px</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Py</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">Pxy</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">Py</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">or</span> <span style="color: #7060A8;">top</span><span style="color: #0000FF;">=</span><span style="color: #008000;">' '</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">Dx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Dy</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">screen</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Py</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Px</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">' '</span> <span style="color: #008080;">then</span> <span style="color: #000080;font-style:italic;">-- can vertical?</span>
<span style="color: #000000;">Dy</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">Dx</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}[</span><span style="color: #7060A8;">rand</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)]</span> <span style="color: #000080;font-style:italic;">-- try l;r or r;l</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">screen</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Py</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Px</span><span style="color: #0000FF;">+</span><span style="color: #000000;">Dx</span><span style="color: #0000FF;">]!=</span><span style="color: #008000;">' '</span> <span style="color: #008080;">then</span> <span style="color: #000000;">Dx</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">Dx</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">screen</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Py</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Px</span><span style="color: #0000FF;">+</span><span style="color: #000000;">Dx</span><span style="color: #0000FF;">]==</span><span style="color: #008000;">' '</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">Dy</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">Dy</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">position</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Py</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Px</span><span style="color: #0000FF;">)</span> <span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">)</span> <span style="color: #000000;">screen</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Py</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Px</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">' '</span>
<span style="color: #000000;">Px</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">Dx</span>
<span style="color: #000000;">Py</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">Dy</span>
<span style="color: #7060A8;">position</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Py</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Px</span><span style="color: #0000FF;">)</span> <span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"o"</span><span style="color: #0000FF;">)</span> <span style="color: #000000;">screen</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Py</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Px</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'o'</span>
<span style="color: #000000;">Pxy</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">Px</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Py</span><span style="color: #0000FF;">}</span>
<span style="color: #000000;">moved</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">Py</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span> <span style="color: #7060A8;">top</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'o'</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">position</span><span style="color: #0000FF;">(</span><span style="color: #000000;">26</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">sleep</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0.2</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">get_key</span><span style="color: #0000FF;">()!=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">top</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">screen</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">][</span><span style="color: #000000;">12</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 2,842 ⟶ 3,181:
Also, here is a slightly nicer and resize-able gui version:
{{libheader|Phix/pGUI}}
{{libheader|Phix/online}}
You can run this online [http://phix.x10.mx/p2js/galtonbox.htm here].
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #000080;font-style:italic;">--
-- demo\rosetta\GaltonBox.exw
-- ==========================
--
-- Author Pete Lomax, May 2017
--</span>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">TITLE</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Galton Box"</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">pGUI</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">timershow</span>
<span style="color: #004080;">cdCanvas</span> <span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cdcanvas</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">brem</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">80</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">balls</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}}</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">bins</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">redraw_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000080;font-style:italic;">/*posx*/</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">/*posy*/</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">w</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">h</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupGetIntInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"DRAWSIZE"</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">xx</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">yy</span>
<span style="color: #7060A8;">cdCanvasActivate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">cdCanvasClear</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- draw the pins, then balls, then bins</span>
<span style="color: #7060A8;">cdCanvasSetForeground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CD_DARK_GREEN</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">pinsize</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">min</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">h</span><span style="color: #0000FF;">/</span><span style="color: #000000;">40</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">w</span><span style="color: #0000FF;">/</span><span style="color: #000000;">50</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">=</span><span style="color: #000000;">4</span> <span style="color: #008080;">to</span> <span style="color: #000000;">16</span> <span style="color: #008080;">by</span> <span style="color: #000000;">2</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">=-(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">to</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">by</span> <span style="color: #000000;">4</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">xx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">w</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">*</span><span style="color: #000000;">w</span><span style="color: #0000FF;">/</span><span style="color: #000000;">32</span>
<span style="color: #000000;">yy</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">h</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">y</span><span style="color: #0000FF;">*</span><span style="color: #000000;">h</span><span style="color: #0000FF;">/</span><span style="color: #000000;">32</span>
<span style="color: #7060A8;">cdCanvasSector</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">xx</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">yy</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pinsize</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pinsize</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">360</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">cdCanvasSetForeground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CD_INDIGO</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">balls</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">balls</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">xx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">w</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">*</span><span style="color: #000000;">w</span><span style="color: #0000FF;">/</span><span style="color: #000000;">32</span>
<span style="color: #000000;">yy</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">h</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">y</span><span style="color: #0000FF;">*</span><span style="color: #000000;">h</span><span style="color: #0000FF;">/</span><span style="color: #000000;">32</span>
<span style="color: #7060A8;">cdCanvasSector</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">xx</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">yy</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pinsize</span><span style="color: #0000FF;">*</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pinsize</span><span style="color: #0000FF;">*</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">360</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">cdCanvasSetLineWidth</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span><span style="color: #000000;">w</span><span style="color: #0000FF;">/</span><span style="color: #000000;">9</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bins</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">xx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">w</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">+(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">*</span><span style="color: #000000;">4</span><span style="color: #0000FF;">-</span><span style="color: #000000;">18</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">w</span><span style="color: #0000FF;">/</span><span style="color: #000000;">32</span>
<span style="color: #000000;">yy</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">bins</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">h</span><span style="color: #0000FF;">/</span><span style="color: #000000;">64</span><span style="color: #0000FF;">+</span><span style="color: #000000;">10</span>
<span style="color: #7060A8;">cdCanvasLine</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span><span style="color: #000000;">xx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">xx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">yy</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">cdCanvasFlush</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">timer_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000000;">ih</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">=</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">dx</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">balls</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">dx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">balls</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">></span><span style="color: #000000;">20</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">bindx</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">+</span><span style="color: #000000;">18</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">4</span>
<span style="color: #000000;">bins</span><span style="color: #0000FF;">[</span><span style="color: #000000;">bindx</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">balls</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">balls</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">balls</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">dx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">balls</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">></span><span style="color: #000000;">15</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">dx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">elsif</span> <span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">dx</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}[</span><span style="color: #7060A8;">rand</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">balls</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">+</span><span style="color: #000000;">dx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">dx</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">></span><span style="color: #000000;">4</span> <span style="color: #008080;">and</span> <span style="color: #000000;">brem</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">brem</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">balls</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">balls</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">brem</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">and</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">balls</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">timershow</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"RUN"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"NO"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">IupUpdate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_IGNORE</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">map_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000000;">ih</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">cdcanvas</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">cdCreateCanvas</span><span style="color: #0000FF;">(</span><span style="color: #004600;">CD_IUP</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">ih</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">cddbuffer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">cdCreateCanvas</span><span style="color: #0000FF;">(</span><span style="color: #004600;">CD_DBUFFER</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cdcanvas</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">cdCanvasSetBackground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CD_GREY</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupOpen</span><span style="color: #0000FF;">()</span>
<span style="color: #000000;">canvas</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupCanvas</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"RASTERSIZE=360x600"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetCallbacks</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"MAP_CB"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"map_cb"</span><span style="color: #0000FF;">),</span>
<span style="color: #008000;">"ACTION"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"redraw_cb"</span><span style="color: #0000FF;">)})</span>
<span style="color: #000000;">timershow</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupTimer</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"timer_cb"</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">80</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">dlg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupDialog</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">`TITLE="%s"`</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">TITLE</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">IupShow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"RASTERSIZE"</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">NULL</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupMainLoop</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupClose</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
=={{header|PicoLisp}}==
<
(let (Bins (need (inc (* 2 Pins)) 0) X 0 Y 0)
(until (= Height (apply max Bins))
Line 2,967 ⟶ 3,318:
(prin (if (>= B H) "o" " ")) )
(prinl) )
(wait 200) ) ) )</
Test:
<syntaxhighlight lang
{{Out}}
<pre># Snapshot after a few seconds:
Line 3,018 ⟶ 3,369:
=={{header|Prolog}}==
Works with SWI-Prolog and XPCE.[[File:Prolog_Galton_Box_1.png|thumb|Sample display of Prolog solution]]
<
:- dynamic balls/2.
:- dynamic stop/1.
Line 3,216 ⟶ 3,567:
send(Ch, append, T),
send(D, display, T))).
</syntaxhighlight>
=={{header|PureBasic}}==
{{trans|Unicon}}
[[File:PureBasic_galtonbox.png|thumb|Sample display of PureBasic solution]]
<
Procedure eventLoop()
Line 3,347 ⟶ 3,698:
If Not galton(pegRows): Break: EndIf
Next
Repeat: eventLoop(): ForEver</
=={{header|Python}}==
<
import sys, os
Line 3,434 ⟶ 3,785:
if __name__=="__main__":
main()</
=={{header|Racket}}==
Line 3,440 ⟶ 3,791:
Multiple balls are added each step, but they do not collide.
<syntaxhighlight lang="racket">
;a ball's position...row is a natural number and col is an integer where 0 is the center
(define-struct pos (row col))
Line 3,559 ⟶ 3,910:
(on-tick (λ (ps) (tock height ps)) 0.5)
(to-draw (λ (ps) (draw height ps)))))
</syntaxhighlight>
=={{header|Raku}}==
Line 3,565 ⟶ 3,916:
[[File:Galton_box_perl6.gif|thumb|UPPER HALF BLOCK and LOWER HALF BLOCK alternate to give a somewhat smooth animation.]]
{{works with|rakudo|2015-09-12}}
<syntaxhighlight lang="raku"
constant $peg = "*";
Line 3,710 ⟶ 4,061:
$row-count = $peg-lines;
simulate($coins);
}</
=={{header|REXX}}==
Line 3,717 ⟶ 4,068:
Balls are dropped continuously (up to a number specified or the default), the default is enough rows of
<br>pins to fill the top <big><sup>1</sup>/<sub>3</sub></big> rows of the terminal screen.
<
trace off /*suppress any messages for negative RC*/
if !all(arg()) then exit /*Any documentation was wanted? Done.*/
Line 3,784 ⟶ 4,135:
!rex: parse upper version !ver !vernum !verdate .; !brexx= 'BY'==!vernum; !kexx= 'KEXX'==!ver; !pcrexx= 'REXX/PERSONAL'==!ver | 'REXX/PC'==!ver; !r4= 'REXX-R4'==!ver; !regina= 'REXX-REGINA'==left(!ver, 11); !roo= 'REXX-ROO'==!ver; call !env; return
!sys: !cms= !sys=='CMS'; !os2= !sys=='OS2'; !tso= !sys=='TSO' | !sys=='MVS'; !vse= !sys=='VSE'; !dos= pos('DOS', !sys)\==0 | pos('WIN', !sys)\==0 | !sys=='CMD'; !crx= left(!sys, 6)=='DOSCRX'; call !rex; return
!var: call !fid; if !kexx then return space( dosenv( arg(1) ) ); return space( value( arg(1), , !env) )</
Programming note: the last seven lines of this REXX program are some general purpose (boilerplate code) that, among other things, finds:
::* the REXX program's filename, filetype (file extension), and filemode (and/or path)
Line 3,941 ⟶ 4,292:
{{libheader|Shoes}}
[[File:galtonbox.shoes.png|thumb|Sample display of Ruby solution]]
<
$width = $rows_of_pins * 10 + ($rows_of_pins+1)*14
Line 4,017 ⟶ 4,368:
end
end
end</
=={{header|Tcl}}==
{{trans|C}}
<
oo::class create GaltonBox {
Line 4,121 ⟶ 4,472:
board show
if {[board step]} {after 60} break
}</
After a sample run with input parameters <tt>10 55</tt>:
<pre>
Line 4,184 ⟶ 4,535:
=={{header|Wren}}==
{{trans|D}}
{{libheader|Wren-
<
import "./
var boxW = 41 // Galton box width.
Line 4,279 ⟶ 4,630:
// Frozen balls are kept in balls list for simplicity
for (b in balls) b.doStep()
}</
{{out}}
Line 4,328 ⟶ 4,679:
This ''Peeks'' into some IBM-PC specific locations and hence is not entirely portable.
<
define Balls = 80; \maximum number of balls
int Bx(Balls), By(Balls), \character cell coordinates of each ball
Line 4,360 ⟶ 4,711:
Sound(0, 3, 1); \delay about 1/6 second
until KeyHit; \continue until a key is struck
]</
{{Out}}
Line 4,391 ⟶ 4,742:
=={{header|Yabasic}}==
<
obst$ = "000000"
Line 4,450 ⟶ 4,801:
next n
loop
</syntaxhighlight>
=={{header|Zig}}==
<syntaxhighlight lang="zig">const std = @import("std");
const rand = std.rand;
const time = std
const PEG_LINES = 20;
const BALLS = 10;
fn boardSize(comptime peg_lines: u16) u16 {
var i: u16 = 0;
var size: u16 = 0;
inline while (i <=
size += i + 1;
}
return size;
Line 4,471 ⟶ 4,822:
const BOARD_SIZE = boardSize(PEG_LINES);
fn stepBoard(board: *[BOARD_SIZE]u1, count: *[PEG_LINES + 1]u8) void {
var prng = rand.DefaultPrng.init(@bitCast(time.timestamp()));
var p: u8 = 0;
var sum: u16 = 0;
while (p <= PEG_LINES) : (p += 1) {
const pegs = PEG_LINES - p;
var i: u16 = 0;
while (i < pegs + 1) : (i += 1) {
if (pegs != PEG_LINES and board[BOARD_SIZE - 1 - sum - i] == 1) {
if (prng.random().boolean()) {
board.*[BOARD_SIZE - 1 - sum - i + pegs + 1] = 1;
} else {
board.*[BOARD_SIZE - 1 - sum - i + pegs + 2] = 1;
}
} else if (pegs == PEG_LINES and board[BOARD_SIZE - 1 - sum - i] == 1) {
count.*[pegs - i] += 1;
}
board.*[BOARD_SIZE - 1 - sum - i] = 0;
}
sum += pegs + 1;
}
}
fn printBoard(board: *[BOARD_SIZE]u1, count: *[PEG_LINES + 1]u8) !void {
_ = try stdout.write("\x1B[2J\x1B[1;1H");
var pegs: u16 = 0;
var sum: u16 = 0;
while (pegs <= PEG_LINES) : (pegs += 1) {
var i: u16 = 0;
while (i < (PEG_LINES - pegs)) : (i += 1) _ = try stdout.write(" ");
i = 0;
while (i < pegs + 1) : (i += 1) {
const spot = if (board[i + sum] == 1) "o" else " ";
_ = try stdout.write(spot);
if (i != pegs) _ = try stdout.write("*");
}
sum += pegs + 1;
_ = try stdout.write("\n");
}
for (count) |n| {
const num_char = [2]u8{'0' + n, ' '};
_ = try stdout.write(&num_char);
}
_ = try stdout.write("\n");
}
pub fn main() !void {
var board: [BOARD_SIZE]u1 = [_]u1{0} ** BOARD_SIZE;
var bottom_count: [PEG_LINES+1]u8 = [_]u8{0} ** (PEG_LINES + 1);
var i: u16 = 0;
while (i <
if (i <
try printBoard(&board, &bottom_count);
Line 4,531 ⟶ 4,882:
time.sleep(150000000);
}
}</
|