avva: (Default)
[personal profile] avva
(эта запись может быть интересна лишь программистам и сочувствующим)

Как и в прошлой загадке, нужно сказать, что делает функция на C. На мой взгляд, она заметно сложнее предыдущей.

Эта функция выполняет некую полезную работу, которую нередко приходится выполнять в настоящих программах или библиотеках. Если вы разобрались в том, что фунцкия делает "буквально", но не понимаете, зачем это нужно, то это не полный ответ на вопрос (хотя тоже можете написать, конечно). Желательно ответить на вопрос, не запуская код; если вы запустили все же, укажите это в своем ответе, пожалуйста.

Комментарии скрываются. Автор этой загадки - мой коллега Дэвид Тернер (David Turner), которого я уже упоминал в записи про предыдущую загадку.

int func(unsigned char c)
{
  const uint64_t MULT= 270549121;
  uint64_t magic = (c >> 2) * MULT + 272696336;
  magic = (((magic >> 6) & MULT)*MULT) >> 28;
  return 1 + (magic & 7);
}


Update (6 часов спустя): только что пришел первый полный ответ, от [livejournal.com profile] type_o_graph. Есть также несколько ответов, которые правильно описывают, что функция делает "буквально", но не объясняют или неправильно объясняют, зачем это нужно.

Update: вот правильный ответ. Раскрываю все комментарии к этой записи. Спасибо всем за попытки и ответы!
Page 1 of 2 << [1] [2] >>

Date: 2011-03-07 09:23 am (UTC)
From: [identity profile] blueher.livejournal.com
Я так понимаю что функция не претендует на оптимальность? Любую "чистую" функцию char->int можно выразить через таблицу размером 1Кб. В нынешние времена это копейка даже для самого мелкого процессора.

Date: 2011-03-07 10:11 am (UTC)
From: [identity profile] avva.livejournal.com
Не претендует.

(no subject)

From: [identity profile] ilya-dogolazky.livejournal.com - Date: 2011-03-07 12:13 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2011-03-07 03:30 pm (UTC) - Expand

(no subject)

From: [identity profile] ilya-dogolazky.livejournal.com - Date: 2011-03-07 03:33 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2011-03-07 03:38 pm (UTC) - Expand

(no subject)

From: [identity profile] ilya-dogolazky.livejournal.com - Date: 2011-03-07 03:41 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2011-03-07 03:41 pm (UTC) - Expand

(no subject)

From: [identity profile] ilya-dogolazky.livejournal.com - Date: 2011-03-07 03:44 pm (UTC) - Expand

(no subject)

From: [identity profile] ilya-dogolazky.livejournal.com - Date: 2011-03-07 03:39 pm (UTC) - Expand

(no subject)

From: [identity profile] dmzlj.livejournal.com - Date: 2011-03-07 01:04 pm (UTC) - Expand

Date: 2011-03-07 09:38 am (UTC)
From: [identity profile] blueher.livejournal.com
Вообще похоже на что-то типа CRC6

Date: 2011-03-07 09:49 am (UTC)
From: [identity profile] blueher.livejournal.com
Считает единички в старших 5 разрядах числа?

Date: 2011-03-07 09:50 am (UTC)
From: [identity profile] ya-doran.livejournal.com
Количество установленных бит со 2-го по 6-й бит в байте?

Date: 2011-03-07 09:59 am (UTC)
From: [identity profile] anton tupy (from livejournal.com)
Количество единиц до первого нуля в двоичном представлении.
Код запускал.

Date: 2011-03-07 10:52 am (UTC)
From: [identity profile] r419.livejournal.com
Прикинул на бумажке,
для бинарного представления числа с
считает количество единиц с начала,
если их не больше шести и не меньше двух.
В общем, делает такое:
111111xx -> 6
111110xx -> 5
11110xxx -> 4
1110xxxx -> 3
110xxxxx -> 2
xxxxxxxx -> 1
Зачем - не могу пока понять.

Date: 2011-03-07 10:56 am (UTC)
From: [identity profile] unbe.livejournal.com
Буквально - вычисляет сколько старших бит установлено подряд (два младших бита отбрасываются, два старших считаются только вместе, но это вроде бы не очень важно).
зачем нужно - фиг знает, немного похоже на выбор уровня в скип-листе, но эти два старших бита портят картину. Наверное, что-то другое, где нужно похожее распределение.

Date: 2011-03-07 11:12 am (UTC)
From: [identity profile] gaius-julius.livejournal.com
В (не таком уж далёком) прошлом, я сдавал экзамен, частью которого была пачка карточек с напечатанными на них C-функциями на четыре-пять строк. Вопрос был тот же - "что делает?"

Тогда на экзамене я чувствовал себя гуру и гением.

Сейчас я чувствую себя дегенератом (-:

Date: 2011-03-07 11:30 am (UTC)
From: [identity profile] alexey boyko (from livejournal.com)
предполагаю, что генерирует следующее псевдослучайное число. правда seed всего 8 бит получается.

Date: 2011-03-07 11:51 am (UTC)
From: [identity profile] fenikso.livejournal.com
Возвращает длину непрерывной цепочки из единичных битов, считая со старшего? (и не учитывая младшие два бита)

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

А, ещё использовал калькулятор, чтобы перевести константы в двоичное представление. :)

Date: 2011-03-07 12:23 pm (UTC)
From: [identity profile] ilya-dogolazky.livejournal.com
Мне эта загадка напомнила такую задачу (по арифметике, не по программированию):
Доказать, что нижеследующая знаменитая функция из фортунок действительно вычисляет то, что она вычисляет

inline int n_bits_64(uint64_t x)
{
x = (x&0x5555555555555555LL) + (((x&0xAAAAAAAAAAAAAAAALL)>>1)) ;
x = (x&0x3333333333333333LL) + (((x&0xCCCCCCCCCCCCCCCCLL)>>2)) ;
x = (x&0x0F0F0F0F0F0F0F0FLL) + (((x&0xF0F0F0F0F0F0F0F0LL)>>4)) ;
x = (x&0x00FF00FF00FF00FFLL) + (((x&0xFF00FF00FF00FF00LL)>>8)) ;
return (int)(x%255) ;
}

Date: 2011-03-09 06:34 am (UTC)
From: [identity profile] http://users.livejournal.com/_navi_/
Ну это классика из Hacker's Delight. Задачка в посте тоже по мотивам той же книжки, там даже подобный подход предлагался для clz(~x) (только константы ещё на пол-байта длиннее наверно были).

Date: 2011-03-07 12:29 pm (UTC)
From: [identity profile] fourdman.livejournal.com
Буквально она считает MAX(6, MIN(1, к-во подряд стоящих в начале единиц в двоичном виде с)). Ответ получил на бумажке, запустил только чтобы проверить. Но вот зачем на практике такая функция — ума не приложу пока.

Date: 2011-03-07 12:34 pm (UTC)
From: [identity profile] mgar.livejournal.com
Нет сейчас времени подумать поглубже, но, на первый взгляд, возвращает, с какого бита в байте (6 страших битов) появляется ноль, если слева считать.

Программу не запускал. Предыдущую задачу понял, что делает, не догадался, зачем.

Date: 2011-03-07 01:51 pm (UTC)
From: (Anonymous)
Вычисляет, сколько единиц идут подряд начиная со седьмого бита вниз до третьего включительно, предполагая, что в восьмом бите стоит 0 и добавляет 1. Может использоваться в алгоритмах компрессии.

Date: 2011-03-07 02:13 pm (UTC)
From: [identity profile] oblomov-jerusal.livejournal.com
В функция вычисляет длину максимальной последовательности единиц начиная с бита 7 вниз до бита 3 включительно и добавляет к ней 1. Может быть полезна в алгоритмах компрессии. Анонимный коммент выше от меня. Я не запускал программу, но пользовался калькулятором, чтобы перевести числа в двоичную форму.

Date: 2011-03-07 02:22 pm (UTC)
From: [identity profile] type-o-graph.livejournal.com
Кажется, это количество байт в символе UTF-8. То есть функция возвращает количество последовательных единичек в старших битах с (начиная с 2-х), а значит полную длину символа в зависимости от первого байта

Вот только не совсем понятно зачем возвращать int а не uchar и зачем прибавлять единичку а не интерпретировать значение как количество оставшихся байт.

Date: 2011-03-07 02:43 pm (UTC)
From: [identity profile] oblomov-jerusal.livejournal.com
В ответе выше предполагается, что бит 8 байта равен 0. Если бит 8 равен 1, посчитается 6 минус длина последовательности. Если я неясно выразился, в обеих случаях последовательность должна начинаться с бита 7.

Date: 2011-03-07 03:05 pm (UTC)
From: [identity profile] fenikso.livejournal.com
Хм, "нужно" это может быть для кучи разных случаев - например для алгоритмов сжатия. domain-specific, имхо.

Date: 2011-03-07 03:30 pm (UTC)
From: [identity profile] avva.livejournal.com
Есть более специфичная и идеально подходящая функция.

(no subject)

From: [identity profile] fenikso.livejournal.com - Date: 2011-03-07 03:45 pm (UTC) - Expand

(no subject)

From: [identity profile] oblomov-jerusal.livejournal.com - Date: 2011-03-07 04:18 pm (UTC) - Expand

(no subject)

From: [identity profile] oblomov-jerusal.livejournal.com - Date: 2011-03-07 04:35 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2011-03-07 04:39 pm (UTC) - Expand

(no subject)

From: [identity profile] oblomov-jerusal.livejournal.com - Date: 2011-03-08 09:26 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2011-03-07 03:46 pm (UTC) - Expand

(no subject)

From: [identity profile] fenikso.livejournal.com - Date: 2011-03-07 03:55 pm (UTC) - Expand

(no subject)

From: [identity profile] yms.livejournal.com - Date: 2011-03-07 05:54 pm (UTC) - Expand

Date: 2011-03-07 03:32 pm (UTC)
From: (Anonymous)
что то типа MD5?

Date: 2011-03-07 03:33 pm (UTC)
From: [identity profile] blueher.livejournal.com
Логарифм по основанию 2?

Date: 2011-03-07 03:58 pm (UTC)
From: [identity profile] grur.livejournal.com
Полная длина UTF-8 символа в байтах?

Date: 2011-03-07 04:56 pm (UTC)
From: [identity profile] mkal.livejournal.com
Считает количество байт в UTF-8 юникоде по его первому байту.

Date: 2011-03-07 06:06 pm (UTC)
From: [identity profile] igogo3000.livejournal.com
Количество байт в UTF-8 букве (где c - первый байт).
From: (Anonymous)
Как договаривались, без компилятора.

По-моему, код делает примерно следующее:
return (C >= 0xF8) + (C >= 0xF0) + (C >= 0xE0) + (C >= 0xC0) + 1;

Зачем, сказать труднее... Считает сколько верхних битов, от одного до шести...

Ой, погодите, а это не длина Юникодового символа? Очень похоже. Сейчас посмотрю... Ага, вроде да. UTF-8 Bit Distribution.

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

Злой ваш коллега! Не добрый!

Date: 2011-03-07 07:27 pm (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
Это яркость пиксела с учетом гаммы, или число байт в символе в UTF8?
:)
Page 1 of 2 << [1] [2] >>

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 12:40 am
Powered by Dreamwidth Studios