Игра 2048 (7/18)

  • 3
  • Недоступна
Исходя из правил игры, мы можем сдвинуть все плитки в одну из 4 сторон: вверх, вниз, вправо, влево. При этом плитки со значением 2 и больше уходят в одну сторону (сторону сдвига), а пустые — в противоположную. На данном этапе реализуем сдвиг влево. Для этого нам понадобится приватный метод boolean
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (43)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Николай Волков
Уровень 20
10 октября, 22:33
Код проходит тесты в идее, в том числе с помощью предложенного в комментах теста, но валидатору не нравится:(
private boolean compressRow (int[] row){
        boolean act = false;
        int [] inn = {0,0,0,0};
        int n = 0;
        for (int i: row){
            if (row[i] > 0){
               inn[n] = row[i];
               n++;
            }
        }
        if(!(Arrays.equals(inn,row))){
            act = true;
        }
        for (int i = 0; i < inn.length; i++) {
            row[i] = inn[i];
        }
        return act;
    }
papsnaz
Уровень 32
7 мая, 19:00
Через копию массива не пропустило, пришлось делать через ду вайл
1 мая, 16:47
Давайте еще тут думать будем, напрягаться! Решила сортировкой пузырьком, только условие вместо "<" поставила другое if (row[j] == 0 && row[j + 1] != 0)
SoSed
Уровень 38
11 января, 13:55
Походу, очередная ситуация, когда надо не решить задачу, а угадать как скормить правильно работающий код валидатору))
OLGA LESOVAIA
Уровень 27
30 декабря 2021, 09:39
очень обидно. решила задачу, валидатор не пропускал по второму пункту. Прежнее решение - возвращала простые true\\false в зависимости от совершенной перестановки, и + return по умолчанию. Решение прошло валидатор, только когда создала отдельную булеву переменную и ее вернула, как в шаблонном варианте... больше код нигде не меняла
Галкин Юрий
Уровень 41
12 ноября 2021, 10:58
Облегчаю задачу для тестирования
public static void main(String[] args) {
    int[][] compressedRows = new int[][]{
            {0, 0, 0, 0}, {1, 0, 0, 0}, {1, 1, 0, 0}, {1, 1, 1, 0}, {1, 1, 1, 1}
    };
    int[][] rowsToCompressOfLength1 = new int[][]{
            {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 1, 0, 0}
    };
    int[][] rowsToCompressOfLength2 = new int[][]{
            {0, 0, 1, 1}, {0, 1, 0, 1}, {0, 1, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}
    };
    int[][] rowsToCompressOfLength3 = new int[][]{
            {0, 1, 1, 1}, {1, 0, 1, 1}, {1, 1, 0, 1}
    };
    Main main = new Main();

    System.out.println("Test of rows not to be compressed.");
    for (int[] compressedRow : compressedRows) {
        System.out.println("row: " + Arrays.toString(compressedRow) + "\t" + (!main.compressRow(compressedRow) ? "PASSED" : "FAILED"));
    }

    System.out.println("\nTest of rows to be compressed.");
    test_doCompression(rowsToCempressOfLength1, main, new int[]{1, 0, 0, 0});
    test_doCompression(rowsToCompressOfLength2, main, new int[]{1, 1, 0, 0});
    test_doCompression(rowsToCompressOfLength3, main, new int[]{1, 1, 1, 0});
}

private static void test_doCompression(int[][] rowsToSort, Main main,  int[] rowReference) {
    for (int[] rowToSort : rowsToSort) {
        System.out.print("before: " + Arrays.toString(rowToSort) + "\t");
        final boolean doCompress = main.compressRow(rowToSort);
         System.out.println("after: " + Arrays.toString(rowToSort)
                + "\t" + (doCompress && Arrays.equals(rowReference, rowToSort)
                ? "PASSED" : "FAILED"));
    }
}
Anonymous #2638667
Уровень 16
21 ноября 2021, 13:42
Спасибо! очень помогло в написании кода👍😻
Anonymous #3063726
Уровень 6
30 апреля, 09:00
Мое почтение!
Игорь
Уровень 33
16 сентября 2021, 13:17
Вот такой псевдокод получился... Хотелось бы оптимизировать конечно этот алгоритм...
private boolean compressRow(int[] row) {
	делаю копию массива.
	for (по оригиналу начиная со второго элемента) {
		if (элемент не равен нулю то входим в условие) {
			if (если предыдущий элемент равен нулю то входим в условие) {
				код который создает временную ячейку, записывает в неё предыдущее значение
				далее сам получает значение текущей ячейки, а текущая ячейка записывается временной;
			}
		}
	}
	if (копия массива не равна оригиналу массива то входим в цикл) {
	Вызываем метод сам себя еще раз.
	}
	return Сравниваем массив и если он равен копии, то false, если не равен то true
}
Максим Глотов
Уровень 35
7 августа 2021, 16:49
Сортировать нельзя же!!! {0,4,8,2} при сортировке станет {2,4,8,0} - а должен быть {4,8,2,0} Советнички...
Лизунов Сергей
Уровень 41
17 июня 2021, 14:23
Мое кривое решение. Сделал клон массива - row1. В цикле заменил все элементы оригинального массива row на ноль. Создал временную int переменную tmp = 0. Запустил цикл по клону массива row1. Если элемент в массиве-клоне не равен нулю, то row[tmp] = row1[i] и tmp++. Затем вернул !Arrays.equals(row1, row).
Marina
Уровень 31
7 февраля 2021, 16:19
Так как массив row состоит из примитивного типа, я воспользовалась этим при создании его нового аналога, заполненного нулями. В новый массив перенесла все встретившиеся по порядку ненулевые числа и тд Не надо не копий ни пузырьков.