Dua langkah maju dan satu langkah mundur

15

Katakanlah saya berjarak sepuluh langkah dari tujuan saya. Saya berjalan di sana mengikuti pepatah lama, "Dua langkah maju dan satu langkah mundur". Saya mengambil dua langkah maju, satu mundur, sampai saya berdiri tepat di tempat tujuan saya. (Ini mungkin melibatkan melangkah melewati tujuan saya, dan kembali ke sana). Berapa langkah saya berjalan?

Tentu saja, saya mungkin tidak 10 langkah lagi. Saya mungkin 11 langkah jauhnya, atau 100. Saya bisa mengukur sepuluh langkah, dan terus berjalan bolak-balik untuk menyelesaikan masalah, atau ... Saya bisa menulis beberapa kode!

  • Tulis fungsi untuk menghitung berapa langkah yang diperlukan untuk mendapatkan N langkah menjauh, secara berurutan: dua langkah maju, satu langkah mundur.
  • Asumsikan Anda sudah mulai pada langkah 0. Hitung "dua langkah ke depan" sebagai dua langkah, bukan satu.
  • Asumsikan semua langkah adalah panjang yang seragam.
  • Ini harus mengembalikan jumlah langkah yang pertama kali diambil ketika Anda mencapai ruang itu. (Misalnya, 10 langkah jauhnya membutuhkan 26 langkah, tetapi Anda akan menekannya lagi pada langkah 30). Kami tertarik pada 26.
  • Gunakan bahasa apa pun yang Anda suka.
  • Ini harus menerima bilangan bulat positif sebagai masukan. Ini mewakili langkah target.
  • Jumlah byte terkecil menang.

Contoh:

Saya ingin mendapatkan 5 langkah:

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

Dalam hal ini, hasil dari fungsinya adalah 11.

Contoh hasil:

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

Selamat bersenang-senang, pegolf!

AJFaraday
sumber
7
Hmm ... ini terasa sangat akrab.
Shaggy
3
Terkait
Rod
@Rod Hore! Saya lolos begitu saja! ;)
AJFaraday
Ya, sepertinya itu yang saya pikirkan, @Rod.
Shaggy
@Shaggy Rod sedikit mengubah komentarnya. Yang sebelumnya mencatat bahwa pertanyaan siput / sumur menanyakan jumlah iterasi, tetapi ini menanyakan jarak yang ditempuh.
AJFaraday

Jawaban:

5

Oasis , 5 4 byte

1 byte disimpan berkat @Adnan

3+23

Jangan bingung dengan 23+3

Cobalah online!

Bagaimana?

      implicitly push a(n-1)
3     push 3
 +    sum and implicitly print
  2   a(2) = 2
   3  a(1) = 3
Uriel
sumber
1
Anda dapat meninggalkan b.
Adnan
Saya pikir Anda bermaksud mengalikan dengan 3, bukan menambahkannya.
Erik the Outgolfer
@EriktheOutgolfer Program ini menghitung a (n) sebagai (n-1) +3 .
Dennis
12

Python 2 , 18 byte

lambda n:3*n-1%n*4

Cobalah online.

Saya mengambil trik ini dari xnor hanya beberapa hari yang lalu ...!

Lynn
sumber
10

Python 2 , 17 byte

lambda n:n-3%~n*2

Cobalah online!

Saya menemukan ekspresi dengan pencarian kasar. Secara efektif menghitung n+2*abs(n-2).

Tidak
sumber
9

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

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

Cobalah online (Java 8).

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

Cobalah online (JavaScript).
Cobalah online (C # .NET) .

Port of @Lynn 's Python 2 answer , jadi pastikan untuk meningkatkan jawabannya.


Jawaban lama:

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

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

Cobalah online (Java 8).

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

Cobalah online (JavaScript).
Cobalah online (C # .NET) .

Penjelasan:

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
sumber
JavaScript polyglot, jika Anda menggunakan panah gemuk.
Shaggy
@Shaggy Added, serta C # .NET :) Meskipun n=>(--n*3||4)-1juga dimungkinkan dalam JavaScript (juga 14 byte).
Kevin Cruijssen
7

R , 20 byte

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

Cobalah online!

Tidak menyadari polanya sampai setelah saya menerapkan solusi yang kurang elegan.

Giuseppe
sumber
3
Selamat atas 10k BTW!
Luis Mendo
4
@LuisMendo terima kasih! Saya pikir peringatan satu tahun saya di situs itu beberapa hari yang lalu, jadi ini minggu yang baik bagi saya, PPCG-bijaksana.
Giuseppe
3
@Giuseppe Saya tahu perasaan: 20rb minggu lalu, dan juga tahun ke-2. :)
Kevin Cruijssen
7

05AB1E , 8 7 byte

3*s≠i4-

Cobalah online!

-1 byte terima kasih kepada Emigna!

Kaldo
sumber
@LuisMendo Terima kasih, sudah diperbaiki!
Kaldo
2
3*s≠i4-menghemat satu byte
Emigna
@Emigna Terima kasih!
Kaldo
6

Oasis , 5 byte

¹y4-3

Penjelasan:

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

Cobalah online!

Okx
sumber
4

MATL , 7 byte

Menggunakan 3*n-4*(n>1)formula. Lipat gandakan input dengan 3 ( 3*), tekan input lagi ( G) dan kurangi itu ( q). Jika hasilnya bukan nol ( ?) maka kurangi 4 dari hasil ( 4-).

3*Gq?4-

Cobalah online!

David
sumber
6 byte porting jawaban Dennis 'Jelly2-|EG+
Giuseppe
4

Jelly , 4 byte

ạ2Ḥ+

Cobalah online!

Bagaimana itu bekerja

ạ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
sumber
3

C (gcc) , 20 byte

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

Cobalah online!

Jonathan Frech
sumber
Alternatif dengan byte-count yang sama:f(n){n=n<2?3:n*3-4;}
Kevin Cruijssen
Alternatif lain dengan jumlah byte yang sama:f(n){n=n*3-4*(n>1);}
MD XF
3

MachineCode pada x86_64, 34 32 24 byte

8d47fe9931d029d08d0447c3

Membutuhkan iflag untuk output integer; input diambil melalui menambahkan kode secara manual.

Cobalah online!


Saya membaca 4 fungsi C yang berbeda ini untuk menemukan program 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)
MD XF
sumber
jadi apa sebenarnya bahasa ini?
qwr
@ qw Periksa README di repositori untuk deskripsi sederhana.
MD XF
3

> <> , 10 9 byte

Disimpan 1 byte berkat Jo King

3*:3)4*-n

Cobalah online!

Emigna
sumber
9 byte
Jo King
@ JoKing: Jangan tunjukkan bagaimana saya melewatkan itu. Terima kasih!
Emigna
2

4 , 54 byte

3.6010160303604047002020003100000180010202046000095024

Cobalah online!

Jika Anda mempertanyakan metode input, silakan kunjungi terlebih dahulu input numerik dan output dapat diberikan sebagai posting meta kode karakter .

Uriel
sumber
Mengapa ini diturunkan?
Uriel
Karena jawabannya tampaknya seperempat, yang bukan hasil yang valid. Sejauh yang saya tahu, itu tidak menyelesaikan masalah.
AJFaraday
@AJFaraday menggunakan input dan output byte, yang valid dengan konsensus meta. lihat penjelasan di dalam bagian input
Uriel
Adakah sumber tentang cara menginterpretasikan hasil? Atau inputnya?
AJFaraday
1
@ AJFaraday kode char dari hasilnya adalah jawabannya. Saya telah mengedit pertanyaan untuk memasukkan meta postingan yang relevan. 4hanya memiliki input char.
Uriel
2

Japt, 7 byte

Port solusi Lynn dari Python.

*3É%U*4

Cobalah


Alternatif

Ini adalah alternatif yang menyenangkan untuk solusi formula tertutup yang, sayangnya, lebih lama satu byte:

_+3}gN³²

Cobalah

Shaggy
sumber
2

TI-Basic, 8 byte

3Ans-4(Ans>1
Timtech
sumber
2

65816 kode mesin, 22 byte

Saya bisa membuat kode mesin 65C02 ini dengan mudah untuk 3 byte lebih sedikit, tetapi tidak, karena ukuran register pada 65C02 adalah 8-bit, bukan 16-bit. Ini akan berhasil, tetapi itu membosankan karena Anda hanya dapat menggunakan angka yang sangat rendah ;-)

xxd dump:

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

penjelasan pembongkaran / kode:

; 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

Mengujinya pada emulator 65816 yang kompatibel:

pengujian

2xsaiko
sumber
1

SHELL , 28 Bytes

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

Tes:

F 1
3

F 2
2

F 3
5

F 4
8

F5
11

F 11
29

F 100
296

F 100000
299996

Penjelasan:

Rumusnya adalah:

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

mengikuti urutan 3 langkah "Dua langkah maju dan satu langkah mundur", kita akan memiliki seri aritmatika:

 +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

Minimal, atau kebetulan pertama:

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

dalam satu formula:

F(n) = 3*n - 4(n>1)     with n>1 is 1 or 0 (if n==1)
Ali ISSA
sumber
tolong jelaskan cangkang mana ini
qwr
diuji pada Cygwin (CYGWIN_NT-10.0 2.3.1 (0.291 / 5/3) 2015-11-14 12:44 x86_64 Cygwin)
Ali ISSA
dapatkah Anda menulisnya dalam bc secara langsung?
qwr
Saya tidak terbiasa dengan bc, tetapi karena argumen fungsi ($ 1) digunakan beberapa kali dan beberapa hal khusus shell (ekspansi aritmatika, $((…))) dilakukan, mungkin tidak.
2xsaiko
1
F(){bc<<<$1*3-$(($1>1))*4}bekerja di zsh meskipun dan menghapus 2 byte
2xsaiko
1

Python 3 , 48 byte

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

Cobalah secara Online!

Nathan Dimmer
sumber
Kerja bagus. Anda mungkin ingin memasukkan beberapa kode di bagian "Footer" juga. Dengan begitu Anda dapat menguji fungsi Anda tanpa
mengisi
@AJFaraday Footer posting saya atau kode saya?
Nathan Dimmer
Saat Coba Online; Anda dapat menambahkan catatan kaki yang berjalan dengan kode Anda tetapi tidak dihitung terhadap panjang byte. Maka output akan menampilkan kode Anda di tempat kerja.
AJFaraday
25 byte
Jo King
@ JoKing Apakah Anda tahu panduan yang bagus untuk fungsi lambda dengan Python? Saya benar-benar tidak mengerti bagaimana sintaks bekerja.
Nathan Dimmer
1

MATLAB / Oktaf , 15 byte

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

Cobalah online!

Agak kaget belum ada jawaban MATLAB. Algoritma yang sama 3*n-4jika lebih besar dari 1, atau3*n sebaliknya.

Tom Carpenter
sumber
1

Brain-Flak , 38 byte

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

Cobalah online!

Jawaban pertama yang saya lihat untuk menghitung jawaban dengan melangkah maju mundur.

({ 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
sumber
1

W d , 7 byte

♦óÖ╣░Θ$

Penjelasan

3*1a<4*-

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

Alternatif lain yang mungkin

3*1am4*-

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

Sebuah'_'
sumber