Не разбирам защо инпута в 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 е грешен, ама първо трябва да оправя инпута
nextInt() не преминава на следващия ред, затова първия nextLine() от цикъла чете празен стринг от края на реда с числото. Или трябва да действаш само с nextLine(), или след nextInt() трябва да извикваш и nextLine(), ако следващия инпут е на нов ред.
П-С:
горе-постнатият код няма връзка с кода върху който работя вмомента, искам само съвет/разяснение относно това какъв output се очаква в последните двата теста.
Когато буквите са еднакви принтиш най-дългата дума,съответно ако има гласни ги броиш.
Пише го в условието : “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.”
може би алгоритъмът ти е малко сложен (доста пъти май върти едни и същи думи, за да проверява различни неща по тях), провай да го опростиш малко.
Например, пази си някъде параметрите, чиито стойности ще печаташ накрая и ъпдейтвай стойностите им според условието, например:
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
а-то е на кирилица и затова изкарва такъв резултат:)
Много ти благодаря за толкова детайлен и обстоен отговор!
Малко труден ми се струва този таск, че хем разбирам логиката какво трябва да се направи, хем не успявам да го реализирам в кода, ама ще го бутам, няма начин
Седнах да си дореша пропуснатите задачи от Coding Tasks на Loops. Стигнах до въпросната задача, мъдря я вече половин ден и ми дава 50 точки и това си му е… Прилагам линк към кода… Ако има някой ,който може да ме светне къде греша…
Здравей,
Съветвам те да тестваш с инпута, който @denski.bg е предоставила по горе, а именно:
3
aaa
aaaaa
aaaa
Като не го копираш директно, а ръчно вкараш буквите така че да са английски, а не български. Най-добре би било да дебъгнеш. Предполагам че проблемът ти е че каунтъра за гласни - int vowelCounter, който инициализираш извън цикъла, не се занулява след всяка дума
Благодаря на denski.bg за предоставените тестови данни, на мен също ми бяха много полезни!
P. S. Мога да споделя моето решение ако ще е полезно
@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);
}
Няма защо, иначе провери си както писах първо int vowelCounter - би било добре да го инициализираш вътре в цикъла или да го зануляваш по някакъв начин, но не това е основният проблем, а това че не изчисляваш никъде VowelToLengthRatio - от неговата стойност трябва да се ръководиш първо при определяне на най-добрата храна - “the best food is the one with the least vowels-to-letters ratio”.