Hai bước tiến và một bước lùi


15

Giả sử tôi cách đích đến mười bước. Tôi đi bộ theo câu nói cũ, "Hai bước tiến và một bước lùi". Tôi tiến lên hai bước, lùi một bước, cho đến khi tôi đứng chính xác về đích. (Điều này có thể liên quan đến việc bước qua đích đến của tôi và quay lại điểm đó). Tôi đã đi được bao nhiêu bước?

Tất nhiên, tôi có thể không đi được 10 bước. Tôi có thể đi được 11 bước, hoặc 100. Tôi có thể đo mười bước, và tiếp tục đi lại để giải quyết vấn đề, hoặc ... Tôi có thể viết một số mã!

  • Viết một hàm để tìm ra bao nhiêu bước để có N bước đi, theo trình tự: hai bước tiến, lùi một bước.
  • Giả sử bạn đã bắt đầu ở bước 0. Đếm "hai bước tiến" là hai bước chứ không phải một.
  • Giả sử tất cả các bước là một chiều dài đồng đều.
  • Nó sẽ trả về số bước đầu tiên được thực hiện khi bạn đạt đến không gian đó. (Ví dụ: 10 bước đi mất 26 bước, nhưng bạn sẽ nhấn lại ở bước 30). Chúng tôi quan tâm đến 26.
  • Sử dụng bất kỳ ngôn ngữ nào bạn thích.
  • Nó nên chấp nhận bất kỳ số nguyên dương nào làm đầu vào. Điều này thể hiện bước mục tiêu.
  • Số byte nhỏ nhất giành chiến thắng.

Thí dụ:

Tôi muốn đi được 5 bước:

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

Trong trường hợp này, kết quả của hàm sẽ là 11.

Kết quả ví dụ:

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

Hãy vui vẻ, người chơi golf!


7
Hmm ... điều này cảm thấy rất quen thuộc.
Shaggy


@Rod Hoan hô! Tôi đã đi với nó! ;)
AJFaraday

Đúng, giống như người mà tôi đã nghĩ đến, @Rod.
Shaggy

@Shaggy Rod thay đổi nhận xét của mình một chút. Người trước đó lưu ý rằng câu hỏi ốc / giếng đang hỏi về số lần lặp, nhưng điều này là yêu cầu khoảng cách được bảo hiểm.
AJFaraday

Câu trả lời:






9

Polyglot: Java 8 / JavaScript / C # .NET, 16 14 12 byte

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

Dùng thử trực tuyến (Java 8).

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

Hãy thử trực tuyến (JavaScript).
Dùng thử trực tuyến (C # .NET) .

Câu trả lời Python 2 của @Lynn , vì vậy hãy đảm bảo nâng cao câu trả lời của anh ấy / cô ấy.


Câu trả lời cũ:

Polyglot: Java 8 / JavaScript / C # .NET, 16 14 byte

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

Dùng thử trực tuyến (Java 8).

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

Hãy thử trực tuyến (JavaScript).
Dùng thử trực tuyến (C # .NET) .

Giải trình:

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 polyglot, nếu bạn sử dụng một mũi tên béo.
Shaggy

@Shaggy Đã thêm, cũng như C # .NET :) Mặc dù n=>(--n*3||4)-1cũng có thể có trong JavaScript (cũng là 14 byte).
Kevin Cruijssen

7

R , 20 byte

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

Hãy thử trực tuyến!

Không nhận thấy mô hình cho đến khi tôi đã thực hiện giải pháp ít thanh lịch của mình.


3
Chúc mừng 10k BTW!
Luis Mendo

4
@LuisMendo cảm ơn! Tôi nghĩ rằng kỷ niệm một năm của tôi trên trang web là một vài ngày trước, vì vậy đó là một tuần tốt cho tôi, PPCG-khôn ngoan.
Giuseppe

3
@Giuseppe Tôi biết cảm giác: 20k tuần trước, cũng như kỷ niệm năm thứ 2. :)
Kevin Cruijssen








4

MATL , 7 byte

Sử dụng 3*n-4*(n>1)công thức. Nhân đầu vào với 3 ( 3*), đẩy đầu vào lại ( G) và giảm nó ( q). Nếu kết quả không bằng 0 ( ?) thì trừ 4 khỏi kết quả ( 4-).

3*Gq?4-

Hãy thử trực tuyến!


6 byte porting Dennis 'Jelly answer2-|EG+
Giuseppe

4

Thạch , 4 byte

ạ2Ḥ+

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ạ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

Mã máy trên x86_64, 34 32 24 byte

8d47fe9931d029d08d0447c3

Yêu cầu icờ cho đầu ra số nguyên; đầu vào được thực hiện thông qua thủ công thêm vào mã.

Hãy thử trực tuyến!


Tôi đã đi qua 4 hàm C khác nhau này để tìm chương trình MachineCode 24 byte:

  • n+2*abs(n-2)= 8d47fe9931d029d08d0447c3(24 byte)
  • 3*n-4*!!~-n= 8d047f31d2ffcf0f95c2c1e20229d0c3(32 byte)
  • n*3-4*(n>1)= 31d283ff028d047f0f9dc2c1e20229d0c3(34 byte)
  • n<2?3:n*3-4 = = 83ff01b8030000007e068d047f83e804c3(34 byte)

Vậy chính xác ngôn ngữ này là gì?
qwr

@qwr Kiểm tra README trong kho lưu trữ để biết mô tả đơn giản.
MD XF


2

4 , 54 byte

3.6010160303604047002020003100000180010202046000095024

Hãy thử trực tuyến!

Nếu bạn đặt câu hỏi về phương thức nhập liệu, vui lòng truy cập đầu tiên và đầu ra số có thể được cung cấp dưới dạng bài đăng mã ký tự .


Tại sao điều này bị hạ cấp?
Uriel

Bởi vì câu trả lời dường như là một phần tư, đó không phải là kết quả hợp lệ. Theo như tôi có thể nói, nó không giải quyết được vấn đề.
AJFaraday

@AJFaraday nó sử dụng đầu vào và đầu ra byte, hợp lệ bởi sự đồng thuận meta. xem phần giải thích bên trong phần đầu vào
Uriel

Bất kỳ tài nguyên về làm thế nào để giải thích kết quả? Hoặc đầu vào?
AJFaraday

1
@AJFaraday mã char của kết quả là câu trả lời. Tôi đã chỉnh sửa câu hỏi để bao gồm các bài đăng meta có liên quan. 4chỉ có đầu vào char.
Uriel

2

Japt, 7 byte

Một cổng của giải pháp Python của Lynn.

*3É%U*4

Thử nó


Thay thế

Đây là một giải pháp thay thế thú vị cho các giải pháp công thức đóng, thật không may, một byte dài hơn:

_+3}gN³²

Thử nó




2

Mã máy 65816, 22 byte

Tôi có thể tạo mã máy 65C02 này dễ dàng với ít hơn 3 byte, nhưng không, vì kích thước thanh ghi trên 65C02 là 8 bit thay vì 16 bit. Nó sẽ hoạt động, nhưng thật nhàm chán vì bạn chỉ có thể sử dụng những con số thực sự thấp ;-)

bãi rác xxd:

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

giải mã / giải mã:

; 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

Kiểm tra nó trên trình giả lập tương thích 65816:

thử nghiệm


1

CHIA SẺ , 28 byte

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

Các xét nghiệm:

F 1
3

F 2
2

F 3
5

F 4
8

F5
11

F 11
29

F 100
296

F 100000
299996

Giải trình :

Công thức là:

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

Theo trình tự gồm 3 bước "Hai bước tiến và lùi một bước", chúng ta sẽ có chuỗi số học:

 +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

Tối thiểu, hoặc trùng hợp đầu tiên:

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

trong một công thức:

F(n) = 3*n - 4(n>1)     with n>1 is 1 or 0 (if n==1)

vui lòng mô tả lớp vỏ này là gì
qwr 27/03/18

đã thử nghiệm trên Cygwin (CYGWIN_NT-10.0 2.3.1 (0.291 / 5/3) 2015-11-14 12:44 x86_64 Cygwin)
Ali ISSA

bạn có thể viết nó trong bc trực tiếp?
qwr

Tôi không quen thuộc với bc, nhưng vì đối số của hàm ($ 1) được sử dụng nhiều lần và một số công cụ dành riêng cho vỏ (mở rộng số học, $((…))) có thể không được thực hiện.
2xsaiko

1
F(){bc<<<$1*3-$(($1>1))*4}hoạt động trong zsh mặc dù và loại bỏ 2 byte
2xsaiko

1

Python 3 , 48 byte

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

Dùng thử trực tuyến!


Công việc tốt đẹp. Bạn cũng có thể muốn đặt một số mã trong phần Foot Footer. Bằng cách đó, bạn có thể kiểm tra chức năng của mình mà không cần đệm ra khỏi sân golf của mình ...
AJFaraday 26/03/18

@AJFaraday Phần cuối bài viết của tôi hoặc mã của tôi?
Nathan Dimmer

Trên thử trực tuyến; bạn có thể thêm chân trang chạy với mã của mình nhưng không được tính vào độ dài byte. Sau đó, đầu ra sẽ hiển thị mã của bạn tại nơi làm việc.
AJFaraday


@JoKing Bạn có biết một hướng dẫn tốt về các hàm lambda trong Python không? Tôi thực sự không hiểu làm thế nào cú pháp hoạt động.
Nathan Dimmer



1

Brain-Flak , 38 byte

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

Hãy thử trực tuyến!

Câu trả lời đầu tiên tôi thấy để tính toán câu trả lời bằng cách bước qua lại.

({ 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 byte

♦óÖ╣░Θ$

Giải trình

3*1a<4*-

Đánh giá (a*3)-4*(a>1).

Một cách khác có thể

3*1am4*-

Đánh giá (a*3)-4*(1%a).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.