Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

VasilK avatar VasilK 40 Точки

10.Lady_Bugs

Решението гърми на проверка 9 и 10. Тествах какво ли не. Възможно е да се дължи на ограниченията в условието на задачата.

Доста съм зациклил и може да не виждам очевидна грешка.  

import java.lang.reflect.Array;
import java.util.*;
import java.util.stream.Collectors;

public class tttt {

    public static void main(String[] args) {

        Scanner scanner = new Scanner( System.in );

        int s = Integer.parseInt( scanner.nextLine() );
        String[] arr_i = scanner.nextLine().split( " " );

        int[] lb = new int[s];

        for (int l = 0; l < lb.length; l++) {
            if (Arrays.asList(arr_i).contains( Integer.toString( l ) )) lb[l] = 1;
        }

        String str;
        while (!(str = scanner.nextLine()).equals("end")) {

            String[] arr = str.split( " " );

            int ind = Integer.parseInt( arr[0] );
            String dir = arr[1];
            int len = Integer.parseInt( arr[2] );

            if (ind < 0 || ind >= s || lb[ind] == 0 || len == 0) continue;

            lb[ind] = 0;
            for (int x = 0; x < lb.length; x++) {
                if (dir.equals("right") && (ind + len + x) >= 0 && (ind + len + x) < s && lb[ind + len + x] == 0) {
                    lb[ind + len + x] = 1;
                    break;
                } else if(dir.equals("right") && (ind + len + x) >= 0 && (ind + len + x) < s && lb[ind + len + x] == 1) {
                    continue;
                } else if (dir.equals("left") && (ind - (len + x)) >= 0 && (ind - (len + x)) < s && lb[ind - (len + x)] == 0) {
                    lb[ind - (len + x)] = 1;
                    break;
                } else if (dir.equals("left") && (ind - (len + x)) >= 0 && (ind - (len + x)) < s && lb[ind - (len + x)] == 1) {
                    continue;
                } else {
                    break;
                }
            }
        }
        for (int v : lb) System.out.print( v + " " );
    }
}
Тагове:
0
Fundamentals Module
VasilK avatar VasilK 40 Точки
Така вече минава. Порблема идва от x във for loop.
вход
5
0 2         -> 1 0 1 0 0  
0 left -2   -> 0 0 1 0 1
end 

връща 0 1 1 0 0
както е написан кода лети 2 надясно  ind(0) - (len(-2) + x(0)) = 2 -> 0 0 1 0 0
индекс 2 е зает и трябва да прелети още две надясно, т.е трябва ни индекс 4.
И тука започва мазалото, ind(0) - (len(-2) + x(1)) = 1 -> 0 1 1 0 0
В случай, че полето е заето, вместо +x коректно е +len.

import java.util.*;
public class tttt {

    public static void main(String[] args) {

        Scanner scanner = new Scanner( System.in );

        int[] lb = new int[Integer.parseInt(scanner.nextLine())];
        int[] arr_i = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(e -> Integer.parseInt(e)).toArray();

        for (int i = 0; i < arr_i.length; i++) {
            if (arr_i[i] >= 0 && arr_i[i] < lb.length) {
                lb[arr_i[i]] = 1;
            }
        }

        String str;
        while (!(str = scanner.nextLine()).equals("end")) {

            String[] arr = str.split( " " );

            int ind = Integer.parseInt(arr[0]);
            String dir = arr[1];
            int len = Integer.parseInt(arr[2]);

            if (ind < 0 || ind >= lb.length || lb[ind] == 0 || len == 0) continue;

            lb[ind] = 0;
            int curlen = len;

            while (true) {

                if ((dir.equals("right") && (ind + curlen < 0 || ind + curlen >= lb.length)) ||
                (dir.equals("left") && (ind - curlen < 0 || ind - curlen >= lb.length))) {
                    break;
                }

                if (dir.equals("right") && lb[ind + curlen] == 0) {
                    lb[ind + curlen] = 1;
                    break;
                } else if (dir.equals("left") && lb[ind - curlen] == 0) {
                    lb[ind - curlen] = 1;
                    break;
                } else {
                    curlen += len;
                }

            }

        }
        for (int v : lb) System.out.print( v + " " );
    }
}
0
svetlakrasteva avatar svetlakrasteva 7 Точки

Благодаря за споделеното решение. Аз съм very beginner и не мога да се справя сама. Прегледах много предложени решения, но ми се струваха объркани и оплетени. Твойто е на има-няма 30 реда (без да броим празни и скоби) и е супер ясно. Поздрави за което!!!

Само смених имената на променливите, за да разбирам, като чета кода (lb = fieldArray, arr_i = lbArray и т.н...)

0
VasilK avatar VasilK 40 Точки

Радвам се че кода ти е полезен. По мое мнение колко е оптимален кода зависи много от това как си представяш решението веднага след като прочетеш условието. Щом ми хрумне нещо веднага го подлагам на критика дали е оптимално. Имам по 4, 5 весии на задача които минават проверките.

Мисля че на този етап по-оплетен код е по-полезен от гледна точка упражняване на логика и подход.

0
14/02/2019 23:48:45
svetlakrasteva avatar svetlakrasteva 7 Точки

Не съм съгласна, че оплетеният код е полезен за упражняване на логиката и подхода.

Твоят подход в много правилен:

  • Изключваш всички начални положения на калинката, които не работят, защото тя е извън полето, или не е в подадения индекс.
  • Изключваш всички положения на калинката след преместването, при които попада извън полето
  • и накрая остават само работещите варианти.

В бъдещите задачи ще се старая да прилагам този подход на изключване на неработещи варианти още в началото.

Още веднъж благодаря.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.