Кредиты @ Agawa001 за этот вопрос.
объяснение
Мой новый "keybore" имеет только 2 кнопки, а именно +
и -
.
Номер в памяти начинается с 0
.
Каждое последовательное нажатие +
или -
будет увеличивать / уменьшать память в течение того времени, сколько раз оно было нажато последовательно.
Поэтому, если вы нажмете +
4 раза, в первый раз он добавляет 1, во второй раз он добавляет 2, в третий раз он добавляет 3, в четвертый раз он добавляет 4, давая вам 10
(десять).
Теперь, если вы нажмете -
3 раза, первый раз вычитает 1, второй раз 2, третий раз 3, оставив вас с 4
(четыре).
TL; DR
Учитывая строку + и -, делите ее при каждом изменении символа. Затем каждая результирующая строка из m +
символов добавляет номер m-го треугольника, а каждая строка из n-
символов вычитает n-й номер треугольника.
Прохождение
Теперь, если вы все еще не понимаете, я покажу вам, как +++--+--
создает 1
.
Program | Counter | Memory
----------------------------
| 0 | 0
+ | +1 | 1
++ | +2 | 3
+++ | +3 | 6
+++- | -1 | 5
+++-- | -2 | 3
+++--+ | +1 | 4
+++--+- | -1 | 3
+++--+-- | -2 | 1
задача
- В качестве входных данных вы будете принимать положительное целое число, либо в качестве функционального аргумента, либо из STDIN.
- Затем вы выведете / распечатаете минимальное количество нажатий клавиш, необходимое для создания этого числа, используя метод выше.
Testcases
Так как перестановка прогонов +
или -
дает одно и то же число, для каждой такой группы указана только самая ранняя лексикографическая последовательность.
Input | Output | Possible corresponding sequences
-------------------------------------------------
4 | 5 | -+++-
6 | 3 | +++
9 | 5 | ++++-
11 | 7 | +++-+++
12 | 7 | +++++--, ++++-++
19 | 8 | -++++++-
39 | 12 | +++++++++---
40 | 13 | +++++++++---+, ++++++++-+++-
45 | 9 | +++++++++
97 | 20 | ++++++++++++++--+---, +++++++++++++-++++--, ++++++++++++-++++++-
361 | 34 | ++++++++++++++++++++++++++-+++-+++
Дополнительные ресурсы
- Доказательство того, что можно сделать любое число : в основном, повторяя
++-
, вы можете получить любое четное число. Чтобы получить нечетные числа, просто поставьте+
в конце. - Еще один общий способ получения любого числа. Например, для генерации
50
можно нажать+
50 раз, а затем нажать-
49 раз. - Решение первых 50 номеров .
- Обязательный JSFiddle .
счет
Это код-гольф . Самое короткое решение в байтах побеждает.
источник
+++++--
это тоже альтернатива, но я удалил,++-++++
так как это эквивалентно++++-++
). У меня все еще есть еще один случай, который я хотел бы добавить позже, если кто-нибудь придумает эффективное решение, если мне удастся его сгенерировать.++-++++
удалять. Кроме того, это была МОЯ редакция, а не ВАША.+++++--
(или, что то же самое--+++++
), поэтому я почувствовал необходимость редактировать в первую очередь.Ответы:
Python 2, 119 байт
Очень медленный подход грубой силы. Третья строка вычисляет оценку строки
x
; другие строки перебирают все возможные двоичные строки, пока не будет найдена та, чья оценка равна аргументу.@Leaky сохранил три байта!
источник
s/x==n and len/(x==n)*len/
s
и просто использовать повторное деление, например так:def f(n): \n while n>0:print n%2;n/=2
Pyth, 25 байт
Попробуйте онлайн.
Это крайне неэффективно и не хватает памяти для
f(n)
≥ 11. Он рассчитываетf(22)
= 10 примерно за 10 секунд на моем ноутбуке.объяснение
T
. (f
)T
. (./T
).pM
)s
){
) Этот шаг можно удалить, но он делает код намного быстрее.f
)d
раздела (*R
) отдельно плюс один (hd
). Это дает двойное число, чтобы сложить / вычесть результат.c
…2
)-M
).a
) Если результат был отрицательным, замена сложений и вычитаний дает положительный результат.qyQ
) В этом случае перестановка разделов верна, верните ее.T
. Вернуться и распечататьT
.источник
MATL ,
4329 байтЭто нехватка памяти и времени. Онлайн-компилятор может обрабатывать только до ввода
45
.Попробуйте онлайн!
Вот модифицированная версия со всеми тестовыми примерами до
40
(это занимает почти минуту в онлайн-компиляторе).объяснение
Это проверяет все возможные последовательности нажатия клавиш каждой длины в порядке увеличения длины, пока не будет найдена действительная последовательность.
источник
Python,
105100 байтИспользует неэффективный поиск в ширину.
h
список используется в качестве очередиm
значение последовательности в начале спискаt
последний добавленный номерm
l
длина последовательности, которая сгенерировалаm
o
+/- 1, знак напротив знакаt
Редактировать: Дрянная Монахиня побрила пять байтов.
источник
s/m,t,l,h=0,0,0,[]/m=t=l=0,h=[]/
s/while m!=n/while m-n/