Уведомления

Группа в Telegram: @pythonsu

Уведомления

  • Found 3494 posts.

Python для новичков » из префиксной нотации в инфиксную (и наоборот (2 разные программы)) » Дек. 7, 2017 18:05:13

 import re
operators = {'-': lambda a, b: f'{a} - {b}',
             '+': lambda a, b: f'{a} + {b}',
             '*': lambda a, b: f'{a} * {b}',
             '/': lambda a, b: f'{a} / {b}',
             '**': lambda a, b: f'{a}**{b}'}
def eval_pn(tokens):
    token = next(tokens)
    if token in operators:
        return operators[token](eval_pn(tokens), eval_pn(tokens))
    elif re.fullmatch(r'\d+', token):
        return token
    raise SyntaxError(ascii(token))
def get_tokens(s):
    op_regex = '|'.join(map(re.escape, operators))
    return iter(re.findall(r'\d+|' + op_regex, s))
a = input()
print(eval_pn(get_tokens(a)))

в 3.6 версии все нормально работает кроме одного, программа должна еще расставлять скобки когда это надо например:
 -3-4 5
в
 3-(4-5)
но если запускаю в 2.7, то интерпретатор ругается на f в operators, может кто подскажет как с этим бороться?
и еще одна программа, обратная польская
 operations = {'*': {'priority': 3}, 'action': lambda a, b: f'{a} - {b}',
'/': {'priority': 2}, 'action': lambda a, b: f'{a} + {b}',
'+': {'priority': 1}, 'action': lambda a, b: f'{a} * {b}',
'-': {'priority': 0}, 'action': lambda a, b: f'{a} / {b}',
'**': {'priority': 5}, 'action': lambda a, b: f'{a}**{b}',
'(': {'priority': 4},
')': {'priority': 1}}
def isempty(string):
    return len(string) == 0;
def priority(a, b):
    return operations[a]['priority'] >= operations[b]['priority'];
def check_expression(exp):
    stack = []
    rpn = []
    for char in exp.split(' '):
        if char in ('0123456789'):
            rpn.append(char)
        elif char in operations:
            if (char == ')'):
                tmp = stack.pop()
                while not isempty(stack) and tmp != '(':
                    rpn.append(tmp)
                    tmp = stack.pop()
            if isempty(stack):
                stack.append(char)
            else:
                while not isempty(stack) and priority(stack[len(stack) - 1], char) \
                        and stack[len(stack) - 1] != '(':
                    rpn.append(stack.pop());
                if char != ')':
                    stack.append(char)
        else:
            return 'ERROR'
    for x in reversed(stack):
        rpn.append(x)
    return " ".join(rpn)
s = input()
print(check_expression(s))

программа работает, все нормально кроме двух моментов, она выводит скобку когда это не надо
  ( 2 - 4 ) * ( 3 + 6 )
  2 4 - 3 6 + * )
т.е тут она выводит скобку, хотя это не нужно и не выводит ошибку, если неправильный ввод, например вводится
  2 3 + * 1 8 / 4
то должен выдать
 ERROR
Заранее спасибо

Центр помощи » Отрисовка в 3х-мерном пространстве » Ноя. 27, 2017 12:37:04

Приветствую!
Подскажите пожалуйста
Есть данные координаты начала вектора и концы и
Как построить вектор в трехмерном пространстве
Знаю что нужна библиотека matplotlib , Axes3d
Но не могу найти как это сделать

GUI » Помощь с настройкой Qt5 Creator » Ноя. 22, 2017 11:26:46

Здравствуйте. Установил Creator в дефолтном варианте, добавил только MinGW последней версии в список устанавливаемых тулзов. Мне creator нужен исключительно для designer'a. При создании нового проекта пишет, что отсутствуют какие то комплекты. Погуглив, нашел похожие вопросы, но там решением было установка или указание пути к отладчику. У меня же он уже установлен (вручную и вместе с creator'ом) и указан. Подскажите, что еще нужно сделать для создания проекта?


Python для новичков » Передаче данных через SPI  » Ноя. 21, 2017 10:15:50

Здравствуйте. Такая проблема: нужно,чтобы от одного устройства к другому (используется распа ) передавались пакеты данных (от 4 датчиков) . В них будет содержаться информация о расстоянии (датчик-приемник). Т.е значения - числа,обозначающие расстояние.
Вопрос: для этого хватит ТОЛЬКО модуля spidev?

Python для новичков » ThreadPoolExecutor » Ноя. 20, 2017 13:04:02

 #!/usr/bin/python3
import telnetlib
import time
import getpass
import sys
from concurrent.futures import ThreadPoolExecutor
VLAN = sys.argv[1].encode()
COMMAND = b'sh vlan tag '
USER = b'admin'
PASSWORD = b'admin'
DEVICES_IP = ['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5']
def show_vlan ( IP ):
        t = telnetlib.Telnet(IP)
        t.read_until(b'User Name:')
        t.write(USER + b'\n')
        t.read_until(b'Password:')
        t.write(PASSWORD + b'\n')
        time.sleep(1)
        t.write(COMMAND + VLAN + b'\n')
        time.sleep(2)
        output = t.read_very_eager().decode('utf-8')
        return output
for IP in DEVICES_IP:
        RESULT = show_vlan(IP)
        print(RESULT)



Есть такой незамысловатый код. Подскажите, плиз, как, используя ThreadPoolExecutor, выполнить его в 5 параллельных потоков?

Web » Поможете закодить? предполагаемый бюджет 1-1.5т.р. » Ноя. 18, 2017 20:58:30

для связи BOX: rambler.ru КОбакко yandex.ru
перезвоню по России, у меня бесплатно
чатиться смс, скайп, Вкшка
предполагаемый бюджет на решение задачи 1-1.5т.р.
если стоит других денег, отпишите, эти сервера - это для меня хоБби
может для кого нить и эта задачка, будет как хобби и тренировка интеллекта)

http://battlelog.battlefield.com/bf4/servers/pc/

игра батл_фиелд4.
заходить в игру со списка серверов
многие админы используют фейковых игроков (ботоф)

можно бота сажать вручную. залогинится в броузере.
запустить оригин, в нем тоже залогинится, какой аккаунт в оригине не важно (origin.com)
при нажатии на кнопку зайти на сервер с броузера, идет попытка подсоединения к серверу, т.к. игрок реально не заходит, автодисконнект после 1 мин.
в браузере появляется кнопка re-connect. жмешь ее и еще 1 мин попытка подсоелинения на сервер
в баттлоге, это показывается, что 1 слот занят
если сдеать 10-20-30 пользователей в хроме, можно перебирая вкладки по очерерди “сажать ботов”
можно исползовать скрипт на браузер, но требует много ресурсов.
можно ли написать программу, для автоматизации и без участия броузера
такие проги есть у админов на phyton 3 и др языках, но никто ими не делится.
обычно работают на вирт сервере
этож хобби)
кто делал - обычно один и тот же список ботов, максимум 64 - перебирает по очереди до 8ми серверов.
как сервер заполнится - боты выключаются, чтоб оставлось немного свободных слотов.
так понимаю оригин вообще не нужен.

чтоб залогинится в оригине или батллоге вот 3 аккаунта
krotenot1@mzm.com
krotenot2@mzm.com
krotenot3@mzm.com
пароль один для все логинов
Lock098765

если скачаете оригин, зайдете под одним из этих аккаунтов, в библиотеке найдет батл_фиелд 4 - поставите на скачку - можете играть в нее)

Python проекты » PLogic Simulator » Ноя. 18, 2017 11:46:04

Здравствуйте. Решил в очередной раз уделить время Python (манит меня этот язык ) и набросал небольшой “учебный” проект. Это симулятор логики, т.е. вам в распоряжение выдается набор базовых элементов - AND/OR/NOR/XOR и.д. из которых вы сможете собрать логическую схему. Для отрисовки сначала использовался OpenGL, но потом переписал на PyGame.

В комплекте идет пример синхронного D триггера, сохранение/загрузка осуществляется кнопками S и L соответственно. Вообще исчерпывающая информация по управлению есть в readme.txt

https://github.com/mrpeidz/PLogicSim

Python для новичков » Pyenv - переименование/удаление папок в виртуальной среде » Ноя. 15, 2017 13:49:18

Добрый день, коллеги,

В виртуальной среде, созданной с помощью утилиты pyenv, установил 2 версии питона (2.7.11 и 3.6.3). Под каждой версией установил фреймворк Pyramid 1.9.1, используя pip ($ pip install pyramid) Структура каталогов для ветки 2.7.11 такая:
eugene@eu-IP-U430p:~/.pyenv$ versions/2.7.11/envs/pyramid, где pyramid - имя папки для проектов под Pyramid.
Вопросы:
1) Как лучше удалить папку pyramid? С помощью pip, предварительно активировав virtualenv:
$ source activate,а затем $ pip uninstall piranid, либо, не активируя. просто $ apt remove /path/pyramid или вручную?
2) Если бы мне потребовалось переименовать папку pyramid, какими должны быть мои действия?
3) Как удалить виртуалку в папке pyramid?

В настоящий момент установлены следующие версии: $ pyenv versions
system
2.7.11
2.7.11/envs/pyramid
3.6.3
3.6.3/envs/pyramid363

Попробовал удалить виртуалку командой: $ pyenv uninstall 2.7.11/envs/pyramid
Подтвердил удаление (remove /home/…/2.7.11/evns/pyramid?), но ничего удалено не было.

Django » django_auth_ldap вхождение пользователя в группу » Ноя. 15, 2017 09:33:44

День добрый!
Делал все по данной статье Django Single Sign-On и Microsoft Active Directory- хочется “плюшек”. А именно в каких группах состоит пользователь. Предполагал “дергать” через AUTH_LDAP_PROFILE_FLAGS_BY_GROUP но я так понял не поддерживается для Django 1.7 и выше. Вариант с AUTH_LDAP_MIRROR_GROUPS не совсем подходит. Вообщем каким образом на уровне создания/обновления пользователя можно “выдернуть” принадлежность к определенной группе в AD.


Django 1.10

 AUTH_LDAP_SERVER_URI = "ldap://192.168.0.6:3268"
AUTH_LDAP_AUTHORIZE_ALL_USERS = True
AUTH_LDAP_PERMIT_EMPTY_PASSWORD = True
AUTH_LDAP_BIND_DN = "cn=dossier_ldap_find,ou=Services,ou=Technical,dc=XXX,dc=ru"
AUTH_LDAP_BIND_PASSWORD = "PASSWORD"
AUTH_LDAP_USER_SEARCH = LDAPSearchUnion(
     LDAPSearch("dc=XXX,dc=ru", ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)"),
     LDAPSearch("dc=YYY,dc=XXX,dc=ru", ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)"),
     LDAPSearch("dc=ZZZ,dc=XXX,dc=ru", ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)"),
)
AUTH_LDAP_GROUP_SEARCH = LDAPSearchUnion(
    LDAPSearch("ou=Services,ou=Technical,dc=XXX,dc=ru", ldap.SCOPE_SUBTREE, "(objectClass=group)"),
    LDAPSearch("ou=Services,ou=Technical,dc=YYY,dc=XXX,dc=ru", ldap.SCOPE_SUBTREE, "(objectClass=group)"),
    LDAPSearch("ou=Services,ou=Technical,dc=ZZZ,dc=XXX,dc=ru", ldap.SCOPE_SUBTREE, "(objectClass=group)"),
)
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType(name_attr="cn")
AUTH_LDAP_REQUIRE_GROUP = (
    (
        LDAPGroupQuery("cn=DOSSIER_ACTIVE,ou=Services,ou=Technical,dc=XXX,dc=ru") |
        LDAPGroupQuery("cn=DOSSIER_ACTIVE,ou=Services,ou=Technical,dc=YYY,dc=XXX,dc=ru") |
        LDAPGroupQuery("cn=DOSSIER_ACTIVE,ou=Services,ou=Technical,dc=ZZZ,dc=XXX,dc=ru")
    )
    &
    ~LDAPGroupQuery("cn=DOSSIER_BLOCKED,ou=Services,ou=Technical,dc=XXX,dc=ru") &
    ~LDAPGroupQuery("cn=DOSSIER_BLOCKED,ou=Services,ou=Technical,dc=YYY,dc=XXX,dc=ru") &
    ~LDAPGroupQuery("cn=DOSSIER_BLOCKED,ou=Services,ou=Technical,dc=ZZZ,dc=XXX,dc=ru")
)
AUTH_LDAP_USER_ATTR_MAP = {
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail"
}
AUTH_LDAP_PROFILE_ATTR_MAP = {
    "ipphone": "ipphone",
}
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
    "is_active":
    (
        LDAPGroupQuery("cn=DOSSIER_ACTIVE,ou=Services,ou=Technical,dc=XXX,dc=ru") |
        LDAPGroupQuery("cn=DOSSIER_ACTIVE,ou=Services,ou=Technical,dc=YYY,dc=XXX,dc=ru") |
       LDAPGroupQuery("cn=DOSSIER_ACTIVE,ou=Services,ou=Technical,dc=ZZZ,dc=XXX,dc=ru")
    ),
    "is_staff":
    (
        LDAPGroupQuery("cn=DOSSIER_STAFF,ou=Services,ou=Technical,dc=XXX,dc=ru") |
        LDAPGroupQuery("cn=DOSSIER_STAFF,ou=Services,ou=Technical,dc=YYY,dc=XXX,dc=ru") |
        LDAPGroupQuery("cn=DOSSIER_STAFF,ou=Services,ou=Technical,dc=ZZZ,dc=XXX,dc=ru")
    ),
    "is_superuser":
    (
        LDAPGroupQuery("cn=DOSSIER_SUPPERUSER,ou=Services,ou=Technical,dc=XXX,dc=ru") |
        LDAPGroupQuery("cn=DOSSIER_SUPPERUSER,ou=Services,ou=Technical,dc=YYY,dc=XXX,dc=ru") |
        LDAPGroupQuery("cn=DOSSIER_SUPPERUSER,ou=Services,ou=Technical,dc=ZZZ,dc=XXX,dc=ru")
    ),
    "is_writer":
    (
        LDAPGroupQuery("cn=DOSSIER_WRITER,ou=Services,ou=Technical,dc=XXX,dc=ru") |
        LDAPGroupQuery("cn=DOSSIER_WRITER,ou=Services,ou=Technical,dc=YYY,dc=XXX,dc=ru") |
        LDAPGroupQuery("cn=DOSSIER_WRITER,ou=Services,ou=Technical,dc=ZZZ,dc=XXX,dc=ru")
    ),
}
AUTH_LDAP_PROFILE_FLAGS_BY_GROUP = {
    "is_writer":
    (
        LDAPGroupQuery("cn=DOSSIER_WRITER,ou=Services,ou=Technical,dc=XXX,dc=ru") |
        LDAPGroupQuery("cn=DOSSIER_WRITER,ou=Services,ou=Technical,dc=YYY,dc=XXX,dc=ru") |
        LDAPGroupQuery("cn=DOSSIER_WRITER,ou=Services,ou=Technical,dc=ZZZ,dc=XXX,dc=ru")
    ),
}
#AUTH_LDAP_MIRROR_GROUPS = True
AUTH_LDAP_ALWAYS_UPDATE_USER = True
AUTH_LDAP_FIND_GROUP_PERMS = True
AUTH_LDAP_CACHE_GROUPS = False
AUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600

 from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from django_auth_ldap.backend import LDAPBackend
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    ipphone = models.CharField(max_length=10, blank=True, null=True)
    is_writer = models.BooleanField(default=False)
    @receiver(post_save, sender=User)
    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            new_profile = Profile.objects.create(user=instance)
            user = LDAPBackend().populate_user(instance.username)
            if user:
                ipphone = user.ldap_user.attrs.get("ipphone", [])[0]
                new_profile.ipphone = ipphone
    @receiver(post_save, sender=User)
    def save_user_profile(sender, instance, **kwargs):
        instance.profile.save()

Python для новичков » Почему print одновременно выдает вывод и ошибку? » Ноя. 6, 2017 00:29:34

Я выводил текст из 1 файла и выскакивали кракозябры. Хотя там был русский текст. Я изменил кодировку в консоли(
chcp65001
) на UTF-8. ОДИН print начал одновременно выдавать русский текст и ошибку IOError: (Errno 0) Error. Как это работает?

Python для новичков » Парсинг div-блоков на zaycev.net » Ноя. 5, 2017 18:03:39

Пишу телеграм-бота для самообразования. Есть идея - парсить сайт zaycev.net, брать оттуда ссылки на песни(брать href с кнопки “скачать” и т.п.). Вопрос - как используя requests выбрать, допустим, из
 response = requests.get("https://zaycev.net")
divs = Что-то, что-то сделать чтобы выбрать только div'ы из response.text (Необязательно брать весь HTML код, может есть что-то для этого)
[\code]
Спасибо за ответ заранее

Python для новичков » Постоянный дисконект socketIO без ошибки » Ноя. 1, 2017 21:03:13


Доброго времени суток. Пытаюсь использовать streamlabs api https://streamlabs.readme.io/docs/socket-api

Там можно найти рабочие примеры на js. Я же пытаюсь реализовать код на питоне с использованием библиотеки socketIO. Подскажите почему не работает и в каком направление двигаться?
token = "....."
import logging
logging.getLogger('socketIO-client').setLevel(logging.DEBUG)
logging.basicConfig()

from socketIO_client import SocketIO, LoggingNamespace
print token

def on_connect():
print('connect')

def on_disconnect():
print('wtf')

def on_event(*args):
print('aaaaaaa', args)

print "connecting"
print "https://sockets.streamlabs.com?token={}".format(token)

socketIO = SocketIO("https://sockets.streamlabs.com?token={}".format(token),443, LoggingNamespace)

socketIO.on('connect', on_connect)
socketIO.on('disconnect', on_disconnect)
socketIO.on('event', on_event)
socketIO.wait()
Вывод дебага
DEBUG:socketIO-client:sockets.streamlabs.com:443/socket.io [engine.io transport selected] websocket

DEBUG:socketIO-client:sockets.streamlabs.com:443/socket.io [engine.io heartbeat reset] DEBUG:socketIO-client:sockets.streamlabs.com:443/socket.io [engine.io message]

1

DEBUG:socketIO-client:sockets.streamlabs.com:443/socket.io [socket.io packet received]

1

wtf

DEBUG:socketIO-client:sockets.streamlabs.com:443/socket.io [engine.io pong] DEBUG:socketIO-client:sockets.streamlabs.com:443/socket.io [engine.io pong] DEBUG:socketIO-client:sockets.streamlabs.com:443/socket.io [engine.io pong] DEBUG:socketIO-client:sockets.streamlabs.com:443/socket.io [engine.io pong] DEBUG:socketIO-client:sockets.streamlabs.com:443/socket.io [engine.io pong]


Если вы все еще читаете, значит вопрос вас заинтересовал. Долгое время пытаюсь решить эту проблему. Единственное на что похоже, что все библиотеки для работы с socketio поддерживают протоколы ниже 2.х.

Python для новичков » Размещение » Ноя. 1, 2017 16:25:59

Доброго времени суток.
Возможно вопрос немного не по теме .Подскажите пожалуйста, написал телеграм бота на python на PyCharm и когда его запускаешь все прекрасно работает.а как сделать чтобы он работал как сайт, как залить на хостинг?
заранее спасибо

Python для новичков » Помогите с кодом(TeleBot) » Окт. 30, 2017 11:32:34

Как сделать, чтобы, когда пользователь вводил текст, этот текст подставлялся в ссылку, а затем эта ссылка отправлялась пользователю

Python для новичков » Openpyxl - сохранение форматирования в xlsx файлах. » Окт. 30, 2017 10:20:43

Добрый день, сообщество.
я хочу написать скрипт для поиска и консолидации определенных значений в массиве xlsx файлов, но у меня возникла проблема. к сожалению openpyxl не сохраняет форматирование исходных данных (например если ячейка в исходном файле была залита желтым, то я не могу перенести заливку в новый файл).
В документации openpyxl (не силен в английском) прямо указано, что форматирование ячеек не сохраняется. Вопрос: может быть есть какая то другая отдельная библиотека, либо расширение для openpyxl которая умеет считывать форматирование?
Заранее благодарен.

Python для новичков » Telegram bot нужна помощь » Окт. 29, 2017 22:13:26

Доброго времени суток. Недавно начал изучать python и первое приложение стал простенький Телеграм бот.
При написании возникли проблемы/вопросы и прошу помощи.
Как реализовать кнопку “Вернуться назад”?
Почему при работе функции “def qqq(message)” не срабатывает “bot.polling()”
Первое сообщение присылается два раза
Заранее спасибо, извините за корявый код.
код прилагаю

Python для новичков » Нужна помощь! » Окт. 29, 2017 18:16:23

Всем привет!Помогите решить задачку. По возможности объясните что да как(второй день разбираюсь в питоне).
https://listick.ru/files/all/c5/0b/d8/5647dc8b13066e0919c5f05113s33468.png

Центр помощи » Помогите, пожалуйста » Окт. 29, 2017 00:07:10

Материалы доступны по ссылке Я.Диска: https://yadi.sk/d/7gz0JUxS3NEfeZ

Задача:
Посмотреть и освоить ресурсы:
http://jupyter.org/widgets.html
http://matplotlib.org/gallery.html
Посмотреть данные мыши (см. mouse_data.tsv.tar.bz2).
Написать систему визуализации движения мыши с помощью Jupiter Notebook.
Прочитать статьи (см. Я.Диск)
Реализовать идентификацию пользователя по курсорному почерку.
Написать отчет(желательно с комментариями).

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

Python для новичков » Биржевой робот » Окт. 25, 2017 14:09:02

Напишите робота для автоматической торговли акциями на бирже.

Вводится цена акций в первый, второй и т. д. дни, ноль — сигнал остановки. Возможно, сначала цена уменьшается. В какой-то момент цена начинает расти. Мы покупаем акции в первый день, когда их цена превышает цену в предыдущий день. После этого в какой-то момент цена акций начинает уменьшаться. Мы продаём акции в первый же день, как только их цена становится меньше цены в предыдущие дни. Возможно, после этого цены как-то ещё меняются.

Программа должна вывести цену акций, по которой мы их купили, цену, по которой продали, и выгоду с каждой акции (возможно, отрицательную).

Не следует пользоваться советами этого робота в реальной жизни.

Формат ввода
Несколько целых чисел — цены акций в последовательные дни.
Число 0 — сигнал прекращения ввода цен.

Формат вывода
Три целых числа — цена покупки, цена продажи, выгода.

Пример
Ввод
32
30
31
34
38
37
39
0
Вывод
31 37 6

Python для новичков » Ищем клад » Окт. 25, 2017 14:06:27

Мы находимся на острове, на котором закопан клад. Мы находимся в точке с координатами (0, 0). Нам известно, где закопан клад, но этого мало: остров полон опасностей, и нужно перемещаться строго по указаниям карты, которая, к счастью, тоже имеется в нашем распоряжении. Мы хотим найти клад как можно скорее.

Сначала вводятся два числа: координаты клада по оси икс (запад-восток) и игрек (юг-север). Затем следует некоторое количество указаний карты. Каждое указание карты состоит из двух строк. Первая строка содержит слово «север», «юг», «запад» или «восток», вторая — натуральное число, количество шагов, которое нужно пройти в данном направлении. Заключительное указание карты состоит только из одной строки, содержащей слово «стоп».

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

Формат ввода
Два целых числа — координаты клада.
Затем несколько блоков: строка (направление движения) и целое число (количество шагов).
Строка «стоп».

Формат вывода
Целое число — минимальное количество указаний карты, которое нужно выполнить, чтобы прийти к кладу.

Пример
Ввод
-2
9
север
9
запад
2
восток
17
стоп
Вывод
2