J, 19 байт
Монадический глагол, берущий число справа и выплевывающий размер контейнера. Есть несколько эквивалентных способов написания, поэтому я включил оба.
2^2(>.+1=>.)@^.#@#:
2^s+1=s=.2>.@^.#@#:
Объяснил взрывом:
2^2(>.+1=>.)@^.#@#: NB. takes one argument on the right...
#: NB. write it in binary
#@ NB. length (i.e. how many bits did that take?)
2 ^. NB. log base 2 of that
(>. )@ NB. ceiling
+1=>. NB. +1 if needed (since no container is two bits wide)
2^ NB. base 2 exponential
Круто, что мы видим два разных способа получения логарифмической базы 2 в J. Первый - очевидный 2^.
, то есть числовой логарифм. Второй #@#:
, который может быть прочитан как «длина представления base-2». Это почти эквивалентно одному-плюс-пол-журнала-базы-2, за исключением того, что #:0
это список из одного элемента 0
, который именно то, что мы хотим. Это бьет 1+2<.@^.1&>.
на 8 байтов.
Используется в REPL:
f =: 2^2(>.+1=>.)@^.#@#:
f 131313
32
f 34359750709
64
(,.f"0) 0 1 2 15 16 123 260
0 1
1 1
2 4
15 4
16 8
123 8
260 16
Старое, слишком умное 20-байтовое решение.
2&^.(>.+1=>.&.)@#@#: NB. takes one argument on the right...
#@#: NB. how many bits
2&^. NB. log base 2 of that
>. NB. ceiling
+1=>. NB. +1 if needed (since no container is two bits wide)
( &.) NB. undo log base 2
2
был выход ...