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

Морской бой

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

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

Класс 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2018, 20:23
Ответы с готовыми решениями:

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

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

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

22
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
22.03.2018, 05:23
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  [ТС]
Чет не пашет
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
22.03.2018, 18:23
Рыжий Лис, Тут недописал

Python
1
2
3
4
5
def shoot(self, x, y, s):
        if s == 'miss':
            f = '*'
        # ...
        self.m[x][y] = f
то ли лень, то ли забыл
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
22.03.2018, 18:24
Специально не дописал. Ты ещё не заметил 10**4.
2
7 / 7 / 0
Регистрация: 15.02.2018
Сообщений: 56
22.03.2018, 20:52  [ТС]
Я запутался. Так как правильно?
0
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
23.03.2018, 17:01
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  [ТС]
Вердикт Я.Контест: 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
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
23.03.2018, 20:25
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
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
24.03.2018, 06:07
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
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
25.03.2018, 13:58
Рыжий Лис, а как лучше каждый раз создавать словарь заново при вызове метода?
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
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.03.2018, 14:04
Мой способ ожидаемо медленнее в два раза. Так что константные значения лучше создавать один раз.

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
Так какой код работает?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
26.03.2018, 08:34
А самому дописать?
0
10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514
26.03.2018, 20:01
Taranboy нужен полностью правильный код! А не половина кодов! Ему нужен только код!
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
27.03.2018, 05:14
Pavlin234, а ты, случайно, не клон Taranboy'я?
0
10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514
27.03.2018, 17:46
Нет

Добавлено через 14 секунд
Скинь полностью работающий код!
0
2 / 2 / 0
Регистрация: 14.03.2019
Сообщений: 3
14.03.2019, 19:25
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
-5 / 10 / 0
Регистрация: 14.03.2019
Сообщений: 52
14.03.2019, 20:01
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
Мне кажется, у них с тестером что-то не так, потому что у меня, когда я сам тестирую, всё как в ответе получается.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.03.2019, 21:42
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru