Add tasks for all the new languages

This commit is contained in:
Tina Müller 2016-12-05 23:44:36 +01:00
parent 9dc3c2bb62
commit bba7bfd280
13208 changed files with 134745 additions and 0 deletions

View file

@ -0,0 +1,112 @@
(lib 'hash)
(lib 'list) ;; permutations
(define H (make-hash))
;; G R A P H
;; generate 'normalized' starter vectors D[i] = number of digits 'i' (0 <=i < 10)
;; reduce graph size : 9009, 9900 .. will be generated once : vector #(2 0 0 0 0 0 0 0 0 2)
(define (generate D dstart ndigits (sd 0))
(when (> ndigits 0)
(set! sd (vector-ref D dstart)) ;; save before recurse
(for ((i (in-range 0 (1+ ndigits))))
#:continue (and ( = i 0) (> dstart 0))
(vector-set! D dstart i)
(sequence D) ;; sequence length from D
(for ((j (in-range (1+ dstart) 10)))
(generate D j (- ndigits i))))
(vector-set! D dstart sd))) ;; restore
;; compute follower of D (at most 99 same digits)
(define (dnext D (dd 0))
(define N (make-vector 10))
(for ((d D) (i 10))
#:continue (zero? d)
(vector-set! N i (1+ (vector-ref N i)))
(if (< d 10)
(vector-set! N d (1+ (vector-ref N d))) ;; d < 9
(begin
(set! dd (modulo d 10))
(vector-set! N dd (1+ (vector-ref N dd)))
(set! dd (quotient d 10))
(vector-set! N dd (1+ (vector-ref N dd))))))
N)
;; update all nodes in same sequence
;; seq-length (next D) = 1 - seq-length(D)
(define (sequence D)
(define (dists D d)
(unless (hash-ref H D)
(hash-set H D d)
(dists (dnext D ) (1- d))))
(unless (hash-ref H D)
(dists D (sequence-length D))))
;; sequence length from D
;; stops on loop found (node N)
(define (sequence-length D )
(define (looper N looplg depth) ;; looper 2 : a b a
(when ( > depth 0)
(hash-set H N looplg)
(looper (dnext N) looplg (1- depth))))
(define followers (make-hash))
(define N (dnext D))
(define seqlg 0)
(define looplg 0)
(hash-set followers D 0)
(set! seqlg
(for ((lg (in-naturals 1 )))
#:break (hash-ref H N) => (+ lg (hash-ref H N)) ;; already known
#:break (hash-ref followers N) => lg ;; loop found
(hash-set followers N lg)
(set! N (dnext N))))
;; update nodes in loop : same seq-length
(when (hash-ref followers N) ;; loop found
(set! looplg ( - seqlg (hash-ref followers N)))
(looper N looplg looplg))
seqlg )
;; O U T P U T
;; backwards from D - normalized vector - to numbers (as strings)
(define (starters D)
(define (not-leading-zero list) (!zero? (first list)))
(map list->string
(filter not-leading-zero (make-set (permutations (for/fold (acc null) ((d D) (i 10))
#:continue (zero? d)
(append acc (for/list ((j d)) i))))))))
;; printing one node
(define (D-print D)
(set! D (reverse (vector->list D)))
(for/string ( (d D) (i (in-range 9 -1 -1)))
#:continue (zero? d)
(string-append d i)))
;; print graph contents
(define (print-sequence D)
(writeln 1 (starters D))
(writeln 2 (D-print D ))
(for ((i (in-range 1 (hash-ref H D))))
(writeln (+ i 2) (D-print (setv! D (dnext D))))))
;; TA S K
(define (task (n 6) (verbose #t))
(generate (make-vector 10) 0 n)
(define seqmax (apply max (hash-values H)))
(when verbose (for ((kv H))
#:continue (!= (rest kv ) seqmax)
(print-sequence (first kv))))
(writeln (expt 10 n) '--> 'max-sequence= (1+ seqmax) 'nodes= (length (hash-values H))))

View file

@ -0,0 +1,32 @@
(task 6)
1 (9009 9090 9900)
2 2920
3 192210
4 19222110
5 19323110
6 1923123110
7 1923224110
8 191413323110
9 191433125110
10 19151423125110
11 19251413226110
12 1916151413325110
13 1916251423127110
14 191716151413326110
15 191726151423128110
16 19181716151413327110
17 19182716151423129110
18 29181716151413328110
19 19281716151423228110
20 19281716151413427110
21 19182716152413228110
1000000 --> max-sequence= 21 nodes= 10926
(task 7 #f)
10000000 --> max-sequence= 21 nodes= 23432
(task 8 #f)
100000000 --> max-sequence= 21 nodes= 47359
(task 9 #f)
1000000000 --> max-sequence= 21 nodes= 97455
(task 10 #f)
10000000000 --> max-sequence= 21 nodes= 188493

View file

@ -0,0 +1,61 @@
# Given any array, produce an array of [item, count] pairs for each run.
def runs:
reduce .[] as $item
( [];
if . == [] then [ [ $item, 1] ]
else .[length-1] as $last
| if $last[0] == $item
then (.[0:length-1] + [ [$item, $last[1] + 1] ] )
else . + [[$item, 1]]
end
end ) ;
# string to string
def next_self_referential:
def runs2integer: # input is an array as produced by runs,
# i.e. an array of [count, n] pairs, where count is an int,
# and n is an "exploded" digit
reduce .[] as $pair
(""; . + ($pair[1] | tostring) + ([$pair[0]]|implode) ) ;
explode | sort | reverse | runs | runs2integer;
# Given an integer as a string,
# compute the entire sequence (of strings) to convergence:
def sequence_of_self_referentials:
def seq:
. as $ary
| (.[length-1] | next_self_referential) as $next
| if ($ary|index($next)) then $ary
else $ary + [$next] | seq
end;
[.] | seq;
def maximals(n):
def interesting:
tostring | (. == (explode | sort | reverse | implode));
reduce range(0;n) as $i
([[], 0]; # maximalseeds, length
if ($i | interesting) then
($i|tostring|sequence_of_self_referentials|length) as $length
| if .[1] == $length then [ .[0] + [$i], $length]
elif .[1] < $length then [ [$i], $length]
else .
end
else .
end );
def task(n):
maximals(n) as $answer
| "The maximal length to convergence for seeds up to \(n) is \($answer[1]).",
"The corresponding seeds are the allowed permutations",
"of the representative number(s): \($answer[0][])",
"For each representative seed, the self-referential sequence is as follows:",
($answer[0][] | tostring
| ("Representative: \(.)",
"Self-referential sequence:",
(sequence_of_self_referentials | map(tonumber))))
;
task(1000000)

View file

@ -0,0 +1,30 @@
$ jq -n -r -f Self_referential_sequence.jq
The maximal length to convergence for seeds up to 1000000 is 21.
The corresponding seeds are the allowed permutations
of the representative number(s): 9900
For each representative seed, the self-referential sequence is as follows:
Representative: 9900
Self-referential sequence:
[
9900,
2920,
192210,
19222110,
19323110,
1923123110,
1923224110,
191413323110,
191433125110,
19151423125110,
19251413226110,
1916151413325110,
1916251423127110,
191716151413326100,
191726151423128100,
19181716151413326000,
19182716151423128000,
29181716151413330000,
19281716151423230000,
19281716151413430000,
19182716152413230000
]