Перейти к содержимому

Fingercomp

Гуру
  • Публикации

    1 629
  • Зарегистрирован

  • Посещение

  • Победитель дней

    283

Сообщения, опубликованные пользователем Fingercomp


  1. К сожалению, пьяным MV пользоваться невозможно совершенно. Виртуальная коробка — вариант так себе, так как производительность там ещё хуже. Как минимум, так было год назад.

     

    Есть подозрение, что за год чего-то там поменялось, и теперь это вполне работает. Надо проверить.


  2. REDNET КАРЛ!! REDNET!! Это не свитч а ОНЛАЙН СЕРВЕР ЧАТБОТ!!!

    Тише, тише, всё спокойно, вас не режут, не пытают.

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

     

    И я свой шмактус здесь оставлю.


  3. (side == "right") — сравнение строки со строкой. Будет true, если строка в переменной side равна "right", и false в противном случае.

     

    (side == "right") and "turnRight" or "turnLeft" — это некое подобие :?, тернарного оператора, в Луа.

    Разделим его на три части: левая — всё, что до and, правая — всё, что после or, и средняя — всё, что между этими операторами.

    Тогда получаем следующую логику: если левый и средний значения не равны false или nil, то будет возвращено выражение средней части. Иначе — правой.

    То есть, если у нас сторона равна "right", будет возвращена строка "turnRight", иначе же будет "turnLeft".

     

    bot[(side == "right") and "turnRight" or "turnLeft"] — строка, которая у нас вернулась в прошлом шаге, теперь подставляется между квадратных скобок. Получаем bot["turnRight"] или bot["turnLeft"].

    Тут нужно помнить, что для Луа tbl.key и tbl["key"] — одинаковые выражения, а точка — это просто синтаксический сахар. Тогда выходит, что при сравнения у нас возвращаются bot.turnLeft или bot.turnRight.

     

    turn = bot[(side == "right") and "turnRight" or "turnLeft"] — значение, полученное выше (bot.turnLeft или bot.turnRight), присваивается переменной turn.

     

     

    Код предложенный совершенно не идеален — так вообще писать нельзя.

    • Неправильно слово написано: длина по-английски — length, а не lenght.
    • Функция не локальная, а глобальная. Это считается дурным тоном — вы засоряете _G.
    • Переменные без local становятся глобальными. То же, что и выше — мусор в _G. Я так однажды баг не мог часами найти — откуда-то переменная уже имела значение, хотя я его не присваивал. Просто забыл local, как оказалось.

    Вот так какнонично должен выглядеть код:

     

     

    local function work(length, side)
      local turn = bot[(side == "right") and "turnRight" or "turnLeft"]
      digandplace(length)
      turn()
      bot.forward()
      turn()
      bot.forward()
    end
    
    • Нравится 4

  4. Вто

     

    Как лучше сделать:

    1) каждый кубик разноцветный(блок состоит из 4х кубиков)

    2) каждый блок имеет свой совственный цвет

    3) каждому блоку определяется случайный цвет

    Второй вариант, конечно же.


  5. Обожаю некропостить, особенно, когда есть причина :P

    Отпушил эту действительно полезную библиотеку на OpenPrograms. oppm install libvector.

    Странно, что тема висит незакреплённой в разделе. И сам ещё несколько раз пролистывал, когда отбирал.


  6. реинкорнации — raincornation — rain corn nation — нация дождливого орешка! Какое отношение это имеет к итлиту?

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

    • Нравится 2

  7. ето скорее похоже на костыльную работу в фоне чем на многопоточность

     

    многопоточность - одна программа делится на много кусков (например через coroutine)

    многозадачность - много программ запущеных одновременно (например через process api)

    Так и есть, многопоточность для бедных :) Хотя даже и до такого титула не дотягивает. Ибо вызывает все функции по очереди из таблицы на полученный сигнал, так что если один заглохнет, умрёт всё.

     

    Это, а еще есть точки и запятые.

    Ты и сам-то не шибко грамотный, если честно. Главное, что не вырвиглазно писано.


  8. Начнём с того, что хранить двочиные числа надо... как ни странно, в обычных числах Луа. Последняя умеет в битовые операции.

    Кроме того, есть string.char (из числа от 0 до 255 делает символ с аналогичным кодом) и string.byte (из данного символа возвращает значение первого байта строки: число от 0 до 255).

     

    Напоследок, вот так для меня выглядит пост:

    M6TXBpz.png

    Я не собираюсь даже пытаться разобраться в этом цветастом месиве. Просьба использовать кнопки очистить форматирование aeWdsrX.png и тег кода: jmFygnF.png.

    • Нравится 4

    1. По первому пунтку: это уже будет помощь потенциальному конкуренту (хотя :lol: ), ты слишком неопытен для такого. Вон, даже про таблицы не знаешь, а ведь без них ничегошеньки не сделаешь. Наберёшься опыта — и комментарии не нужны будут.
    2. Таблица — это переменная, хранящая переменные. С твоим подходом на каждый телефонный номер ты бы издавал по тиражу книг. Таблица — как телефонный справочник: хранит сотни, тысячи номеров.
    3. Про многозадачность уже ответили.
    4. Для начала надо уяснить разницу между аналоговым и цифровым сигналами. Через кабель никакими судьбами ты не передашь аналоговые данные, только цифровые. Цифровой — это та же последовательность бит, аналоговый, например, — звуковая волна. Когда это понятно, ответь на вопрос, а каким образом, и главное, зачем ты собрался передавать аналоговые данные. И непонятны ни язык, ни сами данные, ни окружение. В общем, неотвечаемый вопрос.

    Первый, третий и четвёртый пункты — это вообще для тебя рано. Разберись с работой Lua хотя бы и попиши банальные программки. Обязательно продумай досконально архитектуру проекта. И задавай конкретные вопросы.

    • Нравится 5

  9. Я рискну :P

    320 байт, Python 3.5

     

    #coding=utf-8
    import sys
    a=open(sys.argv[1],'rb').read()
    f=lambda x:int.from_bytes(x,'little')
    o,s,w,h=[f(a[x:x+4])for x in range(10,26,4)]
    d=a[o:]
    print('\n'.join(''.join('█▓▒░ ·'[int((max(d[x],d[x+1],d[x+2])+1)//51.2*d[x+3]/255)if d[x+3]>0 else 5]for x in range(y*w*4,(y+1)*w*4,4))for y in range(h-1,-1,-1)))

    По строчкам, потому что и пеернос строки, и ; занимают одинаковое число байт: один.

    Файл задавать аргументом:

     

    python3.5 ./reader.py ~/img/16x16.bmp
    

    Вот что получается:

    wUP8PxI.png

    • Нравится 2

  10. Начнём сразу с кода. Пихнём в файл ./lib.lua

     

    local a = "Hi"
    local b = "World"
    return {
      a = a,
      b = b
    }
    

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

    Итак, этот небольшой файлик будет возвращает таблицу с двумя ключами. Подключим его (./test.lua):

     

    local test = require("test")
    print(test.a, test.b)
    

    Выведет это "Hi      World" и успокоится. Вроде всё нормально.

    Допишем в этот файл ещё немного кода:

     

    test.a = "Goodbye"
    b = "Cruel World"
    test2 = require("lib")
    print(test2.a, test2.b)
    

    Выведет это, однако, Goodbye Cruel World. Упс.

    Если в таблице будет реализация бомбёжки ракетами по союзникам (а как же), изменять что-то не хотелось бы совсем. Вот об неизменяемости речь и пойдёт.

     

    Заметим, что в таблице либы ключам значение присваивается не напрямую, а через переменную. Локальную. Доступа к ним (проигнорим debug) ни у кого другого нет. С другой стороны, у Луа есть метатаблицы с метаметодом __index. Воспользуемся этим, прямолинейно:

     

    local a = "Hi"
    local b = "World"
    return setmetatable({}, {
      __index = function(self, k)
        if k == "a" then
          return a
        elseif k == "b" then
          return b
        end
      end
    })
    

     

    Код ./test.lua можно даже не менять. Результат всё равно будет тот же. Ибо __index вызывается только для несуществующих значений основной таблицы. Когда мы присвоим какое-то значение, вызываться не будет уже метаметод. Ага, значит, давайте запретим заменять таблицу. При tbl.keyname = value вызывается метаметод __newindex. Окей:

     

    local a = "Hi"
    local b = "World"
    return setmetatable({}, {
      __index = function(self, k)
        if k == "a" then
          return a
        else
          return b
        end
      end,
      __newindex = function(self, k, v)
        print("No way!")
      end
    })
    

    Теперь, если мы запустим код тот же, получим что-то вроде этого:

     

    Hi      World
    No way!
    No way!
    Hi      World
    

    Воооот, вроде бы цель достигнута. Как бы не так. Заменим файл ./test.lua этим:

     

    local test = require("test")
    print(test.a, test.b)
    rawset(test, "a", "Goodbye")
    rawset(test, "b", "Cruel World")
    test2 = require("lib")
    print(test2.a, test2.b)
    

    Угадайте, что получится. Конечно же, большой и длинный "ууупс".

     

    Hi      World
    Goodbye Cruel World
    

    Более того, теперь эти значения сидят в обычной таблице и больше не вызывают __newindex. Вот печаль-то.

     

    Но тем не менее, именно такой код мы и оставим. Для решения проблемы нам потребуется переопределить rawget и rawset, добавив проверку на наши любимые таблицы и не давая ничего изменить. Получится это сделать только для систем с доступом к контролю над _G.

     

    Есть ещё вариант докопаться до сути: getmetatable и setmetatable. Их, как можно догадаться, тоже требуется переопределить. Туда же debug.getmetatable и debug.setmetatable.

     

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

     

    Как видно, Луа всеми силами пытается забрать право на забирание динамичности структур. Позволяя стандартно переопределять внутри VM стандартные функции для своих нужд, И просто так отплясаться не получится. Шмактус, однако.

    • Нравится 3
×
×
  • Создать...