powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Тест по Java на собеседовании
15 сообщений из 15, страница 1 из 1
Тест по Java на собеседовании
    #37733426
rus_sun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недавно приятель был на собеседовании в на вакансию java-разработчик. Ему там предложили за 15 минут оптимизировать код вот такой простенькой игры.
Что смог он за 15 минут изменил, но тест не прошел. Я, если честно, с налета тоже ничего бы существенного не поменял.
Вот выношу на суд сообщества. Интересно, чего они от него ждали.



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
public class GameRunner {

	private static boolean notAWinner;

	public static void main(String[] args) {
		Game aGame = new Game();
		
		aGame.add("Chet");
		aGame.add("Pat");
		aGame.add("Sue");
		
		Random rand = new Random();
	
		do {
			
			aGame.roll(rand.nextInt(5) + 1);
			
			if (rand.nextInt(9) == 7) {
				notAWinner = aGame.wrongAnswer();
			} else {
				notAWinner = aGame.wasCorrectlyAnswered();
			}
			
			
			
		} while (notAWinner);
		
	}
}




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
public class Game {
    ArrayList players = new ArrayList();
    int[] places = new int[6];
    int[] purses = new int[6];
    boolean[] inPenaltyBox = new boolean[6];

    LinkedList popQuestions = new LinkedList();
    LinkedList scienceQuestions = new LinkedList();
    LinkedList sportsQuestions = new LinkedList();
    LinkedList rockQuestions = new LinkedList();

    int currentPlayer = 0;
    boolean isGettingOutOfPenaltyBox;

    public Game() {
        for (int i = 0; i < 50; i++) {
            popQuestions.addLast("Pop Question " + i);
            scienceQuestions.addLast(("Science Question " + i));
            sportsQuestions.addLast(("Sports Question " + i));
            rockQuestions.addLast(createRockQuestion(i));
        }
    }

    public String createRockQuestion(int index) {
        return "Rock Question " + index;
    }

    public boolean isPlayable() {
        return (howManyPlayers() >= 2);
    }

    public boolean add(String playerName) {

        players.add(playerName);
        places[howManyPlayers()] = 0;
        purses[howManyPlayers()] = 0;
        inPenaltyBox[howManyPlayers()] = false;

        System.out.println(playerName + " was added");
        System.out.println("They are player number " + players.size());
        return true;
    }

    public int howManyPlayers() {
        return players.size();
    }

    public void roll(int roll) {
        System.out.println(players.get(currentPlayer)
                + " is the current player");
        System.out.println("They have rolled a " + roll);

        if (inPenaltyBox[currentPlayer]) {
            if (roll % 2 != 0) {
                isGettingOutOfPenaltyBox = true;

                System.out.println(players.get(currentPlayer)
                        + " is getting out of the penalty box");
                places[currentPlayer] = places[currentPlayer] + roll;
                if (places[currentPlayer] > 11)
                    places[currentPlayer] = places[currentPlayer] - 12;

                System.out.println(players.get(currentPlayer)
                        + "'s new location is " + places[currentPlayer]);
                System.out.println("The category is " + currentCategory());
                askQuestion();
            } else {
                System.out.println(players.get(currentPlayer)
                        + " is not getting out of the penalty box");
                isGettingOutOfPenaltyBox = false;
            }

        } else {

            places[currentPlayer] = places[currentPlayer] + roll;
            if (places[currentPlayer] > 11)
                places[currentPlayer] = places[currentPlayer] - 12;

            System.out.println(players.get(currentPlayer)
                    + "'s new location is " + places[currentPlayer]);
            System.out.println("The category is " + currentCategory());
            askQuestion();
        }

    }

    private void askQuestion() {
        if (currentCategory() == "Pop")
            System.out.println(popQuestions.removeFirst());
        if (currentCategory() == "Science")
            System.out.println(scienceQuestions.removeFirst());
        if (currentCategory() == "Sports")
            System.out.println(sportsQuestions.removeFirst());
        if (currentCategory() == "Rock")
            System.out.println(rockQuestions.removeFirst());
    }

    private String currentCategory() {
        if (places[currentPlayer] == 0)
            return "Pop";
        if (places[currentPlayer] == 4)
            return "Pop";
        if (places[currentPlayer] == 8)
            return "Pop";
        if (places[currentPlayer] == 1)
            return "Science";
        if (places[currentPlayer] == 5)
            return "Science";
        if (places[currentPlayer] == 9)
            return "Science";
        if (places[currentPlayer] == 2)
            return "Sports";
        if (places[currentPlayer] == 6)
            return "Sports";
        if (places[currentPlayer] == 10)
            return "Sports";
        return "Rock";
    }

    public boolean wasCorrectlyAnswered() {
        if (inPenaltyBox[currentPlayer]) {
            if (isGettingOutOfPenaltyBox) {
                System.out.println("Answer was correct!!!!");
                purses[currentPlayer]++;
                System.out.println(players.get(currentPlayer) + " now has "
                        + purses[currentPlayer] + " Gold Coins.");

                boolean winner = didPlayerWin();
                currentPlayer++;
                if (currentPlayer == players.size())
                    currentPlayer = 0;

                return winner;
            } else {
                currentPlayer++;
                if (currentPlayer == players.size())
                    currentPlayer = 0;
                return true;
            }

        } else {

            System.out.println("Answer was corrent!!!!");
            purses[currentPlayer]++;
            System.out.println(players.get(currentPlayer) + " now has "
                    + purses[currentPlayer] + " Gold Coins.");

            boolean winner = didPlayerWin();
            currentPlayer++;
            if (currentPlayer == players.size())
                currentPlayer = 0;

            return winner;
        }
    }

    public boolean wrongAnswer() {
        System.out.println("Question was incorrectly answered");
        System.out.println(players.get(currentPlayer)
                + " was sent to the penalty box");
        inPenaltyBox[currentPlayer] = true;

        currentPlayer++;
        if (currentPlayer == players.size())
            currentPlayer = 0;
        return true;
    }

    private boolean didPlayerWin() {
        return !(purses[currentPlayer] == 6);
    }
}
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37733437
rrrrrrrr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За 15 минут у меня получился примерно следующий список замечаний:

1. Дублирование кода в roll(), там в if (penalty)-else ветках одинаковый кусок вроде.
2. В currentCategory() возможно удобнее было бы использовать Map. Похоже заполнить её можно алгоритмом, там смещение по 4.
3. В askQuestion() тоже можно использовать Map.
4. Дублирование кода в wasCorrectlyAnswered if-else ветках (3 места вроде).
5. Вынести весь penaltyBox handling в отдельный метод для повышения читаемости.
6. Радикальное изменение - применить ООП и сделать нормальный класс Player.
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37733451
rus_sun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rrrrrrrr,

автор2. В currentCategory() возможно удобнее было бы использовать Map. Похоже заполнить её можно алгоритмом, там смещение по 4.
3. В askQuestion() тоже можно использовать Map.

Да, я бы там предложил switch-case, ну и стринговые константы заменить на константы из enum

В wasCorrectlyAnswered() еще можно обойтись без локальной переменной winner.

В отношении радикальных изменений, меня еще тянуло спроектировать игру нескольких игроков в виде параллельных потоков.

НО за 15 минут, я могу это от силы увидеть и назвать, но никак не переписать.
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37733490
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roll % 2 на roll & 1
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37733494
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заменить LinkedList на ArrayDeque
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37733526
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rus_sun,

А сравнение if (currentCategory() == "Pop") теперь явой называется? С какой версии явы? Я-то знаю, что с пятой (тигр, по-моему). На четвёрке такое не сработало бы. Интересно, а задавальщики задачи об этом знают?
Ну, а по сабжу - конечно переключатель. Однозначно. За 15 минут прекрасно сумеете переписать все ифы.
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37733624
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rus_sun,

А что значит оптимизировать, ваш приятель не уточнял?
По мне так подобные вопросы на собеседовании могут выявить только телепатические способности соискателя.
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37733771
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergerus_sun,

А сравнение if (currentCategory() == "Pop") теперь явой называется? С какой версии явы? Я-то знаю, что с пятой (тигр, по-моему). На четвёрке такое не сработало бы. Интересно, а задавальщики задачи об этом знают?
Ну, а по сабжу - конечно переключатель. Однозначно. За 15 минут прекрасно сумеете переписать все ифы.
ни с какой версии
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37734182
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael PonomarevShSergerus_sun,

А сравнение if (currentCategory() == "Pop") теперь явой называется? С какой версии явы? Я-то знаю, что с пятой (тигр, по-моему). На четвёрке такое не сработало бы. Интересно, а задавальщики задачи об этом знают?
Ну, а по сабжу - конечно переключатель. Однозначно. За 15 минут прекрасно сумеете переписать все ифы.
ни с какой версии
Серьёзно что-ли? Я как-то написал программулину, признаюсь, с таким сравнением, по ошибке. Пятёрка съела, и вроде-как, вполне всё работало. А вот на четвёрке и ниже - фиг вам. Вот я и решил, что теперь так строки уже можно сравнивать, хотя сам так никогда не делаю.
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37734201
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael PonomarevShSergerus_sun,

А сравнение if (currentCategory() == "Pop") теперь явой называется? С какой версии явы? Я-то знаю, что с пятой (тигр, по-моему). На четвёрке такое не сработало бы. Интересно, а задавальщики задачи об этом знают?
Ну, а по сабжу - конечно переключатель. Однозначно. За 15 минут прекрасно сумеете переписать все ифы.
ни с какой версии
+1
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37734283
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Практически в первую же неделю изучения Java наткнулся на сравнение строк и навсегда запомнил, что в java строка это объект и сравнивать их нужно через .equals. И вроде бы в java так было всегда.
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37734289
пролетевший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeСерьёзно что-ли? Я как-то написал программулину, признаюсь, с таким сравнением, по ошибке. Пятёрка съела, и вроде-как, вполне всё работало. А вот на четвёрке и ниже - фиг вам. Вот я и решил, что теперь так строки уже можно сравнивать, хотя сам так никогда не делаю.
Сработало за счет кеша строк ( ключевое слово intern ). Java пытается переиспользовать строки с одинаковым содержимым. Константы из кода могут совпасть, а вот считанное из фаила и заведенное в коде нет.
По ходу текст надо не улучшать, а переписывать с нуля, дешевле будет. Данный класс весь один сплошной набор "антипаттернов" :
- нарушение OOP подхода ( отдельные коллекции для свойств вмасто обьектов )
- нарушение принципа "single responsibility"
- использование магических цифр/строк
- нечитабельно
- нет проверок на ошибки
- copy/paste
- не тестируемо
В общем, исправление говнокода.
Куда интереснее задача написать такой API для игры ( оригинал был с крестики нолики ) где попытка сделать неверный ход или получить результат от незавершенной игры вызывает ошибку компиляции...
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37734764
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
public class GameRunner {

private static boolean notAWinner;

public static void main(String[] args) {
Game aGame = new Game();

aGame.add("Chet");
aGame.add("Pat");
aGame.add("Sue");

Random rand = new Random();

do {

aGame.roll(rand.nextInt(5) + 1);

if (rand.nextInt(9) == 7) {
notAWinner = aGame.wrongAnswer();
} else {
notAWinner = aGame.wasCorrectlyAnswered();
}



} while (notAWinner);

}
}

1) private static boolean notAWinner - may be a local

public class Game {...}

Все, что можно сделать private - сделать и добавить setter`ы, getter`ы
Все, что можно сделать final - сделать и убрать setter`ы
Все, что можно сделать static - сделать
Все static переменные инициализировать static методами, пример:
Код: java
1.
2.
3.
4.
5.
private LinkedList popQuestions = createPopQuestions();

private static LinkedList createPopQuestions() {
 return ...
} 


Соответственно, вынести логику создания LinkedList из конструктора.
Строковые переменные, вроде "Pop" - загнать в enum`ы и по всему коду заменить сравнения

Первые поправки, абсолютно не вчитываясь в код класса и его логику ;)
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37736820
Core12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+1 к тому что было уже сказано
и новенькое метод isPlayable нигде не используется следовательно на фиг он нужен.
...
Рейтинг: 0 / 0
Тест по Java на собеседовании
    #37736825
Core12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде как ArrayList лучше сделать как ArrayList<String> и тоже самое относится к LinkedList.
Ну и переменные уровня класса не плохо было бы явно прописать private.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Тест по Java на собеседовании
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]