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

LostUser - простейший робот

Рекомендуемые сообщения

Это звучит как байткод, которому требуется компилятор из более читаемого языка

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Респект за соулс от мира опенкомпов! Вики очень достойная, но логику работы сложно осилить даже на примере \0ZZ, учитывая необходимость перма-скроллинга то по списку алиасов в сырце, то по списку операторов в самой вики. Да и без поиска тут не обойтись. Пожалей наши мыши! Интереса ради я решил вникнуть в первый пример:

 

1) Читаю команду \0, понимаю, что это useDown(), вопросов нет

2) Читаю команду Z, осознаю, что это алиас на %`~F'ta'N` ?M*'F?M`FN``RRMN`', приступаю к расшифровке

3) Читаю команду %, смекаю, это ещё один алиас на ?{<a>==nil}, отвечающий за проверку истинности результата выполнения некоего Lua-выражения. А какого?

4) Судорожно ищу, что такое <a>, и вроде бы даже нахожу нужную секцию:

 

image.png.dbdbb62063cd98165419b1cd5a0c4128.png

 

То есть, согласно вики, a - это программа, которая... что? Которая названа a

5) Пытаюсь найти в сырцах некую программу с названием а, но тщетно

6) Допускаю, что, скорее всего, a - это переменная, которая пока еще не определена в текущем окружении. Вроде бы. То есть, наверное, выражение ?{<a>==nil} эквивалентно if a == nil. Или a - это все же программа? Ладно, хрен с ним

7) Возвращаюсь к пункту 2, читаю символ `, вновь обращаюсь к сырцам. В сырцах не нахожу. Видимо, оно в вики? Скроллю вики, нахожу искомое:

 

image.png.3733af878e62513d0f26c76e91134432.png

 

Так, падаж-ж-жи! Интересно, зачем столько вариантов... для возможности использовать внутри строк другие кавычки, когда требуется? Если да, то это хорошо, хотя классический эскейпинг через \" был бы правильнее, т.к., например, я не смогу заюзать все 3 варианта кавычек в строке "hello `sunny`, you are 'so shiny' and "beautiful"". Или все же смогу? Энивей иду вперед

8) Натыкаюсь на символ ~, определяющий алиас на подпрограмму ~F'ta'. Судя по вики, у нас теперь определена некая подпрограмма F, выполняющая команды ta

9) Ищу, что такое t и a. Сырцы говорят, что t отвечает за robot.turn(clockwise). Вероятно, переменная а и отвечает за поворот по часовой стрелке? Вроде бы понятно...

10) Читаю новый неизвестный символ N. Хоспади, только не алиас... МАМОЧКИ, ЭТО ОН. Ищу в сырцах содержимое, нахожу логику инверсии перменной a -a{not <a>}... не-е-е, все, убейте меня. Софтина хорошая, идея клёвая, но нервная система у меня одна хд

  • Нравится 2
  • Спасибо 1
  • Ха-ха 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, ECS сказал:

Респект за соулс от мира опенкомпов! 

Спасибо!

Тут как говорится - хотел как лучше - получилось как всегда.

 

Цитата

Пожалей наши мыши!

Как? Я бы рад, но как?

Может сделать какую то внутреннюю подпрограмму, которая будет расшифровывать все алиасы на месте? Типа, выводить куданибудь в output дерево расшифровки?

 

Цитата

?{<a>==nil} эквивалентно if a == nil.

Все твои шаги расшифровки почти полностью правильно поняли мою задумку. Мне приятно видеть что хоть кто то копнул так глубоко.

Именно в этом шаге ?{<a>==nil} эквивалентно if VARS['a'] == nil, потому что иначе не нужны были бы <>.

 

Цитата

a - это программа, которая... что? Которая названа a

Может, проблема в том, что в языке перемешан синтаксис языка \ алиасы и переменные? Может в таком случае, нужно что бы, например

  • Весь синтаксис только на не-буквеных символах @#$
  • Все переменные как маленькие буквы abc
  • Все алиасы как большие ABC
Цитата

классический эскейпинг через \" был бы правильнее

В принципе, мне не сложно добавить эскейпинг. Я это сделаю.

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

 

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

gW79kp4.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, Krutoy сказал:

Как? Я бы рад, но как?

Может сделать какую то внутреннюю подпрограмму, которая будет расшифровывать все алиасы на месте? Типа, выводить куданибудь в output дерево расшифровки?

Под мышами я имел в виду нужду в хаотичном скроллинге документации :p

Было бы клево иметь всю инфу в маркдауновой доке без нужды бегать к комментам в сырцах и обратно, я об этом

 

2 часа назад, Krutoy сказал:

Именно в этом шаге ?{<a>==nil} эквивалентно if VARS['a'] == nil, потому что иначе не нужны были бы <>.

Занятно, а что будет означать конструкция ?{a==nil}? Такая запись вообще валидна или же <> требуется в обязательном порядке? В доке сказано: "You can use <> inside lua code to execute program between <> as commands", из чего я сделал вывод, что <> выполняет некую программу. Но <a> выглядит как переменная, а не программа. Что такое program? Это просто собирательный термин или там действительно какие-то программы поддерживаются? Поясни, пожалуйста

 

2 часа назад, Krutoy сказал:

Может, проблема в том, что в языке перемешан синтаксис языка \ алиасы и переменные? Может в таком случае, нужно что бы, например

  • Весь синтаксис только на не-буквеных символах @#$

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

 

2 часа назад, Krutoy сказал:

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

gW79kp4.png

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 06.03.2022 в 16:30, Krutoy сказал:

Роботы OC очень сложны в сборке и программировании.

С этим биосом робота можно программировать через переименование на наковальне.

 

Ссылка на английский Readme с большим количеством инфы.

Установка

Соберите робота минимальной конфигурации

  • Корпус
  • CPU
  • RAM
 

sBP2y0N.png

 

(Кстати, в моем модпаке Enigmatica 2: Expert - Extended этот чип будет крафтиться, так что игрокам даже не нужен стационарный компьютер что бы пользоваться чипом.)

 

  1. Скачайте программу из интернета: 
    
    wget https://gist.githubusercontent.com/Krutoy242/db63637d605c2c247bc95e939c7f7ddd/raw/lostuser.min.lua
  2. Запишите прогу на чип:
    
    flash -q lostuser.min.lua LostUser

     

  3. Вставьте чип в робота
    Combining robot with EEPROM

 

Использование

Робот программируется путем его переименования. Можно использовать наковальню pYpuM1 или вот такой инструмент из мода VgGaLN Integrated Dynamics.

Назовите своего Робота \3, поставьте на землю, включите и посмотрите, как он будет щелкать по блоку впереди.

 

tgsaqxj.gif

 

Для тех кто заинтересовался, о синтаксисе программирования робота через имя можно посмотреть в англ. Readme.

 

Примеры

IC2 растения

Мы будем использовать робота для разведения культур Industrial Craft 2.

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

 

Имя такого робота будет \0ZZ

Видео во вложении.

Ferrous-Juniper ферма

А вот пример более сложной программы


?(y0)'E9nS18''^9/0s18|0'Z

Видео.

Эта программа:

  1. Выкидывает предметы из слотов 9-16 вниз
  2. Засасывает предметы в слоты 1-8 сверху
  3. Перемещается зигзагообразно, ломает блок под собой и ставит новый

 

Давайте ее разберем.

  • С начала идет условный оператор ?. Он принимает 3 аргумента:
    1) Условие (y0),
    2) Блок then 'E9nS18'
    3) Блок else '^9/0s18|0'
  • Условие это программа y0, где y - сокращение команды inventory_controller.getInventorySize. Некоторые сокращения записаны в исходном коде.
  • Блок then выполняет две программы. E9n - слить слоты с 9 по n вниз. S18 - набрать предметы сверху.
  • Блок else выделяет 9 слот ^9, ломает блок под собой /0, выбирает первый не-пустой слот s18, устанавливает блок вниз |0.
  • В самом конце проги стоит буква Z, которая означает Зигзагообразное движение.

 

Фидбэк

 

Если кому то понравилась идея, пишите как можно улучшить.

Особенно интересно, какие операторы стоит добавить в заранее записанные сокращения, а в каких сокращениях лучше сменить букву.

 

Главный принцип - возможность писать сложные программы используя всего несколько символов.

 

главный вопрос, а зачем? я в своих роботов либо ставлю монитор, либо подключаю к сети дома, регистрирую на нем удаленную файловую системму(чаще всего и то и другое)(мои софтом(netoworks, distfs2)) и открываю доступ в его lua по сети, и вооля все роботом можно управлять удаленно на диск записал /start.lua(запускаеться моим модом для openOS) и как тока включил он пойдет копать

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, rootmaster сказал:

главный вопрос, а зачем?

Наверное потому что так тоже можно. Зачем городить сложные системы и топологию, когда можно и так. Тебе удобно своими инструментами достигать того же результата, а другим удобно иными инструментами.

Хотя если это сообщение оставлено ради рекламы твоего софта, то не самая удачная идея так делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
12 часа назад, rootmaster сказал:

главный вопрос, а зачем? я в своих роботов либо ставлю монитор, либо подключаю к сети дома, регистрирую на нем удаленную файловую системму(чаще всего и то и другое)(мои софтом(netoworks, distfs2)) и открываю доступ в его lua по сети, и вооля все роботом можно управлять удаленно на диск записал /start.lua(запускаеться моим модом для openOS) и как тока включил он пойдет копать

Моя версия проще. Лешего, не нужно учить луа. Скрафтил и вперёд.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 04.04.2022 в 00:37, Krutoy сказал:

Моя версия проще. Лешего, не нужно учить луа. Скрафтил и вперёд.

lua все кто с этим модом играют знают, без этого не как

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, rootmaster сказал:

lua все кто с этим модом играют знают, без этого не как

С/Assembly все кто с Windows играют знают, без этого не как

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
18 минут назад, ECS сказал:

С/Assembly все кто с Windows играют знают, без этого не как

как не как а удаленный доступ к фски и lua робота лутще так и можно с планшета проявлять, такой вариант больше нравиться

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, rootmaster сказал:

lua все кто с этим модом играют знают, без этого не как

Прекрасно помню 2014-15 год, когда познакомился с СС (а Майноська еще была лишь простенькой оболочкой для него) и OC.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 06.03.2022 в 16:30, Krutoy сказал:

Роботы OC очень сложны в сборке и программировании.

С этим биосом робота можно программировать через переименование на наковальне.

 

Ссылка на английский Readme с большим количеством инфы.

Установка

Соберите робота минимальной конфигурации

  • Корпус
  • CPU
  • RAM
 

sBP2y0N.png

 

(Кстати, в моем модпаке Enigmatica 2: Expert - Extended этот чип будет крафтиться, так что игрокам даже не нужен стационарный компьютер что бы пользоваться чипом.)

 

  1. Скачайте программу из интернета: 
    
    wget https://gist.githubusercontent.com/Krutoy242/db63637d605c2c247bc95e939c7f7ddd/raw/lostuser.min.lua
  2. Запишите прогу на чип:
    
    flash -q lostuser.min.lua LostUser

     

  3. Вставьте чип в робота
    Combining robot with EEPROM

 

Использование

Робот программируется путем его переименования. Можно использовать наковальню pYpuM1 или вот такой инструмент из мода VgGaLN Integrated Dynamics.

Назовите своего Робота \3, поставьте на землю, включите и посмотрите, как он будет щелкать по блоку впереди.

 

tgsaqxj.gif

 

Для тех кто заинтересовался, о синтаксисе программирования робота через имя можно посмотреть в англ. Readme.

 

Примеры

IC2 растения

Мы будем использовать робота для разведения культур Industrial Craft 2.

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

 

Имя такого робота будет \0ZZ

Видео во вложении.

Ferrous-Juniper ферма

А вот пример более сложной программы


?(y0)'E9nS18''^9/0s18|0'Z

Видео.

Эта программа:

  1. Выкидывает предметы из слотов 9-16 вниз
  2. Засасывает предметы в слоты 1-8 сверху
  3. Перемещается зигзагообразно, ломает блок под собой и ставит новый

 

Давайте ее разберем.

  • С начала идет условный оператор ?. Он принимает 3 аргумента:
    1) Условие (y0),
    2) Блок then 'E9nS18'
    3) Блок else '^9/0s18|0'
  • Условие это программа y0, где y - сокращение команды inventory_controller.getInventorySize. Некоторые сокращения записаны в исходном коде.
  • Блок then выполняет две программы. E9n - слить слоты с 9 по n вниз. S18 - набрать предметы сверху.
  • Блок else выделяет 9 слот ^9, ломает блок под собой /0, выбирает первый не-пустой слот s18, устанавливает блок вниз |0.
  • В самом конце проги стоит буква Z, которая означает Зигзагообразное движение.

 

Фидбэк

 

Если кому то понравилась идея, пишите как можно улучшить.

Особенно интересно, какие операторы стоит добавить в заранее записанные сокращения, а в каких сокращениях лучше сменить букву.

 

Главный принцип - возможность писать сложные программы используя всего несколько символов.

 

простите меня за то я пролил на это чудное творения кучу хейта в прошлый раз, я был глуп, и мне очень стыдно и я извеняюсь, а со второго взгляда, могу сказать что софт этот мне очень нравиться, это довольно удобно закинул в накавальну и все, и я даже сделаю свой вариант, да еще и с поддержкой дронов(вдруг ее тут нет), вот только есть один маленький вопрос, а сокрашенные движения робота делают проверку на столкновения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Размышления по поводу программы привели меня к еще более крутой идее:

А что если я не буду придумывать никакого синтаксиса, а просто сделаю функцию сокращения путей и ключевых слов?

 

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

 

Например, если назвать робота

robot.use(3)

- он будет юзать вперед.

Но это можно укоротить до 5 символов. Заменим robot на R, сделаем поиск по полям, уберем ненужную точку, и вуаля, останется только 

Ru(3)

Еще бы сократить вызовы функции с параметрами как то, и вообще шикарно.

 

Еще можно упростить всякие циклы и пэирсы, например заменить for in pairs() на

~:t{pt(k,v)}

Превратится в

for k,v in pairs(t) do
  print(k,v)
end

Но тут уже начинаешь путаться.

 

🤔

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
47 минут назад, Krutoy сказал:

~:t{pt(k,v)}

 

Лучше ~kv:t{pt(k,v)} (или как-то так), потому что циклы могут ведь вкладываться друг в друга.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
15 минут назад, ProgramCrafter сказал:

Лучше ~kv:t{pt(k,v)} (или как-то так), потому что циклы могут ведь вкладываться друг в друга.

Да, но так еще больше символов.

Вообще, я уже решил эту проблему. Все циклы работают через k,v, но при выполнении они переписываются на k0,v0 k1,v1 и так далее.

~:t{~:v{pt(k,v)}}

получится

for k1,v1 in pairs(t) do
  for k0,v0 in pairs(v1) do
    print(k0,v0)
  end
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может у кого то есть еще идеи как можно укоротить всякие конструкции с заголовком / телом ?

 

В таких вещах как функции и циклы есть заголовок - например, таблица для pairs(t) и тело - собственно то что будет внутри блока.

Самое короткое что я придумал - 3 символа.

1. Ключевой символ начала паттерна

2. Разделитель между заголовком и телом

3. Окончание паттерна

 

например вот тут ~:t{pt(k,v)} это ~:1 {2 }3

 

Хотелось бы 2 символа или даже один.

Например, как в лямбда - счислениях a.b означает b(a())

 

Проблема в том, что в EEPROM запихать парсер Lua оч сложно, поэтому самый сильный инструмент у меня в доступе это "рекурсивный" паттерн %b12

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
47 минут назад, Krutoy сказал:

Может у кого то есть еще идеи как можно укоротить всякие конструкции с заголовком / телом ?

У меня есть идея, но она ломает изначальный замысел. С точки зрения пользователя я бы предпочёл использовать стандартный синтаксис Lua, и чтобы все необходимые сокращения кода за меня выполняла программа. Получилось бы подобие упаковщика кода в последовательность ASCII-символов, которые можно было бы ввести через наковальню.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
10 минут назад, eu_tomat сказал:

У меня есть идея, но она ломает изначальный замысел. С точки зрения пользователя я бы предпочёл использовать стандартный синтаксис Lua, и чтобы все необходимые сокращения кода за меня выполняла программа. Получилось бы подобие упаковщика кода в последовательность ASCII-символов, которые можно было бы ввести через наковальню.

Да, идея хорошая. Я думал такое сделать. Но по сути, это просто LZ77 алгоритм с распаковщиком внутри EEPROM.

 

Вопрос такой - как узнать все доступные в наковальне символы? Не все символы можно вставлять в название, например

§

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ок, вот мои наработки по теме:

https://gist.githubusercontent.com/Krutoy242/1f18eaf6b262fb7ffb83c4666a93cbcc

 

Документацию напишу позже.

 

Пока, как я и говорил, робот (или дрон!) умеет выполнять свое имя как Луа-код. Но к тому же, он может всё сокращать до 1-2 символов.

 

Например, вот такая строка сторгует всё что есть у жителя:

~:Tg(){?!v{tr}}

 

А вот мега программа в 54 символ для дрона, который носит предметы из одного вейпоинта к другому:

Dm(tb.u(Nf(300)[a++%2+1].p))s(3)~#{Dsel(i)Dd(0)Dsu(0)}

В этом примере есть такие сокращения:

a++ это продвинутая версия a=a+1, только она работает даже если а==nil

s(3) расшифруется как sleep(3)

~#{BODY} получится for i=1, (R or D).inventorySize() do BODY end

 

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

 

Главная фишка это утилизировать битовые операции. Я сделал такое: a|b превращается в function(c) return b(a(c)) end. Но оказалось, что это почти бессмысленно, если мы не можем получить ключ\значение из цикла.

 

В итоге, я уже могу написать вот такую функцию:

_4|(Dsel|Dd&0)

Получится вот так (примерно):

for k,v in pairs{1,2,3,4} do
  (function() return D.drop(0) end)(D.select(v,k))
end

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...