İki adım ileri ve bir adım geri


15

Diyelim ki hedefimden on adım uzaktayım. Orada "İki adım ileri ve bir adım geri" diyerek yürürüm. Tam olarak hedefim üzerinde durana kadar iki adım ileri gidiyorum. (Bu, hedefimin ötesine geçip ona geri dönmeyi içerebilir). Kaç adım yürüdüm?

Tabii ki, 10 adım uzakta olmayabilirim. 11 adım ötede veya 100 olabilirim. On adım ölçebilirim ve sorunu çözmek için ileri geri yürümeye devam edebilirim, ya da ... Biraz kod yazabilirim!

  • Sırayla N adımı uzaklaştırmak için kaç adım gerektiğini çözmek için bir işlev yazın: iki adım ileri, bir adım geri.
  • 0. adımda başladığınızı varsayın. "İki adım ileri" yi bir değil iki adım olarak sayın.
  • Tüm adımların aynı uzunlukta olduğunu varsayalım.
  • Bu alana ulaştığınızda ilk atılan adım sayısını döndürmelidir. (Örneğin, 10 adım ötede 26 adım sürer, ancak adım 30'da tekrar vurursunuz). 26 ile ilgileniyoruz.
  • İstediğiniz dili kullanın.
  • Herhangi bir pozitif tamsayıyı girdi olarak kabul etmelidir. Bu hedef adımı temsil eder.
  • En az bayt kazanır.

Misal:

5 adım uzaklaşmak istiyorum:

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

Bu durumda, işlevin sonucu 11 olur.

Örnek sonuçlar:

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

İyi eğlenceler, golfçüler!


7
Hmm ... bu çok tanıdık geliyor.
Shaggy


@ Çubuk Yaşasın! Onunla kaçtım! ;)
AJFaraday 26:18

Evet, düşündüğüme benziyor, @Rod.
Shaggy

@Shaggy Rod yorumunu biraz değiştirdi. Birincisi, salyangoz / kuyu sorununun yineleme sayısını istediğini, ancak bu kat edilen mesafeyi istediğini belirtti.
AJFaraday

Yanıtlar:


5

Oasis , 5 4 bayt

@Adnan sayesinde 1 bayt kaydedildi

3+23

Karıştırmamak 23+3

Çevrimiçi deneyin!

Nasıl?

      implicitly push a(n-1)
3     push 3
 +    sum and implicitly print
  2   a(2) = 2
   3  a(1) = 3

1
Dışarıda bırakabilirsiniz b.
Adnan

Sanırım 3 ile çarpmak istediniz, eklemeyin.
Outgolfer Erik

@EriktheOutgolfer Program a (n) değerini (n-1) +3 olarak hesaplar .
Dennis




9

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

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

Çevrimiçi deneyin (Java 8).

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

Çevrimiçi deneyin (JavaScript).
Çevrimiçi deneyin (C # .NET) .

Port of @Lynn'in Python 2 cevabı , bu yüzden cevabını yükselttiğinizden emin olun.


Eski cevap:

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

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

Çevrimiçi deneyin (Java 8).

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

Çevrimiçi deneyin (JavaScript).
Çevrimiçi deneyin (C # .NET) .

Açıklama:

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

Şişman bir ok kullanırsanız JavaScript çok dilli.
Shaggy

@Shaggy ve ayrıca C # .NET :) Eklendi n=>(--n*3||4)-1JavaScript'te de (14 bayt) da mümkündür.
Kevin Cruijssen

7

R , 20 bayt

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

Çevrimiçi deneyin!

Daha az zarif çözümümü uygulayana kadar deseni fark etmedim.


3
Tebrikler 10k BTW!
Luis Mendo

4
@LuisMendo teşekkürler! Sanırım sitede bir yıllık yıldönümüm birkaç gün önce, bu yüzden benim için iyi bir hafta oldu, PPCG-wise.
Giuseppe

3
@Giuseppe Duyguyu biliyorum: Geçen hafta 20 bin, 2. yıl dönümü. :)
Kevin Cruijssen








4

MATL , 7 bayt

3*n-4*(n>1)Formülü kullanır . Girişi 3 ( 3*) ile çarpın , girişi tekrar itin ( G) ve azaltın ( q). Sonuç sıfır değilse ( ?), sonuçtan ( 4-) 4 çıkarın .

3*Gq?4-

Çevrimiçi deneyin!


Dennis 'Jelly cevabını 2-|EG+
Giuseppe

4

Jöle , 4 bayt

ạ2Ḥ+

Çevrimiçi deneyin!

Nasıl çalışır

ạ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

X86_64 üzerinde MachineCode , 34 32 24 bayt

8d47fe9931d029d08d0447c3

iTamsayı çıkışı için bayrak gerektirir ; giriş koda manuel olarak eklenerek alınır.

Çevrimiçi deneyin!


24 baytlık MachineCode programını bulmak için şu 4 farklı C işlevinden geçtim:

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

peki bu dil tam olarak nedir?
qwr

@ qwr Basit bir açıklama için depodaki README dosyasına bakın.
MD XF


2

4 , 54 bayt

3.6010160303604047002020003100000180010202046000095024

Çevrimiçi deneyin!

Giriş yöntemini sorgularsanız, lütfen önce sayısal girişi ve çıkışı bir karakter kodu meta postası olarak verilebilir .


Bu neden reddedildi?
Uriel

Cevap dörtte biri gibi görünüyor, bu geçerli bir sonuç değil. Anlayabildiğim kadarıyla sorunu çözmüyor.
AJFaraday

@AJFaraday, meta konsensüs tarafından geçerli olan bayt giriş ve çıkışını kullanır. giriş bölümü içindeki açıklamaya bakınız
Uriel

Sonucun nasıl yorumlanacağıyla ilgili herhangi bir kaynak var mı? Veya girdi?
AJFaraday

1
@AJFaraday sonucun karakter kodu cevaptır. Soruyu ilgili meta yayını içerecek şekilde düzenledim. 4yalnızca char girdisine sahiptir.
Uriel

2

Japt, 7 bayt

Lynn'in Python çözümünün bir limanı.

*3É%U*4

Dene


Alternatif

Maalesef bir bayt daha uzun olan kapalı formül çözümlerine eğlenceli bir alternatifti:

_+3}gN³²

Dene




2

65816 makine kodu, 22 bayt

Bu 65C02 makine kodunu 3 bayt için daha az kolayca yapabilirdim, ancak yapmadım, çünkü 65C02'deki kayıt boyutu 16 bit yerine 8 bit. Çalışır, ancak sıkıcı çünkü sadece çok düşük sayıları kullanabilirsiniz ;-)

xxd dökümü:

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

sökme / kod açıklaması:

; 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 uyumlu bir emülatörde test etme:

test yapmak


1

SHELL , 28 Bayt

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

Testler:

F 1
3

F 2
2

F 3
5

F 4
8

F5
11

F 11
29

F 100
296

F 100000
299996

Açıklama:

Formül:

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

"İki adım ileri ve bir adım geri" 3 adımdan sonra, aritmetik seri olacak:

 +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

En azından veya ilk tesadüf:

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

bir formülde:

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

lütfen bunun hangi kabuk olduğunu
açıklayın

Cygwin üzerinde test edildi (CYGWIN_NT-10.0 2.3.1 (0.291 / 5/3) 2015-11-14 12:44 x86_64 Cygwin)
Ali ISSA

doğrudan bc'ye yazabilir misiniz?
qwr

BC'ye aşina değilim, ancak fonksiyonun argümanı ($ 1) birkaç kez kullanıldığından ve bazı kabuklara özgü şeyler (aritmetik genişletme $((…))) yapıldığından, muhtemelen değil.
2xsaiko

1
F(){bc<<<$1*3-$(($1>1))*4}olsa zsh çalışır ve 2 bayt kaldırır
2xsaiko

1

Python 3 , 48 bayt

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

Çevrimiçi Deneyin!


İyi iş. “Altbilgi” bölümüne de bazı kodlar koymak isteyebilirsiniz. Bu şekilde golf girişinizi doldurmadan fonksiyonunuzu test edebilirsiniz ...
AJFaraday

@AJFaraday Yayımın veya kodumun altbilgisi mi?
Nathan Dimmer

Çevrimiçi Deneyin; kodunuzla çalışan ancak bayt uzunluğuna dahil olmayan bir altbilgi ekleyebilirsiniz. Sonra çıktı kod iş yerinde gösterecektir.
AJFaraday


@JoKing Python'da lambda fonksiyonları için iyi bir rehber biliyor musunuz? Sözdiziminin nasıl çalıştığını gerçekten anlamıyorum.
Nathan Dimmer



1

Brain-Flak , 38 bayt

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

Çevrimiçi deneyin!

İlk cevap cevabı ileri geri adımlarla hesaplamak için görüyorum.

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

♦óÖ╣░Θ$

açıklama

3*1a<4*-

değerlendirir (a*3)-4*(a>1).

Başka bir olası alternatif

3*1am4*-

Değerlendirir (a*3)-4*(1%a).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.