Дуэли
         Помощь
добавить запись мои записи мои метки new мои дуэли избранное обо мне настройки оформление  
читать всех друзей редактировать друзей редактировать группы дни рождения настройка подписки  
создать сообщество мои сообщества каталог сообществ  
комментируемые активные популярные читаемые звездные блогиЗвездные блоги на Mail.Ru популярные записи последние записи опросы  
мои дуэли победы поражения прямой эфир двустволка new в десятку! new  
  Блог
  Инфо
  Друзья
  Мой Мир
  Фото
  Видео
  Подписаться на обновления

Поиск по блогу



06-05-2007 20:13 (ссылка)

Ошибки нового времени

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

maccuB = [1,2,3,4,5,6,7,8,2**33]
maccuB.select{ |elem| (elem&1).zero? }

Данная программа из maccuBa вытаскивает только четные элементы. Четность проверяется при помощи следующего кода: (elem&1).zero?. Идет побитовое умножение на 1 и проверка результата на равенство нулю. Казалось бы все верно. Я тоже так думал... до недавнего времени.

Все зависит от содержимого массива. Дело в том, что в Руби (как и в Перле с Питоном) есть несколько типов целых чисел: Bignum и Fixnum. Fixnum -- это аналог всем знакомого int, а Bignum -- это все числа, которые в int не поместились. То есть целые числа делятся на большие и маленькие. И загвоздка в том, что большие не имеют побитовых операций, т.к. имею совсем другую структуру хранения числа.

Теперь ситуация -- в результате математических преобразований мы получили число, которое превышает допустимые 30 разрядов (японцы посчитали, что 32 -- число не круглое) и получили большое целое число. Во время проверки на четность вылезет ошибка, так как с побитовыми операциями у больших чисел проблемы. Проблема решается просто:

maccuB = [1,2,3,4,5,6,7,8,2**33]
maccuB.select{ |elem| (elem%2).zero? }

Заменой побитовой операции умножения на операцию получения остатка от деления.

Отсюда мораль: пытаясь ускорить программу, можно сделать ее неработоспособной. Следовательно, оптимизация -- это зло для программиста и добро для компьютера.



Комментарии

 
  Написать комментарий

Psevdonim
23-07-2007 21:12 (ссылка)
 
Re: Ошибки нового времени
hehe...

вообще из любого целого числа (что Fixnum что Bignum) в Руби можно извлечь любой бит операцией []

То есть писать надо:
maccuB.select{ |elem| elem[0].zero?}

вот и получатся все чётные числа

Ответить (с цитатой)

Rubynovich
01-08-2007 17:59 (ссылка)
 
Re[2]: Ошибки нового времени
Блин, уже да. =)))

Ответить (с цитатой)

Rubynovich
01-08-2007 18:02 (ссылка)
 
Re[2]: Ошибки нового времени
Насчет [] я, конечно, знал. Но вот уперся в &1 и думал, что и [] его использует.

ЗЫ. А решение красивое... Ruby Way! =)

Ответить (с цитатой)

Комментарий скрыт  Комментарий скрыт
Комментарий скрыт  Комментарий скрыт
Ольга ,,,,
16-12-2007 16:56 (ссылка)
 
Re[4]: Ошибки нового времени
Да,да . Ну очень нужно ......... Помоги пожалуйсто .

Ответить (с цитатой)

Psevdonim
17-12-2007 09:27 (ссылка)
 
Re[5]: Ошибки нового времени
Где задачки-то?

Ответить (с цитатой)

Ольга ,,,,
17-12-2007 18:44 (ссылка)
 
Re[6]: Ошибки нового времени
ну вот например :
Дано натуральное число n, в котором все цифры различны. Определите порядковый номер его максимальной цифры, считая номера от младшего разряда.

или

Дано натуральное число n, в котором все цифры различны. Определите порядковый номер его минимальной цифры, считая номера от старшего разряда.


Ответить (с цитатой)

Rubynovich
06-01-2008 18:56 (ссылка)
 
Re[7]: Ошибки нового времени
это случаем не задачки из автоматической системы тестирования МГИУ? =)

n = 123
m = n.to_s.split('').reverse
m.index( m.max )

или

n = 123
m = n.to_s.split('')
m.index( m.min )


Ответить (с цитатой)

Ольга ,,,,
09-01-2008 12:35 (ссылка)
 
Re[8]: Ошибки нового времени
они родимые.А ты связан с МГИУ? :))))))) Но она (система) чо то опять не принимает . первая програмка выводит массив , а надо число .....вот как в примере.
Дано натуральное число n, в котором все цифры различны. Определите порядковый номер его максимальной цифры, считая номера от старшего разряда.


Пример
Входные данные:
123456

Выходные данные:
6


Входные данные:
98712345

Выходные данные:
1

Ответить (с цитатой)


  Написать комментарий
Имя:      



Тема:   
Текст:
 
Классические
:) ;) :-)) ;-P 8-) :-D }:o) $-) :-' :-( 8-( :'( :''() $:-o (:-o 8-0 8-[o] ):-p ):-( ):-$ ):-D :-E :devil: :vampire: :-][ :-| B-j :~o (_I_) :heart: :-* :sleepy:
Жесты
:cool: :viva: :ok: :yol: :yor: :suxx: :think: :figu: :kulak: :fuck:
Анимированные
Ангелочек Аплодисменты Красотка Пиво Читаю Мёрзну Рыдаю Танцую Чертовски злюсь Жую Побью Побили Дарю цветочек Смеюсь Смеюсь и плачу Подарок Ворчу Целую Люблю Застрелю Выпей яду Лучезарно Смущаюсь Расстраиваюсь Пою Скучаю Засыпаю Улыбаюсь Показываю язык Peace! Удивляюсь Тошнит
Продвинутые
Улыбаюсь Злорадствую Радуюсь Старичок Свирепствую Пугаюсь Показываю язык Умник Алкоголик Вояка Удивляюсь Чертовски злюсь Расстраиваюсь Панк Лопну от смеха Подмигиваю Думаю Люблю Подавлен Рыдаю Сейчас расплачусь Злюсь Тошнит Сумасшествие Целую Поцеловали Красотка Ангелочек Подозрительно Жую Смущаюсь Стыдно
    Закрыть