Print Deck of Cards - дава ми само 60 точки

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

Моля, някои да погледнат кода ми, че не ми е ясно защо Judge не ми дава 100 точки тук.

Note 1: Видях различни решения и бих се равал ако някои да ми кажат какво съм пропуснал в собствения си код.

Note 2: Пробвах да се принтира и с char символи за всяка карта, и без тях както е в текущото ми решение - не става.

кодът:

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

ЗАДАЧА:

Print Deck of Cards

Description

Write a program that reads a card sign(as a string ) from the console and generates and prints all possible cards from a standard deck of 52 cards up to the card with the given sign(without the jokers). The cards should be printed using the classical notation (like 5 of spades, A of hearts, 9 of clubs; and K of diamonds).

  • The card faces should start from 2 to A ( 10 is 10).
  • Print each card face in its four possible suits: clubs , diamonds , hearts and spades .

Input

  • On the only line, you will receive the sign of the card to which, including, you should print the cards in the deck.

Output

  • The output should follow the format bellow(assume our input is 5 ):
2 of spades, 2 of clubs, 2 of hearts, 2 of diamonds
3 of spades, 3 of clubs, 3 of hearts, 3 of diamonds
...
5 of spades, 5 of clubs, 5 of hearts, 5 of diamonds

Constraints

  • The input character will always be a valid card sign.

Sample tests

Input Output
5 2 of spades, 2 of clubs, 2 of hearts, 2 of diamonds

3 of spades, 3 of clubs, 3 of hearts, 3 of diamonds

5 of spades, 5 of clubs, 5 of hearts, 5 of diamonds|

Здравей,
Според мен грешката ти е че четеш инпута като int, а не като String както е по условие - така пропускаш случаите когато card faces са J, Q, K и A
Поздрави,

1 Like

За съжаление, пак не работи при мене.
Изцяло промених кода си и сега той изглежда ето така:

даже ми дава invalid return сега : /

Здравей отново,

да, така е защото ти се опитваш да парснеш стринг, който не винаги е валиден за парсване към int - когато е J, Q, K и A няма как да го парснеш.
Опитай се да преработиш първата част от кода - аз например си създавам в началото една променлива int number = 0; и съм използвала switch case - имам толкова случаи, колкото различни инпута може да има: от 2 до 10 + още 4 когато инпутът е J, Q, K или A. После за всеки от тези случаи давам стойност на number от 1 до 13. После мисля че лесно ще се ориентираш …
Разбира се, може да започнеш и от 2 до 14 - както намериш за добре

1 Like

Благодаря за бърз отговор, Марта!
То аз като тествам кода си минават вичките инпути от 2 до 14, а инпути като 1 или поголям от 14 са се игнорират.

Пътвият ми for-loop е за чекване и принтиране на значенията от 2 до 10.
Вторият ми for-loop е за чекване и принтиране на значенията от J до A.

Значи ще пробвам да я реша задачата по друг начин :slight_smile:
Поздрави!

1 Like

Здравей,
по-нагоре май не сте се разбрали.
Инпутът го разглеждай като String, а не int (и не char, защото може да е “10”) .

  • The card faces should start from 2 to A ( 10 is 10).
    Никъде не ти казват, че 11 е J (то и J не е 11 по принцип:)).
    Това са картите:
`"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"

Няма ниkoга да влезеш в този if на ред 31:
if (times > 10){

Защото няма да ти подадат примерно “13”, ами “Q” :

Input:  Q
Output: 
2 of spades, 2 of clubs, 2 of hearts, 2 of diamonds
3 of spades, 3 of clubs, 3 of hearts, 3 of diamonds
...
J of spades, J of clubs, J of hearts, J of diamonds
Q of spades, Q of clubs, Q of hearts, Q of diamonds

Успех :slight_smile:

4 Likes

+1 таск със 100 точки, много благодаря за обяснението :slight_smile:
Поздрави!

1 Like

Ето, че и аз блокирах на тази задача.
С масиви, както колегата е писал, се обърквам още повече и е по-зле, затова ползвам само loop и се справям с цифрите, но идея си нямам как да остана да ползвам String, защото тогава ще изгубя възможността за събиране, ако пък ползвам int, както е по-долу не знам как да въведа възможността inputa да е String например “А” :slight_smile:

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String cardSign = scanner.nextLine();
int card = Integer.parseInt(cardSign);

    for (int i = 2; i <= card; i++) {
            System.out.printf("%d of spades, %d of clubs, %d of hearts, %d of diamonds%n", i, i, i, i);
        }
    }
}

Здравей,
а защо да не направиш така, инпута да е само String.
после, проверяваш дали input.equalsTo(“A”) || equalsTo “Q” и т н,
и ако инпута не е буква - парсваш инпута в integer и ги принтираш от N-integer до края на колодата.
Поздрави,

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

има три начина:

  1. създаваш масив [2, 3, … Q, K, A] - и после го навързваш инпута спрямо елементите на масива и ги принтираш в сътветният range.
  2. правиш switch-case и там ги подреждаш буквенните значения един по един, 4 са.
  3. правиш един дълъг if-else блок включващ всиките кейсове.

Успях…и съм много доволен да споделя.
Върнах се след няколко часа към задачата и в 47 реда 100/100 с loop, switch и if.
Сега, когато ми пусна да видя най-добрите решения в judge, виждам едно много смислено с масив от String и switch, дано един ден да ми хрумват такива неща :slight_smile:

1 Like

Прави се масив или лист в стринг формат и цикъл върти до позицията в листа,принтира я и спира.
Това е философията на тази задача.

cards =['2','3','4','5','6','7','8','9','10','J','Q','K','A']
key = '10'
for card in cards:
    print(card,'of spades,',card,'of clubs,',card, 'of hearts,',card,'of diamonds')
    if card == key:
        break

Примерен код с Python