Консультация № 174217
14.11.2009, 14:44
0.00 руб.
0 18 2
Здраствуйте!
Помогите решить такую задачу.
Даны 11 футболистов, каждый из которых играет своим стилем.
Есть 6 стилей
1 Нормальный
2 Британский
3 Спартаковский
4 Бей-беги
5 Комбинационный
6 Катеначчо
Взаимодействуя между собой, эти стили дают определённый бонус.
1 Нормальный со всеми по 0
2 Британский - Катеначчо, Комбинационный (-4)
3 Спартаковский - Катеначчо, Бей-беги (-4)
4 Бей-беги - Спартаковский, Комбинационный (-4)
5 Комбинационный - Бей-беги, Британский (-4)
6 Катеначчо - Спартаковский, Британский (-4)
Два одинаковых стиля дают (+12)
Два нейтральных дают 0

Задача: подсчитать сумму бонусов от стилей 11 футболистов.
==============================================

Из формы я получаю массив со стилями 11 футболистов (12544263335), где цифра обозначает кодовый номер стиля.

Как вот теперь методом перебора или условий подсчитать сумму бонуса. В ручную получится: 0(взаимодействие стиля №1 с 2)+(-4)(2 с 5)+(-4)(5 с 4)+ 12(4 с 4)+ 0(4 с 2) и т.д

Если что-то не понятно, я дополнительно разьясню.

Обсуждение

Неизвестный
14.11.2009, 22:24
общий
<?php

// вы простите, если я с нуля их пересчитаю?
//0 Нормальный, 1 Британский, 2 Спартаковский, 3 Бей-беги, 4 Комбинационный, 5 Катеначчо

$bonuses=array(
0=>array(0,0,0,0,0,0),
1=>array(0,12,0,0,-4,-4),
2=>array(0,0,12,-4,0,-4),
3=>array(0,0,-4,12,-4,0),
4=>array(0,-4,0,-4,12,0),
5=>array(0,-4,-4,0,0,12)
);

$players=array(0,1,4,3,3,1,5,2,2,2,4);
$sum=0;

for ($i=0; $i<count($players); $i++) {
for ($j=0; $j<count($players); $j++) {
$sum+=$bonuses[$i][$j];
}
}

echo intval($sum);

// получилось 0, вручную не пересчитывал

?>

P.S. Фразу "Два нейтральных дают 0" я понял, как "Два НОРМАЛЬНЫХ дают 0"
Неизвестный
15.11.2009, 00:14
общий
Прим Палвер:
Спасибо, что откликнулись!
По поводу вашего постскриптума, я имел ввиду взаимодействие двух стилей, которые по условию не влияют друг на друга, например, Спартаковский и Британский. Но в переменной $bonuses вы и так указали им значения 0:)

Впринципе, два вопроса:
Решение не зависит от конкретнх цифр в массиве $players?
Если вместо кодовых цифр, поставить кодовое сокращение букв, например, Британский не 1, а Брит - будет ли работать скрипт или надо будет переделывать?

Пойду тестить...
Неизвестный
15.11.2009, 01:49
общий
это ответ
Здравствуйте, megamaks.
Обычная комбинаторика... Вот вариант с вводом/выводом в HTML.

Приложение:
<?php

define('PLAYER_COUNT',11);
$styles=Array(
1=>'Нормальный',
2=>'Британский',
3=>'Спартаковский',
4=>'Бей-беги',
5=>'Комбинационный',
6=>'Катеначчо'
);

$bonuses=Array(
2=>Array(5=>-4,6=>-4,2=>12),
3=>Array(4=>-4,6=>-4,3=>12),
4=>Array(3=>-4,5=>-4,4=>12),
5=>Array(2=>-4,4=>-4,5=>12),
6=>Array(2=>-4,3=>-4,6=>12)
);



function print_form($styles)
{
print "<form method=POST action=''>\n";
print "<table>\n";
for($k=0;$k<PLAYER_COUNT;$k++)
{
print "<tr>\n";
print "<td>Стиль футболиста ".$k."</td>\n";
print "<td><select name=s".$k." >\n";
foreach($styles as $id=>$style)
print "<option value=".$id." ".(($_POST['s'.$k]==$id)?'selected':'')." >".htmlspecialchars($style)."</option>\n";
print "</select></td>\n";
print "</tr>\n";
}
print "</table>\n";
print "<input type=submit />\n";
print "</form>\n";
}

print "<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>q174217</title></head><body>\n";
print_form($styles);
if(isset($_POST['s0']))
{
$totalbonus=0;
print "<table>\n";
print "<tr>";
print "<th>Футболист</th>\n";
print "<th>Стиль</th>\n";
print "<th>Напарник</th>\n";
print "<th>Стиль</th>\n";
print "<th>Бонус пары</th>\n";
print "</tr>";

for($k=0;$k<PLAYER_COUNT;$k++)
for($t=$k+1;$t<PLAYER_COUNT;$t++)
{
if(isset($bonuses[$_POST['s'.$k]][$_POST['s'.$t]]))
{

print "<tr><td>".
$k."</td><td>".
$_POST['s'.$k]."</td><td>".
$t."</td><td>".
$_POST['s'.$t]."</td><td>".
$bonuses[$_POST['s'.$k]][$_POST['s'.$t]]."</td></tr>";
$totalbonus+=$bonuses[$_POST['s'.$k]][$_POST['s'.$t]];
}
}
print "</table>\n";
print "<div>Всего бонус: ".$totalbonus."</div>";

}

print "</body></html>";





?>
5
Гениально!!!
Неизвестный
15.11.2009, 11:02
общий
В массиве players перечислены номера игроков. Думаю, что их порядок на результат влиять не должен. Но стиль игрока не должен быть больше 5 :)

Можно ввести дополнительные массивы:
$playersnames=array('Нормальный','Британский','Спартаковский','Бей-беги','Комбинационный','Катеначчо');
$ourplayers=array('Нормальный','Британский','Комбинационный','...','','','','','','','');
А потом - из них получить массив $players с числами.

Если же использовать строковые индексы вместо числовых будет немного сложнее.

Вы же из формы числа или строки передаёте?

<?php
$playersnames=array('Нормальный','Британский','Спартаковский','Бей-беги','Комбинационный','Катеначчо');
echo "<form ... >";
for ($i=0; $i<11; $i++) {
echo"<select name='player[$i]'>";
foreach ($playersnames as $p=>$pp) {
echo "<option value='$p'>$pp</option>";
}
echo "</select>";
}
echo "</form>";
?>

P.S. Конструкторам сайта: можно ли сделать кнопку "отправить" заметнее (слева и крупнее)?
Неизвестный
15.11.2009, 11:53
общий
vladisslav:
Читая рассылку, я давно заметил, что вы любите отвечать готовыми скриптами Обычная комбинаторика для обычных людей не такая уж и обычная , особенно если её надо реализовать програмно.

Есть несколько поправок.

1. Нормальный стиль взаимодействуя с Нормальным тоже даёт бонус +12 (видимо я не заострил на этом внимание в задаче)
2. Игрок должен взаимодействовать только с соседним (1 с 2, 2 с 3, 5 с 6), а не с каждым.
3. Собственно, я задачу разбил на 2 части, вторую часть думал сделать самостоятельно, но в ваш готовый скрипт я сомневаюсь что смогу прикрутить. Доп условие такое:

a) Есть общий командный стиль (выбирается из тех же 6 стилей)
б) Есть 5 запасных игроков, которые не взаимодействуют ни друг с другом, ни с теми кто в основе.
с) НО! К общему бонусу плюсуется ещё +2 за каждого футболиста(теперь уже из 16-ти), чей стиль совпадает с командным.

Вот такие вот пироги.
Буду премного благодарен если эти поправки учтутся!
Неизвестный
15.11.2009, 17:19
общий
Прим Палвер:
Тестирование прошло неудачно:

Вот форма (извиняюсь за столь убогую реализацию):
Код:

<select name='St1'>
<OPTION VALUE='0' SELECTED>Норма
<OPTION VALUE='1'>Брита
<OPTION VALUE='2'>Спарта
<OPTION VALUE='3'>Бей-беги
<OPTION VALUE='4'>Комба
<OPTION VALUE='5'>Катя
<select name='St2'>
<OPTION VALUE='0' SELECTED>Норма
<OPTION VALUE='1'>Брита
<OPTION VALUE='2'>Спарта
<OPTION VALUE='3'>Бей-беги
<OPTION VALUE='4'>Комба
<OPTION VALUE='5'>Катя
<select name='St3'>
<OPTION VALUE='0' SELECTED>Норма
<OPTION VALUE='1'>Брита
<OPTION VALUE='2'>Спарта
<OPTION VALUE='3'>Бей-беги
<OPTION VALUE='4'>Комба
<OPTION VALUE='5'>Катя
<select name='St4'>
<OPTION VALUE='0' SELECTED>Норма
<OPTION VALUE='1'>Брита
<OPTION VALUE='2'>Спарта
<OPTION VALUE='3'>Бей-беги
<OPTION VALUE='4'>Комба
<OPTION VALUE='5'>Катя
<select name='St5'>
<OPTION VALUE='0' SELECTED>Норма
<OPTION VALUE='1'>Брита
<OPTION VALUE='2'>Спарта
<OPTION VALUE='3'>Бей-беги
<OPTION VALUE='4'>Комба
<OPTION VALUE='5'>Катя
<select name='St6'>
<OPTION VALUE='0' SELECTED>Норма
<OPTION VALUE='1'>Брита
<OPTION VALUE='2'>Спарта
<OPTION VALUE='3'>Бей-беги
<OPTION VALUE='4'>Комба
<OPTION VALUE='5'>Катя
<select name='St7'>
<OPTION VALUE='0' SELECTED>Норма
<OPTION VALUE='1'>Брита
<OPTION VALUE='2'>Спарта
<OPTION VALUE='3'>Бей-беги
<OPTION VALUE='4'>Комба
<OPTION VALUE='5'>Катя
<select name='St8'>
<OPTION VALUE='0' SELECTED>Норма
<OPTION VALUE='1'>Брита
<OPTION VALUE='2'>Спарта
<OPTION VALUE='3'>Бей-беги
<OPTION VALUE='4'>Комба
<OPTION VALUE='5'>Катя
<select name='St9'>
<OPTION VALUE='0' SELECTED>Норма
<OPTION VALUE='1'>Брита
<OPTION VALUE='2'>Спарта
<OPTION VALUE='3'>Бей-беги
<OPTION VALUE='4'>Комба
<OPTION VALUE='5'>Катя
<select name='St10'>
<OPTION VALUE='0' SELECTED>Норма
<OPTION VALUE='1'>Брита
<OPTION VALUE='2'>Спарта
<OPTION VALUE='3'>Бей-беги
<OPTION VALUE='4'>Комба
<OPTION VALUE='5'>Катя
<select name='St11'>
<OPTION VALUE='0' SELECTED>Норма
<OPTION VALUE='1'>Брита
<OPTION VALUE='2'>Спарта
<OPTION VALUE='3'>Бей-беги
<OPTION VALUE='4'>Комба
<OPTION VALUE='5'>Катя
<input type='submit' value='Взаимка' onclick=document.getElementById('sigrannost').attributes.action.value='vzaimka.php'>


Файл обработчик
Код:
<?php
session_start();
include_once("include/connectdb.php");
include('include/user_register/uni-auth.php');

if (USER_LOGGED){
$bonuses = array(
0=>array(12,0,0,0,0,0),
1=>array(0,12,0,0,-4,-4),
2=>array(0,0,12,-4,0,-4),
3=>array(0,0,-4,12,-4,0),
4=>array(0,-4,0,-4,12,0),
5=>array(0,-4,-4,0,0,12)
);

$players = array($_POST['St1'], $_POST['St2'], $_POST['St3'], $_POST['St4'], $_POST['St5'],
$_POST['St6'], $_POST['St7'], $_POST['St8'], $_POST['St9'], $_POST['St10'],
$_POST['St11']);

$sum=0;

for ($i=0; $i<count($players); $i++) {
for ($j=0; $j<count($players); $j++) {
$sum+=$bonuses[$i][$j];
}
}

echo intval($sum);
}

else {
echo '<h2 align="center">Вы не авторизованы!</h2>

<h3 align="center">Зарегистрируйтесь или войдите в систему под своим Логином!!!</h3>';
}
?>


При любом выборе стиля, выдаёт результат 32.

Что не так сделал?
Неизвестный
15.11.2009, 19:04
общий
1. Нормальный стиль взаимодействуя с Нормальным тоже даёт бонус +12 (видимо я не заострил на этом внимание в задаче)
2. Игрок должен взаимодействовать только с соседним (1 с 2, 2 с 3, 5 с 6), а не с каждым.
3. Собственно, я задачу разбил на 2 части, вторую часть думал сделать самостоятельно, но в ваш готовый скрипт я сомневаюсь что смогу прикрутить. Доп условие такое:


у меня первые два не учтены - ТЗ желательно озвучивать сразу :)
Неизвестный
15.11.2009, 19:45
общий
Прим Палвер:
Я извиняюсь, но я думал, что вообще никто не ответит
По первому пункту я думал что сам подставлю в массив $bonuses=array(
0=>array(0,0,0,0,0,0),
1=>array(0,12,0,0,-4,-4),
2=>array(0,0,12,-4,0,-4),
3=>array(0,0,-4,12,-4,0),
4=>array(0,-4,0,-4,12,0),
5=>array(0,-4,-4,0,0,12)
);
- 0=>array(12,0,0,0,0,0)
А то что у вас игроки взаимодействуют каждый с каждым, так это до меня только что дошло:(
Но всё равно ваш скрипт как то не так работает, вы говорите что у вас 0 вышло, у меня же считает 20, притом не зависимо от выбранных стилей. Я понял что он просто суммирует все числа в массиве $bonuses
Неизвестный
15.11.2009, 20:29
общий
Попробуйте в одном сообщении озвучить условие сначала и полностью.
Или создайте новую тему с другим условием.
Неизвестный
15.11.2009, 21:55
общий
Прим Палвер:
Выкладываю дополненный вид ТЗ
=========================

Даны 11 футболистов, каждый из которых играет своим стилем.
Есть 6 стилей
1 Нормальный
2 Британский
3 Спартаковский
4 Бей-беги
5 Комбинационный
6 Катеначчо
Взаимодействуя между собой, эти стили дают определённый бонус.
1 Нормальный со всеми по 0 (исключение: Нормальный с Нормальным дают +12)
2 Британский - Катеначчо, Комбинационный (-4)
3 Спартаковский - Катеначчо, Бей-беги (-4)
4 Бей-беги - Спартаковский, Комбинационный (-4)
5 Комбинационный - Бей-беги, Британский (-4)
6 Катеначчо - Спартаковский, Британский (-4)
Два одинаковых стиля дают (+12) (в том числе и Нормальный с Нормальным)
Два нейтральных дают 0 (например, Британский со Спартаковским)

Задача: подсчитать сумму бонусов от стилей 11 футболистов.
==============================================

Из формы я получаю массив со стилями 11 футболистов (12544263335), где цифра обозначает кодовый номер стиля.

Как вот теперь методом перебора или условий подсчитать сумму бонуса. В ручную получится: 0(взаимодействие стиля №1 с 2)+(-4)(2 с 5)+(-4)(5 с 4)+ 12(4 с 4)+ 0(4 с 2) и т.д т.е игрок должен взаимодействовать только с соседним (1 с 2, 2 с 3, 5 с 6), а не с каждым.

Дополнительное условие:
a) Есть ещё общий командный стиль (выбирается из тех же 6 стилей)
б) Есть 5 запасных игроков, которые не взаимодействуют ни друг с другом, ни с теми кто в основе.
с) НО! К общему бонусу плюсуется ещё +2 за каждого футболиста(теперь уже из 16-ти), чей стиль совпадает с командным.

Выбор стиля игрока в форме будет происходить при помощи select`a типа
<select name='Stil1'>
<OPTION VALUE='0' SELECTED>Норма
<OPTION VALUE='1'>Брита
<OPTION VALUE='2'>Спарта
<OPTION VALUE='3'>Бей-беги
<OPTION VALUE='4'>Комба
<OPTION VALUE='5'>Катя

ЗЫ. Ещё раз прошу прощения, если в первый раз непонятно или неполно изложил условие
Неизвестный
16.11.2009, 00:19
общий
это ответ
Ещё раз здравствуйте, megamaks.

<?php

$bonuses=array(
0=>array(12,0,0,0,0,0),
1=>array(0,12,0,0,-4,-4),
2=>array(0,0,12,-4,0,-4),
3=>array(0,0,-4,12,-4,0),
4=>array(0,-4,0,-4,12,0),
5=>array(0,-4,-4,0,0,12)
);

$players=array(0,1,4,3,3,1,5,2,2,2,4);

$sum=0;

for ($i=0; $i<11; $i++) {
if (!$i) $sum+=$bonuses[$players[$i]][$players[10]];
else $sum+=$bonuses[$players[$i]][$players[$i-1]];
}

echo intval($sum);

// intval здесь исключительно из-за того, что 0 сам по себе не будет показан

?>

P.S. Здесь есть допущение с моей стороны, что соседи первого игрока - второй и одиннадцатый (10--0--1)
5
За упорство и настойчивость!
Неизвестный
16.11.2009, 00:26
общий
Об общекомандном стиле я ничего не понял.
Так же, как и о запасных.
Опишите подробнее.
Неизвестный
16.11.2009, 01:25
общий
Прим Палвер:
Спасибо за вашу версию решения задачи!
P.S. Здесь есть допущение с моей стороны, что соседи первого игрока - второй и одиннадцатый (10--0--1)
Допущение неверное, 1 и 11 НЕ являются соседями
===================================
Из формы массив $_POST[] приходит к нам , например, как (0,1,4,3,3,1,5,2,2,2, 4,5,5,3,4, 2), где первые 11 цифр это основа, 5 запасных и последняя цифра - стиль команды.
Я думал делать так.

1. $players=array(0,1,4,3,3,1,5,2,2,2,4);
высчитываем бонус от стилей

2. Считаем сколько элементов(игроков) в общем массиве $_POST[] имеют тот же стиль что и команда, т. е в нашем случае: сколько раз там встречается 2. От суммы отнимаем 1 т.к в общем массиве передаётся цифра обозначающая стиль команды. И умножаем на 2

3. Суммируем бонусы.

===============
Вроде понятно изложил
Неизвестный
16.11.2009, 09:25
общий
тогда я не понимаю, как влияют запасные игроки на игру, если они сидят на скамье
и не понимаю, в какой последовательности их будут менять\
это же тоже важно?

задача всё ещё поставлена нечётко
не всё условие

дополнителоьные условия соберите воедино

P.S. Если 0 и 10 не соседи - заменяем

for ($i=0; $i<11; $i++) {
if (!$i) $sum+=$bonuses[$players[$i]][$players[10]];
else $sum+=$bonuses[$players[$i]][$players[$i-1]];
}

на

for ($i=1; $i<11; $i++) {
$sum+=$bonuses[$players[$i]][$players[$i-1]];
}
Неизвестный
16.11.2009, 09:46
общий
Если только со следующим, тогда действительно никакой комбинаторики не будет...
С поправками:
Код:
<?php

define('PLAYER_COUNT',11);
define('RESERVE_COUNT',5);

$styles=Array(
1=>'Нормальный',
2=>'Британский',
3=>'Спартаковский',
4=>'Бей-беги',
5=>'Комбинационный',
6=>'Катеначчо'
);

$bonuses=Array(
1=>Array(1=>12),
2=>Array(5=>-4,6=>-4,2=>12),
3=>Array(4=>-4,6=>-4,3=>12),
4=>Array(3=>-4,5=>-4,4=>12),
5=>Array(2=>-4,4=>-4,5=>12),
6=>Array(2=>-4,3=>-4,6=>12)
);



function print_form($styles)
{
print "<form method=POST action=''>\n";
print "<table>\n";
for($k=0;$k<PLAYER_COUNT;$k++)
{
print "<tr>\n";
print "<td>Стиль футболиста ".$k."</td>\n";
print "<td><select name=s".$k." >\n";
foreach($styles as $id=>$style)
print "<option value=".$id." ".(($_POST['s'.$k]==$id)?'selected':'')." >".htmlspecialchars($style)."</option>\n";
print "</select></td>\n";
print "</tr>\n";
}
for($k=0;$k<RESERVE_COUNT;$k++)
{
print "<tr>\n";
print "<td>Стиль запасного ".$k."</td>\n";
print "<td><select name=r".$k." >\n";
foreach($styles as $id=>$style)
print "<option value=".$id." ".(($_POST['r'.$k]==$id)?'selected':'')." >".htmlspecialchars($style)."</option>\n";
print "</select></td>\n";
print "</tr>\n";
}
print "<tr>\n";
print "<td>Стиль команды</td>\n";
print "<td><select name=team >\n";
foreach($styles as $id=>$style)
print "<option value=".$id." ".(($_POST['team']==$id)?'selected':'')." >".htmlspecialchars($style)."</option>\n";
print "</select></td>\n";
print "</tr>\n";
print "</table>\n";
print "<input type=submit />\n";
print "</form>\n";
}

print "<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>q174217</title></head><body>\n";
print_form($styles);
if(isset($_POST['s0']))
{
$totalbonus=0;
print "<table>\n";
print "<tr>";
print "<th>Футболист</th>\n";
print "<th>Стиль</th>\n";
print "<th>Напарник</th>\n";
print "<th>Стиль</th>\n";
print "<th>Бонус пары</th>\n";
print "<th>Бонус за совпадение с командным</th>\n";
print "</tr>";

for($k=0;$k<PLAYER_COUNT;$k++)
# for($t=$k+1;$t<PLAYER_COUNT;$t++)
{
$t=$k+1;# с соседним, так с соседним
if($t==PLAYER_COUNT)$t='-';
if(isset($bonuses[$_POST['s'.$k]][$_POST['s'.$t]])||($_POST['s'.$k]==$_POST['team']))
{

print "<tr><td>".
$k."</td><td>".
$_POST['s'.$k]."</td><td>".
$t."</td><td>".
$_POST['s'.$t]."</td><td>".
$bonuses[$_POST['s'.$k]][$_POST['s'.$t]]."</td><td>".
(($_POST['s'.$k]==$_POST['team'])?2:0).
"</td></tr>";
if(isset($bonuses[$_POST['s'.$k]][$_POST['s'.$t]]))$totalbonus+=$bonuses[$_POST['s'.$k]][$_POST['s'.$t]];
if($_POST['s'.$k]==$_POST['team'])$totalbonus+=2;
}
}
print "</table>\n";
print "<table>\n";
print "<tr>";
print "<th>Запасной футболист</th>\n";
print "<th>Стиль</th>\n";
print "<th>Бонус за совпадение с командным</th>\n";
print "</tr>";
for($k=0;$k<RESERVE_COUNT;$k++)
{
if($_POST['r'.$k]==$_POST['team'])
{

print "<tr><td>".
$k."</td><td>".
$_POST['r'.$k]."</td><td>".
(($_POST['s'.$k]==$_POST['team'])?2:0).
"</td></tr>";
$totalbonus+=2;
}
}
print "</table>\n";
print "<div>Всего бонус: ".$totalbonus."</div>";

}

print "</body></html>";





?>
Неизвестный
16.11.2009, 12:09
общий
Прим Палвер:
Спасибо огромное за помощь!
тогда я не понимаю, как влияют запасные игроки на игру, если они сидят на скамье
и не понимаю, в какой последовательности их будут менять\
это же тоже важно?

Я не пишу футбольный симулятор. Это задача с условием. Так что не стоит фантазировать, что там за запасные такие

задача всё ещё поставлена нечётко
не всё условие

дополнителоьные условия соберите воедино


Главная задача решена, спасибо! Доп условие я обьяснил и расписал, больше добавить нечего...
Неизвестный
16.11.2009, 12:57
общий
vladisslav:
Спасибо за полное решение и реализацию задачи!!!

У меня возник такой вопрос:

Допустим я имею такой состав футболистов (0,1,4,3,3,1,5,2,2,2,2, 4,5,5,3,4), но стили их неизвестны, т.е. (?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?)
известно только сколько человек играет определённым стилем и конечный бонус, например
0 стиль - 1 чел
1 - 2 чел
2 - 4 чел
3 - 3 чел
4 - 3 чел
5 - 3 чел
бонус = 36

Можно ли каким то методом перебора или той же комбинаторики узнать возможные цепочки типа (0,1,4,3,3,1,5,2,2,2,2, 4,5,5,3,4), которые, учитывая взаимодействие игроков, приводили бы к результату = 36
Неизвестный
16.11.2009, 17:10
общий
можно перебором, например, n^d вариантов, где n - число игроков, d - число стилей
Форма ответа