Реши задачу и получи приглашение на собеседование в Google

+115
в блоге IT Pony!
UPD. Закончено, Sasha-Flyer победил.

Первый решивший задачу в посте и запостивший рабочее решение в комментарии получит инвайт в программу рекрутинга Google Foobar (что это?). Если там он покажет себя как перспективный разработчик — он может получить приглашение на собеседование в Google.



Вы — спецагент Министерства Тайных Наук. Вы находитесь в зале прямоугольной формы, пол, стены и потолок которой сделаны из абсолютного зеркального материала. Ваша цель, один из трибунов Зебрийского Легиона, прямо перед вами. Вы — спокойная и рассудительная понька. Чтобы сделать один точный и смертельный выстрел из своего лазерного пистолета, вам нужно знать все возможные способы, которыми луч может отразиться от стен, пола и потолка и поразить цель, не поджарив при этом вас.


Дано:
• Куб N на M на K.
• D — Максимальная дистанция полёта луча с учётом отражений.
• Y — Ваша позиция внутри куба.
• T — Позиция вашей цели внутри куба.

Условия:
• Куб в любом из измерений не может быть меньше 2 и больше 10000 юнитов.
• Размер куба и позиции стрелка и цели задаются целыми числами.
• Y или T не могут находиться на грани куба (т.е. как минимум в 1 юните от любой из стен).
• Y и T не могут находиться в одной точке.
• Луч не может пролететь сквозь Y или T.
• Количество отражений не ограничено.
• Угол падения равен углу отражения. В случае попадания в трёхгранный угол — луч отражается в обратном направлении. В двугранный — по двум осям соответствующим углу в обратном и по одной как обычно.
• Требуемая точность попадания в Y и T до 6 знака после запятой (0.000001).
• D находится в пределах [1, 10000].
• Требуемое время выполнения для N = M = K = 100 и D = 2500 — 30 секунд (без учёта старта виртуальной машины, если она нужна).
• Память не ограничена.

Найти:
• Количество уникальных путей, которыми луч может вылететь из Y и поразить T. Включая путь напрямую.

Решение принимается на любом из этих языков: C, C++, C#, Java, Kotlin, JS, TS, Python, Go, Rust, Swift, а так же на GLSL и HLSL (мало ли).
На задачу отводится неделя — если за это время она не будет решена, будет пост с объяснением и следующей задачей.

Good luck, have fun.

472 комментария

Не бойтесь постить свои решения даже если кто-то запостил первее — оно может оказаться нерабочим. Так же, если способ решения мне понравится, поговорим лично — может, тоже получите всякие интересные инвайты.
Спойлер
Интересно, попробуем!
>Y и T на одной высоте у пола
Нет, они могут находится в любой валидной точке внутри куба.
стены и потолок
Но не пол?
все возможные способы, которыми луч может отразиться от стен
А по прямой из Y в T не считается?
до 9 знака после запятой
Ой да ну нафиг с погрешностями флоатов связываться
Пол тоже. И по прямой считается. Исправил.
Да на самом деле достаточно использовать fp64 — точности хватит.
Возможно, дурацкий вопрос — а что в контексте задачи означает точность? Точность попадания луча в точку T?
Да, эта точность.
способы, которыми луч может отразиться от стен и поразить цель

Правильно понимаю, что решения с отражениями от пола и потолка отбрасывать?

Вот думаю… Писать на C, которого последний раз касался лет 10 назад, или на Python, который только собираюсь учить. В любом случае, будет страшное. =] А остального я не знаю >_<
Нет, луч может отражаться от всех стен.
В случае попадания в угол — луч отражается в обратном направлении.
Даже в двугранный угол? Странная модель.
Требуемая точность до 9 знака после запятой.
Что это значит? Ввод и вывод весь целый.
По комменту «Да, эта точность» предположу, что это подразумевает, что Y и T можно условно считать шарами с радиусом 0.000000001 или чёт типа того
Из двугранного угла луч отразится в обратном направлении для двух соответствующих осей, а по третьей оси отразится по углу падения.

Это точность, при которой засчитывается попадание в Y или T.
Можно более формально, что означает это утверждение? Что я должен засчитывать как попадание, даже если отрезок от начальной до конечной точки пройдёт менее чем в 1e-9 условной единицы от промежуточной точки? Что если расстояние между началом и концом отличается от D менее чем на 1e-9, то это попадание? Что таких ситуаций в принципе не будет, даже если ограничения позволяют? Замечу, что на D ограничений нет, и при N,M,K=10000 оно может быть и 5000000, а там уже можно подобрать очень плохие примеры.
Такими темпами уточнения условий скоро упрутся в табунский лимит размера поста)
Вот они проблемы написания задачи по памяти.
Если луч проходит в менее чем или в 1e-9 от точки — значит, это попадание.
D ограничил.
Что это значит? Ввод и вывод весь целый.

Вероятно, имеется в виду, что размер математической точки цели и стрелка в физическом пересчете — не менее 9 знаков после запятой. То есть, при расчете координат нет смысла брать десять знаков, достаточно девяти. Это вроде бы float в терминах C.
Foobar

Тонкая шутка, не сразу заметил.

А чего это Гугл лазерами интересуется? Никак старина Трамп снова Звездные войны решил запилить?
Сделаем Империю снова великой!
— При расчёте мой UE4 подавился и перестал работать! Круто!!! Пойду ещё раз потыкаю!!!
Немного уменьшил требования по времени и точности, в трёх измерениях эта задача гораздо более ресурсоёмкая.
«до 9 знака» забыл поправить?
Сам решаешь на ходу и осознаёшь что за фигню задал?)))
Как-то так, да. Это развитие одной из задач из пула Google. Придумал её пока ждал доставку роллов ¯\_(ツ)_/¯
Вопрос удобства)
Начало координат в одном из углов параллелепипеда?
От этого не зависит решение, поэтому на твоё усмотрение.
То есть проверка не автоматическая?
Проверяется алгоритм, а не конкретная имплементация, так что да, ручками.
Алгоритм словами написать здесь раз в десять быстрее, чем закодить)
Здравствуйте, это сайт по My Little Pony? Объявляем конкурс по набору новой тимы в гугл :D
Ну, я в комментариях выше насчитал пяток профессиональных разработчиков, так что подход работает.
А сам Табун уже несколько лет не может себе программистов найти
А разве все профессиональные разработчики выше уже не отказались от работы над Табуном?
Пхпшеры — не прогаммисты.
Алгоритм1) Разобьём всё пространство на решётку из таких кубов, а один из них выделим и сделаем «начальным» — это представление всевозможных маршрутов луча. Каждый маршрут луча с отражениями можно разложить в прямую, где отражениям будут соответствовать пересечения кубов из решётки.
2) В таком пространстве маршруты луча длины не больше D задаются шаром радиуса D с центром в Y. Искомые маршруты — те внутри этого шара, которые заканчиваются в отражении точки T, лежащей в начальном кубе, относительно стенок решёток. И ещё там нужно отфильтровать, чтобы не проходило через более близкие отражения точек Y и T. Координаты отражений точек Y и T внутри каждого отражения куба довольно просто подсчитать.
3) Начнём обходить кубы в порядке их «глубины» по отражениям — сначала начальный куб (глубины 0), потом его соседей (глубины 1), потом их соседей (глубины 2) и т.д. Более точно, будем поддерживать FIFO-очередь кубов, в которую изначально запихнём начальный куб, а потом будем вынимать очередной куб из очереди, и если он пересекает шар из пункта 2) [или для простоты проверки не сам шар — а куб с параллельными стенками, в который вписан шар — это увеличит количество обойденных кубов в какую-то константу раз], то запихнём в очередь всех его соседей большей глубины. Таким образом, мы обойдём все кубы, пересекающие данный шар, и почти не будем смотреть на кубы вне шара (поиск будет затухать на границе).
4) При доставании очередного куба из очереди мы рассчитываем координаты отражений точек Y и T в нём, и делаем с ними следующее. Проверяем, а) что расстояние до отражения T не превосходит D, и б) по некоторой структуре данных, описанной ниже, что луч в T не проходит через уже посещённые ранее отражения (не близок к лучам, уже лежащим в структуре данных). Если оба условия выполняются, инкрементируем ответ. Затем обновляем структуру данных, добавляя туда лучи в оба отражения Y и T.
5) В качестве структуры данных можно взять ассоциативный массив, основанный на сбалансированном дереве. (std::map в C++) Значениями будут тройки чисел — координаты пересечения направления луча с единичной сферой. Ключи нужно подобрать такие, чтобы можно было быстро найти «очень близкую» тройку. Как вариант — сгенерировать три рандомных вещественных числа (a, b, c) в самом начале, и для тройки (x, y, z) ключ будет (ax+by+cz). Тогда чтобы проверить, был ли уже очень похожий луч, нужно просто найти lower_bound в сбалансированном дереве и посмотреть на близкие элементы справа и слева (там уже сверять и значения троек).

Кода не будет, потому что влом :)
Эх, читор)
Без кода я бы уже два часа назад скинул)
это круто, но я не понимаю. что собой представляет один «куб» в решетке?
Если честно, я тоже не понял ни один из его пунктов) Разве что самый первый немного похож на то, что я предлагал с отраженными копиями изначального куба)
Да, с отражениями всё просто. Чтобы развернуть луч, отражённый относительно какой-то стенки, в прямую, можно отразить весь куб относительно этой стенки (и в общем случае всю комнату, какой бы формы она ни была). Тогда отрезки, проходящие через эту стенку, и соединяющие исходную точку в кубе и какую-то точку отражённого куба, в точности соответствуют кускам лучей, которые 1 раз отразились относительно этой стенки.

Чтобы учесть отражения много раз, можно отразить относительно стенок не только исходный куб, но и его отражения, и их отражения и т.д. до бесконечности. В итоге получится решётка кубов, а каждому отрезку из точки Y в этой решётке будет соответствовать некоторый кусок луча, отражённый произвольное число раз — то число раз, что отрезок пересекает стенки решётки.
> где отражениям будут соответствовать пересечения кубов из решетки
> отрезок пересекает стенки решётки

а, блин, пересечения в физическом смысле
по опыту, если я не понимаю что-то из его пунктов, то это наверняка моя проблема
Вы там свой RTX разрабатываете чтоль? Звучит интересно…
Y — Ваша позиция внутри куба.
• T — Позиция вашей цели внутри куба.

Я так понимаю, эти два значения — набор из трех координат?
(не читал что пишут под другими спойлерами, так что если моё решение полностью совпадает с чужими — это совпадение)
ИдеяПервое что пришло в голову почти сразу после прочтения — отзеркалить куб по всем направлениям во все стороны столько раз, пока между центральным и отзеркаленными во все стороны кубами не будет расстояние, превышающее D — и дальше уже не надо будет никаких геометрических вычислений. Нунжо будет просто понять, как хитро посчитать, в каких отзеркаленных кубах ты сможешь впервые добраться до отзеркаленной в ней точки, не пересекая при этом исходную отзеркаленную точку, а в каких — такое условие будет недостижимо.
Ну точнее не куб, а параллепипед, но не суть.
Собственно, визуализация идея в 2д. Такой подход потребует много оперативной памяти, но раз по условию задачи она неограничена, то всё ок.
Такс, первичная иницилизация всех отраженных кубов и точек цели и себя в них занимает всего долю секунды при параметрах:
• Требуемое время выполнения для N = M = K = 100 и D = 2500

Остается 29.9 секунд, чтобы всё брутфорсом пересчитать)
*глупая улыбка гуманитария* мда, не работать мне в Гугле. :)
А оно надо тебе? ;)
скорее нет, чем да. :)
Я конечно ПОНИмаю все эти ваши заморочки (Глупые яйцеголовый), но если мы находимся в зеркале отражающее лазер температурой выше 1800 градусов Цельсия (температура плавления нержавеющей стали) и наша цель находиться внутри(если это живой объект) то тут остаётся только проломить ему черепушку этим самым оружием из которого собирались стрелять. Рядовой Наливайко выполнил поставленную задачу!
код
import copy
from math import sin, pi
from vg import almost_collinear


def howLong(x1, y1, z1, x2, y2, z2):
    return ((x2-x1)**2+(y2-y1)**2+(z2-z1)**2)**0.5

def appendToExcludeVectors(x1, y1, z1, x2, y2, z2, arr, X, Y, Z, targetL):
    global answer
    vector = [x2-x1, y2-y1, z2-z1]
    targetVector = [X - x1, Y - y1, Z - z1]
    a, b, c = int(sin(vector[1]/(vector[0] or vector[1] or 1000))/(pi/36)), int(sin(vector[2]/(vector[1]or vector[2] or 1000))/(pi/36)), int(sin(vector[2]/(vector[0] or vector[2] or 1000))/(pi/36))
    ar = arr[a][b][c]

    a, b, c = int(sin(targetVector[1]/(targetVector[0] or targetVector[1] or 1000))/(pi/36)), int(sin(targetVector[2]/(targetVector[1]or targetVector[2] or 1000))/(pi/36)), int(sin(targetVector[2]/(targetVector[0] or targetVector[2] or 1000))/(pi/36))
    targetArr = arr[a][b][c]

    l = howLong(x1, y1, z1, x2, y2, z2)
    New = [vector, l, True]
    NewTarget = [targetVector, targetL, False]
    for i in range(len(targetArr)):
        a = targetArr[i]
        v = a[0]

        if almost_collinear([v[0], v[1], v[2]], [targetVector[0], targetVector[1], targetVector[2]]):
            if targetL < a[1]:
                isOldSelf = a[2]
                targetArr[i] = NewTarget
                if isOldSelf:
                    answer += 1
                    break
                else:
                    break
            else:
                break
    else:
        answer += 1
        targetArr.append(NewTarget)

    for i in range(len(ar)):
        a = ar[i]
        v = a[0]
        if almost_collinear([v[0], v[1], v[2]], [vector[0], vector[1], vector[2]]):
            if l < a[1]:
                isOldSelf = a[2]
                ar[i] = New
                if not isOldSelf:
                    answer -= 1
                    return
                else:
                    return
            else:
                return
    else:
        ar.append(New)
        return




if __name__ == "__main__":
    global answer
    answer = 0
    x, y, z = 100,100, 100
    d = 2500
    selfX, selfY, selfZ = map(int, input("введите ваши координаты через пробел \n").split())
    targetX, targetY, targetZ = map(int, input("введите координаты цели через пробел \n").split())
    XX, YY, ZZ = selfX, selfY, selfZ
    selfRTX = []
    targetRTX = []
    excludeVectors = [[[[]for i in range(40)] for x in range(40)] for y in range(40)]
    selfRTX.append([selfX, selfY, selfZ])
    targetRTX.append([targetX, targetY, targetZ])
    bottomX = 0
    topX = x
    bottomY = 0
    topY = y
    bottomZ = 0
    topZ = y

    currentTopSelfx = selfX
    currentBotSelfx = selfX
    currentTopSelfy = selfY
    currentBotSelfy = selfY
    currentTopSelfz = selfZ
    currentBotSelfz = selfZ

    currentTopTargetx = targetX
    currentBotTargetx = targetX
    currentTopTargety = targetY
    currentBotTargety = targetY
    currentTopTargetz = targetY
    currentBotTargetz = targetZ
    # (abs(bottomZ) <= d + z or topZ <= d + z)
    while (abs(bottomX) <= d + x or topX <= d + x):
        topLimit = False
        currentTopSelfx = topX + abs(topX - currentTopSelfx)
        currentTopTargetx = topX + abs(topX - currentTopTargetx)
        l = howLong(*selfRTX[0], currentTopTargetx, targetY, targetZ)
        if l <= d:
            selfRTX.append([currentTopSelfx, selfY, selfZ])
            targetRTX.append([currentTopTargetx, targetY, targetZ])
            appendToExcludeVectors(XX, YY, ZZ, currentTopSelfx, selfY, selfZ, excludeVectors, currentTopTargetx, targetY, targetZ, l)
        else:
            topLimit = True
        topX += x
        currentBotSelfx = bottomX - abs(bottomX - currentBotSelfx)
        currentBotTargetx = bottomX - abs(bottomX - currentBotTargetx)
        l = howLong(*selfRTX[0], currentBotTargetx, targetY, targetZ)
        if l <= d:
            selfRTX.append([currentBotSelfx, selfY, selfZ])
            targetRTX.append([currentBotTargetx, targetY, targetZ])
            appendToExcludeVectors(XX, YY, ZZ, currentBotSelfx, selfY, selfZ, excludeVectors, currentBotTargetx, targetY, targetZ, l)
        elif topLimit:
            break
        bottomX -= x
    Copy = copy.deepcopy(zip(selfRTX, targetRTX))
    for (selfX, selfY, selfZ), (targetX, targetY, targetZ) in Copy:
        bottomY = 0
        topY = y
        currentTopSelfy = selfY
        currentBotSelfy = selfY
        currentTopTargety = targetY
        currentBotTargety = targetY

        while abs(bottomY) <= d + y or topY <= d + y:
            topLimit = False
            currentTopSelfy = topY + abs(topY - currentTopSelfy)
            currentTopTargety = topY + abs(topY - currentTopTargety)
            l = howLong(*selfRTX[0], targetX, currentTopTargety, targetZ)
            if l <= d:
                selfRTX.append([selfX, currentTopSelfy, selfZ])
                targetRTX.append([targetX, currentTopTargety, targetZ])
                appendToExcludeVectors(XX, YY, ZZ, selfX, currentTopSelfy, selfZ, excludeVectors, targetX, currentTopTargety, targetZ, l)
            else:
                topLimit = True
            topY += y
            currentBotSelfy = bottomY - abs(bottomY - currentBotSelfy)
            currentBotTargety = bottomY - abs(bottomY - currentBotTargety)
            l = howLong(*selfRTX[0], targetX, currentBotTargety, targetZ)
            if l <= d:
                selfRTX.append([selfX, currentBotSelfy, selfZ])
                targetRTX.append([targetX, currentBotTargety, targetZ])
                appendToExcludeVectors(XX, YY, ZZ, selfX, currentBotSelfy, selfZ, excludeVectors, targetX, currentBotTargety, targetZ, l)
            elif topLimit:
                break
            bottomY -= y
    Copy = copy.deepcopy(zip(selfRTX, targetRTX))
    for (selfX, selfY, selfZ), (targetX, targetY, targetZ) in Copy:
        bottomZ = 0
        topZ = z
        currentTopSelfz = selfZ
        currentBotSelfz = selfZ
        currentTopTargetz = targetZ
        currentBotTargetz = targetZ
        while abs(bottomZ) <= d + z or topZ <= d + z:
            topLimit = False
            currentTopSelfz = topZ + abs(topZ - currentTopSelfz)
            currentTopTargetz = topZ + abs(topZ - currentTopTargetz)
            l = howLong(*selfRTX[0], targetX, targetY, currentTopTargetz)
            if l <= d:
                selfRTX.append([selfX, selfY, currentTopSelfz])
                targetRTX.append([targetX, targetY, currentTopTargetz])
                appendToExcludeVectors(XX, YY, ZZ, selfX, selfY, currentTopSelfz, excludeVectors, targetX, targetY, currentTopTargetz, l)
            else:
                topLimit = True
            topZ += z
            currentBotSelfz = bottomZ - abs(bottomZ - currentBotSelfz)
            currentBotTargetz = bottomZ - abs(bottomZ - currentBotTargetz)
            l = howLong(*selfRTX[0], targetX, targetY, currentBotTargetz)
            if l <= d:
                selfRTX.append([selfX, selfY, currentBotSelfz])
                targetRTX.append([targetX, targetY, currentBotTargetz])
                appendToExcludeVectors(XX, YY, ZZ, selfX, selfY, currentBotSelfz, excludeVectors,  targetX, targetY, currentBotTargetz, l)
            elif topLimit:
                break
            bottomZ -= z
    print(answer)

На данный момент программа работает несколько минут. (и пока нет обработки исключений, если ты введешь координаты вне границ). У меня уже есть идеи, как уменьшить время работы.
КОД2.0
import copy
from math import degrees, atan
from vg import almost_collinear
from time import time
def sort(x, y):
    if x == y == 0: return 91
    if x == 0 and y < 0: return -90
    if x == 0 and y > 0: return 90
    return int(degrees(atan(y / x)))

def howLong(x1, y1, z1, x2, y2, z2):
    return ((x2-x1)**2+(y2-y1)**2+(z2-z1)**2)**0.5

def appendToExcludeVectors(x1, y1, z1, x2, y2, z2, arr, X, Y, Z, targetL):
    global answer
    vector = [x2-x1, y2-y1, z2-z1]
    targetVector = [X - x1, Y - y1, Z - z1]
    a, b, c = sort(vector[1], vector[0]), sort(vector[2], vector[0]), sort(vector[2], vector[1])
    ar = arr[a][b][c]
    a, b, c = sort(targetVector[1], targetVector[0]), sort(targetVector[2], targetVector[0]), sort(targetVector[2], targetVector[1])
    targetArr = arr[a][b][c]
    l = howLong(x1, y1, z1, x2, y2, z2)
    New = [vector, l, True]
    NewTarget = [targetVector, targetL, False]
    for i in range(len(targetArr)):
        a = targetArr[i]
        v = a[0]

        if almost_collinear([v[0], v[1], v[2]], [targetVector[0], targetVector[1], targetVector[2]]):
            if targetL < a[1]:
                isOldSelf = a[2]
                targetArr[i] = NewTarget
                if isOldSelf:
                    answer += 1
                    break
                else:
                    break
            else:
                break
    else:
        answer += 1
        targetArr.append(NewTarget)

    for i in range(len(ar)):
        a = ar[i]
        v = a[0]
        if almost_collinear([v[0], v[1], v[2]], [vector[0], vector[1], vector[2]]):
            if l < a[1]:
                isOldSelf = a[2]
                ar[i] = New
                if not isOldSelf:
                    answer -= 1
                    return
                else:
                    return
            else:
                return
    else:
        ar.append(New)
        return




if __name__ == "__main__":
    t = (time())
    global answer
    answer = 0
    x, y, z = 100,100, 100
    d = 2500
    selfX, selfY, selfZ = map(int, input("введите ваши координаты через пробел \n").split())
    targetX, targetY, targetZ = map(int, input("введите координаты цели через пробел \n").split())
    XX, YY, ZZ = selfX, selfY, selfZ
    selfRTX = []
    targetRTX = []
    excludeVectors = [[[[]for i in range(181)] for x in range(181)] for y in range(181)]
    selfRTX.append([selfX, selfY, selfZ])
    targetRTX.append([targetX, targetY, targetZ])
    bottomX = 0
    topX = x
    bottomY = 0
    topY = y
    bottomZ = 0
    topZ = y

    currentTopSelfx = selfX
    currentBotSelfx = selfX
    currentTopSelfy = selfY
    currentBotSelfy = selfY
    currentTopSelfz = selfZ
    currentBotSelfz = selfZ

    currentTopTargetx = targetX
    currentBotTargetx = targetX
    currentTopTargety = targetY
    currentBotTargety = targetY
    currentTopTargetz = targetY
    currentBotTargetz = targetZ
    # (abs(bottomZ) <= d + z or topZ <= d + z)
    while (abs(bottomX) <= d + x or topX <= d + x):
        topLimit = False
        currentTopSelfx = topX + abs(topX - currentTopSelfx)
        currentTopTargetx = topX + abs(topX - currentTopTargetx)
        l = howLong(*selfRTX[0], currentTopTargetx, targetY, targetZ)
        if l <= d:
            selfRTX.append([currentTopSelfx, selfY, selfZ])
            targetRTX.append([currentTopTargetx, targetY, targetZ])
            appendToExcludeVectors(XX, YY, ZZ, currentTopSelfx, selfY, selfZ, excludeVectors, currentTopTargetx, targetY, targetZ, l)
        else:
            topLimit = True
        topX += x
        currentBotSelfx = bottomX - abs(bottomX - currentBotSelfx)
        currentBotTargetx = bottomX - abs(bottomX - currentBotTargetx)
        l = howLong(*selfRTX[0], currentBotTargetx, targetY, targetZ)
        if l <= d:
            selfRTX.append([currentBotSelfx, selfY, selfZ])
            targetRTX.append([currentBotTargetx, targetY, targetZ])
            appendToExcludeVectors(XX, YY, ZZ, currentBotSelfx, selfY, selfZ, excludeVectors, currentBotTargetx, targetY, targetZ, l)
        elif topLimit:
            break
        bottomX -= x
    Copy = copy.deepcopy(zip(selfRTX, targetRTX))
    for (selfX, selfY, selfZ), (targetX, targetY, targetZ) in Copy:
        bottomY = 0
        topY = y
        currentTopSelfy = selfY
        currentBotSelfy = selfY
        currentTopTargety = targetY
        currentBotTargety = targetY

        while abs(bottomY) <= d + y or topY <= d + y:
            topLimit = False
            currentTopSelfy = topY + abs(topY - currentTopSelfy)
            currentTopTargety = topY + abs(topY - currentTopTargety)
            l = howLong(*selfRTX[0], targetX, currentTopTargety, targetZ)
            if l <= d:
                selfRTX.append([selfX, currentTopSelfy, selfZ])
                targetRTX.append([targetX, currentTopTargety, targetZ])
                appendToExcludeVectors(XX, YY, ZZ, selfX, currentTopSelfy, selfZ, excludeVectors, targetX, currentTopTargety, targetZ, l)
            else:
                topLimit = True
            topY += y
            currentBotSelfy = bottomY - abs(bottomY - currentBotSelfy)
            currentBotTargety = bottomY - abs(bottomY - currentBotTargety)
            l = howLong(*selfRTX[0], targetX, currentBotTargety, targetZ)
            if l <= d:
                selfRTX.append([selfX, currentBotSelfy, selfZ])
                targetRTX.append([targetX, currentBotTargety, targetZ])
                appendToExcludeVectors(XX, YY, ZZ, selfX, currentBotSelfy, selfZ, excludeVectors, targetX, currentBotTargety, targetZ, l)
            elif topLimit:
                break
            bottomY -= y
    Copy = copy.deepcopy(zip(selfRTX, targetRTX))
    for (selfX, selfY, selfZ), (targetX, targetY, targetZ) in Copy:

        bottomZ = 0
        topZ = z
        currentTopSelfz = selfZ
        currentBotSelfz = selfZ
        currentTopTargetz = targetZ
        currentBotTargetz = targetZ
        while abs(bottomZ) <= d + z or topZ <= d + z:
            topLimit = False
            currentTopSelfz = topZ + abs(topZ - currentTopSelfz)
            currentTopTargetz = topZ + abs(topZ - currentTopTargetz)
            l = howLong(*selfRTX[0], targetX, targetY, currentTopTargetz)
            if l <= d:
                selfRTX.append([selfX, selfY, currentTopSelfz])
                targetRTX.append([targetX, targetY, currentTopTargetz])
                appendToExcludeVectors(XX, YY, ZZ, selfX, selfY, currentTopSelfz, excludeVectors, targetX, targetY, currentTopTargetz, l)
            else:
                topLimit = True
            topZ += z
            currentBotSelfz = bottomZ - abs(bottomZ - currentBotSelfz)
            currentBotTargetz = bottomZ - abs(bottomZ - currentBotTargetz)
            l = howLong(*selfRTX[0], targetX, targetY, currentBotTargetz)
            if l <= d:
                selfRTX.append([selfX, selfY, currentBotSelfz])
                targetRTX.append([targetX, targetY, currentBotTargetz])
                appendToExcludeVectors(XX, YY, ZZ, selfX, selfY, currentBotSelfz, excludeVectors,  targetX, targetY, currentBotTargetz, l)
            elif topLimit:
                break
            bottomZ -= z
    print(answer)
    print("время выполнения: ", time() - t)

x, y, z = 100,100, 100
d = 2500

введите ваши координаты через пробел
25 25 25
введите координаты цели через пробел
30 30 30
65250
время выполнения: 28.195964336395264
время выполнения: 28.195964336395264

Это значение можно уменьшать, увеличивая этот массив:
excludeVectors = [[[[]for i in range(181)] for x in range(181)] for y in range(181)]

И равномерно с этим увеличивая точность функции sort.
Можешь без 3rd party либ сделать? Можешь даже скопировать функцию, просто чтобы остались импорты только из стандартной либы.
Просто скопировать функции из нампая и вг? Ок.
Вряд ли, функция almost_collinear тащит с собой аж целый сишный numpy
блин, нампай не так уж и просто скопировать… если прям одним файлом.
От vg избавился, а вот нампай ну никак не убрать. Там есть еще сторонние библиотеки, которые я просто так в файл не вставлю.
import copy
from math import degrees, atan
from time import time
from numpy import cross, isclose, linalg

def almost_collinear(v1, v2, atol=1e-08):
    Cross = cross(v1, v2)
    norm = linalg.norm(Cross)
    return isclose(norm, 0.0, rtol=0, atol=atol)

def sort(x, y):
    if x == y == 0: return 91
    if x == 0 and y < 0: return -90
    if x == 0 and y > 0: return 90
    return int(degrees(atan(y / x)))

def howLong(x1, y1, z1, x2, y2, z2):
    return ((x2-x1)**2+(y2-y1)**2+(z2-z1)**2)**0.5

def appendToExcludeVectors(x1, y1, z1, x2, y2, z2, arr, X, Y, Z, targetL):
    global answer
    vector = [x2-x1, y2-y1, z2-z1]
    targetVector = [X - x1, Y - y1, Z - z1]
    a, b, c = sort(vector[1], vector[0]), sort(vector[2], vector[0]), sort(vector[2], vector[1])
    ar = arr[a][b][c]
    a, b, c = sort(targetVector[1], targetVector[0]), sort(targetVector[2], targetVector[0]), sort(targetVector[2], targetVector[1])
    targetArr = arr[a][b][c]
    l = howLong(x1, y1, z1, x2, y2, z2)
    New = [vector, l, True]
    NewTarget = [targetVector, targetL, False]
    for i in range(len(targetArr)):
        a = targetArr[i]
        v = a[0]

        if almost_collinear([v[0], v[1], v[2]], [targetVector[0], targetVector[1], targetVector[2]]):
            if targetL < a[1]:
                isOldSelf = a[2]
                targetArr[i] = NewTarget
                if isOldSelf:
                    answer += 1
                    break
                else:
                    break
            else:
                break
    else:
        answer += 1
        targetArr.append(NewTarget)

    for i in range(len(ar)):
        a = ar[i]
        v = a[0]
        if almost_collinear([v[0], v[1], v[2]], [vector[0], vector[1], vector[2]]):
            if l < a[1]:
                isOldSelf = a[2]
                ar[i] = New
                if not isOldSelf:
                    answer -= 1
                    return
                else:
                    return
            else:
                return
    else:
        ar.append(New)
        return




if __name__ == "__main__":
    t = (time())
    global answer
    answer = 0
    x, y, z = 100,100, 100
    d = 2500
    selfX, selfY, selfZ = map(int, input("введите ваши координаты через пробел \n").split())
    targetX, targetY, targetZ = map(int, input("введите координаты цели через пробел \n").split())
    XX, YY, ZZ = selfX, selfY, selfZ
    selfRTX = []
    targetRTX = []
    excludeVectors = [[[[]for i in range(181)] for x in range(181)] for y in range(181)]
    selfRTX.append([selfX, selfY, selfZ])
    targetRTX.append([targetX, targetY, targetZ])
    bottomX = 0
    topX = x
    bottomY = 0
    topY = y
    bottomZ = 0
    topZ = y

    currentTopSelfx = selfX
    currentBotSelfx = selfX
    currentTopSelfy = selfY
    currentBotSelfy = selfY
    currentTopSelfz = selfZ
    currentBotSelfz = selfZ

    currentTopTargetx = targetX
    currentBotTargetx = targetX
    currentTopTargety = targetY
    currentBotTargety = targetY
    currentTopTargetz = targetY
    currentBotTargetz = targetZ
    # (abs(bottomZ) <= d + z or topZ <= d + z)
    while (abs(bottomX) <= d + x or topX <= d + x):
        topLimit = False
        currentTopSelfx = topX + abs(topX - currentTopSelfx)
        currentTopTargetx = topX + abs(topX - currentTopTargetx)
        l = howLong(*selfRTX[0], currentTopTargetx, targetY, targetZ)
        if l <= d:
            selfRTX.append([currentTopSelfx, selfY, selfZ])
            targetRTX.append([currentTopTargetx, targetY, targetZ])
            appendToExcludeVectors(XX, YY, ZZ, currentTopSelfx, selfY, selfZ, excludeVectors, currentTopTargetx, targetY, targetZ, l)
        else:
            topLimit = True
        topX += x
        currentBotSelfx = bottomX - abs(bottomX - currentBotSelfx)
        currentBotTargetx = bottomX - abs(bottomX - currentBotTargetx)
        l = howLong(*selfRTX[0], currentBotTargetx, targetY, targetZ)
        if l <= d:
            selfRTX.append([currentBotSelfx, selfY, selfZ])
            targetRTX.append([currentBotTargetx, targetY, targetZ])
            appendToExcludeVectors(XX, YY, ZZ, currentBotSelfx, selfY, selfZ, excludeVectors, currentBotTargetx, targetY, targetZ, l)
        elif topLimit:
            break
        bottomX -= x
    Copy = copy.deepcopy(zip(selfRTX, targetRTX))
    for (selfX, selfY, selfZ), (targetX, targetY, targetZ) in Copy:
        bottomY = 0
        topY = y
        currentTopSelfy = selfY
        currentBotSelfy = selfY
        currentTopTargety = targetY
        currentBotTargety = targetY

        while abs(bottomY) <= d + y or topY <= d + y:
            topLimit = False
            currentTopSelfy = topY + abs(topY - currentTopSelfy)
            currentTopTargety = topY + abs(topY - currentTopTargety)
            l = howLong(*selfRTX[0], targetX, currentTopTargety, targetZ)
            if l <= d:
                selfRTX.append([selfX, currentTopSelfy, selfZ])
                targetRTX.append([targetX, currentTopTargety, targetZ])
                appendToExcludeVectors(XX, YY, ZZ, selfX, currentTopSelfy, selfZ, excludeVectors, targetX, currentTopTargety, targetZ, l)
            else:
                topLimit = True
            topY += y
            currentBotSelfy = bottomY - abs(bottomY - currentBotSelfy)
            currentBotTargety = bottomY - abs(bottomY - currentBotTargety)
            l = howLong(*selfRTX[0], targetX, currentBotTargety, targetZ)
            if l <= d:
                selfRTX.append([selfX, currentBotSelfy, selfZ])
                targetRTX.append([targetX, currentBotTargety, targetZ])
                appendToExcludeVectors(XX, YY, ZZ, selfX, currentBotSelfy, selfZ, excludeVectors, targetX, currentBotTargety, targetZ, l)
            elif topLimit:
                break
            bottomY -= y
    Copy = copy.deepcopy(zip(selfRTX, targetRTX))
    for (selfX, selfY, selfZ), (targetX, targetY, targetZ) in Copy:

        bottomZ = 0
        topZ = z
        currentTopSelfz = selfZ
        currentBotSelfz = selfZ
        currentTopTargetz = targetZ
        currentBotTargetz = targetZ
        while abs(bottomZ) <= d + z or topZ <= d + z:
            topLimit = False
            currentTopSelfz = topZ + abs(topZ - currentTopSelfz)
            currentTopTargetz = topZ + abs(topZ - currentTopTargetz)
            l = howLong(*selfRTX[0], targetX, targetY, currentTopTargetz)
            if l <= d:
                selfRTX.append([selfX, selfY, currentTopSelfz])
                targetRTX.append([targetX, targetY, currentTopTargetz])
                appendToExcludeVectors(XX, YY, ZZ, selfX, selfY, currentTopSelfz, excludeVectors, targetX, targetY, currentTopTargetz, l)
            else:
                topLimit = True
            topZ += z
            currentBotSelfz = bottomZ - abs(bottomZ - currentBotSelfz)
            currentBotTargetz = bottomZ - abs(bottomZ - currentBotTargetz)
            l = howLong(*selfRTX[0], targetX, targetY, currentBotTargetz)
            if l <= d:
                selfRTX.append([selfX, selfY, currentBotSelfz])
                targetRTX.append([targetX, targetY, currentBotTargetz])
                appendToExcludeVectors(XX, YY, ZZ, selfX, selfY, currentBotSelfz, excludeVectors,  targetX, targetY, currentBotTargetz, l)
            elif topLimit:
                break
            bottomZ -= z
    print(answer)
    print("время выполнения: ", time() - t)
Конечно, коллинеарность векторов можно и вручную проверить. Но блин… зачем самому кодить то, что за тебя уже накодено?
Ну, такие требования для удобства проверки. Забыл правило про стандартную библиотеку указать в посте.
Всё, требования выполнены. только стандартные библиотеки питона 3.
время выполнения: 7.9893951416015625
ОГО. Я все-таки убрал нампай и все прочие сторонние библиотеки. прирост скорости почти в 4 раза!!!
Спойлер
import copy
from math import degrees, atan
from time import time

def collinear(v1, v2, l1, l2, epsilon = 0.000001):
    unitV1 = [v1[0]/l1, v1[1]/l1, v1[2]/l1]
    unitV2 = [v2[0]/l2, v2[1]/l2, v2[2]/l2]
    return unitV1[0] - epsilon < unitV2[0] < unitV1[0] + epsilon and unitV1[1] - epsilon < unitV2[1] < unitV1[1] + epsilon and unitV1[2] - epsilon < unitV2[2] < unitV1[2]

def sort(x, y):
    if x == y == 0: return 91
    if x == 0 and y < 0: return -90
    if x == 0 and y > 0: return 90
    return int(degrees(atan(y / x)))

def howLong(x1, y1, z1, x2, y2, z2):
    return ((x2-x1)**2+(y2-y1)**2+(z2-z1)**2)**0.5

def appendToExcludeVectors(x1, y1, z1, x2, y2, z2, arr, X, Y, Z, targetL):
    global answer
    vector = [x2-x1, y2-y1, z2-z1]
    targetVector = [X - x1, Y - y1, Z - z1]
    a, b, c = sort(vector[1], vector[0]), sort(vector[2], vector[0]), sort(vector[2], vector[1])
    ar = arr[a][b][c]
    a, b, c = sort(targetVector[1], targetVector[0]), sort(targetVector[2], targetVector[0]), sort(targetVector[2], targetVector[1])
    targetArr = arr[a][b][c]
    l = howLong(x1, y1, z1, x2, y2, z2)
    New = [vector, l, True]
    NewTarget = [targetVector, targetL, False]
    for i in range(len(targetArr)):
        a = targetArr[i]
        v = a[0]

        if collinear([v[0], v[1], v[2]], [targetVector[0], targetVector[1], targetVector[2]], a[1], targetL):
            if targetL < a[1]:
                isOldSelf = a[2]
                targetArr[i] = NewTarget
                if isOldSelf:
                    answer += 1
                    break
                else:
                    break
            else:
                break
    else:
        answer += 1
        targetArr.append(NewTarget)

    for i in range(len(ar)):
        a = ar[i]
        v = a[0]
        if collinear([v[0], v[1], v[2]], [vector[0], vector[1], vector[2]], a[1], l):
            if l < a[1]:
                isOldSelf = a[2]
                ar[i] = New
                if not isOldSelf:
                    answer -= 1
                    return
                else:
                    return
            else:
                return
    else:
        ar.append(New)
        return

if __name__ == "__main__":
    t = (time())
    global answer
    answer = 0
    x, y, z = 100,100, 100
    d = 2500
    selfX, selfY, selfZ = map(int, input("введите ваши координаты через пробел \n").split())
    targetX, targetY, targetZ = map(int, input("введите координаты цели через пробел \n").split())
    XX, YY, ZZ = selfX, selfY, selfZ
    selfRTX = []
    targetRTX = []
    excludeVectors = [[[[]for i in range(181)] for x in range(181)] for y in range(181)]
    selfRTX.append([selfX, selfY, selfZ])
    targetRTX.append([targetX, targetY, targetZ])
    bottomX = 0
    topX = x
    bottomY = 0
    topY = y
    bottomZ = 0
    topZ = y

    currentTopSelfx = selfX
    currentBotSelfx = selfX
    currentTopSelfy = selfY
    currentBotSelfy = selfY
    currentTopSelfz = selfZ
    currentBotSelfz = selfZ

    currentTopTargetx = targetX
    currentBotTargetx = targetX
    currentTopTargety = targetY
    currentBotTargety = targetY
    currentTopTargetz = targetY
    currentBotTargetz = targetZ
    # (abs(bottomZ) <= d + z or topZ <= d + z)
    while (abs(bottomX) <= d + x or topX <= d + x):
        topLimit = False
        currentTopSelfx = topX + abs(topX - currentTopSelfx)
        currentTopTargetx = topX + abs(topX - currentTopTargetx)
        l = howLong(*selfRTX[0], currentTopTargetx, targetY, targetZ)
        if l <= d:
            selfRTX.append([currentTopSelfx, selfY, selfZ])
            targetRTX.append([currentTopTargetx, targetY, targetZ])
            appendToExcludeVectors(XX, YY, ZZ, currentTopSelfx, selfY, selfZ, excludeVectors, currentTopTargetx, targetY, targetZ, l)
        else:
            topLimit = True
        topX += x
        currentBotSelfx = bottomX - abs(bottomX - currentBotSelfx)
        currentBotTargetx = bottomX - abs(bottomX - currentBotTargetx)
        l = howLong(*selfRTX[0], currentBotTargetx, targetY, targetZ)
        if l <= d:
            selfRTX.append([currentBotSelfx, selfY, selfZ])
            targetRTX.append([currentBotTargetx, targetY, targetZ])
            appendToExcludeVectors(XX, YY, ZZ, currentBotSelfx, selfY, selfZ, excludeVectors, currentBotTargetx, targetY, targetZ, l)
        elif topLimit:
            break
        bottomX -= x
    Copy = copy.deepcopy(zip(selfRTX, targetRTX))
    for (selfX, selfY, selfZ), (targetX, targetY, targetZ) in Copy:
        bottomY = 0
        topY = y
        currentTopSelfy = selfY
        currentBotSelfy = selfY
        currentTopTargety = targetY
        currentBotTargety = targetY

        while abs(bottomY) <= d + y or topY <= d + y:
            topLimit = False
            currentTopSelfy = topY + abs(topY - currentTopSelfy)
            currentTopTargety = topY + abs(topY - currentTopTargety)
            l = howLong(*selfRTX[0], targetX, currentTopTargety, targetZ)
            if l <= d:
                selfRTX.append([selfX, currentTopSelfy, selfZ])
                targetRTX.append([targetX, currentTopTargety, targetZ])
                appendToExcludeVectors(XX, YY, ZZ, selfX, currentTopSelfy, selfZ, excludeVectors, targetX, currentTopTargety, targetZ, l)
            else:
                topLimit = True
            topY += y
            currentBotSelfy = bottomY - abs(bottomY - currentBotSelfy)
            currentBotTargety = bottomY - abs(bottomY - currentBotTargety)
            l = howLong(*selfRTX[0], targetX, currentBotTargety, targetZ)
            if l <= d:
                selfRTX.append([selfX, currentBotSelfy, selfZ])
                targetRTX.append([targetX, currentBotTargety, targetZ])
                appendToExcludeVectors(XX, YY, ZZ, selfX, currentBotSelfy, selfZ, excludeVectors, targetX, currentBotTargety, targetZ, l)
            elif topLimit:
                break
            bottomY -= y
    Copy = copy.deepcopy(zip(selfRTX, targetRTX))
    for (selfX, selfY, selfZ), (targetX, targetY, targetZ) in Copy:

        bottomZ = 0
        topZ = z
        currentTopSelfz = selfZ
        currentBotSelfz = selfZ
        currentTopTargetz = targetZ
        currentBotTargetz = targetZ
        while abs(bottomZ) <= d + z or topZ <= d + z:
            topLimit = False
            currentTopSelfz = topZ + abs(topZ - currentTopSelfz)
            currentTopTargetz = topZ + abs(topZ - currentTopTargetz)
            l = howLong(*selfRTX[0], targetX, targetY, currentTopTargetz)
            if l <= d:
                selfRTX.append([selfX, selfY, currentTopSelfz])
                targetRTX.append([targetX, targetY, currentTopTargetz])
                appendToExcludeVectors(XX, YY, ZZ, selfX, selfY, currentTopSelfz, excludeVectors, targetX, targetY, currentTopTargetz, l)
            else:
                topLimit = True
            topZ += z
            currentBotSelfz = bottomZ - abs(bottomZ - currentBotSelfz)
            currentBotTargetz = bottomZ - abs(bottomZ - currentBotTargetz)
            l = howLong(*selfRTX[0], targetX, targetY, currentBotTargetz)
            if l <= d:
                selfRTX.append([selfX, selfY, currentBotSelfz])
                targetRTX.append([targetX, targetY, currentBotTargetz])
                appendToExcludeVectors(XX, YY, ZZ, selfX, selfY, currentBotSelfz, excludeVectors,  targetX, targetY, currentBotTargetz, l)
            elif topLimit:
                break
            bottomZ -= z
    print(answer)
    print("время выполнения: ", time() - t)
В идеале, нужно сделать так, чтоб епсилон уменьшался пропорционально увеличению расстояния от начала. Если это нужно обязательно, напиши плиз.
небольшой фикс погрешности
import copy
from math import degrees, atan
from time import time

def collinear(v1, v2, l1, l2, epsilon=0.000001):
    unitV1 = [v1[0]/l1, v1[1]/l1, v1[2]/l1]
    unitV2 = [v2[0]/l2, v2[1]/l2, v2[2]/l2]
    return unitV1[0] - epsilon < unitV2[0] < unitV1[0] + epsilon and unitV1[1] - epsilon < unitV2[1] < unitV1[1] + epsilon and unitV1[2] - epsilon < unitV2[2] < unitV1[2] + epsilon

def sort(x, y):
    if x == y == 0: return 91
    if x == 0 and y < 0: return -90
    if x == 0 and y > 0: return 90
    return int(degrees(atan(y / x)))

def howLong(x1, y1, z1, x2, y2, z2):
    return ((x2-x1)**2+(y2-y1)**2+(z2-z1)**2)**0.5

def appendToExcludeVectors(x1, y1, z1, x2, y2, z2, arr, X, Y, Z, targetL):
    global answer
    vector = [x2-x1, y2-y1, z2-z1]
    targetVector = [X - x1, Y - y1, Z - z1]
    a, b, c = sort(vector[1], vector[0]), sort(vector[2], vector[0]), sort(vector[2], vector[1])
    ar = arr[a][b][c]
    a, b, c = sort(targetVector[1], targetVector[0]), sort(targetVector[2], targetVector[0]), sort(targetVector[2], targetVector[1])
    targetArr = arr[a][b][c]
    l = howLong(x1, y1, z1, x2, y2, z2)
    New = [vector, l, True]
    NewTarget = [targetVector, targetL, False]
    for i in range(len(targetArr)):
        a = targetArr[i]
        v = a[0]

        if collinear([v[0], v[1], v[2]], [targetVector[0], targetVector[1], targetVector[2]], a[1], targetL):
            if targetL < a[1]:
                isOldSelf = a[2]
                targetArr[i] = NewTarget
                if isOldSelf:
                    answer += 1
                    break
                else:
                    break
            else:
                break
    else:
        answer += 1
        targetArr.append(NewTarget)

    for i in range(len(ar)):
        a = ar[i]
        v = a[0]
        if collinear([v[0], v[1], v[2]], [vector[0], vector[1], vector[2]], a[1], l):
            if l < a[1]:
                isOldSelf = a[2]
                ar[i] = New
                if not isOldSelf:
                    answer -= 1
                    return
                else:
                    return
            else:
                return
    else:
        ar.append(New)
        return

if __name__ == "__main__":
    t = (time())
    global answer
    answer = 0
    x, y, z = 100,100, 100
    d = 2500
    selfX, selfY, selfZ = map(int, input("введите ваши координаты через пробел \n").split())
    targetX, targetY, targetZ = map(int, input("введите координаты цели через пробел \n").split())
    XX, YY, ZZ = selfX, selfY, selfZ
    selfRTX = []
    targetRTX = []
    excludeVectors = [[[[]for i in range(181)] for x in range(181)] for y in range(181)]
    selfRTX.append([selfX, selfY, selfZ])
    targetRTX.append([targetX, targetY, targetZ])
    bottomX = 0
    topX = x
    bottomY = 0
    topY = y
    bottomZ = 0
    topZ = y

    currentTopSelfx = selfX
    currentBotSelfx = selfX
    currentTopSelfy = selfY
    currentBotSelfy = selfY
    currentTopSelfz = selfZ
    currentBotSelfz = selfZ

    currentTopTargetx = targetX
    currentBotTargetx = targetX
    currentTopTargety = targetY
    currentBotTargety = targetY
    currentTopTargetz = targetY
    currentBotTargetz = targetZ
    # (abs(bottomZ) <= d + z or topZ <= d + z)
    while (abs(bottomX) <= d + x or topX <= d + x):
        topLimit = False
        currentTopSelfx = topX + abs(topX - currentTopSelfx)
        currentTopTargetx = topX + abs(topX - currentTopTargetx)
        l = howLong(*selfRTX[0], currentTopTargetx, targetY, targetZ)
        if l <= d:
            selfRTX.append([currentTopSelfx, selfY, selfZ])
            targetRTX.append([currentTopTargetx, targetY, targetZ])
            appendToExcludeVectors(XX, YY, ZZ, currentTopSelfx, selfY, selfZ, excludeVectors, currentTopTargetx, targetY, targetZ, l)
        else:
            topLimit = True
        topX += x
        currentBotSelfx = bottomX - abs(bottomX - currentBotSelfx)
        currentBotTargetx = bottomX - abs(bottomX - currentBotTargetx)
        l = howLong(*selfRTX[0], currentBotTargetx, targetY, targetZ)
        if l <= d:
            selfRTX.append([currentBotSelfx, selfY, selfZ])
            targetRTX.append([currentBotTargetx, targetY, targetZ])
            appendToExcludeVectors(XX, YY, ZZ, currentBotSelfx, selfY, selfZ, excludeVectors, currentBotTargetx, targetY, targetZ, l)
        elif topLimit:
            break
        bottomX -= x
    Copy = copy.deepcopy(zip(selfRTX, targetRTX))
    for (selfX, selfY, selfZ), (targetX, targetY, targetZ) in Copy:
        bottomY = 0
        topY = y
        currentTopSelfy = selfY
        currentBotSelfy = selfY
        currentTopTargety = targetY
        currentBotTargety = targetY

        while abs(bottomY) <= d + y or topY <= d + y:
            topLimit = False
            currentTopSelfy = topY + abs(topY - currentTopSelfy)
            currentTopTargety = topY + abs(topY - currentTopTargety)
            l = howLong(*selfRTX[0], targetX, currentTopTargety, targetZ)
            if l <= d:
                selfRTX.append([selfX, currentTopSelfy, selfZ])
                targetRTX.append([targetX, currentTopTargety, targetZ])
                appendToExcludeVectors(XX, YY, ZZ, selfX, currentTopSelfy, selfZ, excludeVectors, targetX, currentTopTargety, targetZ, l)
            else:
                topLimit = True
            topY += y
            currentBotSelfy = bottomY - abs(bottomY - currentBotSelfy)
            currentBotTargety = bottomY - abs(bottomY - currentBotTargety)
            l = howLong(*selfRTX[0], targetX, currentBotTargety, targetZ)
            if l <= d:
                selfRTX.append([selfX, currentBotSelfy, selfZ])
                targetRTX.append([targetX, currentBotTargety, targetZ])
                appendToExcludeVectors(XX, YY, ZZ, selfX, currentBotSelfy, selfZ, excludeVectors, targetX, currentBotTargety, targetZ, l)
            elif topLimit:
                break
            bottomY -= y
    Copy = copy.deepcopy(zip(selfRTX, targetRTX))
    for (selfX, selfY, selfZ), (targetX, targetY, targetZ) in Copy:

        bottomZ = 0
        topZ = z
        currentTopSelfz = selfZ
        currentBotSelfz = selfZ
        currentTopTargetz = targetZ
        currentBotTargetz = targetZ
        while abs(bottomZ) <= d + z or topZ <= d + z:
            topLimit = False
            currentTopSelfz = topZ + abs(topZ - currentTopSelfz)
            currentTopTargetz = topZ + abs(topZ - currentTopTargetz)
            l = howLong(*selfRTX[0], targetX, targetY, currentTopTargetz)
            if l <= d:
                selfRTX.append([selfX, selfY, currentTopSelfz])
                targetRTX.append([targetX, targetY, currentTopTargetz])
                appendToExcludeVectors(XX, YY, ZZ, selfX, selfY, currentTopSelfz, excludeVectors, targetX, targetY, currentTopTargetz, l)
            else:
                topLimit = True
            topZ += z
            currentBotSelfz = bottomZ - abs(bottomZ - currentBotSelfz)
            currentBotTargetz = bottomZ - abs(bottomZ - currentBotTargetz)
            l = howLong(*selfRTX[0], targetX, targetY, currentBotTargetz)
            if l <= d:
                selfRTX.append([selfX, selfY, currentBotSelfz])
                targetRTX.append([targetX, targetY, currentBotTargetz])
                appendToExcludeVectors(XX, YY, ZZ, selfX, selfY, currentBotSelfz, excludeVectors,  targetX, targetY, currentBotTargetz, l)
            elif topLimit:
                break
            bottomZ -= z
    print(answer)
    print("время выполнения: ", time() - t)
Так самое главное: Когда флаер уйдет работать в Гугл? И что останется от Гугла после него.
А гугле не дураки сидят, наверняка смогут показать и рассказать как пользоваться ведром и шваброй.
Главное пылесоса ему не давать, а то сервак из розетки выдернет, чтоб его включить))
Ему не в Гуголь, а в Эппл надо. К Тиму Куку. :3
троянский понь
Хром начнет жрать столько оперативки, сколько не способна проиндексировать 64-битная система.
Я хоть полностью тупой болван который хоть сто раз прочти это и всё равно ничего не допрёт, но даже я понимаю что суть задачи в не в том чтобы решить его, а именно придумать такой метод решения который должен поразить людей.

И даже так, зная чем сегодня стал Гугл, принципиальные люди пойдут туда в последнюю очередь.
Гуглу же надо по квоте набирать всяких пидарасов и аутистов — а Фраер идеально подходит по обеим пунктам))
принципиальные люди пойдут туда в последнюю очередь
Шо, уже даже мелкомягкие и мылосру стали лучше? Я чего-то пропустил?
Лично я, например, модному, но политически ангажированному Гуглу с анальными правилами предпочту обычную галеру. И вообще я не люблю олимпиадные задачи на собеседованиях.
Уж лучше интересные олимпиадные задачи, чем вопросы по типу «расскажи что такое и для чего нужен BASE64», ответы на которые легко гуглятся, но на собеседовании его юзать не дадут.
А олимпиадные задачи тебе на реальном проекте никто решать не даст, потому что проектов, где этот скилл на самом деле может пригодиться — единицы.
Я прекрасно это знаю. Я уже работаю кодером пол года как и знаю как выглядит корпоративная разработка.
Вообще скилл олимпиадных задач в целом слабоприменим, излишняя практика в них может даже немного навредить. Больше ценится умение писать простой и понятный код, который потом поймут и без твоего личного присутствия рядом, и не придется слишком сильно обвешивать костылями, если что-то вдруг изменится.
Наверно там как везде. Ты либо сумрачный гений мега узкой специализации которого очень «невозможно» уволить или просто компанейский парень которому даже блат не нужен и его берут куда угодно просто потому что с ним интересно и которому достаточно просто не лажать.
На самом деле любая «именитая» корпорация не очень: они прекрасно знают, что могут творить лютую фигню, потому что к ним попрутся ради строчки в резюме. Топовым спецам мб там и норм.
Топовым спецам везде норм.

Поправил
Нууу, не везде, мелкая шарашка топовому спецу не даст столько, сколько он хочет
Занимается тем же, что любая корпорация с капитализацией больше одного миллиарда. Гугл делает всё то же самое что и твич, фейскук, эппл даже больших масштабах, только никто особо это не освещает.

Я бы тупо перенаправил тебя на сторону полки с книгой «Живи, вкалывай, сдохни». Но я сам только скачал и собираюсь начать, там более глубоко все разобрано.
даже пиксар… бляяя…
сделал большой рефакторинг, добавил комментарии где это нужно и залил на гитхаб: github.com/Sasha-Flyer/Shimmermare_quest
А Sasha-Flyer почему заминусили? Он что-то не то написал?
Не волнуйся, сейчас Флаера минусят за то, что он Флаер, вне зависимости от содержания его комментариев.
Sasha-Flyer побеждает и получает инвайт.

Моё референсное решение, которое я написал за час и особо не тестировал: gist.github.com/Shimmermare/2ce043acbb22e840bda59bedfad0b334 Скорее всего, там что-то не учтено, но это на самом деле не важно, ибо как выше написали — главное подход.

На будущее советую победителю писать более читаемый код. В следующем челленже его ждёт 9 задач уровня от «отсортировать массив» до «заставит PhD in CS задуматься». 6 из них нужно решить, чтобы получить шанс пройти дальше. На каждую из задач будет отведено от двух до 10 дней. Решения проверяет автоматика, а оценивает человек. Если решения будут интересными, то в течение 1-6 месяцев с ним свяжется рекрутёр. Если дело дойдёт до собеседования — понадобится разговорный английский.

Интересный опыт, может быть повторю ещё раз.
Усе хлопцы, все по бункерам… Ща Фраерское ЧСВ лопнет и забрызгает весь табун…
ЧСВ

Повод-то действительно есть. Он взял и сделал, а я нет.
Я не хочу в Гугл, я завален работой, а последние два дня вообще готовлю экспедицию и по уши в спальниках с консервами.
Но факт остаётся фактом. Молодец.
Фраер уже показал мегаскиллуху со своей уберККИ… после этого его трепыхания в кодинг всерьез не воспринимаются.
Фраер уже показал мегаскиллуху со своей уберККИ… после этого его трепыхания в кодинг всерьез не воспринимаются.

Ну может он исправился и пошёл на путь истинный, чё ты пессимист такой

Идея для стартапа: юзерскрипт, автоматический цитирующий комменты KerHarrad'а в ответах, специально для Флаера
Запустить на табун десяток нейросетей натасканных на срач)) И кто кого — наши эитные табунские срачеводы, или ИИ ))
А прикиньте Фраера возьмут в гугл
Я ничуть не удивлюсь если возьмут. В этом и есть деградация ИТ индустрии нынешней, в кодинг валит совсем трэш, которому в былые годы и мониторы протирать бы не доверили… В итоге нынешний софт почти весь — глючное, тяжелое, дырявое и неудобное говнище
ой, этот коммент должен был быть тут
Ну по статистике 99% кодеров не проходят после вступительного инвайта. (если верить Хабру), так что я как бы не собираюсь сейчас делать такие выводы.
Читая посты на Хабре, я могу с уверенностью сказать, что на работу туда не брали людей, у которых знаний и опыта работы намного больше чем у меня. Так что остается надеятся на смекалку и идеи, а не на опыт.
Ды ты просто скажи — «я гей аутист», пройдешь вне очереди по квоте.
А ведь униженные и оскорблённые сейчас в тренде в США…
Дык да))
Особенно учитывая, что пост на хрен-там-помнит-сколько-комментов был убран из общего доступа. )))

А может быть это хитрый план и Shimmermare твинк Сани… Ой вэй!..
Если мой твинк может отправлять прямые инвайты в foobar, то это значит, что я уже работник гугла? О_о
На будущее советую победителю писать более читаемый код.

Да, сорри. Учту это в будущем.
Стоп стоп стоп, на Табуне без шуток ищут людей для Гугла? С какой стати? Как низко пал Гугл, чтобы искать себе программистов на Табуне?
Не совсем так. Между фубаром и самой работой в гугле огромная пропасть. Даже если я завершу все тестовые задания, мне все равно могут не позвонить / не написать. а даже если позвонят — на данный момент мой разговорный англиский примерно на никаком уровне. а даже если я его подтяну — мне надо будет на нем ответить на теоретические вопросы по кодингу. а гуглить во время собеседования не дадут даже в гугле.
Английский прям обязателен? У Гугла нет русскоговорящих сотрудников, нанимающих для российских филиалов или чего-то такого?
А вообще, всё таки что этот пост делает на Табуне? Это же наверно не какой-то фиг с горы, а кто-то размыто, но связанный с гуглом пришёл на Табун и ищет тут способных людей. Не верится в это…
Если дело дойдёт до собеседования — понадобится разговорный английский.

Думаю человек знает о чем пишет.
Не верится в это…

Его инвайт оказался вполне действительным. Почему именно на табуне? Могу лишь предположить, что это броняша, который хочет, чтобы на его работе появились еще броняши.
Его инвайт оказался вполне действительным. Почему именно на табуне? Могу лишь предположить, что это броняша, который хочет, чтобы на его работе появились еще броняши.


В 2020 году искать себе на работу по принципу «Он смотрит тот же сериал, что и я? Беру его!», это даже не смешно…
То есть по-твоему лучше поступать на работу как в Голливуде?
ТЫ СОТРУДНИК ОТДЕЛА КАДРОВ ГУГЛА
@
СИДИШЬ, ПРОСМАТРИВАЕШЬ БАЗУ ДАННЫХ СОТРУДНИКОВ
@
S A S H A — F L Y E R
@
КОМНАТА ОЗАРЯЕТСЯ КРАСНЫМ СВЕТОМ МИНУСОВ
@
В УШАХ ЗВУЧИТ НЕСТЕРПИМОЕ НЫТЬЕ
@
ТВОИ ГЛАЗА ПЛАЧУТ КРОВЬЮ
@
ТАБУНАРИЙ

ЛОЛ.
Ты имеешь в виду через постель? Нет. По способностям надо брать, или по перспективности (если начинающего сотрудника в расчёт берём).
Английский прям обязателен?

Да, абсолютно. Из московского офиса разработчиков уже давно эвакуировали, там только sales. И даже туда нужен разговорный английский.
А вообще, всё таки что этот пост делает на Табуне?

Просто решил помутить воду, почему нет? Это же не приглашение на интервью, а обычный инвайт в foobar. Его только каждый 10 проходит и не со всеми прошедшими связываются.
Стоило сделать хотя бы ради гневной тирады Орхи о том как он не любит алгоритмические задачки.
Да, абсолютно. Из московского офиса разработчиков уже давно эвакуировали, там только sales. И даже туда нужен разговорный английский.

Ого… А он нужен только на техническом уровне? То есть, типа если я способен прочитать документацию и объяснить её на английском, то этого достаточно?
Ну смотри: собеседование полностью на английском, т.е. как минимум рассказать о себе и ход своих мыслей изложить нужно уметь.
Ох, я даже на русском то не знаю что о себе рассказать)
Можешь посоветовать как легко и быстро подтянуть английский до минимально нужного уровня? Конечно шансы что мне позвонят малы, но если это все-таки случится — будет эпик феил, если я ни слова не смогу выдавить. А если не свяжутся, этот скилл в любом случае не помешает в будущем.
я даже на русском то не знаю что о себе рассказать)

Расскажи о своих приключениях, когда ты смог от армии отбиться. :3
Пусть расскажет как со своей ККИ эпично обосрался
Или как с друзьями в кафе сходил и стал интернет-мемом. Не у каждого это получится…
Лучше про то, как он встретил группу фурри в реале.
ЛОЛ. Только что про это написал выше.
Кстати… не светит Фраеру гугл… он же не толерантен — фуррей хейтит.
like this?Sluchilos' eto v odnom antikafe, i zrelishche, yesli chestno, okazalos' ne samym priyatnym. YA planiroval provesti vremya so znakomymi v etom antikafe, prishli my tuda, uselis' v otdel'nom nebol'shom zale, po nachalu vrode vse normal'no, i vdrug, otkuda ne voz'mis', ya slyshu voy…
«Furri...» — Smiritel'no proiznos odin iz moikh broni-znakomykh. I tut moyo serdtse upalo v pyatki. Chtoby otvlech'sya, vklyuchili ponyal, 1-2 seriyu 5-go sezona, pochti srazu pribezhali oni… «O, poni!». Vneshne, na pervyy vzglyad, oni vyglyadyat dovol'no normal'no, khotya u odnoy osobi zhenskogo pola, bez preuvelicheniy, ya na sheye razglyadel kozhanyy osheynik… Poshumeli oni u nas, prolyapali vsyakuyu labudu, chto oni tipa volki, i ushli dal'she v svoy otdel'nyy zal veselit'sya. Chestno govorya, lyudi eti ne nastol'ko uzhasnyye, no mne prosto nepriyatno bylo ryadom s nimi nakhodit'sya, nu ne moyo eto. I vso by nichego, yesli by cherez 2 chasa nashey veseloy vstrechi so znakomymi, posle igry v neskol'ko nastolok, odin iz moikh bronyash skazal:«Tam, eti, v mafiyu igrat' sobirayutsya, pognali s nimi!» I tut ya okonchatel'no vpal v depressiyu, kotoraya ne otpuskayet menya do sikh por. Posledniye chasy skhodki ya prosidel v pryamom smysle odin v zale, v kotoryy my prishli pervonachal'no kompaniyey. Blago u menya byl planshet i internet s ponyashnymi seriyami, kotoryye ya i smotrel v odinochestve, chtoby uzh okonchatel'no ne rasplakat'sya, takiye vot dela.
Развернуть
1352/5000
This happened in one anti-cafe, and the sight, to be honest, was not the most pleasant. I planned to spend time with friends in this anti-cafe, we went there, sat down in a separate small room, at first everything seemed to be normal, and suddenly, out of nowhere, I hear a howl…
“Furry ...” one of my armor acquaintances said stubbornly. And then my heart sank. To get distracted, they turned on I realized 1-2 series of the 5th season, almost immediately they ran in… «Oh, pony!» Outwardly, at first glance, they look pretty normal, although one female, without exaggeration, I saw a leather collar around my neck… They made a noise with us, dabbed every crap that they were like a wolf, and went on to their own room to have fun. Honestly, these people are not so terrible, but it was just unpleasant for me to be with them, well, it's not mine. And all would be fine, if after 2 hours of our fun meeting with friends, after playing several tables, one of my armor said: “There, these people are going to play the mafia, they drove with them!” And then I finally fell into depression, which still does not let me go. The last hours of the gathering I literally sat alone in the hall, to which we had originally arrived as a company. Fortunately, I had a tablet and the Internet with intelligible series, which I watched alone, so that I would not finally cry, these are the things.
Смело посылай в Гуголь. :D
… на следующий день Гугль опух и мешал ему ходить...^^
Лишь бы под ногами не болтался, а то так ненароком наступишь и оторвёшь его на его же.
Ты представляешь что будет, если СашаФлаер заявится сюда на Табун с «НЕ болтающимся» гуглем? О.О
В полшестого вечера…
Мне намного проще накодить за 1 день 10 похожих по сложности задач как в посте, чем рассказать о себе даже на родном языке.
Я тебя умоляю. Чего там рассказывать? Ты никогда не выступал или никогда на собеседованиях не бывал что ли?
нет. перед устройством на свою первую работу в кодинге меня просто попросили написать элементарную прогу, которая парсила json-файл, и всё.
Ага, подключить libjson и дернуть пару методов — ахуенный скилл кодинга, всем бы такой…
ну что просили, то и сделал. Понятое дело что в гугле вступительные задачки посложнее и другого типа. Но я в принципе не против решить 9 алгоритмических задач даже чисто ради интереса, а не ради призрачных шансов что мне позвонят. Сейчас буду как раз приступать к этому занятию.
Вот давай… чем угодно занимайся, только от табуна подальше.
)))
Ну, ХЗ. Мне и повыступать, и презентации попроводить и на собеседованиях побывать довелось. Порою нервотрёпно, но перетерпеть можно.
Так Орхид же уже давно того, покинул сей проект. Или он снова вернулся?
Не знаю что он там покидал или нет, тирада была в дискорде
тирада была в дискорде

насчет этого поста?
На Бубуне его очень давно не видел. Да и поддержкой ресурса, вроде бы, сейчас только Рандом занимается.
Поддержкой ресурса сейчас занимается Taranov gelirhil Darkseer Atomic RePitt ShprotaNa DRAKANG GadS Edinorog23 leon0747, а не рандом.
Совсем поехал? Че ты несешь?
Флаер закопипастил список донатеров, успокойся.
И какое отношение список донатеров имеет к тому что Орхи ушел и админ сейчас Рэндом?
Вот в этом весь Фраер — ляпнуть что-то тупое и не в тему абсолютно…
Ну, иногда про донат говорят «поддержка», типа «поддержи нас! благодаря твоей денежке мы останемся на плаву». Флаер (не очень уместно) решил скаламбурить, подменив техническую поддержку на финансовую.
Видишь техническую поддержку? И я не вижу, а она есть O_o
Флаер (не очень уместно) решил скаламбурить
Вот ключевое слово «не уместно». Фраерские каламбуры даже не за 300… за 30 шутеечки)
Если бы на табуне была техническая поддержка, то у нас наверняка бы работали аватарки спустя 3 года. Так что по факту тут есть только денежная поддержка.
Но говорили о — пусть и стописот раз формальной — технической.
сорри, промазал минусом… метил в фраера
Зато я в тебя не промазал. ^___^
На зоошизу не обижаюсь :3
зоошизу

Так и не дошло, что это значит.
Почему «зоо», причём тут звери?
И почему «шиза»?
lurkmore.to/%D0%97%D0%BE%D0%BE%D1%88%D0%B8%D0%B7%D0%B0#.D0.97.D0.BE.D0.BE.D1.88.D0.B8.D0.B7.D0.B0
Просвещайся. Это об общем понятии термина.
А применительно к интернету зоошиза — те кто вписываются на форуме за какого-то местного убогого, и начинают яростно защищать, не задумываясь, что может и не просто так он был в убогие определен.
(Стоит добавить, пока не сбежались истерить не понимающие разницу, что зоошиза — совсем не то же самое, что зоозащита, и вторые от первых тоже могут волком выть, бо посмел усыпить животное, мучающееся от последних стадий некурабельной онкологии — сразу враг зоошизе.)
…Почитал. Могу точно заверить, что никому и ничему такому вот не поклоняюсь. И вообще, какая-то шибко стрёмная хрень. о_О
А насчёт вступаться и защищать — одно дело, когда кто-то действительно что-то плохое. Но когда человек ничего плохого не делает, а его всё равно выгоняют чисто за просто так, смеясь с мерзкими улыбочками (думаете, я не знаю, что это так?) — это несправедливо. Если человек просто разговаривает и ведёт себя нормально, за что его гнать-то?
Це репутация
Тем не менее, это не ответ на вопрос «За что?».
Самый быстрый и простой способ:
Видишь баннер с Твайлайт справа?
1. Тыкни на него
2. Найди два удаленных комментария
3. Найди оба этих удаленных комментария в архиве andreymal'а
4. У обоих выбери исходную версию.

При условии кучи свободного времени — более детализированный и ранний вариант: весь тред и прилинкованный комментарий с содержимым конфы
Значит, это и есть то, из-за чего местное общество со злобной ухмылочкой и противным смехом говорит «З-з-з-з-знаааааач-ч-ч-ч-чит-т-т-т-т, с-с-с-с-п-правделиииивости хоооочешшшшшшь… Не будет тебе её!» и злостно, безо всякой совести лицемерит против него?
Boinc — для многих просто последняя капля. Если есть время и желание (у меня нет), можно найти кучу примеров пиздежа (именно в такой формулировке), упертости, абсолютной недалёкости и всего прочего хорошего в постах с ушифратором, его ККИ и так далее. Сейчас я вижу его такое поведение несколько реже, но репутация не за пару недель восстанавливается
абсолютной недалёкости
Да че далеко ходить — в треде про его ККИ он больше сотни постов не мог ответить на банальный вопрос «сколько траффика твоя игра жрет»… устроил какую-то шизоидную клоунаду на сотню каментов…
Но это было давно. А ВОТПРЯМЩАС что плохого он делает?
Он еще за старое неодуплился =)

Да и сечас продолжает бесполезно зафлуживать темы репликами не в тему
А когда «отдуплится»? Вы вообще знаете меру в «наказаниях»? Или это просто потому, что хочется сделать плохо?
Я не думаю, что минусики в комментариях прям такое «наказание», что приносит физические мучения
Но это что-то удовлетворительное для общества. И да, вред действительно есть: вы пытаетесь просто его забанить.
пытаетесь просто его забанить.
Он своими прошлыми подвигами на 10 банов так-то наработал)

вот даже тут посмотри начиная отсюда
tabun.everypony.ru/blog/computers/195945.html#comment13266942

tabun.everypony.ru/blog/computers/195945.html#comment13267074

куча флудопостов подряд. Устроил тут чатег сам с собой, чтоб все видели какой он деловой, умный, решает тут сидит задачу весь из себя… Флудер и хайпоеб. На модерируемом ресурсе улетел бы в бан за флуд.
На модерируемом ресурсе улетел бы в бан за флуд.

Так ресурс модерируется саморегуляцией, видимо всем пофигу на этот спам (не считая хейтеров, но они минусили Флаера ибо он Флаер)
Ну вот кому не пофиг что Фраер всех задолбал спамом — те и хейтят, и минусят)
Ну ну ну, минусы-то он получает даже там, где он не спамит.
А вообше, давайте и мне минусов отсыпите? Не одному же Флаеру все лавры забирать.
Ну ну ну, минусы-то он получает даже там, где он не спамит.
Репутация.
tabun.everypony.ru/blog/MoonLight/195974.html#comment13268169

ну вот как после такого идиотизма к нему относиться? Он очевидной шутки не понимает, пишет херню.
ну вот как после такого идиотизма к нему относиться?

С сожалением =(
Учитывая что сам он от своей бредятины явно не страдает — сожалеть можно только о зафлуженном табуне.
Ну, от чего человек по ту сторону экрана страдает или нет, ты знать не можешь. Скорее это просто удобное оправдание, чтоб продолжать срать и чувствовать себя морально правым, как в принципе и любой твой коммент здесь.
Если б он страдал — прекратил бы давно. А он наслаждается походу.
Еще одно типичное оправдание. Я думаю, в глубине души ты прекрасно понимаешь, что это так не работает, и что если у человека есть проблемы, то вероятность того, что он будет более болезненно реагировать на провокации, как раз выше.
Я и не оправдываюсь. Меня его проблемы неебут от слова совсем, пока они не начинают выплескиваться в общественные места, вроде табуна.
В общем-то, я понимаю, что ты залез на коня аутрейджа, занял комфортную позицию и слезать не хочешь. Я уже такую ситуацию с фриками видел множество раз, и реакции людей здесь совершенно не уникальны, Поэтому я с уверенностью говорю: ты оправдываешься.
Считай как хочешь, дело твое. Я свою позицию обозначил — этого морального урода на табуне быть не должно. Выражаю ее минусами. Вот и все.
аутрейджа

Одним словом ты сейчас описываешь его, мистресс нигму и никса. Однако до них были и другие. Например, в 2015-17 меня активно хейтил Айдем — минусил каждый коммент и пост, еще Стардиск тогда тоже был активен в этом плане. И еще была крайне агрессивная личность, которая всем твердила, что меня вообще ни на какие сходки/турниры нельзя брать. Еще была одна личность, ник которой начинался на Дрой, а заканчивался на Дека, который даже грозился физической расправой. Ну и где все они? Вместо них пришли другие. Я уже привык к такому аутрейджу.
А тебе не приходило в голову, что если самые разные люди приходят, и хейтят именно тебя — то это все-таки с тобой что-то не так?
А тебе не приходило в голову, что если чьи-то взгляды не совпадают с твоими, и если его слова и болезни вызывают у тебя отвращение, то тебе тогда лучше начать его игнорировать?
начать его игнорировать
Игнор не выход. Если говно прикрыть газеткой, оно от этого вонять не перестанет.
Ну можете тогда сами уйти отсюда, если буквально все комментарии Табуна для вас говно. посмотри хотя бы что тут люди писали и обсуждали в 2012-13 годах. я по сравнению с ними вообще баинька.
Во-первых никогда не переводи стрелки на других, отвечай за себя. То что кто-то когда-то был мудаком, не оправдывает тебя ниразу.

Во-воторых не все комментарии табуна говно, а только твои. Опять обобщаешь пытаясь перевести стрелки.
Короче говоря, факт есть факт — если вы так любите смотреть на говно — вы будете смотреть на него всю жизнь. любуйтесь. Пока сами отсюда не уйдете.
Ну тоесть ты признал сейчас, что ты есть говно. Тебе мало, что тебя другие унижают, ты еще и самоунижением занимаешься. Найди себе БДСМ-клуб какой-нибудь, тебе понравится.
Я останусь на Табуне. а ты как хочешь — можешь оставаться, можешь валить. Выбор за тобой. Я свой уже однозначно сделал.
Ну чувааааак… ну ты чееее… У тебя настолько убогая жизнь, что ты готов провести ее всю на табуне, изображая говно? Пиздеееец, я в ахуе.
Ну так ты тоже всю жизнь проведешь на табуне. иначе ты проиграешь, а я выиграю. Мы с тобой заперты тут теперь.
Я тебе уже говорил 100 раз — чтобы решить проблему твоего наличия здесь, необязательно тут сидеть 24/7. Надо один раз немного времени потратить, а дальше оно само…
Ты на это тратишь время больше чем я. то есть я по факту в плюс ухожу по времязатратам.
Тут просто твоё счастье, что в отличие от других некоторых форумов, здесь ограниченное время голосования за посты. Иначе улетел бы отсюда на ракетной тяге.
Ну так моя карма физически не уйдет в минус. Вот прям вообще никак.
Вот зря тыт так в этом уверен… оооочень зря…
До старости будете минусить)
Вовсе нет. Если ты в кодинге ничего не знаешь и не умеешь, кроме копипасты, не значит что все такие, так-то =)
За ботоводство вас забанят первее, увы.
бгггг… уметь надо, Саня))
Ну посмотрим. за последний месяц моя карма не изменилась ни на единицу.
Ну извини, дарагой, попустить твою карму — это далеко не первый пункт в списке моих приоритетов)
Значит будешь вечность любоваться на мои комменты)
А ты будешь вечно гордиться этим единственным достижением в своей никчемной жизни.
У нас signed
Это тут причём?
Ну ну ну, минусы-то он получает даже там, где он не спамит.


Издержки системы. Чтобы минусы оказали эффект, нужно минусить все. Иначе всего один пост с рандомными картинками из интернета уводит в плюс.
всего один пост с рандомными картинками из интернета уводит в плюс

Примерно так и выживают долбоёбы например на Пикабу… не смотря на то, что там есть модерация и иногда жёсткая.
Ты говоришь так, как будто бедняжка всего лишь разок незначительно оступился, а его тут пытаются утопить заживо.
А ты уверен, что это вред?
Не припомню что-то, когда травля кого-либо НЕ была вредом.
У тебя буфер на уровне флаера
… вред есть: вы пытаетесь просто его забанить.


Я не думаю, что минусики в комментариях прям такое «наказание», что приносит физические мучения
Не припомню что-то, когда травля кого-либо НЕ была вредом.
Если у тебя дома развелись клопы или тараканы ты тоже их не травишь? Фраер это заебавший клоп, и подлежит вытравливанию.
tabun.everypony.ru/blog/uniblog/195977.html#comment13268370

Продолжайте вон защищать вашего клопа… опять обсирает чужие проекты.
Если честно, вы страдаете какой-то хернёй. Вы минусами чего хотите добиться? Что Флайер обидится и уйдёт? Мечтайте. Или что сольёте и он не сможет комментить? Это вообще технически невозможно, потому что минусы на комменты не влияют на карму. В итоге получается борьба с клопами вонючим спреем, от которого в комнате дышать затруднительно, но клопы никуда не уходят.

Поставьте себе юзерскрипт для игнора Флайера и всё, что за детский сад?
С таким же успехом можно сказать, что хуйнёй маются те, кто пытается остановить чьё-либо минусование.
С таким же успехом можно сказать, что хуйнёй маются те, кто пытается остановить чьё-либо минусование.
Ну если это такой способ сказать, что минусующие Флаера такие же непробиваемые как и сам Флаер, то ок.
Это способ сказать, что хуйнёй тут маются все, если рассудить с определённой точки зрения. Нечего додумывать чужие слова, у него научился?
Не, а мне нравится, как он продолжил твою мысль =D
Мне тоже
Ты-то чего радуешься? Это значит, что не переживёшь ты их и не станешь Последним Табунчанином. Вы будете обречены вечно сраться на мёртвом Табуне
Не твои же слова он перевернул, чё бы не нравилось
Жизнь — борьба. Борьба за то, чтобы бороться за борьбу, борющуюся за то что борьба…
Нам лень, им — нет, так пусть борются.
Что Флайер обидится и уйдёт?

Они своими минусами как раз таки заставляют меня тут остаться. Может быть я уже дано ушел если бы не эти минусы)) А с ними я 120% тут останусь до самой смерти.
Люди, любящие когда их ненавидят, поистине удивительный сорт…
Моральные мазохисты))
мне нравится смотреть как вы от этого беситесь, а не факт того что меня какая-то милюзга ненавидят. Мне на это так же похуй, как если ко мне на улице подойдет малолетний пиздюк и въебет в колено — да, неприятно. Но не трагедия. Да что можете беситься и ставить минусы дальше. Меня ваша неприкрытая агрессия только забавляет ещё сильнее
А кто сказал что с тебя бесятся? С тебя или орут, или просто брезгливо минусят. Много чести — беситься с тебя.

Мне на это так же похуй, как если ко мне на улице подойдет малолетний пиздюк и въебет в колено
Ты не только моральный мазохист, но и физический еще чтоль? ))
Он просто долбоёб, как местные старая дева и истеричка-шизофреник. Ведёт себя неприкрыто как уёбок, а потом ходит и картинно удивляется, за что его презирают. Тут особый уровень развития, ничего не поделаешь.
*Из мемуаров СаниФраера*
Когда-то я был нормальным человеком, но потом ко мне подошел малолетний пиздюк, и въебал в колено… ))))
Ваша манера речи мне представляется поразительно знакомой...
Да эти тролли — они все на одно лицо, забей. Мне иногда кажется, что это реально один и тот же человек, который зарегал себе 3 твинка.
Можешь сделать себе скрипт, который скрывает минусы он этих твинков =D
Но как, Холмс?)))
Я знаю только одного человека на Табуне, который называет Флаера «СаняФраер»!
Но Холмс, может просто это выражене понравилось кому-то еще?)))
Возможно. Прямых улик у меня нет.

Но я не хочу тыкать пальцем в подозреваемого, т.к. в целом уважаю этого человека. Но не из-за его отношения к Флаеру.
Прямых улик у меня нет.
Аналогично. Хотя у меня в целом три с половиной пункта для подозрения (стиль речи + упоминание кое-кем когда-то необходимости попросить у Рандома твинка для ролки — то разрешено потому что + ролеблог у этих акков). Но с этим всё равно прямо не скажешь, что «а вот эти люди — твинки», нечего показать как 100% пруф, если кто потребует пояснить за слова.
подкину еще одну улицу — хоть у них дата регистрации разная, активно они начали общаться в одно время.
Стиль речи в качестве формального обоснования трудно привести, поэтому и не сказал про него хд

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

А Флаер… Флаер — не подарок. С такими, как он, было бы трудно ужиться. Есть у меня такие знакомые. Поэтому я не могу обвинять тех, кто его хочет выгнать.

Но я на сто процентов уверен, что жизнь у самого Флаера далеко не сахар. Поэтому я его тоже не могу обвинять в его поведении. Оно, я бы сказал, вполне ожидаемо.

Что с ним делать — имхо, сводится к вопросу гуманизма.
Что с ним делать — имхо, сводится к вопросу гуманизма.
Забанить, чтоб не мучился ни он ни с ним)
Вообще будет интереснее лишить его сюжетной брони в виде накопленной кармы)
Ну ну ну, мы все тут фармили себе броню, с чего её просто так забирать?
С того, что смотреть как он ведет себя прилично, чтобы выполнить свою мстю тут всех пересидеть на Табуне веселее, чем если он станет вторым бризюком.
Флаер-то порнуху повсюду не кидает, да и если бы Бризюк спойлерами пользовался, небось с ним всё было не так плохо.
Было бы.
И я не про прон на внешке, а про регулярный спавн.
Пару картинок бризюка, я признаюсь схоронил помнится))
Ну и да, прошу меня извинить за слова выше, если сочтете нужным. Грубо говорить о тех, кто слушает.
Стиль речи в качестве формального обоснования трудно привести, поэтому и не сказал про него хд

А тот факт, что они все состоят в единичном закрытом блоге, админ которого и начал меня первым хейтить, и что у них есть много кармы, но при этом ни одного поста на внешке? Я про тех самых, у кого 2019 год регистрации
Этого я просто не знал.
Так можешь сам перейти по их профилям, посмотреть на тот самый блог и задаться вопросом
И в этом весь Фраер. После того, как другие до всего докопались, он теперь пыжится, корчит умного, типа сам до всего допер.
жизнь у самого Флаера далеко не сахар

Ну так это не повод вести себя так.
У нас все жизнь не сахар, у каждого по-своему. У кого-то физически, у кого-то финансово, у кого-то психологически, а у кого и всё сразу.
Эх, то-есть действительно на Флаера альты налетели? Эх, я думал, что эти минусы действительно общественное мнение, а это всего лишь то пара злобных пидорасов.
Может это он сам лезя с тоски на стену и наплодил.
Если окажется, что часть агрессирующих на него — это его же твинки, то будет очень забавно.
Уникальный случай шизофрении — одна половина личности унижает другую)))
Весь Табун — галлюцинация привязанного к койке Флаера…
Хотя бы теперь я могу быть спокоен, все минусы, которые получает Флаер не связаны с тем, кем он является.
Теперь эти твинки и тебя начали минусить, когда ты их заподозрил) Нам нужно организовать коалицию, чтобы мы все друг друга плюсили наперевес их минусам.
Ничего, не тебе же одному минусы получать? =D
Нам нужно организовать коалицию

Не не не, пока мы разъеденены, они побеждают.
tabun.everypony.ru/blog/FreeRPlay/users/ — вот в этом блоге он набивал себе карму, чтобы их не заминусили, а потом сносили посты, чтобы не осталось улик.
Нужно найти еще хотя бы 4 человек, чтобы все друг друга плюсили, чтобы эти твинководы никого так больше не притесняли. ну и насчет твинководства всё-же стоит написат. Тут даже подозрения не в том что у них стиль речи похожий, а что все эти аккаунты только и делают, что отвечают лично мне. для них других юзеров помимо меня вообще не существует.
насчет твинководства всё-же стоит написат

Таки соглашусь, твинков-то могло быть не 3, а 10, и они могли сливать не тебя, а нормальных людей.
Ну так что делать будем то?
Наслаждаться душем из минусов и делать вбросы, если надо погорячее
Так может лучше как-то продиводействовать этому «душу»?
Ты олдфаг, ты лучше знаешь, кому жаловаться на абьюз твинководства.
А пока что наслаждайся минусами, пока их не прикрыли (если ты таки пожалуешься)

А вообще, твинководские пидары, подайте мне горяченьких минусов!
Ты олдфаг, ты лучше знаешь, кому жаловаться на абьюз твинководства.

Меня одного рандом не послушает. Нужно мнение нескльких независимых юзеров.
Меня одного рандом не послушает
Потому-что ты не нужен ;)
Хреновый Рандом =/ А если бы твинков действительно было 10 и они мгновенно удаляли все твои комменты?
Кароче — я всё сказал. Нужно несколько людей, чтобы написать об этом, собрать и систематизировать все подозрения
Удачи, чё)))
Прости, Летунец, я лишь умею ныть в комментах, в личке Рандома ныть не обучен, тут тебе придётся страдать в одиночку.
То есть все эти твинки так и будут на свободе?
А как ты хотел))
Ты хотя бы выбери, с какого именно акаунта ты мне будешь отвечать.
Ты давай, не отвлекайся, беги Рэндому плакать))
У тебя совсем совести нет?
А у тебя была совесть, когда ты про BOINC херню писал? Или когда ты, не далее как сегодня, обосрал идею новой дерпибуры?

Видишь ли Саня — как аукнется, так и откликнется…
Перечитай свои комменстарии с этого аккаунта и с nix-a — буквально 100% публикаций со всех этих акков — это целенаправленный хейт в мою сторону. тебе не кажется это слишком нездоровой увлеченностью?
Бггг… ты думаешь я тут специально с тобой сижу? Я в третьих героев например сейчас играю, с тобой вожусь пока ход оппонента идет))
Давай еще раз — ты завел три аккаунта, с которых только и делаешь что пишешь мне. зачем?
А ты докажи, что это мои аккаунты? Подозрения не есть факт.

А в целом, прежде чем кого-то спрашивать «зачем» подумай что это могут и у тебя спросить.

Зачем ты писал херню про BOINC и сегодня про новую дерпибуру?
Затем что я так считаю, это моё мнение. Если мое мнение не совпадает с твоим мнением — это еще не повод создавать кучу твинков и минусить одного человека и буквально 100% комментариев посвещать целенаправленному хейту этого человека.
А ты докажи, что это мои аккаунты? Подозрения не есть факт.

за меня уже всё доказали
Затем что я так считаю, это моё мнение
Твое мнение — это мнение малолетнего аутиста, который не в силах понять скудным мозгом, что такое BOINC, счел нужным обосрать.
Я прекрасно понимаю как работают эти схемы, и я не буду в этом участвовать. И вообще, я сейчас общаюсь с тем, кто сам себя плюсует с двух аккаунтов. А еще меня эгоистом называет, мда.
Вот ты сейчас еще раз доказал, что клинический дебил. Какие нахер схемы, ты о чем, болезный? Ты хоть дал себе труд почитать, что такое BOINC, хотябы на вики в двух словак, чтобы не бредить про схемы какие-то.
Я прекрасно вижу что происходит прямо передо мной. Я прекрасно вижу какой хейт возникает, стоит ли хоть что-то сказать про пирамиду. Так и происходит в реальности — когда ты критикуешь очередную МММ, его представители начинают сразу хейтить тебя. Ты своим хейтом сейчас доказываешь мою правоту.
Эх, ты, Летунец. Они же ищут лекарство от коронавируса.
Может конечно действительно тайно майнят, но об этом ни ты ни я знать точно не можем.
Я не верю что они ищут там какое-то лекарство. Можете хейтить меня, можете ради этого еще нескольких твинков насоздавать. НО мощности ваших видеокарт используются не для этого.
Ебанашка, исходники открыты. Хотя тебе с твоим уровнем кодинга это не поможет конечно…
Ну, в сомнении ничего плохого нет.
Это называется критическое мышление — сомневаться во всём и всегда, всегда задаваться лишними вопросами.
Критическое мышление это когда засомневался и нашел доказательства, а когда просто ляпаешь на всё бездоказательной имхой это паранойя.
Ну тут даже сказать нечего, кроме как «ебать дебил!»

Сравнил BOINС и МММ…
И кто-то ж еще защищает этого аутиста.
насчет херни про дерпибуру — не только я не вижу смысла в новой буре. почитай что другие люди пишут. многие согласны с моим мнением, что новая бура нахрен не нужна. но ты хочешь хейтить именно мое мнение, хотя оно полностю совпадает с мнением большинства!
Эх, там буквально недавно скидывали беседу, в которой Флаер люто поддерживает, что из всех геймеров и детей нужно всеми возможными психологическими и геймдизайнерскими манипуляциями высосать все деньги до последней копейки, а вы на него злитесь из-за какой-то херни типа BOINC и новой буры.
Ну ты же понимаешь, что люди злятся не только из-за пары моментов. А из-за всего его поведения в целом.
Всего лишь озвучивают то, что свежее
Но зачем ради этого создавать аккаунты, на которых 100% комментов — это хейт в мою сторону?
Какое восхитительное ЧСВ — считать что что-то делалось ради него. Да кому ты нахер впился, убогий))
А ты перечитай комменты на аккаунте. найди на нем хотя бы один коммент, который не связан со мной? Всё ты на этом акке делаешь только ради меня, разве нет?
Дурик, «закрытые блоги», слышал такое, не?
Угу, и в этих закрытых блогах ты себе и набиваешь карму через основу, прикрываясь «рп блогом» — хороший план.
Это тебе тоже Андреймал сказал? А он в курсе, что прикрываясь его именем ты хуйню несешь, а?
так или иначе содержимое вашего закрытого блога я уже посмотрел.
Так… а вот это уже интересно. Ты понимаешь что сейчас ниибически подставил Андреймала — что он через своего бота дает доступ в закрытые блоги всем левым желающим?
Не, может действительно ролевой блог, просто твинков оттуда решили заодно использовать против тебя.
И типа это законно?
Не то чтобы, просто от твинков, просто если бы этих твинков использовали чисто в этом блоге, было бы меньше вреда, чем от того, как их используют сейчас.
Тем более, твинки для ролевых или публикации чего-то от имени группы лиц (как Bar-pony у радио эврипони) вполне разрешены. Только, по идее, не должны при этом притворяться другими людьми, но тут главное, что с согласованной твинкоте, что нет, чтоб люди знали, что говорят вот конкретно с теми пользователями, а не кем-то другим, Рандому нести их незачем.
Я точно знаю, что с твинков нельзя плюсить или минусить комменты и посты. Мне админы про это лично писали.
Как там SecondFly поживает?
Никак.
В чужих профилях не отображаются комменты из закрытых блогов, балда. По списку из блогов видно, что у них есть закрытый блог с ролевой, там может быть как немного, так и тыщи комментов — этого нельзя увидеть.
Там есть бот андреймала, и я уже у него спросил и он всё рассказал что там происходит. бот всё видит)
Честно говоря, я уже не думаю, что люди злятся. Просто Флаер срётся с человеком, у которого 3 твинка, что создаёт иллюзию народного недовольства. Люди как безразлично терпели Флаера, так и терпят.
он этим и занимается — создает иллюзию массового хейта. первые три минуса я получаю от его твинков, а дальше люди уже чисто за компанию ставят минус.
Ну, я не говорю, опять же за всех, но меня, например, он бесит своей имбецильностью, явно проглядывающимся чсв и упоротостью бешеного барана. Как и со всеми, кто меня бесит, лично я не трогаю абсолютно нейтральные комменты, но когда он начинает переходить на свой привычный тупизм(а это часто происходит почти молниеносно), то тут извините — имею право влепить минус.

А почему три? Вроде как два же. Два твинка мол и один основной
Ну тык. или по-твоему банить надо твинков, а основу не трогать?
А разве не так?
Эммм, нет, не так. Это конечно в итоге Рандому решать, мб он вообще никого не забанит и не поверит что это твинки. Но если основа не банится, то получается я тоже с таким же успехом могу себе создать трех твинков, и с каждого из них плюсить свои комменты, так получается?
И твоих плюсаторских твинков тоже должны забанить, что не так?
А причём тут, блять, бан? Заебал уже чужие слова на другой лад переворачивать.
Потому что твинководство запрещено на табуне?
Ты долбоёб? Мне похуям, что тут запрещено, я про количество твинков говорила, даун.
одна основа + 2 твинка это считай как 3 твинка. в чем разница то принципиальная?
Охуенная логика. Если ты сделаешь две копии оригинала, для тебя все три вещи будут копиями?
ты делаешь две неотличимые копии оригинала, потом перемешываешь их — и да. считай что все три — копии. ибо заведомо не знаешь кто оригинал.
Все дорогуша, Андреймалу ушел прямой вопрос касательно твоего доступа в закрытый блог, со скринами этой темы. И в отличии от твинков, которыми пол-табуна балуется, вот этим как раз Рэндом может и заинтересуется очень :3
Являются ли боты Андреймала компитенцией Рандома?
Какбы открытие всем желющим доступа в закрытый блог — ну такое…
Ты сам пригласил туда бота, который индексирует все комменты.
Ебанашка, каменты закрытого блога остаются закрытыми и в бэкапе.
Флаер может и блефовать…
И ради своего блефа подставляет другого человека под неприятности. Браво, че… Моральный урод 120лвл, как и было сказано ранее сто раз.
К которым можно легко получить доступ уже вне табуна. Так что Рандом тут не причем уже.
О, прикольно. Как взломать этого бота?
(В принципе, есть способ видеть их в бэкапе, если являешься участником блога — пустить в блог бота, не знаю, как это делается, залогиниться в бэкапе, там написано, как — и в бэкапе становится доступно, что доступно и твоему акку, и боту.)
Но тебя в блоге нет. Так что через бэкап ничего не найдёшь.
Ну так так оно и есть. Иногда только замечания отпускаем в эту сторону и всё.
Ты сам хоть пробовал писать и проверять послушают тебя одного или нет? Тупо переложить на остальных это дело хочешь. Потому не будет тебе никто помогать.
Ну так с этим в любом случае нужно что-то делать. Человек слишком обнаглел. Нужно систематизировать информацию, которая у на есть. Чтобы это всё вместе выглядело целым аргументом.
Тупо переложить на остальных это дело хочешь

В общем, кто бы сомневался в этом-то случае…
Так что хрен ему, а не помощь.
ну я последнее время всё сильнее убеждаюсь, что nix и нигма — его твинки. Но так даже эпичнее — один чел ради меня хейтит сразу с трех аккаунтов. Это ли не гениально?
Кого «его»? Кто самый главный антагонист в этой истории?
И запомните, Ватсон — бумаги для разоблачения Мориарти лежат в моем сейфе под литерой «М» ©
Да не уж-то Акио увидал в Флаере Психованную Лошадь и пошёл на него войной?
Лол, ну это нет х) почти наверняка нет
Не, Фраер конечно психованный, но он не лошадь)))
но он не лошадь

Мы не знаем до конца, кем он себя идентифицирует!
Ролёвочка на внешку переехала. Долго же тут раздуплялись что к чему).
Некоторые комменты с трёх аккаунтов просто близнецы братья не то что стилистически, даже оформлением. Беспалевность 80-го уровня.
А цели беспалевности и не было)))
Прикол не в этом — за чистую монету ведь принимают, если не одной бригадой выступаете XD.
Долго же тут раздуплялись
Да просто нет таких пруфов, как те, что я тебе показывала про знаешь кого, нпрмр. А без этого лучше ничего не утверждать как 100%ое (даже если уверенность именно такая же), тебя же и завиноватят.
Пруфы в суде нужны, а тут баловство одно — как будто они что-то изменят).
Не, пруфы нужны, если утверждаешь, и на тебя накидываются (прекрасно знающие, что ты утверждаешь правду).
И что поменяется от разоблачения — по стойке смирно встанут?)
Их не будут воспринимать как отдельных пользователей и общаться как с отдельными личностями. Всех-то зачем обманывать.
Таки ролевые твинки не для того чтоб притворяться — вне ролевой — кем-то другим (и тем более не для умножения своего голоса).
  • Dany