<div dir="ltr">Couldn't resist - last time I did one of these was using Sinclair Basic in 1985. Aiming for compact rather than maintainable, I get the following (36 lines); however, making it pretty would only add maybe a dozen lines:<br><br><span style="font-family:monospace,monospace">%%% @author Richard Carlsson <<a href="mailto:carlsson.richard@gmail.com">carlsson.richard@gmail.com</a>><br>%%% @copyright (C) 2016, Richard Carlsson<br><br>-module(maze).<br><br>-export([print/2, build/2]).<br><br>print(W, H) -><br>    M = build(W, H),<br>    io:put_chars([[[array:get(R*(W*2+1)+C, M) || C <- lists:seq(0,W*2)], $\n]<br>                  || R <- lists:seq(0,H*2)]).<br><br>build(W, H) when is_integer(W), is_integer(H), W > 0, H > 0 -><br>    M = array:new((W*2+1)*(H*2+1), {default,$X}),<br>    build(rand:uniform(W)*2-1, rand:uniform(H)*2-1, (W*2+1), (H*2+1), M).<br><br>build(X, Y, W, H, M) -><br>    move([D || {_,D} <- lists:sort(lists:zip([rand:uniform() || _<-"...."],<br>                                             [{0,-2},{0,2},{2,0},{-2,0}]))],<br>         X, Y, W, H, array:set(Y*W+X, $\s, M)).<br><br>move([{Dx,Dy}|Ds], X, Y, W, H, M) -><br>    X1 = X + Dx, Y1 = Y + Dy,<br>    move(Ds, X, Y, W, H,<br>         if X1 > 0, X1 < W, Y1 > 0, Y1 < H -><br>                 case array:get(Y1*W+X1, M) of<br>                     $\s -> M;<br>                     _   -> build(X1, Y1, W, H,<br>                                  array:set(((Y+Y1) div 2)*W + (X+X1) div 2,<br>                                            $\s, M))<br>                 end;<br>            true -> M<br>         end);<br>move([], _X, _Y, _W, _H, M) -><br>    M.<br></span><br></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature"><br>        /Richard</div></div>
<br><div class="gmail_quote">2016-08-26 7:03 GMT+02:00 Richard A. O'Keefe <span dir="ltr"><<a href="mailto:ok@cs.otago.ac.nz" target="_blank">ok@cs.otago.ac.nz</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">How large should Erlang code for the Rosetta "maze generation"<br>
task be?  I don't know, but here's a data point.  I did it in<br>
my Smalltalk.<br>
- roughly 90 lines<br>
- 12 lines of comments<br>
- 25 lines are devoted to generating the output,<br>
  including terminal ESC sequences.<br>
- I used the algorithm described in the task page.<br>
- I wrote shamelessly compact code instead of well<br>
  documented stuff.  Maintainability shmaintainability.<br>
- I proudly avoided creating any objects other than one<br>
  mutable 2D array of bytes.<br>
- It would have been better to copy the F# code.  Sigh.<br>
<br>
Here's another data point: it's going to be hard to beat<br>
Haskell (67 lines).  The J answer manages it because J is<br>
particularly expressive (if you can call it that...) with<br>
arrays, like its ancestor APL.  Erlang is not.<br>
<br>
If you can write *maintainable* Erlang code for this problem<br>
in 120 lines, you deserve some sort of prize.  (I do not call<br>
the Haskell answer particularly readable.)<br>
<br>
You could, of course, cheat a bit by copying the F# version<br>
and using the process dictionary to hold the maze.<br>
E.g.,<br>
let removeWallBetween (x1,y1) (x2,y2) =<br>
    if x1 <> x2 then<br>
       horizWalls.[min x1 x2, y1] <- false<br>
    else<br>
       vertWalsl.[x1, min y1 y2] <- false<br>
=><br>
    remove_wall_between(X, Y1, X, Y2) -><br>
        put({v,X,min(Y1,Y2)}, false);<br>
    remove_wall_between(X1, Y, X2, Y) -><br>
        put({h,min(X1,X2),Y}, false).<br>
<br>
Not a thing I'd normally recommend, but if this is in its<br>
own process, you might get away with it.<br>
<br>
______________________________<wbr>_________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/list<wbr>info/erlang-questions</a><br>
</blockquote></div><br></div>