Фермеру заменили код кактуса — сортировка, затем n² урожай

Переписано для 1.0+. Кактусы имеют размеры 0–9. Когда каждый сосед выращивается в упорядоченном порядке, сбор урожая одного кактуса собирает весь связанный отсортированный квадрат для n² кактуса.

Порядок сортировки (определение вики)

  • Растение на почве. Затраты на посадку тыквы (`get_cost(Entities.Cactus)`).
  • `measure()` → size in 0…9. `measure(East)` читает соседа, не двигаясь.
  • Отсортировано, если каждый выращенный сосед N/E ≥ этот кактус, а каждый выращенный сосед S/W ≤ этот кактус.
  • Несортированные выращенные кактусы выглядят коричневыми; отсортированные становятся зелеными. Урожай распространяется только через полностью отсортированную → выплату соседей «n**2».
  • `swap(direction)` меняет эту плитку с соседней.

Сценарий обучения: → пузырь → ожидания растений к → урожаю NE

Сортировка пузырьков легко читается, а не самая быстрая. Подождите, пока каждый кактус сможет собрать урожай, прежде чем обмениваться — сортировать незавершенные отходы плитки.

python
def go_to(x, y):
	while get_pos_x() != x:
		if get_pos_x() < x:
			move(East)
		else:
			move(West)
	while get_pos_y() != y:
		if get_pos_y() < y:
			move(North)
		else:
			move(South)

def plant_all():
	size = get_world_size()
	for y in range(size):
		for x in range(size):
			go_to(x, y)
			if get_ground_type() != Grounds.Soil:
				till()
			plant(Entities.Cactus)

def wait_until_grown():
	size = get_world_size()
	ready = False
	while not ready:
		ready = True
		for y in range(size):
			for x in range(size):
				go_to(x, y)
				if get_entity_type() != Entities.Cactus or not can_harvest():
					ready = False

def bubble_sort_once():
	# Push larger sizes toward North/East
	size = get_world_size()
	swapped = False
	for y in range(size):
		for x in range(size):
			go_to(x, y)
			here = measure()
			if x < size - 1:
				east = measure(East)
				if east != None and here > east:
					swap(East)
					swapped = True
					here = measure()
			if y < size - 1:
				north = measure(North)
				if north != None and here > north:
					swap(North)
					swapped = True
	return swapped

clear()
while True:
	plant_all()
	wait_until_grown()
	while bubble_sort_once():
		pass
	go_to(0, 0)
	harvest()

Заметки о нескольких беспилотниках/ скорости

  • Сортировка пузырьков на 32×32 происходит медленно (много проходов). Более быстрые сортировки живут в коллекциях сообщества GitHub — эта страница остается читаемой.
  • Дроны не делятся памятью. Параллельные сортировки требуют тщательного владения плиткой или двойной замены одного и того же края.
  • Целевые факторы кактуса в таблице лидеров - 32 идеальных урожая на полной ферме n² с n = 1024.