Как стать автором
Обновить

Комментарии 12

НЛО прилетело и опубликовало эту надпись здесь

Вы статью читали? Там сказано зачем. К тому же, лукап в таблице заметно медленнее, чем последний вариант

НЛО прилетело и опубликовало эту надпись здесь

А не является ли умножение на 32-битную константу с последующей индексацией 32-битной константы эквивалентом использования 64-битной константы для хранения упакованной lookup-таблицы?

Но подход интересный, спасибо :)

К вопросу как не надо программировать

Вот да, хаб [ненормальное программирование] был бы тему

Чет перемудрил товарисч. wrapped_mul, штоа? Берем два младших бита первого байта строки, дописываем к ним справа два младших бита третьего байта, дописываем еще два нулевых бита, всё. На это число нужно сдвинуть вправо u64 константу с ответами и взять младшие 4 бита.

Четыре раза перечитал статью, и всё никак не могу понять: чего объелся автор, что он эту мешанину из умножения и битовых операций назвал "хеш-таблицей"? Я могу принять "хеш"-половину, а где, простите, таблица? Вот даже в Википедии написано:


Хеш-табли́ца — это структура данных, реализующая интерфейс ассоциативного массива, а именно, она позволяет хранить пары (ключ, значение) и выполнять три операции: операцию добавления новой пары, операцию удаления и операцию поиска пары по ключу.

Эта функция определённо позволяет "найти пару по ключу" (при условии, что мы будем искать только один из 9 ключей), а что с добавлением и удалением? Почему если передать на вход несуществующий ключ, то на выходе будет мусор, а не пустое значение и/или ошибка? Это не говоря о том, что нормальные хеш-таблицы поддерживают такую операцию, как перебор всех имеющихся пар ключ-значение — а в этой "таблице" что, u32::MAX пар лежит?


Можно ли назвать ЭТО "хеш-таблицей значений синуса для x кратных пи радиан"?


fn ultrafast_hash_table_sin (_x: f64) -> f64 { 0.0 }

К вопросу, как не надо переводить.

Как из этого

A Y

B X

C Z

этого

A = X = Камень

B = Y = Ножницы

C = Z = Бумага

и этого

  1. Если мы выбрали Камень — мы получаем 1 очко. Бумага даёт 2 очка. Ножницы — 3 очка.

  2. Если мы проиграли — получаем 0 очков. Если вышла ничья — 3 очка. Победа даёт 6 очков.

вы получили это?

(2 + 6) + (1 + 0) + (3 + 3) = 15.

Ведь A Y = Камень Ножницы = Ножницы (3) + Проигрыш (0), а вовсе не Бумага (2) + Победа (6) ?!

А очень просто. Берем и меняем местами в начальном списке обозначений ножницы и бумагу (paper и scissors) местами. Потому что так на русском звучит лучше. И наплевать, что от этого дальнейшая логика статьи поломается.

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

Некоторое время не мог понять, в чём же ошибка. Спасибо этой задачке за напоминание внимательно и вдумчиво читать ТЗ.

Что-то намудренно у вас слишком. Вот есть 4 байта X 0x20 Y 0x0A. Вычтите из них число 'A' 0x20 'X' 0x0A, останется что-то вроде 0x01 0 0x02 0. Первый и третий байты от 0 до 2. Надо из них собрать 9 различных индексов, допустим, по фромуле 3*x+y — самая простая идеальная хеш функция из {0,1,2}x{0,1,2} в {0-8}. Вот такой код получается:


x -= 0xa582041;
return (x >> 16)*3+(x & 0x3);

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


x -= 0x0a582041;
return ((x >> 14)+(x & 0x3);

Тут два сложения и 2 битовых операции. Вроде, должно быть побыстрее вашего с одиним умножением и тремя бытовыми операциями. А главное, выводится и понимается проще.


Могли бы вы это сравнить с вашим решением?

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

читаю, понимаю текст и смысл

не понимаю: ЗАЧЕМ?

просто упражнение? ну да, ну да

Зарегистрируйтесь на Хабре, чтобы оставить комментарий