Кредити @ Agawa001 для придумують з цим питанням.
Пояснення
У моєї нової "клавіатури" є лише 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.
- Потім ви виведете / роздрукуєте мінімальну кількість натискань клавіш, необхідних для створення цього номера, використовуючи вищевказаний метод.
Тестові шафи
Оскільки перегрупування +
або -
запуски дає однакове число, для кожної такої групи перерахована лише найдавніша лексикографічна послідовність.
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 .
Оцінка балів
Це код-гольф . Найкоротше рішення в байтах виграє.
+++++--
це також альтернатива, але я її зняв, ++-++++
оскільки це рівнозначно ++++-++
). У мене є ще один випадок, який я хотів би додати пізніше, якщо хтось придумає ефективне рішення, якщо мені вдасться його створити.
++-++++
видаляти. Також це було МОЕ редагування, а не ВАШ.
+++++--
(або, що рівнозначно --+++++
), саме тому я відчував потребу в першу чергу редагувати.