Открытое соревнование по программированию искусственного интеллекта

Быстрый старт

Проект

Песочница

Раунд 1

Раунд 2

Финал

Последние комментарии

3 августа 16:43: NoobSaibot написал комментарий в посте Закрытие Russian AI Cup 2018
19 февраля 23:14: karloid написал комментарий в посте Закрытие Russian AI Cup 2018
19 февраля 13:38: tyamgin написал комментарий в посте Закрытие Russian AI Cup 2018
17 февраля 14:58: tsapelman написал комментарий в посте Закрытие Russian AI Cup 2018
13 февраля 09:15: Hal написал комментарий в посте Закрытие Russian AI Cup 2018
12 февраля 10:48: AlexKol написал комментарий в посте Закрытие Russian AI Cup 2018
12 февраля 10:48: AlexKol написал комментарий в посте Закрытие Russian AI Cup 2018
12 февраля 10:12: bearf написал комментарий в посте Закрытие Russian AI Cup 2018
11 февраля 19:09: MikeWazowski написал комментарий в посте Закрытие Russian AI Cup 2018
11 февраля 17:54: tsapelman написал комментарий в посте Закрытие Russian AI Cup 2018

Группа ВКонтакте

Telegram-чат

 

Ниже мы расскажем, как присоединиться к CodeBall буквально за несколько минут.

Зарегистрируйтесь

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

Скачайте языковой пакет

Скачайте пакет для любимого языка программирования со страницы языковые пакеты. Поддерживаются C++, Java, C#, Python 3, Ruby, Kotlin, Rust. Распакуйте ZIP-архив в удобное для вас место и откройте существующий проект или создайте новый с нуля. Возможно, вам надо будет настроить некоторые пути.

Скачайте Local runner

Local runner — это специальная версия симулятора игры для участников. Local runner предоставляет вам возможность запускать тестовые игры локально на своём компьютере. Подробнее об этом здесь.

Прочитайте документацию

В разделе Правила опубликованы официальные и полные правила, обязательно прочитайте их. Некоторые организационные моменты вы можете найти в описаниях Песочницы и этапов чемпионата (Раунд 1, Раунд 2, Финал).

Отошлите свою стратегию

Это можно сделать на странице отослать стратегию. Прежде, чем система примет вашу стратегию, она будет скомпилирована и протестирована в нескольких коротких играх. Если всё в порядке, ваша стратегия автоматически начнёт участвовать в регулярных квалификационных играх Песочницы. Внимательно изучите в секции “На что стоит обратить внимание” различные моменты, вследствие которых ваша стратегия может получить вердикт “Ошибка верификации”. Суммарное количество посылок не ограничено, однако в системе есть ограничения на слишком частую отправку стратегий, а любые попытки дестабилизировать работу системы приведут к дисквалификации. Вы можете написать свою стратегию в произвольном количестве файлов, вам нужно будет лишь упаковать всё необходимое в ZIP-архив и отослать его. Все файлы должны находиться в корне архива. К сожалению, создание пользовательских пакетов в стратегии на Java недопустимо. Помните, что в стартовом пакете вы можете менять только файл MyStrategy.${ext} (где ${ext} — расширение используемого вами языка), и даже если вы измените какой-то другой файл и тоже приложите его в архив, всё равно при тестировании он будет заменён на стандартный (кроме MyStrategy.h в C++).

На что стоит обратить внимание

  • запрещается взаимодействие с сетью, файловой системой и другими ресурсами, кроме оперативной памяти и текущего каталога, нарушители будут дисквалифицированы;
  • процессорное время работы вашей стратегии достаточно сильно ограничено (точные сведения вы можете найти в документации);
  • запускаемая стратегия не должна использовать более 256 мегабайт оперативной памяти (в это количество включается вся память, используемая запускаемым процессом);
  • если ваша стратегия превышает ограничение по времени или памяти, а также в случае ошибок исполнения (например, неожиданное падение), она перестаёт участвовать в этой игре, при этом как бы “замораживается”, то есть ваши очки не обнуляются;
  • стратегия каждого участника запускается в отдельном процессе.

Напишем простую стратегию на Rust

Простые стратегии на некоторых других языках доступны на GitHub.

Простая стратегия, пытающаяся ударить по мячу как можно раньше, причем необязательно в ворота, главное — в сторону противника!

При этом мы не будем учитывать какие либо столкновения, а также координату y — стратегия будет использовать в основном 2d геометрию.

use crate::model::*;
use crate::strategy::Strategy;

const EPS: f64 = 1e-5;

#[derive(Default)]
pub struct MyStrategy;

// Нам понадобится работа с 2d векторами
#[derive(Copy, Clone, Debug)]
struct Vec2 {
    x: f64,
    y: f64,
}

impl Vec2 {
    fn new(x: f64, y: f64) -> Self {
        Self { x, y }
    }
    // Нахождение длины вектора
    fn len(&self) -> f64 {
        (self.x * self.x + self.y * self.y).sqrt()
    }
    // Нормализация вектора (приведение длины к 1)
    fn normalize(self) -> Self {
        self * (1.0 / self.len())
    }
}

// Операция - для векторов
impl std::ops::Sub for Vec2 {
    type Output = Self;
    fn sub(self, b: Self) -> Self {
        Self::new(self.x - b.x, self.y - b.y)
    }
}

// Операция + для векторов
impl std::ops::Add for Vec2 {
    type Output = Self;
    fn add(self, b: Self) -> Self {
        Self::new(self.x + b.x, self.y + b.y)
    }
}

// Операция умножения вектора на число
impl std::ops::Mul<f64> for Vec2 {
    type Output = Self;
    fn mul(self, k: f64) -> Self {
        Self::new(self.x * k, self.y * k)
    }
}

// Определение общего интерфейса для робота и мяча
trait Entity {
    // Нахождение позиции объекта в плоскости XZ
    fn position(&self) -> Vec2;
    // Нахождение скорости объекта в плоскости XZ
    fn velocity(&self) -> Vec2;
}

// Реализация интерфейса Entity для робота
impl Entity for Robot {
    fn position(&self) -> Vec2 {
        Vec2::new(self.x, self.z)
    }
    fn velocity(&self) -> Vec2 {
        Vec2::new(self.velocity_x, self.velocity_z)
    }
}

// Реализация интерфейса Entity для мяча
impl Entity for Ball {
    fn position(&self) -> Vec2 {
        Vec2::new(self.x, self.z)
    }
    fn velocity(&self) -> Vec2 {
        Vec2::new(self.velocity_x, self.velocity_z)
    }
}

// Код стратегии
impl Strategy for MyStrategy {
    fn act(&mut self, me: &Robot, rules: &Rules, game: &Game, action: &mut Action) {

        // Наша стратегия умеет играть только на земле
        // Поэтому, если мы не касаемся земли, будет использовать нитро
        // чтобы как можно быстрее попасть обратно на землю
        if !me.touch {
            *action = Action {
                target_velocity_x: 0.0,
                target_velocity_y: -rules.MAX_ENTITY_SPEED,
                target_velocity_z: 0.0,
                jump_speed: 0.0,
                use_nitro: true,
            };
            return;
        }

        // Если при прыжке произойдет столкновение с мячом, и мы находимся
        // с той же стороны от мяча, что и наши ворота, прыгнем, тем самым
        // ударив по мячу сильнее в сторону противника
        let jump = ((me.x - game.ball.x).powi(2)
            + (me.y - game.ball.y).powi(2)
            + (me.z - game.ball.z).powi(2))
        .sqrt()
            < rules.BALL_RADIUS + rules.ROBOT_MAX_RADIUS
            && me.z < game.ball.z;

        // Так как роботов несколько, определим нашу роль - защитник, или нападающий
        // Нападающим будем в том случае, если есть дружественный робот,
        // находящийся ближе к нашим воротам
        let mut is_attacker = game.robots.len() == 2;
        for robot in &game.robots {
            if robot.is_teammate && robot.id != me.id {
                if robot.position().y < me.position().y {
                    is_attacker = true;
                }
            }
        }

        if is_attacker {
            // Стратегия нападающего:
            // Просимулирем примерное положение мяча в следующие 10 секунд, с точностью 0.1 секунда
            for i in 1..100 {
                let t = i as f64 * 0.1;
                let ball_pos = game.ball.position() + game.ball.velocity() * t;
                // Если мяч не вылетит за пределы арены
                // (произойдет столкновение со стеной, которое мы не рассматриваем),
                // и при этом мяч будет находится ближе к вражеским воротам, чем робот,
                if ball_pos.y > me.position().y
                    && ball_pos.x.abs() < (rules.arena.width / 2.0)
                    && ball_pos.y.abs() < (rules.arena.depth / 2.0)
                {
                    // Посчитаем, с какой скоростью робот должен бежать,
                    // Чтобы прийти туда же, где будет мяч, в то же самое время
                    let delta_pos = Vec2::new(ball_pos.x, ball_pos.y)
                        - Vec2::new(me.position().x, me.position().y);
                    let need_speed = delta_pos.len() / t;
                    // Если эта скорость лежит в допустимом отрезке
                    if 0.5 * rules.ROBOT_MAX_GROUND_SPEED < need_speed
                        && need_speed < rules.ROBOT_MAX_GROUND_SPEED
                    {
                        // То это и будет наше текущее действие
                        let target_velocity =
                            Vec2::new(delta_pos.x, delta_pos.y).normalize() * need_speed;
                        *action = Action {
                            target_velocity_x: target_velocity.x,
                            target_velocity_y: 0.0,
                            target_velocity_z: target_velocity.y,
                            jump_speed: if jump { rules.ROBOT_MAX_JUMP_SPEED } else { 0.0 },
                            use_nitro: false,
                        };
                        return;
                    }
                }
            }
        }
        // Стратегия защитника (или атакующего, не нашедшего хорошего момента для удара):
        // Будем стоять посередине наших ворот
        let mut target_pos = Vec2::new(0.0, -(rules.arena.depth / 2.0) + rules.arena.bottom_radius);
        // Причем, если мяч движется в сторону наших ворот
        if game.ball.velocity().y < -EPS {
            // Найдем время и место, в котором мяч пересечет линию ворот
            let t = (target_pos.y - game.ball.position().y) / game.ball.velocity().y;
            let x = game.ball.position().x + game.ball.velocity().x * t;
            // Если это место - внутри ворот
            if x.abs() < (rules.arena.goal_width / 2.0) {
                // То пойдем защищать его
                target_pos.x = x;
            }
        }

        // Установка нужных полей для желаемого действия
        let target_velocity = Vec2::new(
            target_pos.x - me.position().x,
            target_pos.y - me.position().y,
        ) * rules.ROBOT_MAX_GROUND_SPEED;
        *action = Action {
            target_velocity_x: target_velocity.x,
            target_velocity_y: 0.0,
            target_velocity_z: target_velocity.y,
            jump_speed: if jump { rules.ROBOT_MAX_JUMP_SPEED } else { 0.0 },
            use_nitro: false,
        }
    }
}


SilentNox

SilentNox

Миасс

Сделайте в веб-клиенте возможность просмотра матчей потиково, то есть чтобы можно было промотать на один тик вперед или назад.

17.12.2018 1:35:56
m4shell

В разделе языковые пакеты написано : “Скачайте пакет для любимого языка программирования со страницы языковые пакеты. Поддерживаются C++, Java, C#, Pascal, Python2, Python3 и Ruby.”

Но пакет для Python 2 не выложен. Будет ли поддержка второго Питона?

17.12.2018 12:22:38
nekromant322

Есть какой-нибудь пример MyStrategy на Java? Самый просто и очевидный, для самых тупых

17.12.2018 21:13:22
DonRumata

DonRumata

Saint Petersburg State Polytechnic University

Есть какой-нибудь пример MyStrategy на Java? Самый просто и очевидный, для самых тупых

Приведенный на Rust’е пример относительно несложно перенести, сегодня занимался этим же для плюсов. Не могу сказать, что сильно в плюсах разбираюсь, а Rust вообще увидел впервые в жизни, но сильно много времени это у меня не заняло. Дольше возился с подключением виндовой библиотеки для сокетов.

17.12.2018 22:12:59
Scarlet

Я чего-то не понимаю. Перевёл этот пример на C++, а роботы большую часть игр на месте стоят, а в некоторых активно двигаются (http://russianaicup.ru/game/view/773, http://russianaicup.ru/game/view/847). Попробовал игры создавать с одними и теми же версиями - тоже самое: в одной обе стороны стоят, в другой с одной стороны стоят, с другой играют (http://russianaicup.ru/game/view/733, http://russianaicup.ru/game/view/1202). Как может стратегия так по-разному себя вести? К сожалению, локалраннер x86 не подвезли, репитер тоже, поэтому отлаживаться пока можно только наугад, заливая на сайт.

18.12.2018 9:14:44
chippie

chippie

Москва

Как понять причину ошибки верификации?

18.12.2018 23:32:57
sergeavel

sergeavel

Xing Events

При отправки стратегии (Ruby) получаю ошибку Файл ._remote_process_client.rb имеет некорректное имя

Пробовал отправлять архив скачанные из Языковых пакетов (даже не изменяя), ошибка немного другая Файл Dockerfile имеет некорректное имя

Подскажите пожалуйста, что нужно включать в архив?

18.12.2018 23:54:21
alkozel

alkozel

Калужский филиал ГУ СДА при Спецстрое России

Я чего-то не понимаю. Перевёл этот пример на C++, а роботы большую часть игр на месте стоят, а в некоторых активно двигаются ( http://russianaicup.ru/game/view/773 , http://russianaicup.ru/game/view/847) . Попробовал игры создавать с одними и теми же версиями - тоже самое: в одной обе стороны стоят, в другой с одной стороны стоят, с другой играют ( …

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

19.12.2018 0:33:13
romasffm

romasffm

Бад-Зоден

Даешь Tensorflow или хотя бы NumPy! или TF для Java хотя бы?

Давненько никто про это не спрашивал :)

Tensorflow пока не уживается с PYTHON 3.7, может PYTHON 3.6, это ведь вряд ли кому-то помешает?

Или хотя бы NumPy?!…

А можно и Tensorflow для Java, тогда можно тренировать локально на Питоне, а засылать бота на Java.

Ребята-организаторы, к вам вопрос: нельзя ли тут что-нибудь сделать, а?

Ответьте лучше сюда, на форум, там удобнее: http://russianaicup.ru/forum/index.php?topic=900.0

19.12.2018 0:41:09
romasffm

romasffm

Бад-Зоден

import java.util.Random;

import model.Action;
import model.Game;
import model.Robot;
import model.Rules;

public final class MyStrategy implements Strategy
{
  double ROBOT_MAX_GROUND_SPEED = 30;
  double ROBOT_MAX_JUMP_SPEED   = 15.1;

  Random    rng                    = new Random();

  @Override
  public void act( final Robot me, final Rules rules, final Game game, final Action action )
  {
    action.target_velocity_x = rng.nextGaussian() * ROBOT_MAX_GROUND_SPEED;
    action.target_velocity_y = rng.nextGaussian() * ROBOT_MAX_GROUND_SPEED;
    action.target_velocity_z = rng.nextGaussian() * ROBOT_MAX_GROUND_SPEED;

    if( rng.nextInt( 5 ) == 0 )
      action.jump_speed = rng.nextGaussian() * ROBOT_MAX_JUMP_SPEED;
  }
}

19.12.2018 0:54:46
romasffm

romasffm

Бад-Зоден

Есть какой-нибудь пример MyStrategy на Java? Самый просто и очевидный, для самых тупых

import java.util.Random;

import model.Action;
import model.Game;
import model.Robot;
import model.Rules;

public final class MyStrategy implements Strategy
{
  double ROBOT_MAX_GROUND_SPEED = 30;
  double ROBOT_MAX_JUMP_SPEED   = 15.1;

  Random    rng                    = new Random();

  @Override
  public void act( final Robot me, final Rules rules, final Game game, final Action action )
  {
    action.target_velocity_x = rng.nextGaussian() * ROBOT_MAX_GROUND_SPEED;
    action.target_velocity_y = rng.nextGaussian() * ROBOT_MAX_GROUND_SPEED;
    action.target_velocity_z = rng.nextGaussian() * ROBOT_MAX_GROUND_SPEED;

    if( rng.nextInt( 5 ) == 0 )
      action.jump_speed = rng.nextGaussian() * ROBOT_MAX_JUMP_SPEED;
  }
}

19.12.2018 0:59:57
Scarlet
alkozel

alkozel

Калужский филиал ГУ СДА при Спецстрое России

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

Да нет, не точное: if robot.position().y < me.position().y. К тому же, позиция каждый раунд меняется, а тут ситуация, что либо всю игру стоят. либо всю игру бегают. Да и не только у меня такие глюки и не только на плюсах.

19.12.2018 6:41:20
Scarlet

Кстати, с 11 утра вчера, все партии роботы бегают. Возможно, что-то починили. И стратегия сейчас залилась, которая сначала заливалась, а потом не проходила верификацию.

19.12.2018 6:55:41
aplayt

aplayt

Москва

А зачем в примере вот эти две константы?

    const JUMP_TIME: f64 = 0.2;
    const MAX_JUMP_HEIGHT: f64 = 3.0;

19.12.2018 13:25:34
frau.medved

Не могу отправить стратегию на котлин - выдает ошибку : Файл ._MyStrategy.kt имеет некорректное имя. Архив содержит два файа: MyStrategy.kt и Vector.kt Что не так?

20.12.2018 18:40:50
snikes

snikes

РГППУ

Перестали приниматься стратегии http://prntscr.com/lxm6ha

У всех так? отправлял одну и туже, которая принята (это с галочка тестовая) Перестала после обновления пакетов

20.12.2018 22:42:50
mixei4

mixei4

КГУ

snikes

snikes

РГППУ

Перестали приниматься стратегии http://prntscr.com/lxm6ha У всех так? отправлял одну и туже, которая принята (это с галочка тестовая) Перестала после обновления пакетов

Вчера тоже через раз принимало.

20.12.2018 23:38:48
amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

snikes

snikes

РГППУ

Перестали приниматься стратегии http://prntscr.com/lxm6ha У всех так? отправлял одну и туже, которая принята (это с галочка тестовая) Перестала после обновления пакетов

та же фигня. уже 4 попытка

21.12.2018 0:49:47
dfomin

dfomin

Ларнака

Возникла проблема с получением констант игры, вроде максимальной скорости робота. Судя по коду они извлекаются из json, который отравляет local-runner, но версия для мака константы не отправляет и везде None. У кого-нибудь возникала такая же проблема? Понятно что можно все константы скопировать из pdf с правилами, но хочется убедиться что я все правильно делаю.

23.12.2018 2:37:17
dfomin

dfomin

Ларнака

dfomin

dfomin

Ларнака

Возникла проблема с получением констант игры, вроде максимальной скорости робота. Судя по коду они извлекаются из json, который отравляет local-runner, но версия для мака константы не отправляет и везде None. У кого-нибудь возникала такая же проблема? Понятно что можно все константы скопировать из pdf с правилами, но хочется убедиться что я все правильно делаю.

Судя по всему проблема в том, что для MacOS выложен неактуальный local-runner

23.12.2018 2:54:43
cahq

cahq

Санкт-Петербург

в пакете C# IStrategy не имеет метода string CustomRendering(), а при попытке отослать стратегию она не компилится, по причине его отсутствия. Непорядок.

23.12.2018 3:49:27
AlexKol

AlexKol

BB

cahq

cahq

Санкт-Петербург

в пакете C# IStrategy не имеет метода string CustomRendering(), а при попытке отослать стратегию она не компилится, по причине его отсутствия. Непорядок.

Новую версию возьмите. Там всё есть

23.12.2018 6:48:15
QaraByte

https://ibb.co/6tSPVwg Почему ошибка выходит: “The default XML namespace of the project must be the MSBuild XML namespace…”

23.12.2018 9:35:53
tanujyadav97

tanujyadav97

NIT Delhi

Does the strategy run as a separate process for each robot of the team?

25.12.2018 15:48:07
Flutter

Flutter

Nitka Technologies

tanujyadav97

tanujyadav97

NIT Delhi

Does the strategy run as a separate process for each robot of the team?

No, one after another. You can differ robots by Id.

25.12.2018 16:00:26
code2travel

code2travel

IIT Kharagpur

Submitted a strategy about 20 hrs ago, but has yet not been called for any game by the system. Neither I am able to create any game with my strategy as a participant. Any probable reason?

27.12.2018 6:48:14
am13

am13

Хайдарабад

how to make my strategy compete against itself

27.12.2018 10:49:42
Ancient_mage

Ancient_mage

Itransition

am13

am13

Хайдарабад

how to make my strategy compete against itself

1) You can create game on web site with any your accepted strategy 2) Run Local Runner with –p1 tcp-31001 –p2 tcp-31002 and run 2 strategies on these ports: 31001 and 31002 (you can do this from command line)

27.12.2018 13:14:08
aj15

aj15

Индия

code2travel

code2travel

IIT Kharagpur

Submitted a strategy about 20 hrs ago, but has yet not been called for any game by the system. Neither I am able to create any game with my strategy as a participant. Any probable reason?

I am facing same problem. Do you see your name in the Sandbox Standings?

27.12.2018 13:49:24
kuviman

kuviman

СГУ им. Чернышевского

aj15

aj15

Индия

I am facing same problem. Do you see your name in the Sandbox Standings?

When submitting your strategy, do not check testing submit if you want your strategy to participate in sandbox

27.12.2018 13:55:19
aj15

aj15

Индия

kuviman

kuviman

СГУ им. Чернышевского

When submitting your strategy, do not check testing submit if you want your strategy to participate in sandbox

Thanks!

27.12.2018 14:01:46
am13

am13

Хайдарабад

what happens if I give velocity greater than max velocity

27.12.2018 15:30:28
am13

am13

Хайдарабад

Ancient_mage

Ancient_mage

Itransition

1) You can create game on web site with any your accepted strategy 2) Run Local Runner with –p1 tcp-31001 –p2 tcp-31002 and run 2 strategies on these ports: 31001 and 31002 (you can do this from command line)

Thanks

27.12.2018 15:30:41
Ancient_mage

Ancient_mage

Itransition

am13

am13

Хайдарабад

what happens if I give velocity greater than max velocity

action.target_velocity = clamp(action.target_velocity, MAX_GROUND_ROBOT_SPEED). action.jump_speed = min(action.jump_speed, MAX_JUMP_ROBOT_SPEED). robot.velocity = clamp(robot.velocyt, MAX_ENTITY_SPEED).

27.12.2018 15:48:30
aj15

aj15

Индия

On what factors (apart from jump speed) does the strength of hitting the ball depend?

27.12.2018 22:02:42
am13

am13

Хайдарабад

what is the difference (apart from an increase in radius) b/w giving target velocity in the y-direction and jump-speed? Also, does the entity always move as targeted or are there any special conditions?

29.12.2018 15:53:16
am13

am13

Хайдарабад

what is the difference (apart from an increase in radius) b/w giving target velocity in the y-direction and jump-speed? Also, does the entity always move as targeted or are there any special conditions?

29.12.2018 15:53:18
mixei4

mixei4

КГУ

am13

am13

Хайдарабад

what is the difference (apart from an increase in radius) b/w giving target velocity in the y-direction and jump-speed? Also, does the entity always move as targeted or are there any special conditions?

Setting Y in target_velocity has no effect if you are touching the floor.

Robots change velocity based on given acceleration.

29.12.2018 19:55:44
R4N4R4M4

R4N4R4M4

Лион

am13

am13

Хайдарабад

Thanks

Hi, how do you launch player on tcp 31002 please ?

29.12.2018 20:31:35
amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

R4N4R4M4

R4N4R4M4

Лион

Hi, how do you launch player on tcp 31002 please ?

app.exe 127.0.0.1 31002 9000

29.12.2018 20:53:25
R4N4R4M4

R4N4R4M4

Лион

amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

app.exe 127.0.0.1 31002 9000

thanx very much :D

29.12.2018 20:57:00
R4N4R4M4

R4N4R4M4

Лион

amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

app.exe 127.0.0.1 31002 9000

thanx very much :D

29.12.2018 20:57:01
alkozel

alkozel

Калужский филиал ГУ СДА при Спецстрое России

Народ, подскажите приоритет бинарных операций в Rust

30.12.2018 12:42:18
Mahi

Mahi

Tehran Polytechnic

i need custom rendering in rust! How can I do?

02.01.2019 13:07:53
jMind

jMind

Москва

В чем смысл строки assert arena.bottom_radius == arena.goal_top_radius; в псевдокоде симулятора? Что делает функция clamp, когда в нее передаются 3 параметра?

06.01.2019 15:37:21
mixei4

mixei4

КГУ

jMind

jMind

Москва

В чем смысл строки assert arena.bottom_radius == arena.goal_top_radius; в псевдокоде симулятора? Что делает функция clamp, когда в нее передаются 3 параметра?

Строчку можно выкинуть.

Ограничивает первое число двумя другими.

06.01.2019 21:58:26
Mahi

Mahi

Tehran Polytechnic

can we use filesystem just for the current directory?

09.01.2019 1:57:47
MrZlodey

MrZlodey

NetCracker

Mahi

Mahi

Tehran Polytechnic

can we use filesystem just for the current directory?

Nope

22.01.2019 21:43:51