Допустим, я в десяти шагах от пункта назначения. Я иду туда, следуя старой поговорке: «Два шага вперед и один шаг назад». Я делаю два шага вперед, один назад, пока не стою точно на своем месте назначения. (Это может потребовать пройти мимо моего пункта назначения и вернуться к нему). Сколько шагов я прошел?
Конечно, я не могу быть в 10 шагах. Я мог бы быть в 11 шагах или 100. Я мог бы измерить десять шагов и продолжать идти вперед и назад, чтобы решить проблему, или ... Я мог бы написать какой-нибудь код!
- Напишите функцию, чтобы определить, сколько шагов нужно сделать, чтобы получить N шагов в последовательности: два шага вперед, один шаг назад.
- Предположим, вы начали с шага 0. Считайте «два шага вперед» как два шага, а не один.
- Предположим, что все шаги имеют одинаковую длину.
- Он должен возвращать количество шагов, которые были сделаны первым, когда вы дойдете до этого места. (Например, в 10 шагах нужно сделать 26 шагов, но вы снова нажмете на 30). Мы заинтересованы в 26.
- Используйте любой язык, который вам нравится.
- Он должен принимать любое положительное целое число в качестве входных данных. Это представляет собой целевой шаг.
- Наименьшее количество байтов побеждает.
Пример:
Я хочу сделать 5 шагов:
| | | | | | <- I'm at step 0, not yet on the grid.
| |X| | | | <- I take two steps forward, I'm on step 2: the count is 2
|X| | | | | <- I take one step back, I'm on step 1: the count is 3
| | |X| | | <- I take two steps forward, I'm on step 3: the count is 5
| |X| | | | <- I take one step back, I'm on step 2 again: the count is 6
| | | |X| | <- I take two steps forward, I'm on step 4: the count is 8
| | |X| | | <- I take one step back, I'm on step 3 again: the count is 9
| | | | |X| <- I take two steps forward, I'm on step 5: the count is 11
В этом случае результат функции будет 11.
Пример результатов:
1 => 3
5 => 11
9 => 23
10 => 26
11 => 29
100 => 296
1000 => 2996
10000 => 29996
100000 => 299996
Веселитесь, игроки в гольф!
code-golf
math
arithmetic
AJFaraday
источник
источник
Ответы:
Оазис ,
54 байта1 байт сохранен благодаря @Adnan
Не путать с
23+3
Попробуйте онлайн!
Как?
источник
b
.Python 2 , 18 байт
Попробуйте онлайн.
Я поднял этот трюк у xnor всего несколько дней назад…!
источник
Python 2 , 20 байт
Попробуйте онлайн!
источник
Python 2 , 17 байт
Попробуйте онлайн!
Я нашел выражение поиска методом грубой силы. Это эффективно вычисляет
n+2*abs(n-2)
.источник
Полиглот: Java 8 / JavaScript / C # .NET,
161412 байтПопробуйте онлайн (Java 8).
Попробуйте онлайн (JavaScript).
Попробуйте онлайн (C # .NET) .
Порт ответа @Lynn 's Python 2 , так что не забудьте высказать свой ответ.
Старый ответ:
Полиглот: Java 8 / JavaScript / C # .NET,
1614 байтПопробуйте онлайн (Java 8).
Попробуйте онлайн (JavaScript).
Попробуйте онлайн (C # .NET) .
Объяснение:
источник
n=>(--n*3||4)-1
это также возможно в JavaScript (также 14 байтов).R , 20 байтов
Попробуйте онлайн!
Не замечал шаблон до тех пор, пока я не реализовал свое менее изящное решение.
источник
05AB1E ,
87 байтПопробуйте онлайн!
-1 байт благодаря Emigna!
источник
3*s≠i4-
сохраняет байтОазис , 5 байт
Объяснение:
Попробуйте онлайн!
источник
Haskell , 15 байт
Попробуйте онлайн!
источник
Стандартный ML , 16 байт
Попробуйте онлайн!
источник
Додос , 27 байт
Попробуйте онлайн!
источник
Желе , 6 байт
Попробуйте онлайн!
источник
Пролог (SWI) , 21 байт
Попробуйте онлайн!
источник
MATL , 7 байт
Использует
3*n-4*(n>1)
формулу. Умножьте ввод на 3 (3*
), снова нажмите ввод (G
) и уменьшите его (q
). Если результат не равен нулю (?
), то вычтите 4 из результата (4-
).Попробуйте онлайн!
источник
2-|EG+
Желе , 4 байта
Попробуйте онлайн!
Как это устроено
источник
APL (Дьялог) , 9 байт
Попробуйте онлайн!
источник
C (gcc) , 20 байтов
Попробуйте онлайн!
источник
f(n){n=n<2?3:n*3-4;}
f(n){n=n*3-4*(n>1);}
MachineCode на x86_64,
343224 байтаТребуется
i
флаг для целочисленного вывода; ввод осуществляется через ручное добавление к коду.Попробуйте онлайн!
Я прошел эти 4 различные функции C, чтобы найти 24-байтовую программу MachineCode:
n+2*abs(n-2)
=8d47fe9931d029d08d0447c3
(24 байта)3*n-4*!!~-n
=8d047f31d2ffcf0f95c2c1e20229d0c3
(32 байта)n*3-4*(n>1)
=31d283ff028d047f0f9dc2c1e20229d0c3
(34 байта)n<2?3:n*3-4
=83ff01b8030000007e068d047f83e804c3
(34 байта)источник
> <> ,
109 байтСохранено 1 байт благодаря Джо Кингу
Попробуйте онлайн!
источник
4 , 54 байта
Попробуйте онлайн!
Если вы сомневаетесь в способе ввода, пожалуйста, сначала посетите числовой ввод, и вывод может быть представлен как мета-пост кода символа .
источник
4
имеет только ввод символовJapt, 7 байт
Порт решения Lynn's Python.
Попытайся
альтернатива
Это была забавная альтернатива решениям с закрытой формулой, которая, к сожалению, на байт длиннее:
Попытайся
источник
TI-Basic, 8 байт
источник
05AB1E , 4 байта
Использует метод abs из ответа Желе Денниса
Попробуйте онлайн!
объяснение
источник
65816 машинный код, 22 байта
Я мог бы легко сделать этот машинный код 65C02 на 3 байта меньше, но этого не сделал, поскольку размер регистра на 65C02 составляет 8 бит вместо 16 бит. Это будет работать, но это скучно, потому что вы можете использовать только очень низкие числа ;-)
xxd dump:
Разборка / объяснение кода:
Тестирование на 65816-совместимом эмуляторе:
источник
ОБОЛОЧКА , 28 байт
Тесты:
Пояснение:
Формула:
следуя последовательности из 3 шагов «Два шага вперед и один шаг назад», мы получим арифметическую серию:
Как минимум или первое совпадение:
в одной формуле:
источник
$((…))
) выполняются, вероятно, нет.F(){bc<<<$1*3-$(($1>1))*4}
хотя работает в zsh и удаляет 2 байтаPython 3 , 48 байт
Попробуйте онлайн!
источник
J , 9 байт
Попробуйте онлайн!
источник
MATLAB / Octave , 15 байт
Попробуйте онлайн!
Что-то удивило, что ответа MATLAB уже нет. Тот же алгоритм,
3*n-4
если больше 1, или3*n
иначе.источник
Brain-Flak , 38 байт
Попробуйте онлайн!
Первый ответ, который я вижу, чтобы вычислить ответ, шагая вперед и назад.
источник
W
d
, 7 байтобъяснение
Оценивает
(a*3)-4*(a>1)
.Другая возможная альтернатива
Оценивает
(a*3)-4*(1%a)
.источник