/** This is a program to print a poster of the digits of pi. It uses a system-of-equations solver to do the algebra to fit as closely to the dimensions of a page as possible. */ use systemSolver2.frink use pi2.frink symbolicMode[true] layout = new System[[pageWidth pageHeight === charHeight charWidth numChars, charWidth === 6/10 charHeight, lines === pageHeight / charHeight, charsPerLine === numChars / lines], []] digits = 10000 pageWidth = 8 in pageHeight = 10.5 in // Read number of digits from command-line argument if there is one. if length[ARGS] > 0 digits = eval[ARGS@0] // Read width and height from command-line arguments if they exist. if length[ARGS] >= 3 { pageWidth = eval[ARGS@1] pageHeight = eval[ARGS@2] } numChars = digits + 1 // Account for decimal point if eval["FrinkGeneration[]"] == 0 println["""Note: this program will be orders of magnitude faster with Frink:The Next Generation, available at: https://frinklang.org/experimental.html """] args = [["pageWidth", pageWidth], ["pageHeight", pageHeight], ["numChars", numChars]] println[join["\n", layout.solveAll[]]] charsPerLine = ceil[positive[eval[layout.solveForValues["charsPerLine", args]]]@0] println["Chars per line: $charsPerLine"] lines = ceil[numChars/charsPerLine] println["Lines: $lines"] pi = Pi.getPi[digits] piStr = toString[pi] println["Pi calculated to $digits digits"] g = new graphics[] g.font["Monospaced", 1] line = 0 for pos = 0 to length[piStr]-1 step charsPerLine { sub = substringLen[piStr, pos, charsPerLine] g.text[sub, 0, line, "left", "center"] line = line + .9 } g.show[] filename = "piPoster$digits.svg" g.write[filename, 1000, 1000] //browse[ filename]