Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/141: Рейтинг темы: голосов - 141, средняя оценка - 4.63
7 / 7 / 0
Регистрация: 15.02.2018
Сообщений: 56
1

Морской бой

21.03.2018, 20:23. Показов 27114. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дима любит играть в морской бой. К сожалению, он очень рассеян и постоянно неправильно отмечает на карте клетки, по которым уже стрелял. Напишите класс, который будет строить за Диму карту.

Класс SeaMap должен иметь следующие методы (sm – экземпляр SeaMap):

sm.shoot(row, col, result) — добавить на карту результат выстрела. row — индекс ряда карты. col — индекс вертикальной колонки карты. result — одна из строк “miss” (промах), “hit” (попадание), “sink” (потопление корабля).

sm.cell(row, col) Возвращает ‘.’, если в клетке с координатами row, col может находится корабль. Возвращает ‘*’, если в клетку уже стреляли или она находится рядом с потопленным кораблём. Возвращает ‘x’ если в клетке было попадание.

Метод cell будет вызываться, только когда все обнаруженные на карте корабли потоплены. То есть, не нужно помечать ‘*’ клетки рядом с кораблём в который попали, но не потопили до конца.

Формат ввода
Каждый тест представляет собой код, в котором будет использоваться ваш класс. Файл c решением не обязательно называть solution.py, он будет переименован автоматически. Тест запускается с вашим классом, а его вывод сравнивается с правильным решением.

Пример 1
Ввод Вывод
from solution import SeaMap

sm = SeaMap()
sm.shoot(2, 0, 'miss')
sm.shoot(6, 9, 'miss')
for row in range(10):
for col in range(10):
print(sm.cell(row, col), end='')
print()
..........
..........
*.........
..........
..........
..........
.........*
..........
..........
..........
Пример 2
Ввод Вывод
from solution import SeaMap

sm = SeaMap()
sm.shoot(2, 0, 'sink')
sm.shoot(6, 9, 'hit')
for row in range(10):
for col in range(10):
print(sm.cell(row, col), end='')
print()

..........
**........
x*........
**........
..........
..........
.........x
..........
..........
..........
Пример 3
Ввод Вывод
from solution import SeaMap

sm = SeaMap()
sm.shoot(0, 0, 'sink')
sm.shoot(0, 9, 'sink')
sm.shoot(9, 0, 'sink')
sm.shoot(9, 9, 'sink')
for row in range(10):
for col in range(10):
print(sm.cell(row, col), end='')
print()
x*......*x
**......**
..........
..........
..........
..........
..........
..........
**......**
x*......*x
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2018, 20:23
Ответы с готовыми решениями:

Морской бой
У меня программа должна когда взрываеться весь корабль обрисовывать его "*" подскажите как это...

Морской бой на python
Морской бой Ваш друг любит играть в морской бой на нескольких «досках» сразу, но ленится каждый...

Морской бой
В файле задано поле размером 10*10. Пустое поле кодируется точкой, а поле, представляющее часть...

Морской бой
Помогите решить задачу, Морской Бой, вот условия: Ваш друг любит играть в морской бой на...

22
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
22.03.2018, 05:23 2
Python
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
class SeaMap(object):
    def __init__(self):
        self.m = []
        for row in range(10**4):
            r = []
            for col in range(10**4):
                r.append('.')
            self.m.append(r)
 
    def shoot(self, x, y, s):
        if s == 'miss':
            f = '*'
        # ...
        self.m[x][y] = f
 
    def cell(self, x, y):
        return self.m[x][y]
 
 
sm = SeaMap()
sm.shoot(2, 0, 'miss')
sm.shoot(6, 9, 'miss')
for row in range(10):
    for col in range(10):
        print(sm.cell(row, col), end='')
    print()
0
7 / 7 / 0
Регистрация: 15.02.2018
Сообщений: 56
22.03.2018, 16:13  [ТС] 3
Чет не пашет
0
1291 / 908 / 479
Регистрация: 05.12.2013
Сообщений: 3,073
22.03.2018, 18:23 4
Рыжий Лис, Тут недописал

Python
1
2
3
4
5
def shoot(self, x, y, s):
        if s == 'miss':
            f = '*'
        # ...
        self.m[x][y] = f
то ли лень, то ли забыл
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
22.03.2018, 18:24 5
Специально не дописал. Ты ещё не заметил 10**4.
2
7 / 7 / 0
Регистрация: 15.02.2018
Сообщений: 56
22.03.2018, 20:52  [ТС] 6
Я запутался. Так как правильно?
0
4937 / 3290 / 1140
Регистрация: 21.03.2016
Сообщений: 8,071
23.03.2018, 17:01 7
Python
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
class SeaMap(object):
    
    def __init__(self):
        self.field = [ list('.')*10 for _ in range(10) ]
   
    def shoot(self, row, col, result):
        
        def correct(x):
            if x<0 :
                x = 0
            elif x>9:
                x = 9
            return x
            
        if result == 'sink':
            line_row = [correct(x) for x in (row-1,row,row+1)]
            line_col = [correct(x) for x in (col-1,col,col+1)]
            
            for i in line_row:
                for x in line_col:
                    self.field[i][x] = '*'
            self.field[row][col] = 'x'
        elif result == 'miss':
            self.field[row][col] = '*'
        else:   
            self.field[row][col] = 'x'
 
    def cell(self, row, col):
        return self.field[row][col]
результат проверил на трех данных тестах
..........
..........
*.........
..........
..........
..........
.........*
..........
..........
..........

..........
**........
x*........
**........
..........
..........
.........x
..........
..........
..........

x*......*x
**......**
..........
..........
..........
..........
..........
..........
**......**
x*......*x
1
7 / 7 / 0
Регистрация: 15.02.2018
Сообщений: 56
23.03.2018, 17:42  [ТС] 8
Вердикт Я.Контест: wrong-answer

ompiling/file solution.py || true


stderr:
Тест 7

Ресурсы 43ms/5.26Mb

Ввод

from solution import SeaMap

sm = SeaMap()

sm.shoot(0, 0, 'hit')
sm.shoot(0, 1, 'sink')

sm.shoot(9, 8, 'hit')
sm.shoot(9, 9, 'sink')

sm.shoot(2, 3, 'sink')

sm.shoot(5, 6, 'miss')
sm.shoot(7, 8, 'miss')
sm.shoot(1, 7, 'miss')

sm.shoot(1, 7, 'miss')

for row in range(10):
for col in range(10):
print(sm.cell(row, col), end='')
print()
Вывод программы

*x*.......
*****..*..
..*x*.....
..***.....
..........
......*...
..........
........*.
........**
........*x
Правильный ответ

xx*.......
*****..*..
..*x*.....
..***.....
..........
......*...
..........
........*.
.......***
.......*xx
Сообщение чекера

Line 1 differs: out:
>*x*.......<
corr:
>xx*.......<
0
4937 / 3290 / 1140
Регистрация: 21.03.2016
Сообщений: 8,071
23.03.2018, 20:25 9
Taranboy, ну да я перезаписываю рядом стоящие попадания. при одиночных кораблях когда попал и убил это сработало а вот когда ххх подряд то затирает соседние попадания. осталось реализовать проверку соседних клеток на попадания верх и вниз а так же влево вправо и свободные от х заполнить * но что то я завис на этом.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class SeaMap(object):
    
    def __init__(self):
        self.field = [ list('.')*10 for _ in range(10) ]
        self.shot = {'miss' : '*','hit' :'x', 'sink' :'x'}
        
    def shoot(self, row, col, result):
 
        if result == 'sink':
            self.field[row][col] = self.shot[result]
            '''тут проверяем и заменяем на *'''
        
        else:   
            self.field[row][col] = self.shot[result]
 
    def cell(self, row, col):
        return self.field[row][col]
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
24.03.2018, 06:07 10
Python
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
#!/usr/bin/env python3
 
class SeaMap(object):
    def __init__(self):
        self.field = [ list('.')*10 for _ in range(10) ]
 
    def shoot(self, row, col, result):
        self.field[row][col] = {
            'miss': '*',
            'hit': 'x',
            'sink': 'x',
        }[result]
 
    def cell(self, row, col):
        f = self.field[row][col]
        if f == 'x':
            return 'x'
        elif f == '*':
            return '*'
        elif f == '.':
            return '*' if self._f(row, col) else '.'
 
    def _f(self, x, y):
        f1 = self._g(x-1, y-1)
        f2 = self._g(x-1, y)
        f3 = self._g(x-1, y+1)
        f4 = self._g(x, y-1)
        f5 = self._g(x, y+1)
        f6 = self._g(x+1, y-1)
        f7 = self._g(x+1, y)
        f8 = self._g(x+1, y+1)
        return 'x' in (f1, f2, f3, f4, f5, f6, f7, f8)
 
    def _g(self, x, y):
        try:
            return self.field[x][y]
        except IndexError:
            return '.'
 
 
 
sm = SeaMap()
 
sm.shoot(0, 0, 'hit')
sm.shoot(0, 1, 'sink')
 
sm.shoot(9, 8, 'hit')
sm.shoot(9, 9, 'sink')
 
sm.shoot(2, 3, 'sink')
 
sm.shoot(5, 6, 'miss')
sm.shoot(7, 8, 'miss')
sm.shoot(1, 7, 'miss')
 
sm.shoot(1, 7, 'miss')
 
for row in range(10):
    for col in range(10):
        print(sm.cell(row, col), end='')
    print()
0
4937 / 3290 / 1140
Регистрация: 21.03.2016
Сообщений: 8,071
25.03.2018, 13:58 11
Рыжий Лис, а как лучше каждый раз создавать словарь заново при вызове метода?
Python
1
2
3
4
5
6
def shoot(self, row, col, result):
        self.field[row][col] = {
            'miss': '*',
            'hit': 'x',
            'sink': 'x',
        }[result]
или создать раз при создании обьекта ?
Python
1
2
3
def __init__(self):
        self.field = [ list('.')*10 for _ in range(10) ]
        self.shot = {'miss' : '*','hit' :'x', 'sink' :'x'}
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
25.03.2018, 14:04 12
Мой способ ожидаемо медленнее в два раза. Так что константные значения лучше создавать один раз.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python3
import timeit
 
 
class A(object):
    def __init__(self):
        self.d = {'miss' : '*','hit' :'x', 'sink' :'x'}
 
    def a(self):
        return self.d['hit']
 
 
class B(object):
    def a(self):
        return {
            'miss': '*',
            'hit': 'x',
            'sink': 'x',
        }['hit']
 
print(timeit.timeit(A().a, number=1000000))
print(timeit.timeit(B().a, number=1000000))
0
10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514
26.03.2018, 08:23 13
Так какой код работает?
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
26.03.2018, 08:34 14
А самому дописать?
0
10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514
26.03.2018, 20:01 15
Taranboy нужен полностью правильный код! А не половина кодов! Ему нужен только код!
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
27.03.2018, 05:14 16
Pavlin234, а ты, случайно, не клон Taranboy'я?
0
10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514
27.03.2018, 17:46 17
Нет

Добавлено через 14 секунд
Скинь полностью работающий код!
0
2 / 2 / 0
Регистрация: 14.03.2019
Сообщений: 3
14.03.2019, 19:25 18
Python
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
class SeaMap:
    def __init__(self):
        self.m = [['.' for g in range(10)] for i in range(10)]
    
    def shoot(self, row, col, result):
        if result == 'miss':
            self.m[row][col] = '*'
        elif result == 'sink':
            self.m[row][col] = 'x'
            t1 = row
            while t1 - 1 >= 0 and self.m[t1 - 1][col] == 'h':
                self.m[t1 - 1][col] = 'x'
                t1 -= 1
            t1 = row
            while t1 + 1 < 10 and self.m[t1 + 1][col] == 'h':
                self.m[t1 + 1][col] = 'x'
                t1 += 1
            t1 = col
            while t1 - 1 >= 0 and self.m[row][t1 - 1] == 'h':
                self.m[row][t1 - 1] = 'x'
                t1 -= 1
            t1 = col
            while t1 + 1 < 10 and self.m[row][t1 + 1] == 'h':
                self.m[row][t1 + 1] = 'x'
                t1 += 1
        elif result == 'hit':
            self.m[row][col] = 'h'
    
    def cell(self, row, col):
        if self.m[row][col] == 'x' or self.m[row][col] == '*':
            return self.m[row][col]
        elif self.m[row][col] == 'h':
            return 'x'
        for i in range(row - 1, row + 2):
            if i >= 0 and i < 10:
                for g in range(col - 1, col + 2):
                    if g >= 0 and g < 10 and self.m[i][g] == 'x':
                        return '*'
        return '.'
2
-6 / 9 / 0
Регистрация: 14.03.2019
Сообщений: 52
14.03.2019, 20:01 19
from solution import SeaMap

sm = SeaMap()
sm.shoot(2, 0, 'sink')
sm.shoot(6, 9, 'hit')
for row in range(10):
for col in range(10):
print(sm.cell(row, col), end='')
print()

Ожидаемый результат
..........
**........
x*........
**........
..........
..........
.........x
..........
..........
..........
Вывод
..........
..........
*.........
..........
..........
..........
.........*
..........
..........
..........
Сообщение
Line 2 differs: out:
>..........<
corr:
>**........<
0
2 / 2 / 0
Регистрация: 14.03.2019
Сообщений: 3
14.03.2019, 21:42 20
Мне кажется, у них с тестером что-то не так, потому что у меня, когда я сам тестирую, всё как в ответе получается.
0
14.03.2019, 21:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2019, 21:42
Помогаю со студенческими работами здесь

Морской бой
Добавить второго игрока - компьютер, который будет делать ход после игрока. Исходный код: from...

Морской бой
Ваш друг любит играть в морской бой на нескольких «досках» сразу, но ленится каждый раз придумывать...

Морской бой
Дима любит играть в морской бой. К сожалению, он очень рассеян и постоянно неправильно отмечает на...

Морской бой
Напишите программу, подготавливающую поле для игры в Морской бой. Море будем обозначать нулями,...

Морской бой
Дима любит играть в морской бой. К сожалению, он очень рассеян и постоянно неправильно отмечает на...

Морской бой
Входные данные: В первой строке дается размер поля для морского боя: натуральные числа n и m через...

Морской бой
Эмилия собралась объяснить Максу задачу по алгебре и даже нарисовала числовую прямую. Чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru