горжусь этим кодом. Это была первая моя задача по программированию (обменять значения двух переменных без третьей), с которой я успешно справился. Думаю с неё началось моё увлечение программированием.
MF>Он обменивает значения 2ух переменных. Просто и лаконично. И есть, что показать. Помимо репозиториев на гитхаб и битбакет. Или я чего-то не понимаю?
если бы мне кто-то показал такой код на это вопрос, мне пришлось бы строчно убежать в другую комнату, чтобы проржаться
Здравствуйте, __kot2, Вы писали:
__>Здравствуйте, ManFeel, Вы писали: MF>>
MF>>a, b = b, a
MF>>
MF>>Он обменивает значения 2ух переменных. Просто и лаконично. И есть, что показать. Помимо репозиториев на гитхаб и битбакет. Или я чего-то не понимаю? __>если бы мне кто-то показал такой код на это вопрос, мне пришлось бы строчно убежать в другую комнату, чтобы проржаться
Здравствуйте, ManFeel, Вы писали:
MF>Я, например, горжусь вот этим руби кодом: MF>Он обменивает значения 2ух переменных. Просто и лаконично. И есть, что показать. Помимо репозиториев на гитхаб и битбакет.
Здравствуйте, ManFeel, Вы писали:
MF>У вас есть код, которым вы гордитесь, чтобы показывать, когда работадатели просят его показать? Я, например, горжусь вот этим руби кодом:
MF>
MF>a, b = b, a
MF>
MF>Он обменивает значения 2ух переменных. Просто и лаконично. И есть, что показать. Помимо репозиториев на гитхаб и битбакет. Или я чего-то не понимаю?
Здравствуйте, ManFeel, Вы писали:
MF>Он обменивает значения 2ух переменных. Просто и лаконично. И есть, что показать. Помимо репозиториев на гитхаб и битбакет. Или я чего-то не понимаю?
Видно что вы мыслите образами студента.
То что вы написали может и красивее, но практически в 99% случаев ничем не лучше:
temp = a;
a = b;
b = temp;
Красота должна быть в архитектуре. Насколько ее легко тестировать, расширять, добавлять новый функционал, поддерживать, ввести нового бойца в курс дела... Вот что важно!
А архитектуру в одном форумном сообщении не пояснить.
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, ManFeel, Вы писали:
S>Красота должна быть в архитектуре. Насколько ее легко тестировать, расширять, добавлять новый функционал, поддерживать, ввести нового бойца в курс дела... Вот что важно!
S>А архитектуру в одном форумном сообщении не пояснить.
Здравствуйте, ManFeel, Вы писали:
MF>У вас есть код, которым вы гордитесь, чтобы показывать, когда работадатели просят его показать?
Предлагаю варианты правильных ответов:
— Есть, но я его вам не покажу. Во-первых, а ты не сдохнешь, как наша корова? там дохрена, а во-вторых нефиг.
— Я горжусь почти всем, что пишу, потому что пишу не тяп-ляп. Но если дать написанному настояться и оглянуться на него через какое-то (достаточно большое) время, обычно выясняется, что гордиться там нечем, потому что во-первых, можно было бы и лучше, а во-вторых, какой смысл жить прошлым.
vsb>a := a + b;
vsb>b := a - b;
vsb>a := a - b;
vsb>
a = 2147483647, b = 12345. Получаем overflow и пометку профнепригодности у эйчаров.
На последнюю просьбу пациента "дайте заменить арифметику на xor" предложить a = b = 1 и назначить младшим помощником золоторя при ассенизационном обозе.
Здравствуйте, ManFeel, Вы писали:
MF>Он обменивает значения 2ух переменных. Просто и лаконично. И есть, что показать.
это как бы базовая матчасть. демонстрирует значение руби на уровне faq.
вообразим себе картину. вы ищите работу и демонстрируете этот код, а я вас спрашиваю:
а) может ли этот код бросать исключения?
б) в каком порядке осуществляется обмен и кто это гарантирует (хинт: a,b = nil,a);
в) когда (б) не соблюдается и на выходе получается не [nil, nil], а [nil, a];
г) какие побочные эффекты имеет ваш код (хинт: гуглить write-only переменные);
д) какой оверхид имеет эта операция? (хинт: просиходит ли копирование содержимого переменных);
> Помимо репозиториев на гитхаб и битбакет. Или я чего-то не понимаю?
в вашем коде я виду четыре ошибки, при этом я не специалист по руби.
что же касается показать код, то я могу маркером на доске (или ручной на листке бумаги) написать код калькулятора с поддержкой скобок, приоритетов и в качестве небольшого бонуса — переменных и комментариев. ну типа: ammo_price_per_round = charge / rounds; charge = price — discount; price = box_price * boxes; discount = (boxes >= 5)?(price*discount_rate):0; discount_rate = (member)?0.15:0.10; rounds = boxes * rounds_per_box; rounds_per_box = 20; boxes = 12; box_price = $8.96;
обратите внимание на произвольный порядок присвоения переменных. они тут присваиваются в конце. это же калькулятор, а не программа. так удобнее. задал формулу для пересчета, а потом внезапно понял, что discount у нас разный в зависимости от членства -- добавил еще формулу в _конец_. ну и знак доллара подразумевает операции с фиксированной точкой. и его достаточно задать однажды, а дальше все операции будут вычисляться по принципу наибольшей точности, т.е. в данном случае с фиксированной точной. т.е. я хочу чтобы 1.23 + 44*2 + 3/4 + $1 + 16*3 было вычислено с использованием фиксированной точки везде. мелочь, а приятно. если АРХИТЕКТУРА парсера правильная, то эту фичу можно добавить и на лету без больших правок.
у меня это влезает на белую доску с маркером (или на блокнотный лист — меньше половины от A4). и оно даже транслируется. "оно" это написанный мной код. и в нем хорошо видна архитектура. причем, это как бы слегка нетривиальный пример. декларативные калькуляторы на каждой помойке не валяются, хотя на самом деле тут декларация реализована вполне имеративным способом — через компиляцию. грубо говоря как на том же руби можно объявлять функцию после ее вызова. руби на это чихать. он сначала парсит код и только если не находит нужной функции — только тогда ругается.
а у вас сколько займет это строк и времени? тот кто вас собеседует не начнет скучать? между прочим, декларативный калькулятор (на самом деле не декларативный, но разница настолько тонка, что незаметная) производит впечатление. кроме того, легким движением руки оно превращается в продвинутый парсер файла конфигурации, где нужна именно декларативность.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, abibok, Вы писали:
A>a = 2147483647, b = 12345. Получаем overflow и пометку профнепригодности у эйчаров. A>На последнюю просьбу пациента "дайте заменить арифметику на xor" предложить a = b = 1 и назначить младшим помощником золоторя при ассенизационном обозе.
Фу, быть таким. Это наверняка сделано школьником (Паскаль) и было удивительно.
И наверняка значение 2147483647 присвоить не получится, потому что школьники учили (учат?) Паскаль на примере 16-битного ТурбоПаскаля.
A>a = 2147483647, b = 12345. Получаем overflow и пометку профнепригодности у эйчаров.
Никакого overflow мы не получаем — Паскаль содержит целочисленую арифметику, аналогичную C/C++ — не влезающие биты просто отбрасываются. Код будет работать коректно (на 32 бит машине).
A>На последнюю просьбу пациента "дайте заменить арифметику на xor" предложить a = b = 1 и назначить младшим помощником золоторя при ассенизационном обозе.
xor использовать конечно более правильно, но вс еравно — Не понял юмора ?
E>xor использовать конечно более правильно, но вс еравно — Не понял юмора ?
вообще-то a,b = b,a работает с любыми типами. там может быть и строка, и некий абстрактный объект. или одна переменная строка, а другая число. причем, обмен значениями происходит без оверхида, т.к. значения лежат на месте и никто их не трогает, меняются лишь переменные. точнее, идентификатору a соответствует то, что соответствовало b и наоборот.
вопрос на засыпку: является ли конструкция a,b = b,a эквивалентной (в смысле оверхида) конструкции: tmp = a; a = b; b = tmp; ответ обосновать. тут можно трепаться минут с полчаса, ибо есть о чем поговорить... под оверхидом подразумевается расходы на память (время), которые зависят от содержимого переменных
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
E>>xor использовать конечно более правильно, но вс еравно — Не понял юмора ? М>вообще-то a,b = b,a работает с любыми типами. там может быть и строка, и некий абстрактный объект. или одна переменная строка, а другая число. причем, обмен значениями происходит без оверхида, т.к. значения лежат на месте и никто их не трогает, меняются лишь переменные. точнее, идентификатору a соответствует то, что соответствовало b и наоборот.
Я так понимаю, нить темы потеряна, но я напомню: a = 2147483647, b = 12345. Получаем overflow и пометку профнепригодности у эйчаров.
Что кассается a,b = b,a то, безусловно, работает с любыми типами. Но не во всех языках, конкретно я знаю про Lua, а теперь еще про этот ваш Руби.
М>вопрос на засыпку: является ли конструкция a,b = b,a эквивалентной (в смысле оверхида) конструкции: tmp = a; a = b; b = tmp; ответ обосновать. тут можно трепаться минут с полчаса, ибо есть о чем поговорить... под оверхидом подразумевается расходы на память (время), которые зависят от содержимого переменных
Для начала, надо определиться о каком языке идет речь, ибо не во всех языках есть этот синтаксический сахар, и подозреваю, реализован он по разному. Конкретно в Lua он реализован поклажей на стек b,a и взятием со стека a,b, т.е. эквивалентен конструкции tmpa = a; tmpb = b; a = tmpb; b = tmpa; и соответсвенно не эквиватентен конструкции: tmp = a; a = b; b = tmp;