JavaRush /Java блог /Архив info.javarush /Кухня(); Задание N32.
terranum
28 уровень
Milan

Кухня(); Задание N32.

Статья из группы Архив info.javarush
Кухня(); Задание N32. - 1 Правила [Одномерные массивы] 32. Секретный замок для сейфа состоит из 10 расположенных в ряд ячеек, в которые надо вставить игральные кубики. Но дверь открывается только в том случае, когда в любых трех соседних ячейках сумма точек на передних гранях кубиков равна 10. (Игральный кубик имеет на каждой грани от 1 до 6 точек.) Напишите программу, которая разгадывает код замка при условии, что два кубика уже вставлены в ячейки. --- --- --- --- --- --- --- Каким оружием могли бы быть разные языки программирования --- --- --- --- --- --- ---
Комментарии (59)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Docktor91 Уровень 40
14 сентября 2014
еще раз скажу, у меня в коде нужно вставить правильно кубики, тогда решение будет нормально(правда если честно, у меня там косячок есть)))
[0, 0, 0, 0, 0, 0, 0, 5, 0, 6] например здесь возьмем три последние, очевидно что сумма уже не равна 10
значит вставлены не верно, можно добавить еще один цикл для проверки элементов меньше 1, и выкрикивать эксепшн
Airon Уровень 34
14 сентября 2014
Хорошая задача, сначала кинула в пот из-за на первый взгляд большущего кода. Потом решив немножко подглядеть решение посмотрел тут код, но оказалось невероятно сложно и абсолютно не понятно или мой скилл еще достаточно девственен. Хотя и поигрался с приведенными тут кодами, но некоторые массивы были:
[0, 0, 0, 0, 0, 0, 0, 5, 0, 6]
[6, 5, -1, 6, 5, -1, 6, 5, -1, 6]
и еще по такому типу
[0, 0, 0, 0, 6, 5, 0, 0, 0, 0]
[-1, 6, 5, -1, 6, 5, -1, 6, 5, -1]
что не есть решение.
Итак немного поднявшись и изменив угол обзора, увидел замыливание в задаче, оказалось, что для решение надо перенести координатную ось до первого кубика, и если эта правая часть решаема то по полученному образцу (паттерну) добрать левую часть массива.
Вот мой вариант, еще есть куда оптимизировать, но это повлечет кучу проверок и еще увеличение кода:
public class thekitchen {
    public static void main(String[] args) {
        Random random = new Random();
        int[] numbers = new int[10];
        while (true) {
            int i1 = random.nextInt(10);
            int i2 = random.nextInt(10);
            if (i1 != i2) {
                numbers[i1] = random.nextInt(6) + 1;
                numbers[i2] = random.nextInt(6) + 1;
                break;
            }
        }
        System.out.println(Arrays.toString(numbers));
        System.out.println(Arrays.toString(getPassword(numbers)));
    }

    public static boolean isOpen(int... array) {
        for (int i = 1; i < array.length - 1; i++)
            if (array[i - 1] + array[i] + array[i + 1] != 10)
                return false;
        return true;
    }

    public static int[] getPassword(int... array) {
        int index = 0;
        for (int i = 0; i < array.length; i++)
            if (array[i] != 0) {
                index = i;  // Находим индекс самого левого/первого кубика
                break;
            }
    
terranum Уровень 28
4 сентября 2014
Не буду вас больше кипятить, go дальше)

Слыхали ты в гугл устроился, ну как там?)))
terranum Уровень 28
4 сентября 2014
Ладно ребят, выдвигаю тезис, от него будем скакать.
«Клиент всегда прав.»
Соглашаемся и уточняем условие, не соглашаемся, значить скачим дальше.
Docktor91 Уровень 40
4 сентября 2014
извините за нерефакторенность
Docktor91 Уровень 40
4 сентября 2014
public static void getPassword(int...arr)
	{
		
		int[] res=new int[]{0,0,0,0,0,0,0,0,0,0};
		int fi=0;
		int si=0;
		for (int i=0;i<arr.length;i++)
		{
			if (arr[i]>0)
			{
				if (fi==0)
					fi=i;
				else
					si=i;
			}
		}
		int[] d=new int[3];
		d[fi%3]=arr[fi];
		if (arr[fi]==arr[si])
			d[(fi+1)%3]=(10-arr[fi]-arr[si])/2;
		else
			d[(fi+1)%3]=arr[si];
		d[(fi+2)%3]=10-arr[fi]-d[(fi+1)%3];
		
		for (int i=0;i<res.length;i++)
		{
			res[i]=d[i%3];
		}
		System.out.println(Arrays.toString(res));
	}
Vash_the_Stampede Уровень 11
3 сентября 2014
Прошлый код опять оказался неверным, вроде этот рабочий (там же генератор входных данных и проверка):
public class MainClass {

    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 1000; i++) {
            int[] arr = generateInputForKitchen32();
            int[] copy = Arrays.copyOf(arr, arr.length);
            kitchen32(arr);
            for (int j = 0; j < arr.length - 2; j++) {
                if (arr[j] + arr[j + 1] + arr[j + 2] != 10) {
                    System.out.println("Wrong result");
                    System.out.println(Arrays.toString(copy));
                    System.out.println(Arrays.toString(arr));
                    System.out.println();
                    System.exit(0);
                }
            }
        }
    }

    public static int[] generateInputForKitchen32() {
        int k1, v1, k2, v2;

        k1 = (int) (Math.random() * 10);
        v1 = (int) (Math.random() * 6) + 1;

        do {
            k2 = (int) (Math.random() * 10);
        }
        while (k1 == k2);

        if (k1 % 3 == k2 % 3) {
            v1 = v2 = v1 > 5 ? v1 : (int) (Math.random() * 4) + 1;
        }
        else
            do {
                v2 = (int) (Math.random() * 6) + 1;
            }
            while (v1 + v2 < 4 || v1 + v2 > 9);

        int[] arr = new int[10];
        arr[k1] = v1;
        arr[k2] = v2;

        return arr;
    }

    public static int[] kitchen32(int[] arr) {
        final int N = arr.length; // number of cubes
        final int S = 10; // sum of three nearby cubes

        int k1 = 0;
        while (arr[k1] == 0) {
            k1++;
        }

        int k2 = k1 + 1;
        while (arr[k2] == 0) {
            k2++;
        }

        if (k1 % 3 == k2 % 3) {
            if (arr[k1] != arr[k2]) {
                System.out.println("Impossibile!"); // Italian
                return arr;
            }
            els
terranum Уровень 28
3 сентября 2014
Необходимо еще раз прочитать условие, в данной задаче нет невозможных решений!
Vash_the_Stampede Уровень 11
3 сентября 2014
Тут был код задания. Удален мною, поскольку был неверен и занимал много места.
Vash_the_Stampede Уровень 11
3 сентября 2014
Не знаю, почему, но Arrays.binarySearch(new int[] { 4, 1, 0 }, 0) возвращает -1(я ожидал 2), поэтому пришлось самому искать:
public static int[] kitchen32(int[] arr) {
    final int N = arr.length; // number of cubes
    final int S = 10; // sum of three nearby cubes

    int k1 = -1;
    while (arr[++k1] == 0);
    int k2 = k1;
    while (arr[++k2] == 0);

    if (k1 % 3 == k2 % 3) {
        if (arr[k1] != arr[k2]) {
            System.out.println("Impossibile!"); // Italian
            System.exit(0);
        }
        else {
            arr[k1 + 1] = arr[k1];
        }
    }

    int[] three = new int[3];

    three[k1 % 3] = arr[k1];
    three[k2 % 3] = arr[k2];
    for (int i = 0; i < 3; i++) {
        if (three[i] == 0) {
            three[i] = S - three[0] - three[1] - three[2];
            break;
        }
    }

    System.out.println(Arrays.toString(three));

    for (int i = 0; i < N; i++) {
        arr[i] = three[i % 3];
    }

    return arr;
}