LINUX.ORG.RU

История изменений

Исправление rtxtxtrx, (текущая версия) :

На Go, кстати, строчек не больше чем на питоне, если пустые строки и фигурные скобки в конце блока не учитывать. Код, кстати, тож мой… Электронный чушпан и даже простой алгоритм с языка на язык не смог переписать правильно, а тем более лаконично.

// Супер быстрый парсер значений переменных west и east на странице с проверкой
// от Cloudflare
func ParseExpression(expression string) (int, error) {
	index := 0

	accept := func(token string) bool {
		if expression[index:index+len(token)] == token {
			index += len(token)
			return true
		}
		return false
	}

	result := 0
	if !accept("+(") {
		return 0, fmt.Errorf("expression must starts with '+('")
	}

	// выражения в вложенных скобках имеют значения от 0 до 9, они преобразуются
	// в строки при сложении, а потом преобразуются обратно в число
	for accept("(") {
		result *= 10

		if accept("+!+[]") {
			result += 1
		} else if !accept("+![]") {
			return 0, fmt.Errorf("expected '+!+[]' or '+![]' after '(' at position %d", index)
		}

		for !accept(")") {
			if accept("+!![]") {
				result += 1
			} else if !accept("+[]") {
				return 0, fmt.Errorf("expected '+!![]' or '+[]' at position %d", index)
			}
		}

		if accept("+") {
			continue
		}
	}

	if !accept(")") {
		return 0, fmt.Errorf("expected ')' at position %d", index)
	}

	if index != len(expression) {
		return 0, fmt.Errorf("unexpected character at position %d", index)
	}

	return result, nil
}

Исходная версия rtxtxtrx, :

На Go, кстати, строчек не больше чем на питоне, если пустые строки и фигурные скобки в конце блока не учитывать.

// Супер быстрый парсер значений переменных west и east на странице с проверкой
// от Cloudflare
func ParseExpression(expression string) (int, error) {
	index := 0

	accept := func(token string) bool {
		if expression[index:index+len(token)] == token {
			index += len(token)
			return true
		}
		return false
	}

	result := 0
	if !accept("+(") {
		return 0, fmt.Errorf("expression must starts with '+('")
	}

	// выражения в вложенных скобках имеют значения от 0 до 9, они преобразуются
	// в строки при сложении, а потом преобразуются обратно в число
	for accept("(") {
		result *= 10

		if accept("+!+[]") {
			result += 1
		} else if !accept("+![]") {
			return 0, fmt.Errorf("expected '+!+[]' or '+![]' after '(' at position %d", index)
		}

		for !accept(")") {
			if accept("+!![]") {
				result += 1
			} else if !accept("+[]") {
				return 0, fmt.Errorf("expected '+!![]' or '+[]' at position %d", index)
			}
		}

		if accept("+") {
			continue
		}
	}

	if !accept(")") {
		return 0, fmt.Errorf("expected ')' at position %d", index)
	}

	if index != len(expression) {
		return 0, fmt.Errorf("unexpected character at position %d", index)
	}

	return result, nil
}