История изменений
Исправление 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
}