Project Euler - Problem 115
HINWEIS: Dies ist eine schwierigere Variante des Problem 114.
Eine Reihe mit der Länge n Einheiten enthält rote Blöcke der Mindestlänge m so, dass zwischen zwei roten Blöcken immer mindestens ein schwarzes Quadrat liegt. Die roten Blöcke dürfen verschiedene Längen haben. (Siehe Bild beim Problem 114.)
Die Füll-Funktion F(m,n) soll die Anzahl verschiedener Möglichkeiten darstellen, in denen die Reihe gefüllt werden kann.
Zum Beispiel sind F(3,29) = 673135 und F(3,30) = 1089155.
Das bedeutet, für m=3 ist ersichtlich, dass n = 30 der kleinste Wert ist, für den die Füll-Funktion eine Anzahl ergibt, die eine Million überschreitet. In der gleichen Weise findet man, dass F(10,56) = 880711 und F(10,57) = 1148904 ist, so das n = 57 der kleinste Wert ist, bei dem die Füll-Funktion zum ersten mal eine Anzahl von über eine Million Möglichkeiten anzeigt.
Für m = 50 finde den kleinsten Wert n für den die Füll-Funktion zum ersten mal eine Anzahl von einer Million Möglichkeiten übersteigt.
Antwort: Finde es selbst heraus mit Forth
Eine Lösung mit gforth (ist in 170 Millisecunden gelaufen):
#! /usr/bin/gforth
Create X 1000 cells allot \ allocate X[1000]
50 constant M
1000000 constant L
0 value R
: solve
1 X !
1
begin
0 over cells X + !
dup M > if
dup M - 0 do
dup M - i - X i cells + @ * over cells X + dup @ rot + swap !
loop
then
dup cells X + @ R + to R
1+
R L >
until
." Solution is " 2 - . cr
;
solve
bye