J, 19 Bytes
Monadisches Verb, das die Zahl rechts aufnimmt und die Behältergröße ausspuckt. Es gibt zwei äquivalente Schreibweisen, also habe ich beide eingeschlossen.
2^2(>.+1=>.)@^.#@#:
2^s+1=s=.2>.@^.#@#:
Erklärt durch Explosion:
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
Was cool ist, ist, dass wir in J zwei verschiedene Arten sehen 2^.
, Logarithmus 2 zu nehmen. Die erste ist der offensichtliche , ein numerischer Logarithmus. Die zweite ist #@#:
, die als "Länge der Basis-2-Darstellung" gelesen werden kann. Dies ist fast gleichbedeutend mit einem Plus-Stockwerk-von-Log-Basis-2, mit der Ausnahme, dass #:0
es sich um die Liste mit einem Element handelt 0
, die genau das ist, was wir wollen. Dies schlägt 1+2<.@^.1&>.
um 8 Bytes.
Im Einsatz bei der 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
Alte, zu clevere 20-Byte-Lösung.
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
eine Ausgabe wäre ...