Add ru version (#1865)

* Add Russian docs site baseline

* Add Russian localized codebase

* Polish Russian code wording

* Update ru code translation.

* Update code translation and chapter covers.

* Fix pythontutor extraction.

* Add README and landing page.

* placeholder of profiles

* Use figures of English version

* Remove chapter paperbook
This commit is contained in:
Yudong Jin
2026-03-28 04:24:07 +08:00
committed by GitHub
parent 2ca570cc33
commit 772183705e
1958 changed files with 108186 additions and 0 deletions
@@ -0,0 +1,108 @@
=begin
File: array.rb
Created Time: 2024-03-18
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
=end
# ## Случайный доступ к элементу ###
def random_access(nums)
# Случайным образом выбрать число из интервала [0, nums.length)
random_index = Random.rand(0...nums.length)
# Получить и вернуть случайный элемент
nums[random_index]
end
# ## Увеличить длину массива ###
# Обратите внимание: Array в Ruby является динамическим массивом и может быть расширен напрямую
# Для удобства обучения эта функция рассматривает Array как массив неизменяемой длины
def extend(nums, enlarge)
# Инициализировать массив увеличенной длины
res = Array.new(nums.length + enlarge, 0)
# Скопировать все элементы исходного массива в новый массив
for i in 0...nums.length
res[i] = nums[i]
end
# Вернуть новый массив после расширения
res
end
# ## Вставка элемента num по индексу index в массив ###
def insert(nums, num, index)
# Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
for i in (nums.length - 1).downto(index + 1)
nums[i] = nums[i - 1]
end
# Присвоить num элементу по индексу index
nums[index] = num
end
# ## Удаление элемента по индексу index ###
def remove(nums, index)
# Сдвинуть все элементы после индекса index на одну позицию вперед
for i in index...(nums.length - 1)
nums[i] = nums[i + 1]
end
end
# ## Обход массива ###
def traverse(nums)
count = 0
# Обход массива по индексам
for i in 0...nums.length
count += nums[i]
end
# Непосредственно обходить элементы массива
for num in nums
count += num
end
end
# ## Поиск заданного элемента в массиве ###
def find(nums, target)
for i in 0...nums.length
return i if nums[i] == target
end
-1
end
### Driver Code ###
if __FILE__ == $0
# Инициализация массива
arr = Array.new(5, 0)
puts "Массив arr = #{arr}"
nums = [1, 3, 2, 5, 4]
puts "Массив nums = #{nums}"
# Случайный доступ
random_num = random_access(nums)
puts "Случайный элемент из nums = #{random_num}"
# Расширение длины
nums = extend(nums, 3)
puts "После увеличения длины массива до 8 nums = #{nums}"
# Вставка элемента
insert(nums, 6, 3)
puts "После вставки числа 6 по индексу 3 nums = #{nums}"
# Удаление элемента
remove(nums, 2)
puts "После удаления элемента по индексу 2 nums = #{nums}"
# Обход массива
traverse(nums)
# Поиск элемента
index = find(nums, 3)
puts "Поиск элемента 3 в nums: индекс = #{index}"
end
@@ -0,0 +1,83 @@
=begin
File: linked_list.rb
Created Time: 2024-03-18
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
=end
require_relative '../utils/list_node'
require_relative '../utils/print_util'
# ## Вставка узла _p после узла n0 в связном списке ###
# В Ruby `p` — встроенная функция, а `P` — константа, поэтому вместо этого можно использовать `_p`
def insert(n0, _p)
n1 = n0.next
_p.next = n1
n0.next = _p
end
# ## Удаление первого узла после узла n0 в связном списке ###
def remove(n0)
return if n0.next.nil?
# n0 -> remove_node -> n1
remove_node = n0.next
n1 = remove_node.next
n0.next = n1
end
# ## Доступ к узлу связного списка по индексу index ###
def access(head, index)
for i in 0...index
return nil if head.nil?
head = head.next
end
head
end
# ## Поиск первого узла со значением target в связном списке ###
def find(head, target)
index = 0
while head
return index if head.val == target
head = head.next
index += 1
end
-1
end
### Driver Code ###
if __FILE__ == $0
# Инициализация связного списка
# Инициализация всех узлов
n0 = ListNode.new(1)
n1 = ListNode.new(3)
n2 = ListNode.new(2)
n3 = ListNode.new(5)
n4 = ListNode.new(4)
# Построить ссылки между узлами
n0.next = n1
n1.next = n2
n2.next = n3
n3.next = n4
puts "Исходный связный список"
print_linked_list(n0)
# Вставка узла
insert(n0, ListNode.new(0))
print_linked_list n0
# Удаление узла
remove(n0)
puts "Связный список после удаления узла"
print_linked_list(n0)
# Доступ к узлу
node = access(n0, 3)
puts "Значение узла по индексу 3 в связном списке = #{node.val}"
# Поиск узла
index = find(n0, 2)
puts "Индекс узла со значением 2 в связном списке = #{index}"
end
@@ -0,0 +1,60 @@
=begin
File: list.rb
Created Time: 2024-03-18
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
=end
### Driver Code ###
if __FILE__ == $0
# Инициализация списка
nums = [1, 3, 2, 5, 4]
puts "Список nums = #{nums}"
# Доступ к элементу
num = nums[1]
puts "Элемент по индексу 1: num = #{num}"
# Обновление элемента
nums[1] = 0
puts "После обновления элемента по индексу 1 до 0 nums = #{nums}"
# Очистить список
nums.clear
puts "После очистки списка nums = #{nums}"
# Добавление элемента в конец
nums << 1
nums << 3
nums << 2
nums << 5
nums << 4
puts "После добавления элементов nums = #{nums}"
# Вставка элемента в середину
nums.insert(3, 6)
puts "После вставки элемента 6 по индексу 3 nums = #{nums}"
# Удаление элемента
nums.delete_at(3)
puts "После удаления элемента по индексу 3 nums = #{nums}"
# Обходить список по индексам
count = 0
for i in 0...nums.length
count += nums[i]
end
# Непосредственно обходить элементы списка
count = 0
nums.each do |x|
count += x
end
# Объединить два списка
nums1 = [6, 8, 7, 10, 9]
nums += nums1
puts "После конкатенации списка nums1 к nums nums = #{nums}"
nums = nums.sort { |a, b| a <=> b }
puts "После сортировки списка nums = #{nums}"
end
@@ -0,0 +1,132 @@
=begin
File: my_list.rb
Created Time: 2024-03-18
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
=end
# ## Класс списка ###
class MyList
attr_reader :size # Получить длину списка (текущее число элементов)
attr_reader :capacity # Получить вместимость списка
# ## Конструктор ###
def initialize
@capacity = 10
@size = 0
@extend_ratio = 2
@arr = Array.new(capacity)
end
# ## Доступ к элементу ###
def get(index)
# Если индекс выходит за границы, выбрасывается исключение; далее аналогично
raise IndexError, "индекс выходит за границы" if index < 0 || index >= size
@arr[index]
end
# ## Доступ к элементу ###
def set(index, num)
raise IndexError, "индекс выходит за границы" if index < 0 || index >= size
@arr[index] = num
end
# ## Добавление элемента в конец ###
def add(num)
# При превышении вместимости по числу элементов запускается расширение
extend_capacity if size == capacity
@arr[size] = num
# Обновить число элементов
@size += 1
end
# ## Вставка элемента в середину ###
def insert(index, num)
raise IndexError, "индекс выходит за границы" if index < 0 || index >= size
# При превышении вместимости по числу элементов запускается расширение
extend_capacity if size == capacity
# Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
for j in (size - 1).downto(index)
@arr[j + 1] = @arr[j]
end
@arr[index] = num
# Обновить число элементов
@size += 1
end
# ## Удаление элемента ###
def remove(index)
raise IndexError, "индекс выходит за границы" if index < 0 || index >= size
num = @arr[index]
# Сдвинуть все элементы после индекса index на одну позицию вперед
for j in index...size
@arr[j] = @arr[j + 1]
end
# Обновить число элементов
@size -= 1
# Вернуть удаленный элемент
num
end
# ## Расширение списка ###
def extend_capacity
# Создать новый массив длиной в extend_ratio раз больше исходного и скопировать в него исходный массив
arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))
# Обновить вместимость списка
@capacity = arr.length
end
# ## Преобразование списка в массив ###
def to_array
sz = size
# Преобразовывать только элементы списка в пределах фактической длины
arr = Array.new(sz)
for i in 0...sz
arr[i] = get(i)
end
arr
end
end
### Driver Code ###
if __FILE__ == $0
# Инициализация списка
nums = MyList.new
# Добавление элемента в конец
nums.add(1)
nums.add(3)
nums.add(2)
nums.add(5)
nums.add(4)
puts "Список nums = #{nums.to_array}, емкость = #{nums.capacity}, длина = #{nums.size}"
# Вставка элемента в середину
nums.insert(3, 6)
puts "После вставки числа 6 по индексу 3 nums = #{nums.to_array}"
# Удаление элемента
nums.remove(3)
puts "После удаления элемента по индексу 3 nums = #{nums.to_array}"
# Доступ к элементу
num = nums.get(1)
puts "Элемент по индексу 1: num = #{num}"
# Обновление элемента
nums.set(1, 0)
puts "После обновления элемента по индексу 1 до 0 nums = #{nums.to_array}"
# Проверка механизма расширения
for i in 0...10
# При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения
nums.add(i)
end
puts "После расширения список nums = #{nums.to_array}, емкость = #{nums.capacity}, длина = #{nums.size}"
end