Унарные числа обычно представляют только неотрицательные целые числа, но мы можем расширить их, чтобы представить все целые числа следующим образом:
- Положительное целое число N представляется как N
1
:5 -> 11111
- Отрицательное целое число -N представляется как
0
N, за которыми следуют1
:-5 -> 011111
- Ноль представлен как
0
Затем мы можем однозначно представить список этих чисел, если будем использовать 0
в качестве разделителя:
3,-2,0,1
111,011,0,1
111 0 011 0 0 0 1
11100110001
Ваша задача: взять строку, представляющую такой список унарных чисел со знаком, и перевести ее в список десятичных чисел.
Детали
Вы можете предположить, что ввод представляет собой полный список унарных чисел со знаком. В частности, вашей программе не нужно обрабатывать 1) пустой ввод или 2) ввод, заканчивающийся разделителем.
Вы можете предположить, что величина каждого числа не будет превышать 127. Для языков с максимальными размерами строк или списков вы можете предполагать, что ввод и вывод будут соответствовать структуре данных вашего языка, но ваш алгоритм теоретически должен работать для списка любого размера.
Ваша программа или функция может выполнять ввод / вывод любым из стандартных способов . Входные данные могут быть строкой или списком символов, односимвольными строками, целыми числами или логическими значениями. Вы можете использовать любые два символа для представления 1
и 0
; если вы не используете1
и 0
, пожалуйста, укажите, какие символы вы используете.
Вывод должен быть десятичным числом в любом приемлемом формате списка (в частности, должен быть какой-то разделитель между числами). Отрицательные числа должны быть обозначены знаком минус, хотя если ваш язык имеет другой формат для отрицательных целых чисел, я также приму это. Ноль может быть представлен в выводе как 0
или -0
.
Контрольные примеры
1 -> 1
0 -> 0 (or -0, and similarly for the other test cases)
011 -> -2
1101 -> 2,1
1100 -> 2,0
11001 -> 2,-1
110001 -> 2,0,1
11100110001 -> 3,-2,0,1
00000001 -> 0,0,0,-1
01111011111111001111111111111110111111111111111100111111111111111111111110111111111111111111111111111111111111111111 -> -4,8,-15,16,-23,42
01111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -> -127
0
) и префикс отрицательного знака ( 0
) одинаковы, хотя это по-прежнему однозначно, так как вы не можете иметь отрицательные знаки в середине числа ( 182--693-1
число? Нет, и ни 1111011000101111
по одной и той же причине).
'0's
, это не является технически унарным. Хороший вызов, хотя!