Задания
Версия для печати и копирования в MS Word
Тип 9 № 68271
i

От­крой­те файл элек­трон­ной таб­ли­цы, со­дер­жа­щей в каж­дой стро­ке шесть на­ту­раль­ных чисел.

Будем счи­тать две за­пол­нен­ные ячей­ки со­сед­ни­ми, если у них есть общая сто­ро­на или угол. У каж­дой ячей­ки в углах таб­ли­цы  — три со­сед­ние, у не уг­ло­вых ячеек в пер­вых и по­след­них стро­ках и столб­цах  — по пять со­сед­них, у внут­рен­них ячеек таб­ли­цы  — по во­семь со­се­дей.

Назовём ячей­ку таб­ли­цы ин­те­рес­ной, если вы­пол­ня­ют­ся сле­ду­ю­щие усло­вия:

—  число в дан­ной ячей­ке боль­ше не встре­ча­ет­ся в дан­ной стро­ке;

—  в со­сед­них ячей­ках есть хотя бы одно число, мень­шее, чем число в дан­ной ячей­ке.

Опре­де­ли­те ко­ли­че­ство строк таб­ли­цы, для ко­то­рых вы­пол­не­ны сле­ду­ю­щие усло­вия:

— стро­ка со­дер­жит не менее трёх ин­те­рес­ных ячеек;

— в стро­ке есть по­вто­ря­ю­щи­е­ся числа.

За­да­ние 9

Спрятать решение

Ре­ше­ние.

Опре­де­лим мак­си­маль­ное зна­че­ние в ячей­ках таб­ли­цы.

Для этого вве­дем фор­му­лу:

=МАКС(A1:F16000)

и по­лу­чим ре­зуль­тат 100.

До­ба­вим в на­ча­ло пу­стую стро­ку вна­ча­ле и пу­стой стол­бец. В первую стро­ку и в стро­ку после по­след­ней, а также в пер­вый стол­бец и стол­бец после дан­ных впи­шем число за­ве­до­мо боль­шее, чем мак­си­маль­но воз­мож­ное в ячей­ке. Таким об­ра­зом, мы по­лу­чим, что у всех ячеек будет оди­на­ко­вое ко­ли­че­ство со­сед­них.

Най­дем, сколь­ко раз числа по­вто­ря­ют­ся в стро­ке. Для этого в ячей­ку I2 вве­дем фор­му­лу:

=СЧЁТЕСЛИ($B2:$G2;B2)

и ско­пи­ру­ем ее на диа­па­зон I:I16001.

Опре­де­лим, яв­ля­ет­ся ли ячей­ка ин­те­рес­ной, для этого в ячей­ку O2 вве­дем фор­му­лу:

=ЕСЛИ(И(I2=1;ИЛИ(A1 < B2;B1 < B2;C1 < B2;C2 < B2;C3 < B2;B3 < B2;A3 < B2;A2 < B2));1;0)

и ско­пи­ру­ем ее на диа­па­зон O2:T16001.

По­счи­та­ем ко­ли­че­ство ин­те­рес­ных ячеек в стро­ке. Для этого в ячей­ку U2 вве­дем фор­му­лу:

=СУММ(O2:T2)

и ско­пи­ру­ем ее на диа­па­зон U2:U16001.

Про­ве­рим, вы­пол­ня­ют­ся ли для стро­ки усло­вия за­да­чи. Для этого в ячей­ку V2 вве­дем фор­му­лу:

=ЕСЛИ(И(СУММ(I2:N2)>6;U2>2);1;0)

и ско­пи­ру­ем ее на диа­па­зон V2:V16001.

Окон­ча­тель­но на­хо­дим ко­ли­че­ство ис­ко­мых строк:

=СУММ(V2:V16001)

и по­лу­ча­ем ответ  — 2022.

 

Ответ: 2022.

 

При­ведём ре­ше­ние Артёма Гри­ди­на на языке Python.

s = list(map(lambda s: [int(i) for i in s.split(';')], open('09.csv').read().splitlines()))

cnt = 0

for i in range(len(s)-1):

if len(set(s[i])) == len(s[i]):

continue

cnt_interesting = 0

for j in range (0, 6):

if s[i].count(s[i][j]) != 1:

continue

t = False

cell_type = 0

if (i, j) == (0, 0): cell_type = 1

elif (i, j) == (0, 5): cell_type = 2

elif (i, j) == (len(s)-1, 0): cell_type = 3

elif (i, j) == (len(s)-1, 5): cell_type = 4

elif i == 0: cell_type = 5

elif i == len(s)-1: cell_type = 6

elif j == 0: cell_type = 7

elif j == 5: cell_type = 8

shift_data = {0: (-1, 1, -1, 1), 1: (0, 1, 0, 1), 2: (0, 1, -1, 0),

3: (-1, 0, 0, 1), 4:(-1, 0, -1, 0), 5: (0, 1, -1, 1),

6: (-1, 0, -1, 1), 7: (-1, 1, 0, 1), 8: (-1, 1, -1, 0)}

for x in range(shift_data[cell_type][0], shift_data[cell_type][1]+1):

for y in range(shift_data[cell_type][2], shift_data[cell_type][3]+1):

if (x, y) == (0, 0):

continue

if s[i+x][j+y] < s[i][j]:

t = True

break

if t: break

if t: cnt_interesting += 1

if cnt_interesting >= 3:

cnt+=1

print(cnt)

 

При­ме­ча­ние. Файл тре­бу­ет­ся со­хра­нить в фор­ма­те csv.

 

При­ведём ре­ше­ние Анны Ло­ма­ки­ной на языке Python.

f = open('09.csv')

sp = f.readlines()

count = 0

table = [[int(x)for x in st.split(';')] for st in sp]

for i in range(0, len(table)):

if len(set(table[i])) != 6:

interest = 0

for j in range(0, 6):

if table[i].count(table[i][j]) == 1:

flag = False

for Y in range(max(i-1, 0), min(len(table), i+2)):

for X in range(max(j-1, 0), min(6, j+2)):

if table[Y][X] < table[i][j]:

flag = True

if flag:

interest += 1

if interest >= 3:

count += 1

print(count)

 

При­ме­ча­ние. Файл тре­бу­ет­ся со­хра­нить в фор­ма­те csv.

 

При­ведём ре­ше­ние Егора Чер­не­цо­ва на языке Python.

data = [list(map(int, line.split())) for line in open('09.csv')]

print(sum(1 for i, row in enumerate(data) if len(set(row)) < len(row) and

sum(1 for j, val in enumerate(row) if row.count(val) == 1 and

any(data[i+dx][j+dy] < val for dx in (-1,0,1) for dy in (-1,0,1)

if (dx or dy) and 0<=i+dx= 3))

 

При­ме­ча­ние. Файл тре­бу­ет­ся со­хра­нить в фор­ма­те csv.


Аналоги к заданию № 68242: 68271 68510 Все