Le dernier chiffre se duplique plus loin

 

 

Envoyée fin janvier 2009 à la liste SeqFan, cette idée de suite (je traduis) :

 

« Le dernier chiffre < d > de a(n) est présent dans a(n+1+d) »

 

Trois règles de construction supplémentaires :

 

a) a(1) = 1

b) quand il n’y a aucune contrainte d’écriture pesant sur a(n), prendre a(n) = a(n-1)+1

c) quand il y a une ou plusieurs contraintes d’écriture sur a(n), prendre le plus petit a(n) > a(n-1) ne conduisant pas à une contradiction.

 

C’est tout.

 

En français ordinaire il s’agit de construire une suite S strictement croissante d’entiers dont le dernier chiffre < d > est dupliqué quelque part dans un autre entier de la suite, situé à une distance < d > du premier, vers la droite. (Quand < d > vaut zéro, c’est le terme suivant qui doit contenir < 0 >).

 

Sans réponse de SeqFan, j’ai envoyé ce problème au groupe rec.puzzles de Google.

 

Duncan Booth a calculé immédiatement les cent premiers termes de S ; il a joint son programme informatique :

 

S = 1, 2, 10, 20, 102, 103, 104, 112, 113, 123, 124, 134, 135, 136, 137, 140, 204, 205, 215, 216, 226, 234, 237, 245, 250, 260, 406, 416, 417, 425, 427, 428, 429, 436, 446, 450, 470, 480, 507, 508, 568, 569, 579, 580, 590, 600, 607, 608, 618, 628, 629, 639, 649, 650, 670, 680, 708, 718, 728, 729, 739, 749, 759, 760, 770, 780, 800, 801, 802, 819, 829, 892, 893, 894, 902, 903, 913, 920, 940, 1039, 1093, 1094, 1095, 1096, 1103, 1104, 1114, 1115, 1135, 1139, 1146, 1147, 1148, 1150, 1205, 1206, 1207, 1216, 1217, 1279, ...

 

---

 

from itertools import islice

def isok(s, needs):

    s = str(s)

    for c in needs:

        if c not in s:

            return False

    return True

def genS():

    required = {}

    n = 1

    S = 1

    while 1:

        obdigits = required.pop(n, "")

        while not isok(S, obdigits):

            S += 1

        yield n,S, obdigits

        d = S % 10

        constrain = n+d+1

        d = str(d)

        if constrain in required:

            required[constrain] += d

        else:

            required[constrain] = d

        n += 1

        S += 1

if __name__=='__main__':

    sequence = genS()

    for n,S,ob in islice(sequence, 100):

        print n,S,ob

 

---

 

Le tableau suivant reprend les cent premiers termes de la suite S (2e colonne) et les chiffres à dupliquer (3e colonne) :

 

1

1

 

2

2

 

3

10

1

4

20

0

5

102

20

6

103

 

7

104

 

8

112

2

9

113

 

10

123

3

11

124

2

12

134

4

13

135

3

14

136

3

15

137

 

16

140

4

17

204

40

18

205

 

19

215

5

20

216

 

21

226

6

22

234

4

23

237

7

24

245

5

25

250

5

26

260

0

27

406

640

28

416

6

29

417

 

30

425

5

31

427

7

32

428

 

33

429

 

34

436

6

35

446

6

36

450

5

37

470

70

38

480

0

39

507

70

40

508

 

41

568

86

42

569

6

43

579

9

44

580

 

45

590

0

46

600

0

47

607

70

48

608

 

49

618

8

50

628

8

51

629

 

52

639

9

53

649

9

54

650

 

55

670

70

56

680

0

57

708

80

58

718

8

59

728

8

60

729

 

61

739

9

62

749

9

63

759

9

64

760

 

65

770

0

66

780

80

67

800

80

68

801

80

69

802

 

70

819

91

71

829

9

72

892

92

73

893

9

74

894

 

75

902

2

76

903

 

77

913

3

78

920

2

79

940

40

80

1039

930

81

1093

93

82

1094

 

83

1095

 

84

1096

 

85

1103

3

86

1104

 

87

1114

4

88

1115

 

89

1135

53

90

1139

9

91

1146

64

92

1147

4

93

1148

 

94

1150

5

95

1205

50

96

1206

 

97

1207

 

98

1216

6

99

1217

 

100

1279

97

...

 

Merci à Duncan Booth, Hans Havermann et Paolo Lava pour leurs calculs, conseils et remarques.

 

__________

Back to main page, here.