Опишем простую процедуру. Выберем натуральное число N от 1 до 99 и сопоставим ему число, равное количеству букв в записи N в виде слова какого-то языка. Для полученного числа снова повторим эту операцию. Для русского языка получается довольно симпатичное дерево, в котором есть три цикла 3→3, 11→11 и 6→5→4→6.
![image](https://habrastorage.org/r/w780q1/files/93b/98e/70b/93b98e70b61b4dba9e9b8389fe721d9c.jpg)
Интересно, что в английском языке не более, чем за пять шагов мы придем к 4 и зациклимся.
Вот пример короткого кода на Ruby, производящего нужный нам граф для английского языка
![](https://habrastorage.org/files/7ce/1bb/b78/7ce1bbb78cd641ba85dba9a62a826f48.gif)
Аналогично устроен код для французского языка
В этом случае мы приходим к циклу 5→4→6→3→5.
![](https://habrastorage.org/files/69e/31a/951/69e31a95168a4f668cfbaa66c080127a.gif)
![image](https://habrastorage.org/files/93b/98e/70b/93b98e70b61b4dba9e9b8389fe721d9c.jpg)
Интересно, что в английском языке не более, чем за пять шагов мы придем к 4 и зациклимся.
Вот пример короткого кода на Ruby, производящего нужный нам граф для английского языка
require 'humanize'
require 'rgl/adjacency'
require 'rgl/dot'
result = RGL::DirectedAdjacencyGraph.new
1.upto(99) { |i|
result.add_edge(i.to_s, i.humanize(locale: :en).length.to_s)
}
result.dotty
![](https://habrastorage.org/files/7ce/1bb/b78/7ce1bbb78cd641ba85dba9a62a826f48.gif)
Аналогично устроен код для французского языка
result = RGL::DirectedAdjacencyGraph.new
1.upto(99) { |i|
result.add_edge(i.to_s, i.humanize(locale: :fr).length.to_s)
}
result.dotty
В этом случае мы приходим к циклу 5→4→6→3→5.
![](https://habrastorage.org/files/69e/31a/951/69e31a95168a4f668cfbaa66c080127a.gif)