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 у Дж. Перший очевидний 2^.
, що є числовим логарифмом. Друге - #@#:
це може бути прочитано як "довжина подання бази-2". Це майже еквівалентно одному-плюс-підлоги-log-base-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
був і вихід…