Fibonacci word: Difference between revisions

Added Easylang
m (→‎{{header|REXX}}: added commas to appropriate numbers, increased width for future (bigger) numbers.)
(Added Easylang)
 
(18 intermediate revisions by 11 users not shown)
Line 1:
{{task}}
[[File:Fibonacci word cutting sequence.png|thumb|Fibonacci word.]]
 
The   Fibonacci Word   may be created in a manner analogous to the   Fibonacci Sequence   [http://hal.archives-ouvertes.fr/docs/00/36/79/72/PDF/The_Fibonacci_word_fractal.pdf as described here]:
 
Line 29:
{{trans|Python}}
 
<langsyntaxhighlight lang="11l">F entropy(s)
I s.len <= 1
R 0.0
Line 42:
fwords [+]= reversed(fwords[(len)-2..]).join(‘’)
V v = fwords[n - 1]
print(‘#3.0 #10.0 #2.7 #.’.format(n, v.len, entropy(v), I v.len < 56 {v} E ‘<too long>’))</langsyntaxhighlight>
 
{{out}}
Line 87:
 
=={{header|Ada}}==
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Strings.Unbounded,
Ada.Strings.Unbounded.Text_IO, Ada.Numerics.Long_Elementary_Functions,
Ada.Long_Float_Text_IO;
Line 143:
end loop;
end Fibonacci_Words;
</syntaxhighlight>
</lang>
Output
<pre> N Length Entropy Word
Line 186:
 
=={{header|Aime}}==
<langsyntaxhighlight lang="aime">real
entropy(data b)
{
Line 229:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre> 1 1 0 1
Line 271:
=={{header|ALGOL 68}}==
{{works with|ALGOL 68G|Any - tested with release 2.8.win32}}
<langsyntaxhighlight lang="algol68"># calculate some details of "Fibonacci Words" #
 
# fibonacci word 1 = "1" #
Line 389:
print fibonacci word stats( 37 )
)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 433:
 
=={{header|APL}}==
<langsyntaxhighlight lang="apl">
F_WORD←{{⍵,,/⌽¯2↑⍵}⍣(0⌈⍺-2),¨⍵}
ENTROPY←{-+/R×2⍟R←(+⌿⍵∘.=∪⍵)÷⍴⍵}
FORMAT←{'N' 'LENGTH' 'ENTROPY'⍪(⍳⍵),↑{(⍴⍵),ENTROPY ⍵}¨⍵ F_WORD 1 0}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 480:
37 24157817 0.9594187282
</pre>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">entropy: function [s][
if 1 >= size s -> return 0.0
strlen: to :floating size s
count0: to :floating size match s "0"
count1: strlen - count0
return neg add (count0/strlen) * log count0/strlen 2 (count1/strlen) * log count1/strlen 2
]
 
fibwords: function [n][
x: 0
a: "1"
b: "0"
result: @[a b]
while [x<n][
a: b ++ a
 
tmp: b
b: a
a: tmp
result: result ++ b
x: x+1
]
return result
]
 
loop.with:'i fibwords 37 'w [
print [
pad to :string i+1 4
pad to :string size w 10
pad to :string entropy w 20
]
]</syntaxhighlight>
 
{{out}}
 
<pre> 1 1 0.0
2 1 0.0
3 2 1.0
4 3 0.9182958340544896
5 5 0.9709505944546686
6 8 0.9544340029249649
7 13 0.961236604722876
8 21 0.9587118829771318
9 34 0.9596868937742169
10 55 0.9593160320543777
11 89 0.9594579158386696
12 144 0.959403754221023
13 233 0.9594244469559867
14 377 0.9594165437404407
15 610 0.9594195626031441
16 987 0.9594184095152245
17 1597 0.9594188499578099
18 2584 0.9594186817240321
19 4181 0.9594187459836638
20 6765 0.9594187214386756
21 10946 0.9594187308140278
22 17711 0.959418727232962
23 28657 0.9594187286008073
24 46368 0.9594187280783371
25 75025 0.9594187282779029
26 121393 0.9594187282016755
27 196418 0.9594187282307918
...</pre>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">SetFormat, FloatFast, 0.15
SetBatchLines, -1
OutPut := "N`tLength`t`tEntropy`n"
Line 509 ⟶ 575:
}
return, e
}</langsyntaxhighlight>
'''Output:'''
<pre>N Length Entropy
Line 551 ⟶ 617:
 
=={{header|C}}==
<langsyntaxhighlight Clang="c">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Line 647 ⟶ 713:
free(current_word);
return 0;
}</langsyntaxhighlight>
{{out}}
<pre> N Length Entropy Word
Line 689 ⟶ 755:
</pre>
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight Clang="c sharp">using SYS = System;
using SCG = System.Collections.Generic;
 
Line 760 ⟶ 826:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>N Length Entropy
Line 802 ⟶ 868:
 
=={{header|C++}}==
<langsyntaxhighlight Cpplang="cpp">#include <string>
#include <map>
#include <iostream>
Line 854 ⟶ 920:
}
return 0 ;
}</langsyntaxhighlight>
{{out}}
<pre>N length entropy
Line 897 ⟶ 963:
 
=={{header|Clojure}}==
<langsyntaxhighlight Clojurelang="clojure">(defn entropy [s]
(let [len (count s), log-2 (Math/log 2)]
(->> (frequencies s)
Line 914 ⟶ 980:
(doseq [i (range 1 38)
w (take 37 (fibonacci str "1" "0"))]
(printf "%2d %10d %.15f %s%n" i (count w) (entropy w) (if (<= i 8) w "..."))))</langsyntaxhighlight>
 
Output
Line 955 ⟶ 1,021:
36 14930352 0,959418728222743 ...
37 24157817 0,959418728222745 ...</pre>
 
=={{header|CLU}}==
<syntaxhighlight lang="clu">% NOTE: when compiling with Portable CLU,
% this program needs to be merged with 'useful.lib' to get log()
%
% pclu -merge $CLUHOME/lib/useful.lib -compile fib_words.clu
 
% Yield pairs of (zeroes, ones) for each Fibonacci word
% We don't generate the whole words, as that would take too much
% memory.
fib_words = iter () yields (int,int)
az: int := 0 ao: int := 1
bz: int := 1 bo: int := 0
while true do
yield(az, ao)
az, ao, bz, bo := bz, bo, az+bz, ao+bo
end
end fib_words
 
fib_entropy = proc (zeroes, ones: int) returns (real)
rsize: real := real$i2r(zeroes + ones)
zeroes_frac: real := real$i2r(zeroes)/rsize
ones_frac: real := real$i2r(ones)/rsize
return(-zeroes_frac*log(zeroes_frac)/log(2.0)
-ones_frac*log(ones_frac)/log(2.0))
except when undefined: return(0.0) end
end fib_entropy
 
start_up = proc ()
max = 37
po: stream := stream$primary_output()
stream$putl(po, " # Length Entropy")
num: int := 0
for zeroes, ones: int in fib_words() do
num := num + 1
stream$putright(po, int$unparse(num), 2)
stream$putright(po, int$unparse(zeroes+ones), 10)
stream$putright(po, f_form(fib_entropy(zeroes, ones), 1, 6), 10)
stream$putl(po, "")
if num=max then break end
end
end start_up </syntaxhighlight>
{{out}}
<pre> # Length Entropy
1 1 0.000000
2 1 0.000000
3 2 1.000000
4 3 0.918296
5 5 0.970951
6 8 0.954434
7 13 0.961237
8 21 0.958712
9 34 0.959687
10 55 0.959316
11 89 0.959458
12 144 0.959404
13 233 0.959424
14 377 0.959417
15 610 0.959419
16 987 0.959418
17 1597 0.959419
18 2584 0.959419
19 4181 0.959419
20 6765 0.959419
21 10946 0.959419
22 17711 0.959419
23 28657 0.959419
24 46368 0.959419
25 75025 0.959419
26 121393 0.959419
27 196418 0.959419
28 317811 0.959419
29 514229 0.959419
30 832040 0.959419
31 1346269 0.959419
32 2178309 0.959419
33 3524578 0.959419
34 5702887 0.959419
35 9227465 0.959419
36 14930352 0.959419
37 24157817 0.959419</pre>
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(defun make-fibwords (array)
(loop for i from 0 below 37
for j = "0" then (concatenate 'string j k)
Line 988 ⟶ 1,139:
for n = (aref *fib* i) do
(format t "~2D ~10D ~17,15F ~A~%"
(1+ i) (length n) (entropy n) (string-or-dots n)))</langsyntaxhighlight>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio, std.algorithm, std.math, std.string, std.range;
 
real entropy(T)(T[] s) pure nothrow
Line 1,013 ⟶ 1,164:
s.dup.representation.entropy.abs,
s.length < 25 ? s : "<too long>");
}</langsyntaxhighlight>
{{out}}
<pre> N Length Entropy Fibword
Line 1,053 ⟶ 1,204:
36 14930352 0.9594187282227428063 <too long>
37 24157817 0.9594187282227447312 <too long></pre>
 
=={{header|Dart}}==
{{trans|Java}}
<syntaxhighlight lang="Dart">
import 'dart:math';
 
class FWord {
String fWord0 = "";
String fWord1 = "";
 
String nextFWord() {
String result;
 
if (fWord1 == "") {
result = "1";
} else if (fWord0 == "") {
result = "0";
} else {
result = fWord1 + fWord0;
}
 
fWord0 = fWord1;
fWord1 = result;
 
return result;
}
 
static double entropy(String source) {
int length = source.length;
var counts = <String, int>{};
double result = 0.0;
 
for (int i = 0; i < length; i++) {
String c = source[i];
 
if (counts.containsKey(c)) {
counts[c] = counts[c] + 1;
} else {
counts[c] = 1;
}
}
 
counts.values.forEach((count) {
double proportion = count / length;
result -= proportion * (log(proportion) / log(2));
});
 
return result;
}
 
static void main() {
FWord fWord = FWord();
 
for (int i = 0; i < 37;) {
String word = fWord.nextFWord();
print("${++i} ${word.length} ${entropy(word)}");
}
}
}
 
void main() {
FWord.main();
}
</syntaxhighlight>
{{out}}
<pre>
1 1 0.0
2 1 0.0
3 2 1.0
4 3 0.9182958340544896
5 5 0.9709505944546686
6 8 0.9544340029249649
7 13 0.961236604722876
8 21 0.9587118829771318
9 34 0.9596868937742169
10 55 0.9593160320543777
11 89 0.9594579158386696
12 144 0.959403754221023
13 233 0.9594244469559867
14 377 0.9594165437404407
15 610 0.9594195626031441
16 987 0.9594184095152245
17 1597 0.9594188499578099
18 2584 0.9594186817240321
19 4181 0.9594187459836638
20 6765 0.9594187214386756
21 10946 0.9594187308140278
22 17711 0.959418727232962
23 28657 0.9594187286008073
24 46368 0.9594187280783371
25 75025 0.9594187282779029
26 121393 0.9594187282016755
27 196418 0.9594187282307918
28 317811 0.9594187282196702
29 514229 0.9594187282239184
30 832040 0.9594187282222959
31 1346269 0.9594187282229156
32 2178309 0.9594187282226789
33 3524578 0.9594187282227691
34 5702887 0.9594187282227347
35 9227465 0.9594187282227479
36 14930352 0.9594187282227429
37 24157817 0.9594187282227448
 
</pre>
 
 
=={{header|Delphi}}==
See [[#Pascal]]
 
=={{header|EasyLang}}==
{{trans|Nim}}
<syntaxhighlight>
func log2 x .
return log10 x / log10 2
.
func entropy s$ .
l = len s$
if l <= 1
return 0
.
for v$ in strchars s$
cnt0 += if v$ = "0"
.
cnt1 = l - cnt0
return -(cnt0 / l * log2 (cnt0 / l) + cnt1 / l * log2 (cnt1 / l))
.
a$ = ""
b$ = ""
func$ fibword .
if a$ = ""
a$ = "1"
return a$
.
if b$ = ""
b$ = "0"
return b$
.
a$ = b$ & a$
swap a$ b$
return b$
.
numfmt 6 8
print " n length entropy"
print " ——————————————————————"
for n to 37
s$ = fibword
print n & " " & len s$ & " " & entropy s$
.
</syntaxhighlight>
 
=={{header|EchoLisp}}==
<langsyntaxhighlight lang="scheme">
(lib 'struct)
(struct FW ( count0 count1 length string)) ;; a fibonacci word
Line 1,084 ⟶ 1,383:
(printf "%3d %10d %24d %a"
i (FW-length fw) (entropy fw) (FW-string fw))))
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,129 ⟶ 1,428:
{{works with|Elixir|1.3}}
{{works with|Erlang/OTP|18}}
<langsyntaxhighlight lang="elixir">defmodule RC do
def entropy(str) do
leng = String.length(str)
Line 1,150 ⟶ 1,449:
str = if len < 60, do: word, else: "<too long>"
:io.format "~3w ~8w ~17.15f ~s~n", [i+1, len, RC.entropy(word), str]
end)</langsyntaxhighlight>
 
{{out}}
Line 1,195 ⟶ 1,494:
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">// include the code from /wiki/Entropy#F.23 for the entropy function
 
let fiboword =
Line 1,205 ⟶ 1,504:
Seq.iteri (fun i (s : string) ->
printfn "%3i %10i %10.7g %s" (i+1) s.Length (entropy s) (if s.Length < 40 then s else ""))
(Seq.take 37 fiboword)</langsyntaxhighlight>
{{out}}
<pre> # Length Entropy Word (if length < 40)
Line 1,248 ⟶ 1,547:
=={{header|Factor}}==
It is not necessary to calculate each fibonacci word, since every fibonacci word less than 37 is contained in the 37th fibonacci word. In order to obtain the nth fibonacci word ( <= 37 ), we start with the 37th fibonacci word and take the subsequence from index 0 to the nth fibonacci number, as in the standard fibonacci sequence.
<langsyntaxhighlight lang="factor">USING: assocs combinators formatting kernel math math.functions
math.ranges math.statistics namespaces pair-rocket sequences ;
IN: rosetta-code.fibonacci-word
Line 1,283 ⟶ 1,582:
dup nth-fib-word [ length ] [ entropy ] bi
"%2d %8d %.8f\n" printf
] each</langsyntaxhighlight>
{{out}}
<pre>
Line 1,327 ⟶ 1,626:
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight FreeBASIClang="freebasic">' version 25-06-2015
' compile with: fbc -s console
 
Line 1,387 ⟶ 1,686:
Print : Print "hit any key to end program"
Sleep
End</langsyntaxhighlight>
{{out}}
<pre> N Length Entropy Word
Line 1,427 ⟶ 1,726:
36 14930352 0.959418728222743
37 24157817 0.959418728222745</pre>
 
=={{header|Fōrmulæ}}==
 
{{FormulaeEntry|page=https://formulae.org/?script=examples/Fibonacci_word}}
 
'''Solution'''
 
[[File:Fōrmulæ - Fibonacci word 01.png]]
 
'''Example'''
 
[[File:Fōrmulæ - Fibonacci word 02.png]]
 
[[File:Fōrmulæ - Fibonacci word 03.png]]
 
'''Table of Fibonacci word lengths and entropies'''
 
It is not necessary to calculate the actual values for the Fibonacci words in each step.
 
Because the generation of a new word is the concatenation of the two previous words, its length is the sum of the two previous lengths. They are Fibonacci numbers.
 
For the same reason (concatenation), the number of zeros of a new word is the sum of the number of zeros of the two previous words. The same happens to ones.
 
The following table shows the length, the number of zeros and the number of ones of a sequence of Fibonacci words. Notice that all of them are Fibonacci sequences.
 
[[File:Fōrmulæ - Fibonacci word 04.png]]
 
[[File:Fōrmulæ - Fibonacci word 05.png]]
 
Also notice that:
 
* The number of zeros of the i-th word is the length of the (i - 1)-th word.
* The number of ones of the i-th word is the length of the (i - 2)-th word.
 
Since we only need the number of zeros and ones of a given Fibonacci word in order to calculate its entropy, the actual word is not necessary:
 
[[File:Fōrmulæ - Fibonacci word 06.png]]
 
[[File:Fōrmulæ - Fibonacci word 07.png]]
 
'''Limit of the entropy'''
 
Given that the entropy of the i-th Fibonacci word is:
 
<math display="block"> - \left( \frac{zeroes_i}{zeroes_i + ones_i} \lg \left( \frac{zeroes_i}{zeroes_i + ones_i} \right) + \frac{ones_i}{zeroes_i + ones_i} \lg \left( \frac{ones_i}{zeroes_i + ones_i} \right) \right)</math>
 
<math display="block"> - \left( \frac{F_{i-1}}{F_i} \lg \left( \frac{F_{i-1}}{F_i} \right) + \frac{F_{i-2}}{F_i} \lg \left( \frac{F_{i-2}}{F_i} \right) \right)</math>
 
<math display="block"> - \left( \frac{F_{i-1}}{F_i} \lg \left( \frac{F_{i-1}}{F_i} \right) + \frac{F_{i-2}}{F_{i-1}} \frac{F_{i-1}}{F_i} \lg \left( \frac{F_{i-2}}{F_{i-1}} \frac{F_{i-1}}{F_i} \right) \right)</math>
 
Because the ratio between a Fibonacci term over the next term is <math>\frac{1}{\varphi}</math> as i is bigger, the previous expression tends to be:
 
<math display="block"> - \left( \frac{1}{\varphi} \lg \left( \frac{1}{\varphi} \right) + \frac{1}{\varphi} \frac{1}{\varphi} \lg \left( \frac{1}{\varphi} \frac{1}{\varphi} \right) \right)</math>
 
<math display="block"> - \left( \frac{1}{\varphi} \lg \left( \frac{1}{\varphi} \right) + \frac{1}{\varphi^2} \lg \left( \frac{1}{\varphi^2} \right) \right)</math>
 
This value, with a precision of 100 digits is:
 
[[File:Fōrmulæ - Fibonacci word 08.png]]
 
[[File:Fōrmulæ - Fibonacci word 09.png]]
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,489 ⟶ 1,849:
fmt.Printf("%3d %9d %.16f\n", n, len(s), entropy(s))
}
}</langsyntaxhighlight>
{{out}}
[http://play.golang.org/p/e1whcGGOU1 Run in the Go Playground.]
Line 1,500 ⟶ 1,860:
=={{header|Haskell}}==
 
<langsyntaxhighlight Haskelllang="haskell">module Main where
 
import Control.Monad
Line 1,524 ⟶ 1,884:
i l (entropy v) (if l > 40 then "..." else v))
[1..38::Int]
(take 37 $ fibonacci "1" "0")</langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
Line 1,531 ⟶ 1,891:
words are shown, while the Fibonacci word length and [[Entropy]] are shown for all 37.
 
<langsyntaxhighlight lang="unicon">procedure main(A)
n := integer(A[1]) | 37
write(right("N",4)," ",right("length",15)," ",left("Entrophy",15)," ",
Line 1,557 ⟶ 1,917:
every (h := 0.0) -:= P[c := key(P)] * log(P[c],2)
return h
end</langsyntaxhighlight>
 
Sample run:
Line 1,606 ⟶ 1,966:
=={{header|J}}==
Implementation:
<langsyntaxhighlight Jlang="j">F_Words=: (,<@;@:{~&_1 _2)@]^:(2-~[)&('1';'0')</langsyntaxhighlight>
 
Also, from the [[Entropy#J|entropy]] page we need:
<langsyntaxhighlight Jlang="j">entropy=: +/@:-@(* 2&^.)@(#/.~ % #)</langsyntaxhighlight>
 
Task example:
 
<langsyntaxhighlight Jlang="j"> (,.~#\)(#,entropy)@> F_Words 37
1 1 0
2 1 0
Line 1,650 ⟶ 2,010:
35 9.22747e6 0.959419
36 1.49304e7 0.959419
37 2.41578e7 0.959419</langsyntaxhighlight>
 
=={{header|Java}}==
<langsyntaxhighlight Javalang="java">import java.util.*;
 
public class FWord {
Line 1,702 ⟶ 2,062:
}
}
}</langsyntaxhighlight>
Output:
<pre> 1 1 0.0
Line 1,744 ⟶ 2,104:
 
=={{header|JavaScript}}==
<langsyntaxhighlight JavaScriptlang="javascript">//makes outputting a table possible in environments
//that don't support console.table()
function console_table(xs) {
Line 1,844 ⟶ 2,204:
}
 
fibWord(37);</langsyntaxhighlight>
Output:
<pre>|N |Length |Entropy |Word |
Line 1,887 ⟶ 2,247:
=={{header|jq}}==
'''Entropy''':
<langsyntaxhighlight lang="jq"># Input: an array of strings.
# Output: an object with the strings as keys,
# the values of which are the corresponding frequencies.
Line 1,895 ⟶ 2,255:
# entropy in bits of the input string
def entropy:
(explode | map( [.] | implode ) | counter | [ .[] | . * (.|log) ] | add) as $sum
| ((length|log) - ($sum / length)) / (2|log) ;</langsyntaxhighlight>
'''Pretty printing''':
<langsyntaxhighlight lang="jq"># truncate n places after the decimal point;
# return a string since it can readily be converted back to a number
def precision(n):
Line 1,916 ⟶ 2,276:
else rjustify(n)
end ;
</syntaxhighlight>
</lang>
'''The task''':
<syntaxhighlight lang="jq">
<lang jq># Generate the first n terms of the Fibonacci word sequence
def enumerate(s): foreach s as $x (-1; .+1; [., $x]);
# as a stream of arrays of the form [index, word]
 
def fibonacci_words(n):
def fibonacci_words:
# input: [f(i-2), f(i-1), countdown, counter]
"1",
def fib:
(["0","1"]
if .[2] == 1 then [.[3], .[0]]
| recurse([add, .[0]])
else
(.[1] +| .[0]) as $sum;
 
| [ .[3], .[0]], ([ .[1], $sum, (.[2] - 1), (.[3] + 1) ] | fib)
# Generate the first n terms of the Fibonacci word sequence
end;
# as a stream of arrays of the form [index, word] starting with [0,1]
if n <= 0 then empty
def fibonacci_words($n):
else (["1", "0", n, 1] | fib)
enumerate(limit($n; fibonacci_words));
end;
 
def task(n):
Line 1,941 ⟶ 2,301:
 
task(37)
</syntaxhighlight>
</lang>
{{Out}} (head and tail)
<pre>$ jq -n -r -f fibonacci_word.rc
Line 1,967 ⟶ 2,327:
{{works with|Julia|0.6}}
 
<langsyntaxhighlight lang="julia">using DataStructures
entropy(s::AbstractString) = -sum(x -> x / length(s) * log2(x / length(s)), values(counter(s)))
 
Line 1,993 ⟶ 2,353:
 
println(" n\tlength\tentropy")
testfibbo(37)</langsyntaxhighlight>
 
{{out}}
Line 2,036 ⟶ 2,396:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.0.6
 
fun fibWord(n: Int): String {
Line 2,067 ⟶ 2,427:
else println()
}
}</langsyntaxhighlight>
 
{{out}}
Line 2,113 ⟶ 2,473:
 
=={{header|Lua}}==
<langsyntaxhighlight Lualang="lua">-- Return the base two logarithm of x
function log2 (x) return math.log(x) / math.log(2) end
Line 2,147 ⟶ 2,507:
if string.len(#v) < 8 then io.write("\t") end
print("\t" .. entropy(v))
end</langsyntaxhighlight>
{{out}}
<pre>n Word length Entropy
Line 2,189 ⟶ 2,549:
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">entropy = (p - 1) Log[2, 1 - p] - p Log[2, p];
 
TableForm[
Line 2,195 ⟶ 2,555:
Quiet@Check[N[entropy /. {p -> Fibonacci[k - 1]/Fibonacci[k]}, 15],
0]}, {k, 37}],
TableHeadings -> {None, {"N", "Length", "Entropy"}}]</langsyntaxhighlight>
 
{{out}}<pre>N Length Entropy
Line 2,238 ⟶ 2,598:
 
=={{header|Nim}}==
<langsyntaxhighlight Nimlang="nim">import math, strformat, strutils
 
 
Line 2,269 ⟶ 2,629:
inc n
echo fmt"{n:2} {str.len:8} {entropy(str):.16f}"
if n == 37: break</langsyntaxhighlight>
 
{{out}}
Line 2,313 ⟶ 2,673:
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">use Collection;
 
class FibonacciWord {
Line 2,370 ⟶ 2,730:
};
}
}</langsyntaxhighlight>
 
Output:
Line 2,415 ⟶ 2,775:
=={{header|Oforth}}==
 
<langsyntaxhighlight Oforthlang="oforth">: entropy(s) -- f
| freq sz |
s size dup ifZero: [ return ] asFloat ->sz
Line 2,427 ⟶ 2,787:
ListBuffer new dup add("1") dup add("0") dup ->ws
3 n for: i [ i 1- ws at i 2 - ws at + ws add ]
dup map(#[ dup size swap entropy Pair new]) apply(#println) ;</langsyntaxhighlight>
 
{{out}}
Line 2,473 ⟶ 2,833:
=={{header|ooRexx}}==
{{trans|REXX}}
<langsyntaxhighlight lang="oorexx">/* REXX ---------------------------------------------------------------
* 09.08.2014 Walter Pachl 'copied' from REXX
* lists the # of chars in fibonacci words and the words' entropy
Line 2,523 ⟶ 2,883:
Return left(1,d+2) /* return a left-justified "1". */
Return format(s,,d) /* normalize the number (sum or S)*/
::requires rxm.cls</langsyntaxhighlight>
{{out}}
<pre> N length Entropy Fibonacci word # of zeroes # of ones
Line 2,578 ⟶ 2,938:
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">ent(a,b)=[a,b]=[a,b]/(a+b);(a*log(if(a,a,1))+b*log(if(b,b,1)))/log(1/2)
allocatemem(75<<20) \\ Allocate 75 MB stack space
F=vector(37);F[1]="1";F[2]="0";for(n=3,37,F[n]=Str(F[n-1],F[n-2]))
for(n=1,37,print(n" "fibonacci(n)" "ent(fibonacci(n-1),fibonacci(n-2))))</langsyntaxhighlight>
 
For those output fascists:
Line 2,626 ⟶ 2,986:
{{works with|Freepascal propably Delphi/Turbo-Pascal}}
As in Algol68 statet, you needn't to create the long string.
<langsyntaxhighlight lang="pascal">program FibWord;
{$IFDEF DELPHI}
{$APPTYPE CONSOLE}
Line 2,735 ⟶ 3,095:
end;
END.
</syntaxhighlight>
</lang>
The same output:
<pre>No. Length Entropy Word
Line 2,756 ⟶ 3,116:
 
=={{header|Perl}}==
<langsyntaxhighlight Perllang="perl">sub fiboword;
{
my ($a, $b, $count) = (1, 0, 0);
Line 2,786 ⟶ 3,146:
entropy($word),
$count > 9 ? '' : $word
}</langsyntaxhighlight>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>function log2(atom v)
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
return log(v)/log(2)
<span style="color: #008080;">function</span> <span style="color: #000000;">entropy</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
end function
<span style="color: #004080;">sequence</span> <span style="color: #000000;">symbols</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">unique</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">),</span>
 
<span style="color: #000000;">counts</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">symbols</span><span style="color: #0000FF;">))</span>
function entropy(sequence s)
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
sequence symbols = {},
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #000000;">symbols</span><span style="color: #0000FF;">)</span>
counts = {}
<span style="color: #000000;">counts</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
integer N = length(s)
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
for i=1 to N do
<span style="color: #004080;">atom</span> <span style="color: #000000;">H</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
object si = s[i]
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">counts</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
integer k = find(si,symbols)
<span style="color: #004080;">atom</span> <span style="color: #000000;">ci</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">counts</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]/</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
if k=0 then
<span style="color: #000000;">H</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">ci</span><span style="color: #0000FF;">*</span><span style="color: #7060A8;">log2</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ci</span><span style="color: #0000FF;">)</span>
symbols = append(symbols,si)
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
counts = append(counts,1)
<span style="color: #008080;">return</span> <span style="color: #000000;">H</span>
else
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
counts[k] += 1
end if
<span style="color: #004080;">sequence</span> <span style="color: #000000;">F_words</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"1"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"0"</span><span style="color: #0000FF;">}</span>
end for
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">3</span> <span style="color: #008080;">to</span> <span style="color: #000000;">37</span> <span style="color: #008080;">do</span>
atom H = 0
<span style="color: #000000;">F_words</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">F_words</span><span style="color: #0000FF;">,</span><span style="color: #000000;">F_words</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]&</span><span style="color: #000000;">F_words</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">])</span>
integer n = length(counts)
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
for i=1 to n do
atom ci = counts[i]/N
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">F_words</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
H -= ci*log2(ci)
<span style="color: #004080;">string</span> <span style="color: #000000;">fi</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">F_words</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
end for
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%2d: length %9d, entropy %f %s\n"</span><span style="color: #0000FF;">,</span>
return H
<span style="color: #0000FF;">{</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fi</span><span style="color: #0000FF;">),</span><span style="color: #000000;">entropy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fi</span><span style="color: #0000FF;">),</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;"><</span><span style="color: #000000;">10</span><span style="color: #0000FF;">?</span><span style="color: #000000;">fi</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"..."</span><span style="color: #0000FF;">)})</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
 
<!--</syntaxhighlight>-->
sequence F_words = {"1","0"}
for i=3 to 37 do
F_words = append(F_words,F_words[i-1]&F_words[i-2])
end for
 
for i=1 to length(F_words) do
printf(1,"%2d: length %9d, entropy %f %s\n",
{i,length(F_words[i]),entropy(F_words[i]),
iff(i<10?F_words[i],"...")})
end for</lang>
{{out}}
<pre>
Line 2,843 ⟶ 3,194:
37: length 24157817, entropy 0.959419 ...
</pre>
 
=={{header|Picat}}==
<syntaxhighlight lang="picat">go =>
foreach(N in 1..37)
F = fib(N),
E = entropy(F),
if N <= 10 then
printf("%3d %10d %0.16f %w\n",N,length(F),E,F)
else
printf("%3d %10d %0.16f\n",N,length(F),E)
end
end,
nl.
 
table
fib(1) = "1".
fib(2) = "0".
fib(N) = fib(N-1) ++ fib(N-2).
 
entropy(L) = Entropy =>
Len = L.len,
Occ = new_map(),
foreach(E in L)
Occ.put(E, Occ.get(E,0) + 1)
end,
Entropy = -sum([P2*log2(P2) : _C=P in Occ, P2 = P/Len]).</syntaxhighlight>
 
{{out}}
<pre> 1 1 0.0000000000000000 1
2 1 0.0000000000000000 0
3 2 1.0000000000000000 01
4 3 0.9182958340544896 010
5 5 0.9709505944546686 01001
6 8 0.9544340029249651 01001010
7 13 0.9612366047228759 0100101001001
8 21 0.9587118829771318 010010100100101001010
9 34 0.9596868937742169 0100101001001010010100100101001001
10 55 0.9593160320543777 0100101001001010010100100101001001010010100100101001010
11 89 0.9594579158386696
12 144 0.9594037542210230
13 233 0.9594244469559867
14 377 0.9594165437404407
15 610 0.9594195626031441
16 987 0.9594184095152245
17 1597 0.9594188499578098
18 2584 0.9594186817240320
19 4181 0.9594187459836638
20 6765 0.9594187214386756
21 10946 0.9594187308140277
22 17711 0.9594187272329620
23 28657 0.9594187286008073
24 46368 0.9594187280783371
25 75025 0.9594187282779028
26 121393 0.9594187282016754
27 196418 0.9594187282307918
28 317811 0.9594187282196702
29 514229 0.9594187282239183
30 832040 0.9594187282222957
31 1346269 0.9594187282229155
32 2178309 0.9594187282226788
33 3524578 0.9594187282227691
34 5702887 0.9594187282227347
35 9227465 0.9594187282227479
36 14930352 0.9594187282227428
37 24157817 0.9594187282227447</pre>
 
=={{header|PL/I}}==
Line 2,848 ⟶ 3,264:
{{improve|PL/I| <br><br>The task's requirements are to also show the Fibonacci word's entropy. <br><br>}}
 
<langsyntaxhighlight PLlang="pl/Ii">fibword: procedure options (main); /* 9 October 2013 */
declare (fn, fnp1, fibword) bit (32000) varying;
declare (i, ln, lnp1, lfibword) fixed binary(31);
Line 2,871 ⟶ 3,287:
end;
 
end fibword;</langsyntaxhighlight>
<pre> 1 1 1
2 1 0
Line 2,911 ⟶ 3,327:
 
=={{header|PureBasic}}==
<langsyntaxhighlight lang="purebasic">EnableExplicit
Define fwx$, n.i
NewMap uchar.i()
Line 2,945 ⟶ 3,361:
PrintN(" N Length Entropy Word")
For n=1 To 37 : fwx$=fw(n) : RowPrint(Str(n),Str(Len(fwx$)),StrD(ce(fwx$),15),fwx$) : Next
Input()</langsyntaxhighlight>
<pre> N Length Entropy Word
1 1 0.000000000000000 0
Line 2,986 ⟶ 3,402:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">>>> import math
>>> from collections import Counter
>>>
Line 3,043 ⟶ 3,459:
36 14930352 0.9594187 <too long>
37 24157817 0.9594187 <too long>
>>> </langsyntaxhighlight>
 
=={{header|R}}==
With inspiration from [http://rosettacode.org/wiki/Entropy#R here] for the entropy function:
<langsyntaxhighlight lang="rsplus">entropy <- function(s)
{
if (length(s) > 1)
Line 3,077 ⟶ 3,493:
rownames(ret) <- NULL
return(ret)
}</langsyntaxhighlight>
 
Output:
Line 3,128 ⟶ 3,544:
 
So to start, a massively generalised version:
<langsyntaxhighlight lang="racket">#lang racket
(provide F-Word gen-F-Word (struct-out f-word) f-word-max-length)
(require "entropy.rkt") ; save Entropy task implementation as "entropy.rkt"
Line 3,189 ⟶ 3,605:
(check-match (F-Word 4) (f-word "010" _ _ _))
(check-match (F-Word 5) (f-word "01001" _ _ _))
(check-match (F-Word 8) (f-word "010010100100101001010" _ _ _)))</langsyntaxhighlight>
Output:
<pre> 1 1 0.000000000000 1
Line 3,231 ⟶ 3,647:
 
And a simpler implementation:
<langsyntaxhighlight lang="racket">#lang racket
 
(define f-word-max-length (make-parameter 80))
Line 3,262 ⟶ 3,678:
(check-match (F-Word 4) (f-word "010" _ _ _))
(check-match (F-Word 5) (f-word "01001" _ _ _))
(check-match (F-Word 8) (f-word "010010100100101001010" _ _ _)))</langsyntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
 
<syntaxhighlight lang="raku" perl6line>constant @fib-word = 1, 0, { $^b ~ $^a } ... *;
sub entropy {
Line 3,277 ⟶ 3,693:
printf "%5d\t%10d\t%.8e\t%s\n",
(state $n)++, .chars, .&entropy, $n > 10 ?? '' !! $_;
}</langsyntaxhighlight>
 
That works, but is terribly slow due to all the string processing and bag creation, just to count 0's and 1's. By contrast, the following prints the table up to 100 almost instantly by tracking the values to calculate entropy in parallel with the actual strings. This works in Raku because lazy lists are calculated on demand, so if we don't actually ask for the larger string forms, we don't calculate them. Which would be relatively difficult for a string containing 573147844013817084101 characters, unless you happen to have a computer with a zettabyte or so of memory sitting in your garage.
 
<syntaxhighlight lang="raku" perl6line>constant @fib-word = '1', '0', { $^b ~ $^a } ... *;
constant @fib-ones = 1, 0, * + * ... *;
constant @fib-chrs = 1, 1, * + * ... *;
Line 3,299 ⟶ 3,715:
printf "%5d\t%21d\t%.15e\t%s\n",
$n, @fib-chrs[$n], entropy($n), $n > 9 ?? '' !! @fib-word[$n];
}</langsyntaxhighlight>
{{out}}
<pre> 0 1 0.000000000000000e+00 1
Line 3,405 ⟶ 3,821:
=={{header|REXX}}==
Programming note: &nbsp; 32-bit Regina REXX (under Windows/XP) can execute this program with &nbsp; N='''42''' &nbsp; without exhausting system resources, &nbsp; the 64-bit version of Regina can calculate bigger Fibonacci words.
<langsyntaxhighlight lang="rexx">/*REXX program displays the number of chars in a fibonacci word, and the word's entropy.*/
d= 21; de= d + 6; numeric digits de /*use more precision (the default is 9)*/
parse arg N . /*get optional argument from the C.L. */
Line 3,441 ⟶ 3,857:
xx=izz; m=m+is*2**j; end /*while*/; x=x* e** -m -1; z=0; _=-1; p=z
do k=1; _=-_*x; z=z+_/k; if z=p then leave; p=z; end /*k*/
r=z+m; if arg()==2 then return r; return r / log2(2,.)</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default input:}}
<pre>
Line 3,491 ⟶ 3,907:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
# Project : Fibonacci word
 
Line 3,543 ⟶ 3,959:
logBase =log( x) /log( 2)
return logBase
</syntaxhighlight>
</lang>
Output:
<pre>
Line 3,590 ⟶ 4,006:
Includes code for entropy from [[Entropy#Ruby|Entropy]] page.
 
<langsyntaxhighlight lang="ruby">#encoding: ASCII-8BIT
 
def entropy(s)
Line 3,613 ⟶ 4,029:
words.each.with_index(1) do |word, i|
puts '%3i %9i %15.12f %s' % [i, word.length, entropy(word), word.length<60 ? word : '<too long>']
end</langsyntaxhighlight>
 
{{out}}
Line 3,660 ⟶ 4,076:
This is not implemented in any sort of generic way and is probably fairly inefficient.
 
<langsyntaxhighlight lang="rust">struct Fib<T> {
curr: T,
next: T,
Line 3,705 ⟶ 4,121:
println!("{:10} {:10} {:.10} {:60}", i + 1, s.len(), get_entropy(&s.bytes().collect::<Vec<_>>()), word);
}
}</langsyntaxhighlight>
 
{{out}}
Line 3,751 ⟶ 4,167:
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">
//word iterator
def fibIt = Iterator.iterate(("1","0")){case (f1,f2) => (f2,f1+f2)}.map(_._1)
Line 3,769 ⟶ 4,185:
val it = fibIt.zipWithIndex.map(w => (w._2, w._1.length, entropy(w._1)))
println(it.take(37).map{case (n,l,e) => s"$n).\t$l \t$e"}.mkString("\n"))
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,814 ⟶ 4,230:
=={{header|Scheme}}==
 
<langsyntaxhighlight lang="scheme">
(import (scheme base)
(scheme inexact)
Line 3,857 ⟶ 4,273:
(entropy (vector-ref *words* i)))
"\n")))
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,905 ⟶ 4,321:
 
===Recursive function===
<syntaxhighlight lang="text">exec('.\entropy.sci',0);
 
function word=fiboword(n)
Line 3,935 ⟶ 4,351:
 
disp('EXECUTION TIME: '+string(time)+'s.');
disp(['N', 'LENGTH', 'ENTROPY'; string([N char_length entropies])]);</langsyntaxhighlight>
 
{{out}}
Line 4,017 ⟶ 4,433:
 
===Iterative method===
<syntaxhighlight lang="text">exec('.\entropy.sci',0);
 
final_length = 37;
Line 4,049 ⟶ 4,465:
 
disp('EXECUTION TIME: '+string(time)+'s.');
disp(['N', 'LENGTH', 'ENTROPY'; string([N word_length entropies])]);</langsyntaxhighlight>
 
{{out}}
Line 4,132 ⟶ 4,548:
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
include "float.s7i";
include "math.s7i";
Line 4,184 ⟶ 4,600:
writeln(index lpad 2 <& length(fibWord) lpad 10 <& " " <& entropy(fibWord) digits 15);
end for;
end func;</langsyntaxhighlight>
 
{{out}}
Line 4,227 ⟶ 4,643:
</pre>
 
=={{header|SETL}}==
<syntaxhighlight lang="setl">program fibonacci_words;
print("N Length Entropy");
print("---- ---------- -------------------");
loop for n in [1..37] do
[zeroes, ones] := fibword := fib_word n;
length := zeroes + ones;
print(lpad(str n,4) + " " + lpad(str length,10) + " " + str entropy fibword);
end loop;
 
$ Return the amount of zeroes and ones in the N'th fibonacci word
op fib_word(n);
[a0, a1, b0, b1] := [0, 1, 1, 0];
loop for i in [2..n] do
[a0, a1, b0, b1] := [b0, b1, a0+b0, a1+b1];
end loop;
return [a0, a1];
end op;
 
op entropy(fibword);
[zeroes, ones] := fibword;
fzeroes := zeroes / (zeroes + ones);
fones := ones / (zeroes + ones);
 
if fzeroes = 0 or fones = 0 then
return 0;
end if;
 
return -fzeroes*log fzeroes/log 2 - fones*log fones/log 2;
end op;
end program;</syntaxhighlight>
{{out}}
<pre>N Length Entropy
---- ---------- -------------------
1 1 0
2 1 0
3 2 1
4 3 0.91829583405449
5 5 0.970950594454669
6 8 0.954434002924965
7 13 0.961236604722876
8 21 0.958711882977132
9 34 0.959686893774217
10 55 0.959316032054378
11 89 0.95945791583867
12 144 0.959403754221023
13 233 0.959424446955987
14 377 0.959416543740441
15 610 0.959419562603144
16 987 0.959418409515225
17 1597 0.95941884995781
18 2584 0.959418681724032
19 4181 0.959418745983664
20 6765 0.959418721438675
21 10946 0.959418730814028
22 17711 0.959418727232962
23 28657 0.959418728600807
24 46368 0.959418728078337
25 75025 0.959418728277903
26 121393 0.959418728201676
27 196418 0.959418728230792
28 317811 0.95941872821967
29 514229 0.959418728223918
30 832040 0.959418728222296
31 1346269 0.959418728222916
32 2178309 0.959418728222679
33 3524578 0.959418728222769
34 5702887 0.959418728222735
35 9227465 0.959418728222748
36 14930352 0.959418728222743
37 24157817 0.959418728222745</pre>
=={{header|Sidef}}==
{{trans|Ruby}}
<langsyntaxhighlight lang="ruby">func entropy(s) {
[0] + (s.chars.freq.values »/» s.len) -> reduce { |a,b|
a - b*b.log2
Line 4,250 ⟶ 4,737:
entropy(word),
word.len<30 ? word : '<too long>'))
}</langsyntaxhighlight>
 
=={{header|Swift}}==
 
<langsyntaxhighlight lang="swift">import Foundation
 
struct Fib: Sequence, IteratorProtocol {
Line 4,295 ⟶ 4,782:
 
print("i: \(i) len: \(str.count) entropy: \(ent)")
}</langsyntaxhighlight>
 
{{out}}
Line 4,338 ⟶ 4,825:
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">proc fibwords {n} {
set fw {1 0}
while {[llength $fw] < $n} {
Line 4,365 ⟶ 4,852:
foreach word [fibwords 37] {
fibwordinfo [incr i] $word
}</langsyntaxhighlight>
{{out}}
<pre>
Line 4,406 ⟶ 4,893:
36 14930352 0.959418728222743 <too long>
37 24157817 0.959418728222745 <too long>
</pre>
 
=={{header|Uiua}}==
Memoisation saves the day :-)
 
<syntaxhighlight lang="Uiua">
# Build the string recursively.
F ← |1 memo⟨⟨⊂∩F-1.-1|"0"◌⟩=2.|"1"◌⟩=1.
# General entropy formula - quite slow for this task.
Egen ← /+(¯×ₙ2.)÷/+.≡(⧻⊚=)⊃◴¤
# Specific entropy formula for a binary string.
E ← ⍥(0◌)=NaN.+∩(¯×ₙ2.)⟜(¯-1)÷⊃⧻(⧻⊚="1")
 
# Much faster approach -- don't even build the string, just count
# how many "0"s and "1"s the string will have.
Fx ← |1 memo⟨⟨+∩Fx-1.-1|[1 0]◌⟩=2.|[0 1]◌⟩=1.
Ex ← ⍥(0◌)=NaN./+(¯×ₙ2.)÷/+.
 
# Print and time it
⍜now(≡(⇌[⊃/+ (⍜(×1e8)⁅Ex)Fx.])+1⇡37)
</syntaxhighlight>
{{out}}
<pre>
╭─
╷ 1 0 1
2 0 1
3 1 2
4 0.91829583 3
5 0.97095059 5
6 0.954434 8
7 0.9612366 13
8 0.95871188 21
9 0.95968689 34
10 0.95931603 55
...etc...
35 0.95941873 9227465
36 0.95941873 14930352
37 0.95941873 24157817
0.0029999999678694-ε
</pre>
 
=={{header|Wren}}==
{{libheader|Wren-math}}
{{libheader|Wren-fmt}}
<langsyntaxhighlight ecmascriptlang="wren">import "./mathfmt" for MathFmt
import "/fmt" for Fmt
 
var entropy = Fn.new { |s|
Line 4,423 ⟶ 4,948:
for (k in m.keys) {
var c = m[k]
hm = hm + c *Math c.log2(c)
}
var l = s.count
return Mathl.log2(l) - hm/l
}
 
Line 4,451 ⟶ 4,976:
Fmt.print("$2d $,10d $0.8f $s", i, fw.count, entropy.call(fw), Fmt.abbreviate(20, fw))
}
}</langsyntaxhighlight>
 
{{out}}
Line 4,498 ⟶ 5,023:
{{trans|D}}
{{trans|Python}}
<langsyntaxhighlight lang="zkl">fcn entropy(bs){ //binary String-->Float
len:=bs.len(); num1s:=(bs-"0").len();
T(num1s,len-num1s).filter().apply('wrap(p){ p=p.toFloat()/len; -p*p.log() })
Line 4,511 ⟶ 5,036:
"%3d %10d %2.10f %s".fmt(n,w.len(),entropy(w),
w.len()<50 and w or "<too long>").println();
}</langsyntaxhighlight>
{{out}}
<pre>
Line 4,532 ⟶ 5,057:
=={{header|ZX Spectrum Basic}}==
{{trans|FreeBASIC}}
<langsyntaxhighlight lang="zxbasic">10 LET x$="1": LET y$="0": LET z$=""
20 PRINT "N, Length, Entropy, Word"
30 LET n=1
Line 4,566 ⟶ 5,091:
1070 IF t(j)>0 THEN LET prop=t(j)/sourcelen: LET entropy=entropy-(prop*LN (prop)/LN (base))
1080 NEXT j
1090 RETURN</langsyntaxhighlight>
1,983

edits