================================================================================ EdigitsDraft ================================================================================ :: os; :: std : BigInt; :: math; exec.main { %n := (?? os.args.size > 1 => (<> os.args[1]).scan !!=> 27); %k := binary_search 0; %p & %q := sum_terms 0 (k - 1); p += q; $a := (std.BigInt.of 10).pow (n - 1); %answer := p * a /. q; %s := answer.to_string; @ %i : (@ %j : 0..(n / 10 +. 1) => j * 10) => { ?? i + 10 <=. n => print (s.subseg i (i + 10) ++ "\t:" ++. (i + 10).to_string) !!=> print (s.subseg i n ++ (@ _ : 0..(10 - math.mod n 10) => ''\s'') ++ "\t:" ++ n.to_string); }; } sum_terms 'a 'b : Int Int -> std.BigInt -> std.BigInt { ?? 'b ==. 'a + 1 => return std.BigInt.of 1 & std.BigInt.of 'b; %mid := 'a + 'b /. 2; %p_left & %q_left := sum_terms 'a mid; %p_right & %q_right := sum_terms mid 'b; return p_left * q_right +. p_right &.. q_left * q_right; } binary_search 'n : Int -> Int { %a := 0; %b := 1; @ not (test_k 'n b) => { a = b; b *= 2; }; @ b - a >. 1 => { %m := a + b /. 2; ?? test_k 'n m => b = m !!=> a = m; }; return b; } test_k 'n 'k : Int Int -> Bool { ?? k < 0 => return false; %ln_k_factorial := k * (math.log k - 1) +. 0.5 * math.log math.tau; %log_10_k_factorial := ln_k_factorial / math.ln10; return log_10_k_factorial >=. n + 10; } -------------------------------------------------------------------------------- (source_file (empty_lines) (import (simple_name_identifier)) (empty_lines) (import (simple_name_identifier) (simple_type_identifier)) (empty_lines) (import (simple_name_identifier)) (empty_lines) (function_definition (simple_name_identifier) (block (empty_lines) (match (name_definition (simple_name_identifier)) (case (condition (operator_expression (name_expression (simple_name_identifier)) (operator) (index_literal)) (name_expression (reference_expression (array_access (simple_name_identifier) (index_literal))) (simple_name_identifier)) (index_literal)))) (empty_lines) (match (name_definition (simple_name_identifier)) (case (name_expression (simple_name_identifier) (index_literal)))) (empty_lines) (match (operator_expression (name_definition (simple_name_identifier)) (operator) (name_definition (simple_name_identifier))) (case (name_expression (simple_name_identifier) (index_literal) (operator_expression (name_expression (simple_name_identifier)) (operator) (index_literal))))) (empty_lines) (operator_expression (name_expression (simple_name_identifier)) (operator) (name_expression (simple_name_identifier))) (empty_lines) (match (name_definition (simple_name_identifier)) (case (name_expression (name_expression (simple_type (simple_type_identifier)) (simple_name_identifier) (index_literal)) (simple_name_identifier) (operator_expression (name_expression (simple_name_identifier)) (operator) (index_literal))))) (empty_lines) (match (name_definition (simple_name_identifier)) (case (operator_expression (operator_expression (name_expression (simple_name_identifier)) (operator) (name_expression (simple_name_identifier))) (operator_tail1) (name_expression (simple_name_identifier))))) (empty_lines) (match (name_definition (simple_name_identifier)) (case (name_expression (simple_name_identifier)))) (empty_lines) (loop (name_definition (simple_name_identifier)) (loop (name_definition (simple_name_identifier)) (operator_expression (index_literal) (operator) (operator_expression (operator_expression (name_expression (simple_name_identifier)) (operator) (index_literal)) (operator_tail1) (index_literal))) (operator_expression (name_expression (simple_name_identifier)) (operator) (index_literal))) (block (empty_lines) (condition (operator_expression (operator_expression (name_expression (simple_name_identifier)) (operator) (index_literal)) (operator_tail1) (name_expression (simple_name_identifier))) (name_expression (simple_name_identifier) (operator_expression (operator_expression (name_expression (simple_name_identifier) (simple_name_identifier) (operator_expression (name_expression (simple_name_identifier)) (operator) (index_literal))) (operator) (string_literal)) (operator_tail1) (name_expression (operator_expression (name_expression (simple_name_identifier)) (operator) (index_literal)) (simple_name_identifier)))) (name_expression (simple_name_identifier) (operator_expression (operator_expression (operator_expression (name_expression (simple_name_identifier) (simple_name_identifier) (simple_name_identifier)) (operator) (loop (placeholder) (operator_expression (index_literal) (operator) (operator_expression (index_literal) (operator) (name_expression (simple_name_identifier) (simple_name_identifier) (index_literal)))) (char_literal))) (operator) (string_literal)) (operator) (name_expression (simple_name_identifier))))) (empty_lines))) (empty_lines))) (empty_lines) (function_definition (simple_name_identifier) (argument_name_identifier) (argument_name_identifier) (simple_type (simple_type_identifier)) (simple_type (simple_type_identifier)) (reference_type (simple_type (simple_type_identifier))) (reference_type (simple_type (simple_type_identifier))) (block (empty_lines) (condition (operator_expression (name_expression (argument_name_identifier)) (operator_tail1) (operator_expression (name_expression (argument_name_identifier)) (operator) (index_literal))) (return (operator_expression (name_expression (simple_type (simple_type_identifier)) (simple_name_identifier) (index_literal)) (operator) (name_expression (simple_type (simple_type_identifier)) (simple_name_identifier) (argument_name_identifier))))) (empty_lines) (match (name_definition (simple_name_identifier)) (case (operator_expression (operator_expression (name_expression (argument_name_identifier)) (operator) (name_expression (argument_name_identifier))) (operator_tail1) (index_literal)))) (empty_lines) (match (operator_expression (name_definition (simple_name_identifier)) (operator) (name_definition (simple_name_identifier))) (case (name_expression (simple_name_identifier) (argument_name_identifier) (simple_name_identifier)))) (empty_lines) (match (operator_expression (name_definition (simple_name_identifier)) (operator) (name_definition (simple_name_identifier))) (case (name_expression (simple_name_identifier) (simple_name_identifier) (argument_name_identifier)))) (empty_lines) (return (operator_expression (operator_expression (operator_expression (name_expression (simple_name_identifier)) (operator) (name_expression (simple_name_identifier))) (operator_tail1) (name_expression (simple_name_identifier))) (operator_tail2) (operator_expression (name_expression (simple_name_identifier)) (operator) (name_expression (simple_name_identifier))))) (empty_lines))) (empty_lines) (function_definition (simple_name_identifier) (argument_name_identifier) (simple_type (simple_type_identifier)) (reference_type (simple_type (simple_type_identifier))) (block (empty_lines) (match (name_definition (simple_name_identifier)) (case (index_literal))) (empty_lines) (match (name_definition (simple_name_identifier)) (case (index_literal))) (empty_lines) (loop (name_expression (simple_name_identifier) (name_expression (simple_name_identifier) (argument_name_identifier) (simple_name_identifier))) (block (empty_lines) (operator_expression (name_expression (simple_name_identifier)) (operator) (name_expression (simple_name_identifier))) (empty_lines) (operator_expression (name_expression (simple_name_identifier)) (operator) (index_literal)) (empty_lines))) (empty_lines) (loop (operator_expression (operator_expression (name_expression (simple_name_identifier)) (operator) (name_expression (simple_name_identifier))) (operator_tail1) (index_literal)) (block (empty_lines) (match (name_definition (simple_name_identifier)) (case (operator_expression (operator_expression (name_expression (simple_name_identifier)) (operator) (name_expression (simple_name_identifier))) (operator_tail1) (index_literal)))) (empty_lines) (condition (name_expression (simple_name_identifier) (argument_name_identifier) (simple_name_identifier)) (operator_expression (name_expression (simple_name_identifier)) (operator) (name_expression (simple_name_identifier))) (operator_expression (name_expression (simple_name_identifier)) (operator) (name_expression (simple_name_identifier)))) (empty_lines))) (empty_lines) (return (name_expression (simple_name_identifier))) (empty_lines))) (empty_lines) (function_definition (simple_name_identifier) (argument_name_identifier) (argument_name_identifier) (simple_type (simple_type_identifier)) (simple_type (simple_type_identifier)) (reference_type (simple_type (simple_type_identifier))) (block (empty_lines) (condition (operator_expression (name_expression (simple_name_identifier)) (operator) (index_literal)) (return (bool_literal))) (empty_lines) (match (name_definition (simple_name_identifier)) (case (operator_expression (operator_expression (name_expression (simple_name_identifier)) (operator) (operator_expression (name_expression (simple_name_identifier) (simple_name_identifier)) (operator) (index_literal))) (operator_tail1) (operator_expression (double_literal) (operator) (name_expression (simple_name_identifier) (simple_name_identifier)))))) (empty_lines) (match (name_definition (simple_name_identifier)) (case (operator_expression (name_expression (simple_name_identifier)) (operator) (name_expression (simple_name_identifier))))) (empty_lines) (return (operator_expression (name_expression (simple_name_identifier)) (operator_tail1) (operator_expression (name_expression (simple_name_identifier)) (operator) (index_literal)))) (empty_lines))) (empty_lines))