Два кроки вперед і один крок назад


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

Веселіться, гольфісти!


7
Гм ... це відчувається дуже знайомим.
Кудлатий


@Rod Hooray! Я розібрався з цим! ;)
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, а не додавати його.
Ерік Аутгольфер

@EriktheOutgolfer Програма обчислює a (n) як (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) .

Порт відповіді Python 2 @Lynn , тому обов'язково підтримайте його / її відповідь.


Стара відповідь:

Поліглот: 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 байт).
Kevin Cruijssen

7

R , 20 байт

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

Спробуйте в Інтернеті!

Я не помітив шаблону, поки не втілив своє менш елегантне рішення.


3
Поздравляємо на 10 кВт!
Луїс Мендо

4
@LuisMendo дякую! Я думаю, що мій річний ювілей на сайті був пару днів тому, тому для мене це був хороший тиждень, PPCG-мудрий.
Джузеппе

3
@Giuseppe Я знаю почуття: 20k минулого тижня, а також 2-річний ювілей. :)
Кевін Кройсейсен








4

MATL , 7 байт

Використовує 3*n-4*(n>1)формулу. Помножте введення на 3 ( 3*), натисніть введення ще раз ( G) і зменшіть його ( q). Якщо результат не дорівнює нулю ( ?), відніміть 4 від результату ( 4-).

3*Gq?4-

Спробуйте в Інтернеті!


6 байтів, що передають відповідь Дженніса «Желе»2-|EG+
Джузеппе




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 байти)

так яка саме ця мова?
qwr

@qwr Перегляньте README у сховищі для простого опису.
MD XF


2

4 , 54 байти

3.6010160303604047002020003100000180010202046000095024

Спробуйте в Інтернеті!

Якщо ви сумніваєтесь у способі введення, будь ласка, відвідайте спочатку числовий ввід та вихід можуть бути подані як мета-повідомлення символьного коду .


Чому це було знято?
Уріель

Оскільки, здається, відповідь становить одну чверть, що не є достовірним результатом. Наскільки я можу сказати, це не вирішує проблему.
AJFaraday

@AJFaraday він використовує введення та вихід байтів, що є дійсним мета-консенсусом. дивіться пояснення у розділі введення
Уріель

Будь-які ресурси щодо того, як інтерпретувати результат? Або вхід?
AJFaraday

1
@AJFaraday char код результату - відповідь. Я відредагував питання, щоб включити відповідний мета-пост. 4має лише введення знаків.
Уріель




2

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

Я міг би зробити цей машинний код 65C02 легко на 3 байти менше, але цього не зробив, оскільки розмір регістра в 65C02 8-бітний замість 16-бітового. Це спрацювало б, але це нудно, тому що ви можете використовувати лише дуже низькі числа ;-)

xxd дамп:

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:

testing


1

SHELL , 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)
Ali ISSA

ви можете написати це безпосередньо в bc?
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


@JoKing Чи знаєте ви хороший посібник щодо лямбда-функцій в Python? Я дійсно не розумію, як працює синтаксис.
Натан Діммер



1

Мозок-Флак , 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

1

Ш d , 7 байт

♦óÖ╣░Θ$

Пояснення

3*1a<4*-

Оцінює (a*3)-4*(a>1).

Ще одна можлива альтернатива

3*1am4*-

Оцінює (a*3)-4*(1%a).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.