Programming Fundamentals Final Exam - 04 April 2020 Group 2
Здравейте,
Стигнах до 60/100 : https://pastebin.com/0jgx1jq1 02. Fancy Barcodes ,
Ако някой може да хвърли едно око или един код.
Поздрави!
Здравейте,
Стигнах до 60/100 : https://pastebin.com/0jgx1jq1 02. Fancy Barcodes ,
Ако някой може да хвърли едно око или един код.
Поздрави!
Регекса, който използваш не хваща всички случаи.
Ето примерен вариант, който покрива условието (питай, ако нещо не ти е ясно по него):
^@#+(?=[A-Z])([A-Za-z0-9]{6,})(?<=[A-Z])@#+$
Това e решението ти с оправен регекс и разкоментиран код за принтиране на default product group (взема 100/100 в Judge)
Ето едно решение и от мен:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collector;
import java.util.stream.IntStream;
public class FancyBarcodes {
public static void main(String[] args) {
String regex = "^@#+(?=[A-Z])(?<barcode>[A-Za-z0-9]{6,})(?<=[A-Z])@#+$";
Pattern pattern = Pattern.compile(regex);
Scanner scanner = new Scanner(System.in);
int barcodesCount = Integer.parseInt(scanner.nextLine());
IntStream.range(0, barcodesCount)
.mapToObj(i -> {
Matcher matcher = pattern.matcher(scanner.nextLine());
if (!matcher.matches()) {
return "Invalid barcode";
}
String barcode = matcher.group("barcode");
String productGroup = barcode.codePoints()
.filter(Character::isDigit)
.mapToObj(c -> (char) c)
.collect(Collector.of(
StringBuilder::new,
StringBuilder::append,
StringBuilder::append,
sb -> sb.length() == 0 ? "00" : sb.toString()));
return "Product group: " + productGroup;
})
.forEach(System.out::println);
}
}
Здравейте,снощи с 300 зора стигнах до 80/100 https://pastebin.com/AjUqN35r и сега като смених regexa с Вашия ми даде 100/100,благодаря за помощта.
Относно Вашето решение,струва ми се на малко по-високо ниво,отколкото мога да понеса,но си го запазвам за да го гледам.
^@#+(?=[A-Z])(?<barcode>[A-Za-z0-9]{6,})(?<=[A-Z])@#+$
Понеже оставихте възможност за въпроси ,искам да попитам за това : (?=[A-Z]) и това: (?<=[A-Z]),за сега съм използвал
само : ?<barcode> ,което създава име/етикетче за групата,до колкото си го представям,горните създават "от-до" граница, от главна буква [A-Z] ,за средната група "barcode".
Също така пробвах какви ли не начини и варианти,комбинации да накарам това парче код да заработи и нестава и нестава:
Благодаря отново!
Да се включа и аз. Това е регекса от твоето решение:
String regex = "^(@#+)([A-Z])(\\w{5,})([A-Z])(\\1)$";
Проблема е във тази (\\w{5,}) и тази (\\1) групи.
По условие имаш главна буква в началото, следват букви и цифри и накрая е отново главна буква и всичко това 6 и нагоре знака. Така написан ([A-Z])(\\w{5,})([A-Z]) взема 7 и нагоре. Второ \w е аналогично на [a-zA-Z0-9_]. Тук се взема освен всичко необходимо и знак _ а по условие не е така.
Не е по условие и повторението на първата група. Тя трябва да отговаря на същите условия като първата но може да е различна.
Според мен трябва да бъде:
String regex = "^(@#+)([A-Z][a-zA-Z0-9]{4,}[A-Z])(@#+)$";
Ето и моето решение: https://pastebin.com/3iPdSxpk
Първото е (positive) lookahead, а второто - (positive) lookbehind. Освен двете positive версии има и negative такива:
Ето малко повече по темата:
Създал си Pattern и от него създал и инициализирал Matcher инстанция, но не си стартирал същинското мачване и съответно няма как да извлечеш групата.
Има повече от един начин да направиш това - разгледай методите на Matcher класа, като в случая най-удачно изглежда използването на Matcher#matches: