Страница 1 из 1

remake "русская рулетка"

Добавлено: 02 май 2015, 13:41
nezabudka
Ввиду повышенной опасности предоставляемой информации настоятельная просьба ко всем
читателям перед выполнением любой части кода из нижепреведнного сценария прочесть
статью до конца.
Как известно даже в самой небольшей строчке кода можно найти некоторые возможности по
улучшению. Сегодня мы с вами разберем очень простенькую но тем не менее смертельно опасную
игру "Русская Рулетка", проведем оптимизацию и конвертируем ее в безопасный в руках пользователя
вариант под названием Remake "Русская Рулетка". И так пишим всем известный код и проводим
разбор фрица:
(Внимание перед выполнением строчки данного кода следует в обязательном порядке
обновить бэкап всей системы
)

Код: Выделить всё

[ $[$RANDOM % 6] == 0 ] && rm -rf / || echo 'you win!'
Для начала определим алгоритм в правилах игры:
В барабан нагана вставляем один патрон, раскручиваем, подносим ствол к виску, жмем на спусковой
крючек, все, любуемся результатом. Новичкам и людям с неокрепшей психикой следует
однозначно потренироваться на муляже:

Код: Выделить всё

[ $[$RANDOM % 6] ==0 ] && echo 'you lose!' || echo 'you win!'
Теперь вывернем принцип действия. Переменная $RENDOM возвращает случайное число из
интервала 0 - 32767, это положительная часть всех возможных 16 битных чисел. Остаток от деления
на шесть получаем с помощью конструкции $((выражение)) или как в данном случае $[выражение].
Выражение это будет равно одному из ряда от нуля до пяти. Сравниваем с одним из значений, пулю
принимаем за ноль реализовывая тем самым один случайный вариант из шести возможных.
Логические операторы && И(and) и || ИЛИ(or) предоставляют выбор действий в зависимости от
проверки сравнения в нутри объемлющих квадратных скобок и в зависимости от выбора выводится
строка при помощи оператора echo. Незабываем что квадратные скобки это тоже оператор и их
необходимо отделять от других литералов пробелом, исключением является конструкция $[...]
предназначенная для выпонения арифметических операций. Результатом проигрыша будет
по всей видимости отсутствие домашней директории пользователя на жестком диске.
Почему то ни кто не догадался упростить код игры и мы сделаем это самостоятельно, для чего не станем
вычислять остаток от деления а сразу воспользуемся кодом возврата нашего выражения заключив его
в двойные круглые скобки, здесь результат в 0 трактуется как false, а любое другое значение как true.

Код: Выделить всё

(( $RANDOM % 6 )) && echo 'you win' || echo 'you lose'
Заметте что теперь для правильной работы кода мы инвертировали строки оперетора echo.
И даже если мы уберем знак переменной в двойных круглых скобках, код будет продолжать
исправно работать

Код: Выделить всё

(( RANDOM % 6 )) && echo 'you win' || echo 'you lose'
На этом все, получаем 5 за оптимизацию и 5 за безопасность, можно давать детям.
В помощь экстремалам для первоначального варианта игры всегда команда sudo. Удачи!

Re: remake "русская рулетка"

Добавлено: 02 май 2015, 15:42
Kycok
А нет у вас таких советов по питону? :)

Re: remake "русская рулетка"

Добавлено: 02 май 2015, 16:58
nezabudka
Kycok писал(а):А нет у вас таких советов по питону? :)
Мне очень нравится питон, и я видела что раздел пока пустует. Обязательно поделюсь в будущем материалом по Python, Ipython и Scapy

Re: remake "русская рулетка"

Добавлено: 02 май 2015, 17:55
Kycok
nezabudka писал(а):Обязательно поделюсь в будущем материалом по Python
Очень бы пригодилось! ;) Как раз сейчас пишу монополию, и, скорее всего, есть куски кода, которые можно заставить работать быстрее

Re: remake "русская рулетка"

Добавлено: 02 май 2015, 18:48
Oleg65
Этот и подобные способы подробно расписаны в последней версии (предыдущую только пытаюсь сравнивать с последней) Advanced Bash Script Guide

Re: remake "русская рулетка"

Добавлено: 02 май 2015, 19:11
nezabudka
Oleg65 писал(а):Этот и подобные способы подробно расписаны в последней версии (предыдущую только пытаюсь сравнивать с последней) Advanced Bash Script Guide
А можно немножко яснее что бы у меня мозги не дымились?

Re: remake "русская рулетка"

Добавлено: 02 май 2015, 19:24
Oleg65
nezabudka писал(а):
Oleg65 писал(а):Этот и подобные способы подробно расписаны в последней версии (предыдущую только пытаюсь сравнивать с последней) Advanced Bash Script Guide
А можно немножко яснее что бы у меня мозги не дымились?
Конечно, это где-то в 16-17 главах (примерно), где объясняется действие [[ ]] и (( )). Точнее укажу чуть позднее (как найду), кстати, главы в предыдущей и последней версиях - не соответствуют друг другу по нумерации. Если не лень самой покопаться - старая версия и новая версия

Re: remake "русская рулетка"

Добавлено: 02 май 2015, 19:40
nezabudka
Oleg65 писал(а):Если не лень самой покопаться - старая версия и новая версия
Если чесно то лень. Этот учебник написан очень сухим языком, читать его довольно нудное занятие
и я пользуюсь им в основном для справок по определенному вопросу при необходимости так
сказать когда есть интерес. Но с вами я вполне согласна и думаю в этом учебнике описаны многие примеры применения команд в баше.

Re: remake "русская рулетка"

Добавлено: 03 май 2015, 06:45
Oleg65
nezabudka писал(а):
Oleg65 писал(а):Если не лень самой покопаться - старая версия и новая версия
Если чесно то лень.
Старая версия Глава7 "Проверка условий", Новая версия -7.1 Test Constructs

Re: remake "русская рулетка"

Добавлено: 03 май 2015, 08:40
nezabudka
Хочу только добавить, мне очень нравится в консоли как оптимизация кода так и построение заведомо избыточных конструкций, зачастую бесполезных но исправно работающих приемов и порой это бывает намного интересней и увлекательней. :)