Vowel to Length Ratio

Здравейте на всички!

Не разбирам защо инпута в array[0] в String[] inputs се инициализира като null,

то ест:

input:
4
pizza
macaroni
kiufte
banica

и става така:
String[] inputs = {"", pizza, macaroni, kiufte};

Помощ!

Vowel to Length Ratio

You are still hungry!

The objective criteria of finding the food with the longest length is not working anymore. Continuing the idea of thinking outside the box, you decide to introduce a new rule - the best food is the one with the least vowels-to-letters ratio.
For instance:

  • pizza → 2/5 (2 vowels, 5 letters)
  • macaroni → 4/8 (4 vowels, 8 letters)

Pizza is clearly better.

The vowels are ‘aouei’

If two foods share the same ratio, choose the one with more vowels. If they have the same ratio and same number of vowels, choose the one with more letters.

Input

  • The input consists of several lines
  • On the first line - integer N - the number of lines to follow
  • On the next N lines - each food

Output

  • Output the best food and its ratio in format `food vowels/letters’

Constraints

1 <= lines <= 20

Sample Tests

Input

4
pizza
macaroni
kiufte
banica

Output

pizza 2/5

Input

3
macaroni
kiufte
banica

Output

macaroni 4/8

КОДЪТ ми:

p-s:
знам че if-else е грешен, ама първо трябва да оправя инпута :slight_smile:

Благодаря предварително!

nextInt() не преминава на следващия ред, затова първия nextLine() от цикъла чете празен стринг от края на реда с числото. Или трябва да действаш само с nextLine(), или след nextInt() трябва да извикваш и nextLine(), ако следващия инпут е на нов ред.

1 Like

да, забравих за това…

Integer.parseInt(scanner.nextLine());

не сложих Solved, че може да се наложи да уточня и нещо друго относно таска, иначе инпута е оправен, Благодаря!

Този код минава само 2 от 6 теста:

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

Благодаря предварително!

Дали някой ще може да ми обясни какъв output се очаква в последните два теста?

Логиката беше че letters - включват и vowels, пък в тестовете където има само гласните или само съгласните букви - judge дава грешка.

П-С:
горе-постнатият код няма връзка с кода върху който работя вмомента, искам само съвет/разяснение относно това какъв output се очаква в последните двата теста.

Благодаря предварително!

image

Когато буквите са еднакви принтиш най-дългата дума,съответно ако има гласни ги броиш.
Пише го в условието : “If two foods share the same ratio, choose the one with more vowels. If they have the same ratio and same number of vowels, choose the one with more letters.”

1 Like

сега направих промяната в кода, минават 1,2,3,4 и 6 тестовете, 5-ти все още дава грешка.

ръчно тествах ето тези I/O:

input:
3
ааа
ааааа
аааа

output:
ааааа 0/5

input:
3
aaa
bbb
aaaa

output:
aaaa 4/4

input:
3
aaa
aaa
bbbb

output:
bbbb 0/4

ето го кода ми:

Дали някой може ли да види кода ми и да даде хинт?

Благодаря предварително!

Здравей,

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

Например, пази си някъде параметрите, чиито стойности ще печаташ накрая и ъпдейтвай стойностите им според условието, например:

String topWord = inputs[0]; (за по-лесно може да зададеш началната стойност да е първата дума от инпут-а)
int topWordVowelCounter = 0; (понеже не знаеш дали първата дума дали изобщо ще има гласни или не)
int topWordLength = inputs[0].length();
double topWordRatio = примерно Double.MAX_VALUE;

После циклиш всяка дума от инпут-а и проверяваш 1 по 1 условията:
ако currentWordRatio < topWordRatio → присвояваш текущите стойности за top-стойности
ако currentWordRatio = topWordRatio →
→ проверяваш дали currentWordVowelsCounter > topWordVowelsCounter → ако да → присвояваш текущите стойности за top-стойности; а ако са = → проверяваш коя дума е по-дълга и т.н.

п.п. не видях да сравняваш реално някъде това ratio като число, но гледай да го изчислява в double, a не в int, понеже като делиш int / int, резултатът ще ти е пак int, т.е. ще ти показва, че 2/5 = 3/5 (=0)

Накрая пак ще си го печаташ по същия начин
System.out.println(topWord + " " + topWordVowelCounter + "/" + topWordLength);

п.п. в този твой кейс
input:
3
ааа
ааааа
аааа

output:
ааааа 0/5

а-то е на кирилица и затова изкарва такъв резултат:)

Успех! :slight_smile:

2 Likes

Много ти благодаря за толкова детайлен и обстоен отговор!
Малко труден ми се струва този таск, че хем разбирам логиката какво трябва да се направи, хем не успявам да го реализирам в кода, ама ще го бутам, няма начин :slight_smile:

Успешна седмица от мене!

Поздрави,
Алекс Т.

Седнах да си дореша пропуснатите задачи от Coding Tasks на Loops. Стигнах до въпросната задача, мъдря я вече половин ден и ми дава 50 точки и това си му е… Прилагам линк към кода… Ако има някой ,който може да ме светне къде греша…

Здравей,
Съветвам те да тестваш с инпута, който @denski.bg е предоставила по горе, а именно:

3
aaa
aaaaa
aaaa
Като не го копираш директно, а ръчно вкараш буквите така че да са английски, а не български. Най-добре би било да дебъгнеш. Предполагам че проблемът ти е че каунтъра за гласни - int vowelCounter, който инициализираш извън цикъла, не се занулява след всяка дума :slightly_smiling_face:
Благодаря на denski.bg за предоставените тестови данни, на мен също ми бяха много полезни!
P. S. Мога да споделя моето решение ако ще е полезно :slightly_smiling_face:

@Spasimir Мисля че проблемът при теб всъщност е че ти никъде не изчисляваш VowelToLengthRatio, a приемаш че думата с най-малко гласни е тази която търсиш

Ето моето решение на тази задача:

import java.util.Scanner;

public class VowelToLengthRatio {

public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);

    int n = Integer.parseInt(scanner.nextLine());

    boolean isVowel = false;
    double ratio = 0;
    double minRatio = Double.MAX_VALUE;
    int resultVowels = 0;
    int resultLetters = 0;
    String result = "";

    while (n>0){
        String food = scanner.nextLine();
        int vowelCounter = 0;
        for (int i = 0; i < food.length(); i++) {
            char letter = food.charAt(i);

            if(letter=='a' || letter=='A' || letter=='e' || letter=='E' || letter=='i' || letter=='I'
                    || letter=='o' || letter=='O' || letter=='u' || letter=='U'){
                isVowel = true;
                vowelCounter++;
            }
        }

        ratio = vowelCounter * 1.0/food.length();

        if(ratio<minRatio){
            minRatio = ratio;
            result = food;
            resultVowels = vowelCounter;
            resultLetters = food.length();
        }else if(ratio==minRatio){
            if(vowelCounter>resultVowels){
                result = food;
                resultVowels = vowelCounter;
                resultLetters = food.length();
            }else if(vowelCounter==resultVowels){
                if(food.length()>resultLetters){
                    result = food;
                    resultVowels = vowelCounter;
                    resultLetters = food.length();
                }
            }
        }

        n--;

    }

    System.out.printf("%s %d/%d%n", result, resultVowels, resultLetters);
}

}

Много благодаря! Ще разгледам решението по-късно и ще се опитам да намеря грешката си.

1 Like

Няма защо, иначе провери си както писах първо int vowelCounter - би било добре да го инициализираш вътре в цикъла или да го зануляваш по някакъв начин, но не това е основният проблем, а това че не изчисляваш никъде VowelToLengthRatio - от неговата стойност трябва да се ръководиш първо при определяне на най-добрата храна - “the best food is the one with the least vowels-to-letters ratio”.

Поздрави,