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!


7
Hmm ... wydaje się to bardzo znajome.
— Shaggy


@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

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




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

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.


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








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!


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.



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)

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.


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




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


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)

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!


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


@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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.