const rootVm = new Vue({
    el: '#app-sudoku',
    template: `
    <div class="boxes">
        <div class="box-row" v-for="span in [[0, 3], [3, 6], [6, 9]]">
            <div class="box" v-for="numbers in boxes.slice(span[0], span[1])">
                <div class="row-in-box" v-for="span in [[0, 3], [3, 6], [6, 9]]">
                    <span v-for="n in numbers.slice(span[0], span[1])" :class="{'cell': 1, given: n}">{{
                        n || ''
                    }}<div v-if="!n" class="memo" v-for="memo in [[1,2,3],[4,5,6],[7,8,9]]">
                    <span v-for="n in memo">{{ n }}</span>
                    </div></span>
                </div>
            </div>
        </div>
    </div>`,
    computed: {
        rows: function() {
            const splitAt = (array, n) => [array.slice(0, n), array.slice(n)];
            const rows = splitAt(Array.from(this.board).map(Number), 9);
            var p = rows;
            while (p[1].length !== 0) {
                p[1] = splitAt(p[1], 9);
                p = p[1];
            }
            const reduceConcat = a => a.length ? a.reduce((a, b) => [a].concat(reduceConcat(b))) : [];
            return reduceConcat(rows);
        },
        boxes: function() {
            const rows = this.rows;
            return [
                [].concat(rows[0].slice(0, 3), rows[1].slice(0, 3), rows[2].slice(0, 3)),
                [].concat(rows[0].slice(3, 6), rows[1].slice(3, 6), rows[2].slice(3, 6)),
                [].concat(rows[0].slice(6, 9), rows[1].slice(6, 9), rows[2].slice(6, 9)),

                [].concat(rows[3].slice(0, 3), rows[4].slice(0, 3), rows[5].slice(0, 3)),
                [].concat(rows[3].slice(3, 6), rows[4].slice(3, 6), rows[5].slice(3, 6)),
                [].concat(rows[3].slice(6, 9), rows[4].slice(6, 9), rows[5].slice(6, 9)),

                [].concat(rows[6].slice(0, 3), rows[7].slice(0, 3), rows[8].slice(0, 3)),
                [].concat(rows[6].slice(3, 6), rows[7].slice(3, 6), rows[8].slice(3, 6)),
                [].concat(rows[6].slice(6, 9), rows[7].slice(6, 9), rows[8].slice(6, 9)),
            ];
        },
    },
    data: () => new Object({
        board: '060003001200500600007090500000400090800000006010005000002010700004009003700200040', // 朝日新聞beパズル 2017/10/07 掲載分
    }),
});

@@ -1,16 +1,348 @@
+const splitAt = (array, n) =%3E %5Barray.slice(0, n), array.slice(n)%5D;%0Aconst reduceConcat = a =%3E a.length ? a.reduce((a, b) =%3E %5Ba%5D.concat(reduceConcat(b))) : %5B%5D;%0Aconst slice = (array, n) =%3E %7B%0A    var p = array;%0A    while (p%5B1%5D.length !== 0) %7B%0A        p%5B1%5D = splitAt(p%5B1%5D, n);%0A        p = p%5B1%5D;%0A    %7D%0A    return reduceConcat(array);%0A%7D;%0A%0A
 const rootVm = n
@@ -350,16 +350,16 @@
 w Vue(%7B%0A
-
     el: 
@@ -1058,487 +1058,8 @@
 : %7B%0A
-        rows: function() %7B%0A            const splitAt = (array, n) =%3E %5Barray.slice(0, n), array.slice(n)%5D;%0A            const rows = splitAt(Array.from(this.board).map(Number), 9);%0A            var p = rows;%0A            while (p%5B1%5D.length !== 0) %7B%0A                p%5B1%5D = splitAt(p%5B1%5D, 9);%0A                p = p%5B1%5D;%0A            %7D%0A            const reduceConcat = a =%3E a.length ? a.reduce((a, b) =%3E %5Ba%5D.concat(reduceConcat(b))) : %5B%5D;%0A            return reduceConcat(rows);%0A        %7D,%0A
     
@@ -1966,16 +1966,16 @@
      %5D;%0A
-
         
@@ -1980,24 +1980,132 @@
   %7D,%0A    %7D,%0A
+    created: function() %7B%0A        this.rows = slice(splitAt(Array.from(this.board).map(Number), 9));%0A    %7D,%0A
     data: ()

Refactor the calculation of rows.