• Welcome to SpeedSolving.com — the world’s largest puzzle community!

    You’re currently browsing as a guest, which means you have limited access to discussions, resources, member profiles, and community features.

    Join 50,000+ cubers and puzzle enthusiasts from around the world to ask questions, share solves, improve faster, and be part of the community.

    Registration is free, fast, and easy — create your account today.

    Already a member? Log in here to hide this message and start participating.
Found the file on my computer today and decided to try it. I don't remember what my old records were, but I think this is a pretty good time.

48 Puzzle:
Time: 298.844
Moves: 973

My MC is still realllly high :P 3.25 moves/sec is pretty good. If I could get my MC lower I'd be sub4

48 on sim. First solve: time ~420, moves ~1200 (didn't remembered).
Second solve: time 313.015, moves 821.
Will practice. Still cannot get used to the controls, also.

What sim you're using, btw? The one I'm using constantly resets puzzle size to 2x2 or 4x4.
 
Last edited:
48 puzzle on sim
219.702, 300.343, 270.25, 228.073, 294.385, 250.983, 269.18, 299.326, 298.094, 352.049
Best: 219.702
Worst: 352.049
Mean: 278.239
PB (avg 10): 278.239

15 puzzle
21.473, 34.04, 39.423, 39.013, 31.655, 25.18, 32.793, 31.92, 32.954, 31.345
Best: 21.473
Worst: 39.423
Mean: 31.980
PB (avg 10): 31.980 (last 34.976)
 
Last edited:
48 on sim. First solve: time ~420, moves ~1200 (didn't remembered).
Second solve: time 313.015, moves 821.
Will practice. Still cannot get used to the controls, also.

What sim you're using, btw? The one I'm using constantly resets puzzle size to 2x2 or 4x4.

It's the one you're using, but the controls are slightly different. You move the gap rather than the pieces, if that makes sense.

Rather than search through pages of threads to find it:

Code:
<!DOCTYPE html>
<html>

    <head>
        
        <!-- 
             Fifteen Puzzle
            
             Version: 0.101
             Date:    2012-02-25
             Author:  Alberto Burgos <[email protected]>
             
             An online version can be found at:
             http://albertoonsoftware.com/fifteenpuzzle
        -->
    
        <meta charset="utf-8" />
        
        <title>Fifteen puzzle</title>
                
        <style type="text/css">
        
            body {
                font-family: Arial, Serif;
                margin: 0;
            }
            .container {
                margin: 20px auto 35px;
                width: 500px;
            }
            #board {             
                margin: 0 auto;
                font-size: 20px;
            }
            .infoPanel {
                margin-top: 50px;
            }
            .odd, .even {
                float: left;
                width: 60px;
                height: 60px;
                margin: 2px;
                
                line-height: 60px;
                text-align: center;
                
                border: 1px solid black;
                -webkit-border-radius: 7px;
                -moz-border-radius: 7px;
                border-radius: 7px;
            }
            .even {
                background-color: #0E00D3;
            }
            .odd {
                background-color: #F8CD0B;
            }
            #times {
                width: 500px;
                max-width: 500px;
                min-height: 80px;
            }
            #state {
                color: #007700;
            }
            #state, #time, #movs {
                font-weight: bold;
            }
            .simpleTable {
                border-spacing: 0;
                border-collapse: collapse;
            }
            .simpleTable td {
                padding: 0 10px 0 0;
            }
            .right {
                float: right;
            }
            .left {
                float: left;
            }
            .clear {
                clear: both;
            }
        </style>        
            
        <script type="text/javascript">

            var puzzle;
            var tiles;
            var labels;
            var solves;
            
            function init(side)
            {                
                Array.prototype.avg = function() {
                    for(var i=0, sum=0; i < this.length; sum += this[i++]);
                    return sum/this.length;
                }
                
                labels = 
                {
                    state: document.getElementById('state'),
                    movs: document.getElementById('movs'),
                    time: document.getElementById('time'),
                    times: document.getElementById('times'),
                    best: document.getElementById('best'),
                    worst: document.getElementById('worst')
                };
                
                document.addEventListener('keydown', keyHandler);
                
                reset(side);
            }
            
            function reset(side)
            {                
                puzzle =
                {
                    side: parseInt(side),
                    lastTile: side*side,
                    gap: side*side,
                    state: 'solved',
                };

                labels.state.textContent = 'solved';
                labels.state.style.color = '#007700';
                
                solves =
                {
                    // Last solve data
                    movs: -1,
                    iniTime: -1,
                    endTime: -1,

                    // All solves data
                    best: null,
                    worst: null,
                    times: new Array()
                };

                var board = document.getElementById('board');
                board.innerHTML = '';
                board.style.width = puzzle.side*66+'px';
                board.style.height = puzzle.side*66+'px';
                
                tiles = new Array();            
                var tile;
                
                for(var i = 1; i <= puzzle.lastTile; i++)
                {
                    tiles[i] = document.createElement('div');
                    tiles[i].className = i % 2 != 0 ? 'odd' : 'even';
                    tiles[i].id = 't'+i;
                    tiles[i].textContent = i;
                    board.appendChild(tiles[i]);
                }
                tiles[puzzle.lastTile].style.visibility = 'hidden';
            }

            function solve()
            {
                for(var i=1; i <= puzzle.lastTile; i++)
                {
                    tiles[i].textContent = i;
                    tiles[i].className = i % 2 != 0 ? 'odd' : 'even';
                    tiles[i].style.visibility = 'visible';
                }
                tiles[puzzle.lastTile].style.visibility = 'hidden';
                
                puzzle.gap = puzzle.lastTile;
                puzzle.state = 'solved';
                labels.state.textContent = 'solved';
                labels.state.style.color = '#007700';
            }
            
            function keyHandler(e)
            {
                var keyCode = e.keyCode;
                
                if (keyCode > 36 && keyCode < 41 || keyCode == 32)
                    e.preventDefault();
                    
                if (keyCode == 37 || keyCode == 65)
                    move(2);
                else if (keyCode == 38 || keyCode == 87)
                    move(3);
                else if (keyCode == 39 || keyCode == 68)
                    move(0);
                else if (keyCode == 40 || keyCode == 83)
                    move(1);
                else if (keyCode == 32 && puzzle.state == 'solved')
                    scramble();
                else if (keyCode == 27)
                    solve();
            }
            
            function scramble()
            {
                var max = Math.pow(puzzle.side, 4);
                var count = 0, movement, forbidden=0;
                while (count < max)
                {
                    movement = Math.floor(Math.random()*4);
                    if (movement != forbidden && move(movement) == true)
                    {
                        count++;
                        forbidden = (movement+2) % 4;
                    }                    
                }
                puzzle.state = 'scrambled';
                labels.state.textContent = 'scrambled';
                labels.state.style.color = '#0055dd';
            }
            
            function move(m)
            {
                if(m == 0)       // Left
                {
                    if (puzzle.gap % puzzle.side == 0) return false;
                    else swapTiles(puzzle.gap+1, puzzle.gap);
                }
                else if (m == 1)  // Up
                {
                    if (puzzle.gap > puzzle.side*(puzzle.side-1)) return false;
                    else swapTiles(puzzle.gap+puzzle.side, puzzle.gap);
                }
                else if (m == 2)  // Right
                {
                    if ((puzzle.gap+puzzle.side-1) % puzzle.side == 0) return false;
                    else swapTiles(puzzle.gap-1, puzzle.gap);
                }
                else if (m == 3)  // Down
                {
                    if (puzzle.gap < puzzle.side+1) return false;
                    else swapTiles(puzzle.gap-puzzle.side, puzzle.gap);
                }
                
                if(puzzle.state == 'scrambled')
                {
                    puzzle.state = 'solving';
                    labels.state.textContent = 'solving';
                    labels.state.style.color = "#aa0000";
                    solves.movs = 0;
                    solves.iniTime = new Date();
                }
                
                if(puzzle.state == 'solving')
                {
                    solves.movs++;
                    if (isSolved())
                    {
                        solves.endTime = new Date();                        
                        puzzle.state = 'solved';
                        
                        var newTime = (solves.endTime.getTime() - solves.iniTime.getTime())/1000;
                        solves.times.push(newTime);

                        if(solves.best == null)
                            labels.best.textContent = labels.worst.textContent
                            = solves.best = solves.worst = newTime;
                        else if(solves.best > newTime)
                            labels.best.textContent = solves.best = newTime;
                        else if(solves.worst < newTime)
                            labels.worst.textContent = solves.worst = newTime;
                        
                        labels.state.textContent = 'solved';
                        labels.state.style.color = '#00ff00';
                        labels.movs.textContent = solves.movs;
                        labels.time.textContent = newTime.toFixed(3);
                        labels.times.textContent = solves.times.toString();

                        document.getElementById('average').textContent = solves.times.avg().toFixed(3);
                    }
                }
                return true;
            }

            function isSolved()
            {
                for (var i = 1; i < puzzle.lastTile; i++)
                    if (i != tiles[i].textContent)
                        return false;
                return true;
            }                
    
            function swapTiles(a, b)
            {
                var aux = tiles[a].textContent;
                tiles[a].textContent = tiles[b].textContent;
                tiles[b].textContent = aux;
                tiles[a].style.visibility = 'hidden';
                tiles[b].style.visibility = 'visible';
                tiles[a].className = tiles[a].textContent % 2 != 0 ? 'odd' : 'even';
                tiles[b].className = tiles[b].textContent % 2 != 0 ? 'odd' : 'even';
                puzzle.gap = a;
            }

        </script>
        
    </head>
    
    <body onload="init(4)">
    
        <div class="container">
        
            <div id="board"></div>
            
            <div class="infoPanel">
            
                <div class="right">
                
                    Puzzle side: 
                    
                    <select onchange="reset(this.value)">
                        <option value="2">2</option>
                        <option value="3">3</option>
                        <option value="4" selected="selected">4</option>
                        <option value="5">5</option>
                        <option value="6">6</option>
                        <option value="7">7</option>
                    </select>
                    
                </div>
                
                <table class="simpleTable left">
                
                    <tr>
                        <td>State:</td>
                        <td id="state" style="width: 120px">solved</td>
                    </tr>
                    
                    <tr>
                        <td>Time:</td>
                        <td id="time"></td>
                    </tr>
                    
                    <tr>
                        <td>Movs:</td>
                        <td id="movs"></td>
                    </tr>
                    
                </table>
                
                <table class="simpleTable left">
                
                    <tr>
                        <td>Best:</td>
                        <td id="best"></td>
                    </tr>
                    
                    <tr>
                        <td>Worst:</td>
                        <td id="worst"></td>
                    </tr>
                    
                    <tr>
                        <td>Mean:</td>
                        <td id="average"></td>
                    </tr>
                    
                </table>
                
                <div class="clear"></div>
                
                <br/>
                
                Times:<br/><textarea id="times" readonly="readonly" cols="1" rows="1"></textarea>
                
                <br/>
                <br/>
                
                <b>Controls</b>
                
                <table class="simpleTable">
                
                    <tr>
                        <td>Move tile:</td>
                        <td>Arrows or WASD</td>
                    </tr>
                    
                    <tr>
                        <td>Scramble:</td>
                        <td>Space</td>
                    </tr>
                    
                    <tr>
                        <td>Solve:</td>
                        <td>Escape</td>
                    </tr>
                    
                </table>
                
            </div> <!--  End of infoPanel -->
            
        </div> <!-- End of container -->
        
    </body>

</html>

save it as a .html file
 
4x5x6 single 7:12.89. Should have been like 5:50 but I messed something up somewhere :/

edit:

RhuQh.png


10000 tps :3
 
Last edited:
New 6x6 pb Double Parity, without it, would probably be about 4:20
1. 4:39.50 f' 3u F' U R b f2 l u r2 f 3u r2 l' F' B 3r2 d' 3u2 u' b2 B2 R' f' F' 3f d L' l2 b' 3f U2 r b' r2 l2 L' b B F' R F' u2 l' b d' F2 L2 d' D2 3r 3u' r' R F' u' b' d2 R' F2 3f b2 B R' F2 3r D' L F' D u' F' U2 u2 L' l' u R 3f' l2
 
Mean of 3: 12.07
1. 9.20 L2 F2 D2 F2 U' F2 D L2 U' F2 U L F R B U F U' F L' F
2. 13.77 B L2 B2 U2 L2 F2 D2 F R2 D2 F' R' F' U R F L' F L2 F'
3. 13.23 B L2 B L2 D2 F2 D2 F L2 U2 L2 D' L' U2 R2 D' L2 B2 F' L B

I got a new PB single (PLL skip) and a nice mo3. I don't ordinary use mo3 but this was seriously really good for me. Of course fail at avg5:(
 
1:39.83, 1:30.15, 1:45.84, 1:31.56, 1:51.34, 1:40.76, 1:50.74, 1:36.88, 1:38.24, 1:30.30, 1:47.16, 1:38.00
ill get it one day

best time: 1:30.15
worst time: 1:51.34
best avg5: 1:37.71 (σ = 0.73)
best avg12: 1:39.93 (σ = 6.53)
 
It's the one you're using, but the controls are slightly different. You move the gap rather than the pieces, if that makes sense.

Rather than search through pages of threads to find it:

Code:
<!DOCTYPE html>
<html>

    <head>
        
        <!-- 
             Fifteen Puzzle
            
             Version: 0.101
             Date:    2012-02-25
             Author:  Alberto Burgos <[email protected]>
             
             An online version can be found at:
             http://albertoonsoftware.com/fifteenpuzzle
        -->
    
        <meta charset="utf-8" />
        
        <title>Fifteen puzzle</title>
                
        <style type="text/css">
        
            body {
                font-family: Arial, Serif;
                margin: 0;
            }
            .container {
                margin: 20px auto 35px;
                width: 500px;
            }
            #board {             
                margin: 0 auto;
                font-size: 20px;
            }
            .infoPanel {
                margin-top: 50px;
            }
            .odd, .even {
                float: left;
                width: 60px;
                height: 60px;
                margin: 2px;
                
                line-height: 60px;
                text-align: center;
                
                border: 1px solid black;
                -webkit-border-radius: 7px;
                -moz-border-radius: 7px;
                border-radius: 7px;
            }
            .even {
                background-color: #0E00D3;
            }
            .odd {
                background-color: #F8CD0B;
            }
            #times {
                width: 500px;
                max-width: 500px;
                min-height: 80px;
            }
            #state {
                color: #007700;
            }
            #state, #time, #movs {
                font-weight: bold;
            }
            .simpleTable {
                border-spacing: 0;
                border-collapse: collapse;
            }
            .simpleTable td {
                padding: 0 10px 0 0;
            }
            .right {
                float: right;
            }
            .left {
                float: left;
            }
            .clear {
                clear: both;
            }
        </style>        
            
        <script type="text/javascript">

            var puzzle;
            var tiles;
            var labels;
            var solves;
            
            function init(side)
            {                
                Array.prototype.avg = function() {
                    for(var i=0, sum=0; i < this.length; sum += this[i++]);
                    return sum/this.length;
                }
                
                labels = 
                {
                    state: document.getElementById('state'),
                    movs: document.getElementById('movs'),
                    time: document.getElementById('time'),
                    times: document.getElementById('times'),
                    best: document.getElementById('best'),
                    worst: document.getElementById('worst')
                };
                
                document.addEventListener('keydown', keyHandler);
                
                reset(side);
            }
            
            function reset(side)
            {                
                puzzle =
                {
                    side: parseInt(side),
                    lastTile: side*side,
                    gap: side*side,
                    state: 'solved',
                };

                labels.state.textContent = 'solved';
                labels.state.style.color = '#007700';
                
                solves =
                {
                    // Last solve data
                    movs: -1,
                    iniTime: -1,
                    endTime: -1,

                    // All solves data
                    best: null,
                    worst: null,
                    times: new Array()
                };

                var board = document.getElementById('board');
                board.innerHTML = '';
                board.style.width = puzzle.side*66+'px';
                board.style.height = puzzle.side*66+'px';
                
                tiles = new Array();            
                var tile;
                
                for(var i = 1; i <= puzzle.lastTile; i++)
                {
                    tiles[i] = document.createElement('div');
                    tiles[i].className = i % 2 != 0 ? 'odd' : 'even';
                    tiles[i].id = 't'+i;
                    tiles[i].textContent = i;
                    board.appendChild(tiles[i]);
                }
                tiles[puzzle.lastTile].style.visibility = 'hidden';
            }

            function solve()
            {
                for(var i=1; i <= puzzle.lastTile; i++)
                {
                    tiles[i].textContent = i;
                    tiles[i].className = i % 2 != 0 ? 'odd' : 'even';
                    tiles[i].style.visibility = 'visible';
                }
                tiles[puzzle.lastTile].style.visibility = 'hidden';
                
                puzzle.gap = puzzle.lastTile;
                puzzle.state = 'solved';
                labels.state.textContent = 'solved';
                labels.state.style.color = '#007700';
            }
            
            function keyHandler(e)
            {
                var keyCode = e.keyCode;
                
                if (keyCode > 36 && keyCode < 41 || keyCode == 32)
                    e.preventDefault();
                    
                if (keyCode == 37 || keyCode == 65)
                    move(2);
                else if (keyCode == 38 || keyCode == 87)
                    move(3);
                else if (keyCode == 39 || keyCode == 68)
                    move(0);
                else if (keyCode == 40 || keyCode == 83)
                    move(1);
                else if (keyCode == 32 && puzzle.state == 'solved')
                    scramble();
                else if (keyCode == 27)
                    solve();
            }
            
            function scramble()
            {
                var max = Math.pow(puzzle.side, 4);
                var count = 0, movement, forbidden=0;
                while (count < max)
                {
                    movement = Math.floor(Math.random()*4);
                    if (movement != forbidden && move(movement) == true)
                    {
                        count++;
                        forbidden = (movement+2) % 4;
                    }                    
                }
                puzzle.state = 'scrambled';
                labels.state.textContent = 'scrambled';
                labels.state.style.color = '#0055dd';
            }
            
            function move(m)
            {
                if(m == 0)       // Left
                {
                    if (puzzle.gap % puzzle.side == 0) return false;
                    else swapTiles(puzzle.gap+1, puzzle.gap);
                }
                else if (m == 1)  // Up
                {
                    if (puzzle.gap > puzzle.side*(puzzle.side-1)) return false;
                    else swapTiles(puzzle.gap+puzzle.side, puzzle.gap);
                }
                else if (m == 2)  // Right
                {
                    if ((puzzle.gap+puzzle.side-1) % puzzle.side == 0) return false;
                    else swapTiles(puzzle.gap-1, puzzle.gap);
                }
                else if (m == 3)  // Down
                {
                    if (puzzle.gap < puzzle.side+1) return false;
                    else swapTiles(puzzle.gap-puzzle.side, puzzle.gap);
                }
                
                if(puzzle.state == 'scrambled')
                {
                    puzzle.state = 'solving';
                    labels.state.textContent = 'solving';
                    labels.state.style.color = "#aa0000";
                    solves.movs = 0;
                    solves.iniTime = new Date();
                }
                
                if(puzzle.state == 'solving')
                {
                    solves.movs++;
                    if (isSolved())
                    {
                        solves.endTime = new Date();                        
                        puzzle.state = 'solved';
                        
                        var newTime = (solves.endTime.getTime() - solves.iniTime.getTime())/1000;
                        solves.times.push(newTime);

                        if(solves.best == null)
                            labels.best.textContent = labels.worst.textContent
                            = solves.best = solves.worst = newTime;
                        else if(solves.best > newTime)
                            labels.best.textContent = solves.best = newTime;
                        else if(solves.worst < newTime)
                            labels.worst.textContent = solves.worst = newTime;
                        
                        labels.state.textContent = 'solved';
                        labels.state.style.color = '#00ff00';
                        labels.movs.textContent = solves.movs;
                        labels.time.textContent = newTime.toFixed(3);
                        labels.times.textContent = solves.times.toString();

                        document.getElementById('average').textContent = solves.times.avg().toFixed(3);
                    }
                }
                return true;
            }

            function isSolved()
            {
                for (var i = 1; i < puzzle.lastTile; i++)
                    if (i != tiles[i].textContent)
                        return false;
                return true;
            }                
    
            function swapTiles(a, b)
            {
                var aux = tiles[a].textContent;
                tiles[a].textContent = tiles[b].textContent;
                tiles[b].textContent = aux;
                tiles[a].style.visibility = 'hidden';
                tiles[b].style.visibility = 'visible';
                tiles[a].className = tiles[a].textContent % 2 != 0 ? 'odd' : 'even';
                tiles[b].className = tiles[b].textContent % 2 != 0 ? 'odd' : 'even';
                puzzle.gap = a;
            }

        </script>
        
    </head>
    
    <body onload="init(4)">
    
        <div class="container">
        
            <div id="board"></div>
            
            <div class="infoPanel">
            
                <div class="right">
                
                    Puzzle side: 
                    
                    <select onchange="reset(this.value)">
                        <option value="2">2</option>
                        <option value="3">3</option>
                        <option value="4" selected="selected">4</option>
                        <option value="5">5</option>
                        <option value="6">6</option>
                        <option value="7">7</option>
                    </select>
                    
                </div>
                
                <table class="simpleTable left">
                
                    <tr>
                        <td>State:</td>
                        <td id="state" style="width: 120px">solved</td>
                    </tr>
                    
                    <tr>
                        <td>Time:</td>
                        <td id="time"></td>
                    </tr>
                    
                    <tr>
                        <td>Movs:</td>
                        <td id="movs"></td>
                    </tr>
                    
                </table>
                
                <table class="simpleTable left">
                
                    <tr>
                        <td>Best:</td>
                        <td id="best"></td>
                    </tr>
                    
                    <tr>
                        <td>Worst:</td>
                        <td id="worst"></td>
                    </tr>
                    
                    <tr>
                        <td>Mean:</td>
                        <td id="average"></td>
                    </tr>
                    
                </table>
                
                <div class="clear"></div>
                
                <br/>
                
                Times:<br/><textarea id="times" readonly="readonly" cols="1" rows="1"></textarea>
                
                <br/>
                <br/>
                
                <b>Controls</b>
                
                <table class="simpleTable">
                
                    <tr>
                        <td>Move tile:</td>
                        <td>Arrows or WASD</td>
                    </tr>
                    
                    <tr>
                        <td>Scramble:</td>
                        <td>Space</td>
                    </tr>
                    
                    <tr>
                        <td>Solve:</td>
                        <td>Escape</td>
                    </tr>
                    
                </table>
                
            </div> <!--  End of infoPanel -->
            
        </div> <!-- End of container -->
        
    </body>

</html>

save it as a .html file

Cool, thanks. I'll play with it.

But this one also resets the puzzle size. (I just solved 5x5, then switched tab in browser, then switched back, and it showed me 6x6 puzzle).

Edit:
48 puzzle
271.682, 261.289, 256.251, 235.141, 277.074, 264.795, 279.692, 243.051, 270.733, 223.384
Best: 223.384
Worst: 279.692
Mean: 258.309
PB (avg 10): 258.309 (previous 277.809)

Edit 2:
The scramble function in the simulator was not fair. The length of solution was always even or always odd, depending on the puzzle size.

I've slightly modified code to correct this behavior. See this thread in Software Area.

- Bulat
 
Last edited:
PB average of 12 and 25 for 6x6.

3:09.32, 3:24.20, 2:58.08, 3:13.05, 3:07.15, 2:50.64, 2:58.44, 3:21.92, 3:02.88, 3:05.00, 2:49.94, 3:24.15, 3:06.43, 3:09.65, 2:56.31, 3:03.72, 3:03.06, 2:47.59, 3:15.28, 2:53.30, 3:00.10, 3:23.68, 3:18.51, 3:16.53, 2:55.62

number of times: 25/25
best time: 2:47.59
worst time: 3:24.20

current mo3: 3:10.22 (σ = 12.68)
best mo3: 2:58.12 (σ = 9.13)

current avg5: 3:11.71 (σ = 10.11)
best avg5: 2:58.82 (σ = 5.00)

current avg12: 3:05.21 (σ = 9.26)
best avg12: 3:02.28 (σ = 7.63)

current avg25: 3:06.13 (σ = 9.42)
best avg25: 3:06.13 (σ = 9.42)

 
Last edited:
Back
Top