Problem 43

More details about this document
Create Date:
Publish Date:
Update Date:
2024-12-10 15:51
Creator:
Emacs 31.0.50 (Org mode 9.7.11)
License:
This work is licensed under CC BY-SA 4.0

1. Problem

Sub-string Divisibility

The number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order, but it also has a rather interesting sub-string divisibility property.

Let d1 be the 1st digit, d2 be the 2nd digit, and so on. In this way, we note the following:

Find the sum of all 0 to 9 pandigital numbers with this property.

子串的可整除性

1406357289 是一个 0 至 9 全数字数,因为它由 0 到 9 这十个数字排列而成;但除此之外,它还有一个有趣的性质:子串的可整除性。

记 d1 是它的第 1个数字,d2 是第 2个数字,依此类推,注意到:

找出所有满足同样性质的 0 至 9 全数字数,并求它们的和。

2. Solution

由于子串之间的强约束性(相邻的两个字串有两个相同的数字),我们可以考虑从头部或尾部字串作为起始推得其他字串的可行值,比如 1000 以下能被 17 整除的仅有 58 个数字,筛去含有相同数字的则仅有以下这些:

(defun eu43-num2ls (n)
  (let ((res '())
	  (tmp n))
    (while (/= n 0)
	(push (% n 10) res)
	(setq n (/ n 10)))
    (when (< tmp 100)
	(push 0 res))
    res))

(defun eu43-check (ls)
  (and (= (length ls) 3)
	 (= (length (delete-dups ls)) 3)))

(setq eu43-ini
	(cl-remove-if-not
	 'eu43-check
	 (mapcar 'eu43-num2ls
		 (cl-loop for i from 1 to 1000
			  if (zerop (% i 17))
			  collect i))))

(length eu43-ini) => 44

接下来一遍一遍筛就行了:

(let ((divs '(13 11 7 5 3 2))
	(facs '(0 1 2 3 4 5 6 7 8 9))
	(nums eu43-ini))
  (while divs
    (setq nums
	    (cl-loop
	     for a in nums append
	     (cl-loop
	      for b in (cl-set-difference facs a)
	      with a1 = (nth 0 a)
	      with a2 = (nth 1 a)
	      for newnum = (eu43-ls2num (list b a1 a2))
	      if (zerop (% newnum (car divs)))
	      collect (cons b a))))
    (setq divs (cdr divs)))
  (mapcar (lambda (x) (cons (car (cl-set-difference facs x))
			      x))
	    nums))
=> ((4 1 6 0 3 5 7 2 8 9) (1 4 6 0 3 5 7 2 8 9)
    (4 1 0 6 3 5 7 2 8 9) (1 4 0 6 3 5 7 2 8 9)
    (4 1 3 0 9 5 2 8 6 7) (1 4 3 0 9 5 2 8 6 7))


(cl-reduce (lambda (a b) (+ a (eu43-ls2num b)))
	     '((4 1 6 0 3 5 7 2 8 9) (1 4 6 0 3 5 7 2 8 9)
	       (4 1 0 6 3 5 7 2 8 9) (1 4 0 6 3 5 7 2 8 9)
	       (4 1 3 0 9 5 2 8 6 7) (1 4 3 0 9 5 2 8 6 7))
	     :initial-value 0)
=> 16695334890