Два шага вперед и один шаг назад

15

Допустим, я в десяти шагах от пункта назначения. Я иду туда, следуя старой поговорке: «Два шага вперед и один шаг назад». Я делаю два шага вперед, один назад, пока не стою точно на своем месте назначения. (Это может потребовать пройти мимо моего пункта назначения и вернуться к нему). Сколько шагов я прошел?

Конечно, я не могу быть в 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

Веселитесь, игроки в гольф!

AJFaraday
источник
7
Хм ... это кажется очень знакомым.
Мохнатый
@ Род Ура! Мне это сошло с рук! ;)
AJFaraday
Да, это похоже на тот, о котором я думал, @Rod.
Мохнатый
@ Shaggy Rod немного изменил свой комментарий. Ранее отмечалось, что вопрос об улитках / скважинах требует количества итераций, но это вопрос о пройденном расстоянии.
AJFaraday

Ответы:

5

Оазис , 5 4 байта

1 байт сохранен благодаря @Adnan

3+23

Не путать с 23+3

Попробуйте онлайн!

Как?

      implicitly push a(n-1)
3     push 3
 +    sum and implicitly print
  2   a(2) = 2
   3  a(1) = 3
Уриэль
источник
1
Вы можете опустить b.
Аднан
Я думаю, что вы хотели умножить на 3, а не добавить его.
Эрик Outgolfer
@EriktheOutgolfer Программа вычисляет a (n) как a (n-1) +3 .
Денис
9

Полиглот: Java 8 / JavaScript / C # .NET, 16 14 12 байт

n->3*n-1%n*4

Попробуйте онлайн (Java 8).

n=>3*n-1%n*4

Попробуйте онлайн (JavaScript).
Попробуйте онлайн (C # .NET) .

Порт ответа @Lynn 's Python 2 , так что не забудьте высказать свой ответ.


Старый ответ:

Полиглот: Java 8 / JavaScript / C # .NET, 16 14 байт

n->n<2?3:n*3-4

Попробуйте онлайн (Java 8).

n=>n<2?3:n*3-4

Попробуйте онлайн (JavaScript).
Попробуйте онлайн (C # .NET) .

Объяснение:

n->       // Method with integer as both parameter and return-type
  n<2?    //  If the input is 1:
   3      //   Return 3
  :       //  Else:
   n*3-4  //   Return the input multiplied by 3, and subtract 4
Кевин Круйссен
источник
JavaScript полиглот, если вы используете жирную стрелку.
Лохматый
@Shaggy Добавлено, как и C # .NET :) Хотя n=>(--n*3||4)-1это также возможно в JavaScript (также 14 байтов).
Кевин Круйссен,
7

R , 20 байтов

N=scan();3*N-4*(N>1)

Попробуйте онлайн!

Не замечал шаблон до тех пор, пока я не реализовал свое менее изящное решение.

Giuseppe
источник
3
Поздравляю с 10k BTW!
Луис Мендо
4
@ LuisMendo спасибо! Я думаю, что мой годовалый юбилей на сайте был пару дней назад, так что это была хорошая неделя для меня, с точки зрения PPCG.
Джузеппе
3
@Giuseppe Мне знакомо это чувство: 20 тыс. На прошлой неделе, а также 2-й юбилей. :)
Кевин Круйссен
4

MATL , 7 байт

Использует 3*n-4*(n>1)формулу. Умножьте ввод на 3 ( 3*), снова нажмите ввод ( G) и уменьшите его ( q). Если результат не равен нулю ( ?), то вычтите 4 из результата ( 4-).

3*Gq?4-

Попробуйте онлайн!

Дэвид
источник
6 байтов переносят ответ Jelly Денниса2-|EG+
Джузеппе
3

C (gcc) , 20 байтов

f(n){n=3*n-4*!!~-n;}

Попробуйте онлайн!

Джонатан Фрех
источник
Альтернатива с тем же количеством байтов:f(n){n=n<2?3:n*3-4;}
Кевин Круйссен,
Другая альтернатива с тем же количеством байтов:f(n){n=n*3-4*(n>1);}
MD XF
3

MachineCode на x86_64, 34 32 24 байта

8d47fe9931d029d08d0447c3

Требуется 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 байта)
MD XF
источник
так что же это за язык?
qwr
@qwr Проверьте README в репозитории для простого описания.
MD XF
2

4 , 54 байта

3.6010160303604047002020003100000180010202046000095024

Попробуйте онлайн!

Если вы сомневаетесь в способе ввода, пожалуйста, сначала посетите числовой ввод, и вывод может быть представлен как мета-пост кода символа .

Уриэль
источник
Почему это было отвергнуто?
Уриэль
Поскольку ответ, кажется, составляет одну четверть, который не является действительным результатом. Насколько я могу судить, это не решает проблему.
AJFaraday
@AJFaraday он использует байтовый ввод и вывод, который действителен по мета-консенсусу. см. объяснение в разделе ввода
Uriel
Любые ресурсы о том, как интерпретировать результат? Или вход?
AJFaraday
1
@AJFaraday код результата - это ответ. Я отредактировал вопрос, добавив соответствующий мета-пост. 4имеет только ввод символов
Уриэль
2

Japt, 7 байт

Порт решения Lynn's Python.

*3É%U*4

Попытайся


альтернатива

Это была забавная альтернатива решениям с закрытой формулой, которая, к сожалению, на байт длиннее:

_+3}gN³²

Попытайся

мохнатый
источник
2

65816 машинный код, 22 байта

Я мог бы легко сделать этот машинный код 65C02 на 3 байта меньше, но этого не сделал, поскольку размер регистра на 65C02 составляет 8 бит вместо 16 бит. Это будет работать, но это скучно, потому что вы можете использовать только очень низкие числа ;-)

xxd dump:

00000000: 7aa9 0000 aa89 0100 d004 8888 e824 c8e8  z............$..
00000010: 1ac0 0000 d0ef                           ......

Разборка / объяснение кода:

; target is on the stack
  ply              7A                  ; pull target from stack
  lda #$0000       A9 00 00            ; set loop counter to 0
  tax              AA                  ; set step counter to 0
loop:
  bit #$0001       89 01 00            ; sets Z if loop counter is even
  bne odd          D0 04               ; if Z is not set, jump to 'odd'
  dey              88                  ; decrement target twice
  dey              88
  inx              E8                  ; increment step counter
  .byte $24        24                  ; BIT $xx opcode, effectively skips the next byte
odd:
  iny              C8                  ; increment target

  inx              E8                  ; increment step counter
  inc a            1A                  ; increment loop counter

  cpy #$0000       C0 00 00            ; sets zero flag, can be optimized maybe?
  bne loop         D0 EF               ; if Y is non-zero, loop

; result is in register X

Тестирование на 65816-совместимом эмуляторе:

тестирование

2xsaiko
источник
1

ОБОЛОЧКА , 28 байт

F(){ bc<<<$1*3-$(($1>1))*4;}

Тесты:

F 1
3

F 2
2

F 3
5

F 4
8

F5
11

F 11
29

F 100
296

F 100000
299996

Пояснение:

Формула:

if n == 1  ==> F(1) = 3
else F(n) = 3*n - 4

следуя последовательности из 3 шагов «Два шага вперед и один шаг назад», мы получим арифметическую серию:

 +2  2 => 2  ( or 6 )
 -1  1 => 3
 -----------
 +2  3 => 5  ( or 9 )
 -1  2 => 6
 -----------
 +2  4 => 8  ( or 12 )
 -1  3 => 9
 -----------
 +2  5 => 11 ( or 15 )
 -1  4 => 12
 -----------
 +2  6 => 14 ( or 18 )
 -1  5 => 15 
 -----------
 +2  7 => 17 ( or 21 )
 -1  6 => 18

Как минимум или первое совпадение:

 1 => 3
 2 => 2
 3 => 5
 4 => 8
 5 => 11
 6 => 14

в одной формуле:

F(n) = 3*n - 4(n>1)     with n>1 is 1 or 0 (if n==1)
Али ИССА
источник
опишите, пожалуйста, что это за оболочка
qwr
протестировано на Cygwin (CYGWIN_NT-10.0 2.3.1 (0.291 / 5/3) 2015-11-14 12:44 x86_64 Cygwin)
Али ISSA
Вы можете написать это непосредственно до н.э.
qwr
Я не знаком с bc, но поскольку аргумент функции ($ 1) используется несколько раз, а некоторые специфические для оболочки вещи (арифметическое расширение $((…))) выполняются, вероятно, нет.
2xsaiko
1
F(){bc<<<$1*3-$(($1>1))*4}хотя работает в zsh и удаляет 2 байта
2xsaiko
1

Python 3 , 48 байт

def a(x):
    if x!=1:
        return((3*x)-4)
    return(3)

Попробуйте онлайн!

Натан Диммер
источник
Хорошо сделано. Возможно, вы также захотите поместить некоторый код в раздел «Нижний колонтитул». Таким образом, вы можете проверить свою функцию, не
дополняя
@AJFaraday Нижний колонтитул моего поста или моего кода?
Натан Диммер
Попробуйте онлайн; Вы можете добавить нижний колонтитул, который работает с вашим кодом, но не учитывает длину байта. Затем вывод покажет ваш код на работе.
AJFaraday
25 байтов
Джо Кинг
@JoKing Знаете ли вы хорошее руководство по лямбда-функциям в Python? Я действительно не понимаю, как работает синтаксис.
Натан Диммер
1

Brain-Flak , 38 байт

({<([()()]{})>()(){(<((){})>)()}{}}{})

Попробуйте онлайн!

Первый ответ, который я вижу, чтобы вычислить ответ, шагая вперед и назад.

({ while not at 0
  <([()()]{})>()() take two steps forward, counting 2 steps
  {(<((){})>)()}{} take one step back, if not at 0, and add 1 step
}{}) remove the 0 and push step sum
MegaTom
источник
1

W d , 7 байт

♦óÖ╣░Θ$

объяснение

3*1a<4*-

Оценивает (a*3)-4*(a>1).

Другая возможная альтернатива

3*1am4*-

Оценивает (a*3)-4*(1%a).


источник