Професионална програма
Loading...
+ Нов въпрос
abetterman avatar abetterman 21 Точки

Две! грешки в условието на задача 3.Take/Skip Rope от More Exercises: Lists

Часове ми бяха необходими, докато намеря грешките!

1ва Грешка в изречението " Afterwards, iterate over both of the lists and skip {skipCount} characters from the non-numbers list, then take {takeCount} characters and store it in a result string. "  
Обратното е. take {takeCount} characters and store it in a result string, then skip {skipCount} characters from the non-numbers list
То така е показано и в примерите по-долу, че първо вземаме символи и тогава skip-ваме.

2ра Грешка. В главния пример на задачата има стринг "skipTest_String044170" . Предпоследния символ трябва да е шест, а не седем.

Трябва да е skipTest_String044160 , защото думата String има 6 символа, а не 7.

 

Тагове:
0
Fundamentals Module
Savas avatar Savas 37 Точки

Благодаря за спестеното време  abetterman,
И аз ще добавя малко от себе си за да помогнем на колегите и те да спестят малко време и нерви (ако са толкова педантични, че докато не намерят решение – не намират покой :)

Може да се обобщи, че обяснението е непълно, объркващо и грешно (предполагам, че това е търсен ефект). Понякога се питам какво се цели с подобен подход, но какво разбирам аз…

Ще се опитам да хвърля светлина върху „неясния“ абзац, който може да бъде квалифициран като пе7й97нин87дъа7с (цифрите следва да се скипнат :). Ето го и абзаца:

 

Afterwards, iterate over both of the lists and skip {skipCount} characters from the non-numbers list, then take {takeCount} characters and store it in a result string. Note that the skipped characters are summed up as they go.

 

Това е оригиналното обяснение, където в червено съм маркирал обяснения, които са дадени за да помогнат… в какво ли? (с изключение на втория ред – където е ОК)

 

  1. Take 0 characters --> Taken: "", skip 4 characters (total 0) --> Skipped: "skipTest_String"--> Result: ""
  2. Take 4 characters --> Taken: "Test", skip 1 characters (total 4) --> Skipped: "skip" --> Result: "Test"
  3. Take 6 characters --> Taken: "String", skip 0 characters (total 9) --> Skipped: "" --> Result: "TestString"

 

Тейкването е някак си логично – при всяка итерация вземаме съответния брой chars. Но скипването е доста мъгливо, а без него неможем да се ориентираме откъде да започнем да take-ваме.

 

Ето какво е „искал да каже автора“:

Скипването на елементи се натрупва при всяка итерация (започвайки от нула на първата итерация). При всяка итерация се сумират броя на скипнатите и тейкнати елементи, така че всеки следващ тейк (при следваща итерация) започва от края на предходно „обработения“ диапазон (който е сума от всички take+skip до момента). Ето как би изглеждал примера, който трябва да се реализира, както казва по-горе abetterman:

 

1. Тотал скип чарс 0 --> Take 0 characters --> Taken: "" --> Result: "" // (skipList[1] + takeList[1] = 4)
(скипваш 0 и вземаш следващите 0)

2. Тотал скип чарс 4 (0 + 4) --> Take 4 characters --> Taken: " Test " --> Result: "Test" // (skipList[2] + takeList[2] = 5)
(скипваш 4 и вземаш следващите 4)

3. Тотал скип чарс 9 (4 + 5) --> Take 6 characters --> Taken: "String" --> Result: "TestString"
(скипваш 9 и вземаш следващите 6)

0
03/06/2020 20:52:16
MariqnK1 avatar MariqnK1 54 Точки

Може ли линк към условието? Благодаря!

0
Savas avatar Savas 37 Точки

https://softuni.bg/downloads/svn/soft-tech/Sept-2019/CSharp/05.%20CSharp-Fundamentals-Lists/05.%20CSharp-Fundamentals-Lists-More-Exercise.docx

Задача 3 от doc файла от линка по-горе.
Ще пейстна и условието тук, но може да се "изяде"(повреди) някой символ при пействането.

3. Take/Skip Rope

Write a program, which reads a string and skips through it, extracting a hidden message. The algorithm you have to implement is as follows:

Let’s take the string “skipTest_String044170” as an example.

Take every digit from the string and store it somewhere. After that, remove all the digits from the string. After this operation, you should have two lists of items: the numbers list and the non-numbers list:

  • Numbers list: [0, 4, 4, 1, 7, 0]
  • Non-numbers: [s, k, i, p, T, e, s, t, _, S, t, r, i, n, g]

After that, take every digit in the numbers list and split it up into a take list and a skip list, depending on whether the digit is in an even or an odd index:

  • Numbers list: [0, 4, 4, 1, 7, 0]
  • Take list: [0, 4, 7]
  • Skip list: [4, 1, 0]

Afterwards, iterate over both of the lists and skip {skipCount} characters from the non-numbers list, then take {takeCount} characters and store it in a result string. Note that the skipped characters are summed up as they go. The process would look like this on the aforementioned non-numbers list:

  1. Take 0 characters >>>Taken: "", skip 4 characters (total 0) >>> Skipped: "skipTest_String" >>> Result: ""
  2. Take 4 charactersTaken: "Test", skip 1 characters (total 4) >>> Skipped: "skip" >>> Result: "Test"
  3. Take 7 characters >>>Taken: "String", skip 0 characters (total 9) >>> Skipped: "" >>> Result: "TestString"

After that, just print the result string on the console.

Input

  • First line: The encrypted message as a string

Output

  • First line: The decrypted message as a string

Constraints

  • The count of digits in the input string will always be even.
  • The encrypted message will contain any printable character.

Examples

Input

Output

T2exs15ti23ng1_3cT1h3e0_Roppe

TestingTheRope

O{1ne1T2021wf312o13Th111xreve!!@!

OneTwoThree!!!

this forbidden mess of an age rating 0127504740

hidden message

 

1
04/06/2020 10:00:44
mitkomik avatar mitkomik 13 Точки
Може и без метода, но бях тръгнал в друга посока и впоследствие ме домързя да го махна:)
Така я видях аз тази задача. 100/100 Judge.

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class TakeSkipRope14_01_03 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        List<Character> numbers = new ArrayList<>();
        List<Character> characters = new ArrayList<>();
        for (int i = 0; i < input.length(); i++) {

            if (input.charAt(i) >= 48 && input.charAt(i) <= 57) {
                numbers.add(input.charAt(i));
            } else {
                characters.add(input.charAt(i));
            }
        }
        List<Integer> takeList = new ArrayList<>();
        List<Integer> skipList = new ArrayList<>();
        for (int i = 0; i < numbers.size(); i++) {
            int numToAdd = Character.getNumericValue(numbers.get(i));
            if (i % 2 == 0) {
                takeList.add(numToAdd);
            } else {
                skipList.add(numToAdd);
            }
        }
        String string = characters.toString()
                .substring(1, 3 * characters.size() - 1)
                .replaceAll(", ", "");

        takePartsOfString(string, takeList, skipList);

    }

    private static void takePartsOfString(String string, List<Integer> takeList, List<Integer> skipList) {
        StringBuilder newString = new StringBuilder();
        for (int i = 0; i < takeList.size(); i++) {
            int take = takeList.get(i);
            for (int j = 0; j < take; j++) {
                if (string.length() == 0) {
                    break;
                }
                newString.append(string.charAt(0));
                string = string.substring(1);
            }

            for (int j = 0; j < skipList.get(i); j++) {

                if (string.length() == 0) {
                    break;
                }
                string = string.substring(1);
            }
        }
        System.out.println(newString);
    }
}
0
JsDSU avatar JsDSU 3 Точки

Качвам едно решение за Java ---> https://pastebin.com/Vv2Qbznp без substring.

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

 Успех!

0
03/03/2021 13:16:27