Zwei Schritte vor und einen Schritt zurück

14

Nehmen wir an, ich bin zehn Schritte von meinem Ziel entfernt. Ich gehe dorthin und folge dem alten Sprichwort: "Zwei Schritte vorwärts und einen Schritt zurück". Ich mache zwei Schritte vorwärts und einen zurück, bis ich genau an meinem Ziel stehe. (Dies kann bedeuten, dass ich an meinem Ziel vorbeigehe und dorthin zurückkehre). Wie viele Schritte bin ich gegangen?

Natürlich bin ich vielleicht nicht 10 Schritte entfernt. Ich könnte 11 Schritte oder 100 entfernt sein. Ich könnte zehn Schritte messen und weiter hin und her gehen, um das Problem zu lösen, oder ... ich könnte einen Code schreiben!

  • Schreiben Sie eine Funktion, um herauszufinden, wie viele Schritte erforderlich sind, um N Schritte in der folgenden Reihenfolge zu entfernen: zwei Schritte vorwärts, einen Schritt zurück.
  • Angenommen, Sie haben bei Schritt 0 begonnen. Zählen Sie die "zwei Schritte vorwärts" als zwei Schritte, nicht als einen.
  • Angenommen, alle Schritte haben eine einheitliche Länge.
  • Es sollte die Anzahl der Schritte zurückgeben, die zuerst ausgeführt wurden, wenn Sie dieses Feld erreichen. (Zum Beispiel sind 10 Schritte entfernt 26 Schritte, aber Sie würden es in Schritt 30 erneut treffen). Wir interessieren uns für die 26.
  • Verwenden Sie eine beliebige Sprache.
  • Es sollte eine positive ganze Zahl als Eingabe akzeptieren. Dies ist der Zielschritt.
  • Die kleinste Anzahl von Bytes gewinnt.

Beispiel:

Ich möchte 5 Schritte entfernt sein:

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

In diesem Fall wäre das Ergebnis der Funktion 11.

Beispielergebnisse:

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

Viel Spaß, Golfer!

AJFaraday
quelle
7
Hmm ... das kommt mir sehr bekannt vor.
Shaggy
3
Related
Rod
@ Rod Hurra! Ich bin damit durchgekommen! ;)
AJFaraday
Ja, das sieht aus wie das, an das ich gedacht habe, @Rod.
Shaggy
@ Shaggy Rod hat seinen Kommentar ein wenig geändert. Der frühere bemerkte, dass die Schnecken / Brunnen-Frage nach der Anzahl der Iterationen fragt, aber dies fragt nach der zurückgelegten Distanz.
AJFaraday

Antworten:

5

Oase , 5 4 Bytes

Dank @Adnan 1 Byte gespart

3+23

Nicht zu verwechseln mit 23+3

Probieren Sie es online!

Wie?

      implicitly push a(n-1)
3     push 3
 +    sum and implicitly print
  2   a(2) = 2
   3  a(1) = 3
Uriel
quelle
1
Sie können das weglassen b.
Adnan
Ich denke, Sie wollten mit 3 multiplizieren, nicht addieren.
Erik der Outgolfer
@EriktheOutgolfer Das Programm berechnet a (n) als (n-1) +3 .
Dennis
10

Python 2 , 17 Bytes

lambda n:n-3%~n*2

Probieren Sie es online!

Ich fand den Ausdruck durch Brute-Force-Suche. Es berechnet effektiv n+2*abs(n-2).

xnor
quelle
9

Mehrsprachig: Java 8 / JavaScript / C # .NET, 16 14 12 Bytes

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

Probieren Sie es online aus (Java 8).

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

Probieren Sie es online aus (JavaScript).
Probieren Sie es online aus (C # .NET) .

Port von @Lynns Python 2-Antwort. Stellen Sie also sicher, dass Sie die Antwort positiv bewerten.


Alte Antwort:

Mehrsprachig: Java 8 / JavaScript / C # .NET, 16 bis 14 Byte

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

Probieren Sie es online aus (Java 8).

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

Probieren Sie es online aus (JavaScript).
Versuchen Sie es online (C # .NET) .

Erläuterung:

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
quelle
JavaScript-Polyglott, wenn Sie einen fetten Pfeil verwenden.
Shaggy
@Shaggy Hinzugefügt, sowie C # .NET :) Obwohl n=>(--n*3||4)-1es auch in JavaScript möglich ist (auch 14 Bytes).
Kevin Cruijssen
7

R , 20 Bytes

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

Probieren Sie es online!

Ich habe das Muster erst bemerkt, nachdem ich meine weniger elegante Lösung implementiert hatte.

Giuseppe
quelle
3
Herzlichen Glückwunsch zu 10k BTW!
Luis Mendo
4
@ LuisMendo danke! Ich glaube, mein einjähriges Jubiläum auf der Seite war vor ein paar Tagen, also war es eine gute Woche für mich, PPCG-weise.
Giuseppe
3
@ Giuseppe Ich kenne das Gefühl: 20k letzte Woche sowie 2. Jahrestag. :)
Kevin Cruijssen
7

05AB1E , 8 7 Bytes

3*s≠i4-

Probieren Sie es online!

-1 Byte danke an Emigna!

Kaldo
quelle
@ LuisMendo Danke, behoben!
Kaldo
2
3*s≠i4-speichert ein Byte
Emigna
@Emigna Danke!
Kaldo
6

Oase , 5 Bytes

¹y4-3

Erläuterung:

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

Probieren Sie es online!

Okx
quelle
4

MATL , 7 Bytes

Verwendet die 3*n-4*(n>1)Formel. Multiplizieren Sie die Eingabe mit 3 ( 3*), drücken Sie die Eingabe erneut ( G) und dekrementieren Sie sie ( q). Wenn das Ergebnis nicht Null ist ( ?), subtrahieren Sie 4 vom Ergebnis ( 4-).

3*Gq?4-

Probieren Sie es online!

David
quelle
6 Bytes, die Dennis 'Jelly-Antwort portieren2-|EG+
Giuseppe
4

Gelee , 4 Bytes

ạ2Ḥ+

Probieren Sie es online!

Wie es funktioniert

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

C (gcc) , 20 Bytes

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

Probieren Sie es online!

Jonathan Frech
quelle
Alternative mit der gleichen f(n){n=n<2?3:n*3-4;}
Byteanzahl
Eine weitere Alternative mit der gleichen Anzahl von Bytes:f(n){n=n*3-4*(n>1);}
MD XF
3

MachineCode auf x86_64, 34 32 24 Bytes

8d47fe9931d029d08d0447c3

Benötigt das iFlag für die Ganzzahlausgabe; Die Eingabe erfolgt durch manuelles Anhängen an den Code.

Probieren Sie es online!


Ich habe diese 4 verschiedenen C-Funktionen durchgesehen, um das 24-Byte-MachineCode-Programm zu finden:

  • n+2*abs(n-2)= 8d47fe9931d029d08d0447c3(24 Bytes)
  • 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
quelle
Also, was genau ist diese Sprache?
Qwr
@qwr Eine einfache Beschreibung finden Sie in der README-Datei im Repository.
MD XF
2

4 , 54 Bytes

3.6010160303604047002020003100000180010202046000095024

Probieren Sie es online!

Wenn Sie die Eingabemethode in Frage stellen, besuchen Sie bitte zuerst. Die numerische Eingabe und Ausgabe kann als Zeichencode- Metapost angegeben werden.

Uriel
quelle
Warum wurde das abgelehnt?
Uriel
Weil die Antwort ein Viertel zu sein scheint, was kein gültiges Ergebnis ist. Soweit ich das beurteilen kann, löst es das Problem nicht.
AJFaraday
@AJFaraday verwendet Byte-Eingabe und -Ausgabe, die im Metakonsens gültig sind. Siehe die Erklärung im Eingabeabschnitt
Uriel
Gibt es Ressourcen zur Interpretation des Ergebnisses? Oder die Eingabe?
AJFaraday
1
@AJFaraday der Zeichencode des Ergebnisses ist die Antwort. Ich habe die Frage so bearbeitet, dass sie den relevanten Metapost enthält. 4hat nur Zeicheneingabe.
Uriel
2

Japt, 7 Bytes

Ein Port von Lynns Python-Lösung.

*3É%U*4

Versuch es


Alternative

Dies war eine unterhaltsame Alternative zu den geschlossenen Formellösungen, die leider ein Byte länger sind:

_+3}gN³²

Versuch es

Zottelig
quelle
2

TI-Basic, 8 Bytes

3Ans-4(Ans>1
Timtech
quelle
2

65816 Maschinencode, 22 Bytes

Ich hätte diesen 65C02-Maschinencode leicht für 3 Bytes weniger machen können, tat es aber nicht, da die Registergröße auf dem 65C02 8-Bit anstelle von 16-Bit ist. Es würde funktionieren, aber es ist langweilig, weil man nur sehr niedrige Zahlen verwenden kann ;-)

xxd dump:

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

Demontage / Code Erklärung:

; 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

Testen Sie es auf einem 65816-kompatiblen Emulator:

testen

2xsaiko
quelle
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

Erklärung:

Die Formel lautet:

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

Nach der Abfolge von 3 Schritten "Zwei Schritte vorwärts und einen Schritt zurück" erhalten wir die arithmetische Reihe:

 +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

Zumindest oder beim ersten Zufall:

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

in einer Formel:

F(n) = 3*n - 4(n>1)     with n>1 is 1 or 0 (if n==1)
Ali IVSS
quelle
Bitte beschreiben Sie, welche Shell dies ist
qwr
Getestet auf Cygwin (CYGWIN_NT-10.0 2.3.1 (0.291 / 5/3) 2015-11-14 12:44 x86_64 Cygwin)
Ali IVSS
Kannst du es direkt in bc schreiben?
Qwr
Ich kenne mich nicht mit bc aus, aber da das Argument der Funktion ($ 1) mehrmals verwendet wird und einige Shell-spezifische Dinge (arithmetische Erweiterung, $((…))) erledigt sind, ist dies wahrscheinlich nicht der Fall.
2xsaiko
1
F(){bc<<<$1*3-$(($1>1))*4}arbeitet in zsh obwohl und entfernt 2 Bytes
2xsaiko
1

Python 3 , 48 Bytes

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

Probieren Sie es online!

Nathan Dimmer
quelle
Gute Arbeit. Möglicherweise möchten Sie auch Code in den Abschnitt "Fußzeile" einfügen. Auf diese Weise können Sie Ihre Funktion testen, ohne Ihren
Golfeingang auszupolstern
@AJFaraday Die Fußzeile meines Posts oder meines Codes?
Nathan Dimmer
On Try It Online; Sie können eine Fußzeile hinzufügen, die mit Ihrem Code ausgeführt wird, jedoch nicht zur Bytelänge zählt. Dann zeigt die Ausgabe Ihren Code bei der Arbeit.
AJFaraday
25 Bytes
Jo King
@JoKing Kennen Sie einen guten Leitfaden für Lambda-Funktionen in Python? Ich verstehe wirklich nicht, wie die Syntax funktioniert.
Nathan Dimmer
1

MATLAB / Octave , 15 Bytes

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

Probieren Sie es online!

Ein bisschen überrascht, dass es noch keine MATLAB-Antwort gibt. Gleicher Algorithmus, 3*n-4wenn größer als 1 oder auf 3*nandere Weise.

Tom Carpenter
quelle
1

Brain-Flak , 38 Bytes

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

Probieren Sie es online!

Die erste Antwort, die ich sehe, um die Antwort zu berechnen, indem ich vor und zurück gehe.

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

W d , 7 Bytes

∂f⓻⑤pH¬

Erläuterung

3*1a<4*-

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

Eine weitere mögliche Alternative

3*1am4*-

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

ein'_'
quelle