Dwa kroki do przodu i jeden do tyłu

15

Powiedzmy, że jestem dziesięć kroków od celu. Idę tam, kierując się starym powiedzeniem: „Dwa kroki do przodu i jeden do tyłu”. Robię dwa kroki do przodu, jeden do tyłu, aż stoję dokładnie na miejscu. (Może to obejmować przekroczenie celu i powrót do niego). Ile kroków przeszedłem?

Oczywiście może nie być 10 kroków dalej. Mogę być 11 kroków lub 100. Mógłbym zmierzyć dziesięć kroków i chodzić tam i z powrotem, aby rozwiązać problem, lub ... Mógłbym napisać kod!

  • Napisz funkcję, aby obliczyć, ile kroków potrzeba, aby oddalić N kroków w sekwencji: dwa kroki do przodu, jeden krok do tyłu.
  • Załóżmy, że zacząłeś od kroku 0. Policz „dwa kroki do przodu” jako dwa kroki, a nie jeden.
  • Załóż, że wszystkie kroki mają jednakową długość.
  • Powinien zwrócić liczbę kroków, które po raz pierwszy wykonałeś po dotarciu do tego miejsca. (Na przykład 10 kroków dalej zajmuje 26 kroków, ale uderzyłbyś go ponownie w kroku 30). Interesuje nas 26.
  • Użyj dowolnego języka, który ci się podoba.
  • Powinien akceptować każdą dodatnią liczbę całkowitą jako dane wejściowe. To reprezentuje krok docelowy.
  • Wygrywa najmniejsza liczba bajtów.

Przykład:

Chcę dostać się 5 kroków dalej:

| | | | | | <- 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

W takim przypadku wynikiem funkcji byłoby 11.

Przykładowe wyniki:

1      =>  3
5      =>  11
9      =>  23
10     =>  26
11     =>  29
100    =>  296
1000   =>  2996
10000  =>  29996
100000 =>  299996

Miłej zabawy, golfiści!

AJFaraday
źródło
7
Hmm ... wydaje się to bardzo znajome.
Shaggy
3
Powiązane
Rod
@Rod Hooray! Uciekłem! ;)
AJFaraday
Tak, to wygląda jak ten, o którym myślałem, @Rod.
Kudłaty
@Shaggy Rod zmienił nieco swój komentarz. Wcześniej zauważono, że pytanie o ślimaki / studzienki wymaga podania liczby iteracji, ale dotyczy to przebytej odległości.
AJFaraday

Odpowiedzi:

5

Oaza , 5 4 bajtów

1 bajt zapisany dzięki @Adnan

3+23

Nie należy mylić 23+3

Wypróbuj online!

W jaki sposób?

      implicitly push a(n-1)
3     push 3
 +    sum and implicitly print
  2   a(2) = 2
   3  a(1) = 3
Uriel
źródło
1
Możesz pominąć b.
Adnan
Myślę, że chciałeś pomnożyć przez 3, a nie dodać.
Erik the Outgolfer
@EriktheOutgolfer Program oblicza a (n) jako (n-1) +3 .
Dennis
10

Python 2 , 17 bajtów

lambda n:n-3%~n*2

Wypróbuj online!

Znalazłem to wyrażenie za pomocą poszukiwania siły. Skutecznie oblicza n+2*abs(n-2).

xnor
źródło
9

Polyglot: Java 8 / JavaScript / C # .NET, 16 14 12 bajtów

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

Wypróbuj online (Java 8).

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

Wypróbuj online (JavaScript).
Wypróbuj online (C # .NET) .

Port odpowiedzi na Python 2 w @Lynn , więc pamiętaj, aby głosować na jego odpowiedź.


Stara odpowiedź:

Polyglot: Java 8 / JavaScript / C # .NET, 16 14 bajtów

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

Wypróbuj online (Java 8).

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

Wypróbuj online (JavaScript).
Wypróbuj online (C # .NET) .

Wyjaśnienie:

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
Kevin Cruijssen
źródło
Poliglota JavaScript, jeśli używasz grubej strzały.
Shaggy
@Shaggy Dodano, a także C # .NET :) Chociaż n=>(--n*3||4)-1jest to również możliwe w JavaScript (także 14 bajtów).
Kevin Cruijssen
7

R , 20 bajtów

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

Wypróbuj online!

Nie zauważyłem wzoru, dopóki nie wdrożyłem mojego mniej eleganckiego rozwiązania.

Giuseppe
źródło
3
Gratulacje na 10k BTW!
Luis Mendo
4
@LuisMendo dzięki! Myślę, że moja rocznica na stronie miała miejsce kilka dni temu, więc był to dla mnie dobry tydzień, jeśli chodzi o PPCG.
Giuseppe
3
@Giuseppe Znam to uczucie: 20 tys. W zeszłym tygodniu, a także rocznica drugiego roku. :)
Kevin Cruijssen
7

05AB1E , 8 7 bajtów

3*s≠i4-

Wypróbuj online!

-1 bajt dzięki Emignie!

Kaldo
źródło
@LuisMendo Dzięki, naprawiono!
Kaldo
2
3*s≠i4-zapisuje bajt
Emigna
@Emigna Thanks!
Kaldo
6

Oaza , 5 bajtów

¹y4-3

Wyjaśnienie:

    3  defines f(1) = 3
¹y4-   defines f(n) as:
¹      push input
 y     triple
  4-   subtract four

Wypróbuj online!

Okx
źródło
4

MATL , 7 bajtów

Używa 3*n-4*(n>1)wzoru. Pomnóż wejście przez 3 ( 3*), wciśnij ponownie wejście ( G) i zmniejsz je ( q). Jeśli wynik nie jest równy zero ( ?), odejmij 4 od wyniku ( 4-).

3*Gq?4-

Wypróbuj online!

David
źródło
6 bajtów przenoszących odpowiedź Dennisa na galaretkę2-|EG+
Giuseppe
4

Galaretka , 4 bajty

ạ2Ḥ+

Wypróbuj online!

Jak to działa

ạ2Ḥ+  Main link. Argument: n

ạ2    Absolute difference with 2; yield |n-2|.
  Ḥ   Unhalve/double; yield 2|n-2|.
   +  Add; yield 2|n-2|+n.
Dennis
źródło
3

C (gcc) , 20 bajtów

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

Wypróbuj online!

Jonathan Frech
źródło
Alternatywnie z tą samą liczbą bajtów:f(n){n=n<2?3:n*3-4;}
Kevin Cruijssen
Inna alternatywa z tą samą liczbą bajtów:f(n){n=n*3-4*(n>1);}
MD XF
3

MachineCode na x86_64, 34 32 24 bajtów

8d47fe9931d029d08d0447c3

Wymaga iflagi dla wyjścia liczb całkowitych; dane wejściowe są pobierane poprzez ręczne dołączenie do kodu.

Wypróbuj online!


Przejrzałem te 4 różne funkcje C, aby znaleźć 24-bajtowy program MachineCode:

  • n+2*abs(n-2)= 8d47fe9931d029d08d0447c3(24 bajty)
  • 3*n-4*!!~-n = 8d047f31d2ffcf0f95c2c1e20229d0c3 (32 bytes)
  • n*3-4*(n>1) = 31d283ff028d047f0f9dc2c1e20229d0c3 (34 bytes)
  • n<2?3:n*3-4 = 83ff01b8030000007e068d047f83e804c3 (34 bytes)
MD XF
źródło
so what exactly is this language?
qwr
@qwr Check out the README in the repository for a simple description.
MD XF
2

4, 54 bytes

3.6010160303604047002020003100000180010202046000095024

Try it online!

If you question the input method, please visit first the numerical input and output may be given as a character code meta post.

Uriel
źródło
Why was this downvoted?
Uriel
Because the answer appears to be one quarter, which isn't a valid result. As far as I can tell, it doesn't solve the problem.
AJFaraday
@AJFaraday it uses byte input and output, which is valid by meta consensus. see the explanation inside the input section
Uriel
Any resources on how to interpret the result? Or the input?
AJFaraday
1
@AJFaraday the char code of the result is the answer. I've edited the question to include the relevant meta post. 4 has only char input.
Uriel
2

Japt, 7 bytes

A port of Lynn's Python solution.

*3É%U*4

Try it


Alternative

This was a fun alternative to the closed formula solutions that is, unfortunately, a byte longer:

_+3}gN³²

Try it

Shaggy
źródło
2

TI-Basic, 8 bytes

3Ans-4(Ans>1
Timtech
źródło
2

65816 machine code, 22 bytes

I could have made this 65C02 machine code easily for 3 bytes less, but didn't, since the register size on the 65C02 is 8-bit instead of 16-bit. It would work, but it's boring because you can only use really low numbers ;-)

xxd dump:

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

disassembly / code explanation:

; 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

Testing it out on a 65816-compatible emulator:

testing

2xsaiko
źródło
1

SHELL , 28 Bytes

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

Tests :

F 1
3

F 2
2

F 3
5

F 4
8

F5
11

F 11
29

F 100
296

F 100000
299996

Explanation :

The formula is :

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

following the sequence of 3 steps "Two steps forward and one step back", we will have the arithmetic series :

 +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

At the minimum, or first coincidence :

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

in one formula :

F(n) = 3*n - 4(n>1)     with n>1 is 1 or 0 (if n==1)
Ali ISSA
źródło
please describe which shell this is
qwr
tested on Cygwin ( CYGWIN_NT-10.0 2.3.1(0.291/5/3) 2015-11-14 12:44 x86_64 Cygwin)
Ali ISSA
can you write it in bc directly?
qwr
I'm not familiar with bc, but since the argument of the function ($1) is used several times and some shell-specific stuff (arithmetic expansion, $((…))) is done, probably not.
2xsaiko
1
F(){bc<<<$1*3-$(($1>1))*4} works in zsh though and removes 2 bytes
2xsaiko
1

Python 3, 48 bytes

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

Try It Online!

Nathan Dimmer
źródło
Nice work. You might want to put some code in the “Footer” section, too. That way you can test your function without padding out your golf entry...
AJFaraday
@AJFaraday The footer of my post or of my code?
Nathan Dimmer
On Try It Online; you can add a footer which runs with your code but doesn’t count towards the byte length. Then the output will show your code at work.
AJFaraday
25 bytes
Jo King
@JoKing Do you know of a good guide to lambda functions in Python? I really don't understand how the syntax works.
Nathan Dimmer
1

MATLAB/Octave, 15 bytes

@(n)3*n-4*(n>1)

Try it online!

Kind of surprised there isn't already a MATLAB answer. Same algorithm of 3*n-4 if greater than 1, or 3*n otherwise.

Tom Carpenter
źródło
1

Brain-Flak, 38 bytes

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

Try it online!

The first answer I see to calculate the answer by stepping back and forth.

({ 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
źródło
1

W d, 7 bytes

♦óÖ╣░Θ$

Explanation

3*1a<4*-

Evaluates (a*3)-4*(a>1).

Another possible alternative

3*1am4*-

Evaluates (a*3)-4*(1%a).


źródło