X Schritte vorwärts, 1 Schritt zurück


21

Hier die ersten 100 Zahlen einer einfachen Sequenz:

0,1,0,2,1,4,3,7,6,11,10,16,15,22,21,29,28,37,36,46,45,56,55,67,66,79,78,92,91,106,105,121,120,137,136,154,153,172,171,191,190,211,210,232,231,254,253,277,276,301,300,326,325,352,351,379,378,407,406,436,435,466,465,497,496,529,528,562,561,596,595,631,630,667,666,704,703,742,741,781,780,821,820,862,861,904,903,947,946,991,990,1036,1035,1082,1081,1129,1128,1177,1176,1226

Wie funktioniert diese Sequenz?

n: 0 1     2           3     4     5     6     7     8      9       10      11      12

   0,      1-1=0,      2-1=1,      4-1=3,      7-1=6,       11-1=10,        16-1=15,      
     0+1=1,      0+2=2,      1+3=4,      3+4=7,      6+5=11,        10+6=16,        15+7=22
  • a(0) = 0
  • Für jede ungerade n(0-indiziert) ist es a(n-1) + X(wo X=1und erhöht sich bei jedem Zugriff um 1).
  • Für jede gerade n(0-indizierte) ist esa(n-1) - 1

Herausforderung:

Einer von:

  • Geben Sie bei einer Ganzzahl ndie n'te Zahl in der Sequenz aus.
  • Geben Sie bei einer Ganzzahl ndie ersten nZahlen der Sequenz aus.
  • Geben Sie die Sequenz auf unbestimmte Zeit aus, ohne eine Eingabe ( oder eine leere, nicht verwendete Eingabe ) zu übernehmen.

Herausforderungsregeln:

  • Der Eingang nkann sowohl 0- als auch 1-indiziert sein.
  • Wenn Sie einen Teil der Sequenz ausgeben, können Sie eine Liste / ein Array verwenden und mit einem beliebigen Trennzeichen (Leerzeichen, Komma, Zeilenumbruch usw.) auf STDOUT ausgeben. Ihr Anruf.
  • Bitte geben Sie an, welche der drei Optionen Sie in Ihrer Antwort verwendet haben.
  • Sie müssen mindestens die ersten 10.000 Nummern unterstützen (die 10.000ste Nummer ist 12,497,501).

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
  • Fügen Sie nach Möglichkeit auch eine Erklärung hinzu.

Testfälle:

Pastebin mit den ersten 10.001 Nummern in der Sequenz. Fühlen Sie sich frei zu wählen, was Sie möchten.

Einige höhere Zahlen:

n (0-indexed)    Output:

68,690           589,772,340
100,000          1,249,975,000
162,207          3,288,888,857
453,271          25,681,824,931
888,888          98,765,012,346
1,000,000        124,999,750,000

Antworten:



8

Excel, 31 Bytes

Die Antwort ist 0indiziert. Gibt ndie Nummer aus.

=(A1^2+IF(ISODD(A1),7,-2*A1))/8

Die beschriebene Sequenz besteht letztendlich nur aus zwei verschachtelten Sequenzen:

ODD:   (x^2+x+2)/2
EVEN:  (x^2-x)/2

Das Verschachteln dieser in eine 0indizierte Sequenz ergibt:

a = (x^2 - 2x)/8 if even
a = (x^2 + 7 )/8 if odd

Welches gibt:

=IF(ISODD(A1),(A1^2+7)/8,(A1^2-2*A1)/8)

was wir bis auf die 31Bytes Golf spielen .


1Indiziert ergeben sich nach dem gleichen Ansatz 37Bytes:

=(A1^2-IF(ISODD(A1),4*A1-3,2*A1-8))/8



4

Haskell , 40 38 37 Bytes

scanl(flip($))0$[1..]>>=(:[pred]).(+)

Gibt eine unendliche Liste zurück, versuche es online!

Erläuterung

scanldrei Argumente verwendet f, initund xs( [ x 0 , x 1 ... ] ) und baut eine neue Liste:

[ a 0 = init , a 1 = f (a 0 , x 0 ) , a 2 = f (a 1 , x 1 ) ... ]

Wir setzen init = 0und verwenden den gespiegelten ($)Anwendungsoperator (daher wendet er ein i auf die Funktion x i an ), jetzt brauchen wir nur noch eine Liste von Funktionen - die Liste [1..]>>=(:[pred]).(+)ist eine unendliche Liste mit den richtigen Funktionen:

[(+1),(-1),(+2),(-1),(+3),(-1),(+4),...

Interessante Alternative, 37 Bytes

flipmit der Art (a -> b -> c) -> b -> a -> cwir auch nutzen könnten , id :: d -> danstatt ($)wegen Haskells Typinferenz die Art dwürde mit vereinigt werden a -> b, gibt uns das gleiche.

Probieren Sie es online!

Bearbeiten

-2 Bytes mit (>>=)anstelle von do-notation.

-1 Byte mit scanlanstelle von zipWith.



3

05AB1E , 10 Bytes

ÎF<NÈi¼¾>+

Probieren Sie es online!

Erläuterung

Î             # initialize stack with: 0, input
 F            # for N in [0 ... input-1] do:
  <           # decrement the current number
   NÈi        # if N is even
      ¼       # increment a counter
       ¾>     # push counter+1
         +    # add to current number

Ein weiterer 10-Byte: ÎFNÈN;Ì*<O


ÎGDN+D<generiert die Sequenz, aber das n-te Element zu greifen scheint ... in 3 Bytes schwierig zu sein.
Magic Octopus Urn



3

Gelee , 6 Bytes

HḶS‘_Ḃ

Ein monadischer Link, der akzeptiert (1-indiziert) nund zurückgibta(n) .

Probieren Sie es online! Oder sehen Sie die Testsuite an

Wie?

HḶS‘_Ḃ - link: n
H      - halve         -> n/2.0
 Ḷ     - lowered range -> [0,1,2,...,floor(n/2.0)-1]
  S    - sum           -> TriangleNumber(floor(n/2.0)-1)
   ‘   - increment     -> TriangleNumber(floor(n/2.0)-1)+1
     Ḃ - bit = 1 if n is odd, 0 if it's even
    _  - subtract      -> TriangleNumber(floor(n/2.0)-1)+isEven(n)

Hm, interessanter Ansatz genau dort.
Erik der Outgolfer

3

PHP , 73 64 55 51 47 Bytes

Erste Methode

Erste Code Golf Antwort!
Ich bin mir sicher, dass es PHP-Tricks gibt, die es kürzer machen und die Mathematik kann wahrscheinlich verbessert werden.

Nimmt n als erstes Argument und gibt die n-te Zahl in der Sequenz aus.

$y=$argv[1]/2;for(;$i<$y+1;)$x+=$i++;echo$x-($y|0);

Minus 9 Bytes durch Entfernen von "$ x = 0;" und "$ i = 0".

Minus 9 Bytes dank @Kevin Cruijssen, der die for-Schleife und den Verlust des End-Tags verbessert.

Minus 1 Byte mit bitweise oder "|" anstatt "(int)"

Minus 3 Bytes dank @Dennis, da Sie die Tags entfernen können, indem Sie sie über die Befehlszeile mit "php -r 'code here'" ausführen.

Probieren Sie es online!

Zweite Methode

Hat meine vorherige Antwort mit einer ganz neuen Methode abgeglichen!

for(;$i<$argv[1];$i++)$x+=($y^=1)?$i/2+1:-1;echo$x;

Verwenden von XOR und dem Tenary-Operator, um zwischen den Summen in der Schleife zu wechseln.

Bearbeiten: Dies funktioniert nicht für n = 0 und ich habe keine Ahnung warum. $ i ist nicht zugewiesen, daher sollte es 0 sein, daher sollte die Schleife ($i<$argv[1])fehlschlagen (0<0==false), daher sollte ein nicht zugewiesenes $ x als 0 und nicht als 1 ausgegeben werden.

Probieren Sie es online!

Dritte Methode

Die Konvertierung der erstellten Excel-Formel @Wernisch in PHP ergibt eine 47-Byte-Lösung

$z=$argv[1];echo(pow($z,2)+(($z&1)?7:-2*$z))/8;

Probieren Sie es online!


1
Hallo, willkommen bei PPCG! Wenn Sie es noch nicht getan haben, könnten Tipps zum Golfen in PHP und Tipps zum Golfen in <allen Sprachen> interessant sein. Einige Dinge zum Golfspielen: Sie können das Schleppen entfernen ?>. Entfernen $x=0und $i=0ist in der Tat erlaubt (wenn nicht, $x=$i=0wäre es auch kürzer gewesen). Auch die Schleife kann auf gekürzt werden for(;$i<$y+1;)$x+=$i++;. Welches ist -15 Bytes insgesamt. Genieße deinen Aufenthalt! :)
Kevin Cruijssen

@ KevinCruijssen vielen Dank!
Sam Dean

Bitte. Übrigens ist Ihr TIO derzeit immer noch 60 Bytes anstatt 58. Und nicht sicher, warum Sie 57 angegeben haben. Versuchen Sie es online.
Kevin Cruijssen

@ KevinCruijssen Ich habe immer wieder das falsche TIO gepostet! TIO sagt jetzt 58, aber ich habe 55 gepostet, da Sie "php" aus dem Eröffnungs-Tag entfernen können, nur nicht in TIO
Sam Dean

@Wernisch danke für deine Formel!
Sam Dean

3

R , 35 Bytes

diffinv(rbind(n<-1:scan(),-1)[n-1])

Probieren Sie es online!

Ich fand das eine interessante Alternative zu @ JayCes Antwort da es sich nicht sehr gut für Sprachen keine eingebaute Unterstützung für Matrizen haben, und zufällig genauso gut für Golfer geeignet ist.

1-indiziert, gibt die ersten nElemente der Sequenz zurück.

Wie es funktioniert:

rbind(n<-1:scan(),-1) konstruiert die folgende Matrix:

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]   -1   -1   -1   -1

Da R Matrizen in der Hauptreihenfolge der Spalten enthält vector, würden wir einen Vektor erhalten , wenn wir dies in a umwandeln würden

1 -1 2 -1 3 -1 4 -1

Wobei, wenn wir eine kumulative Summe von nehmen, wir bekommen würden

1 0 2 1 4 3 7 6

Das ist die Sequenz, nur ohne die Führung 0. diffinvGlücklicherweise wird die führende Null hinzugefügt, sodass wir die ersten n-1Werte aus der Matrix und diffinvdiesen entnehmen und die ersten nWerte der Sequenz erhalten.


2
Ich bin ein großer Fan Ihrer "diffinv" Antworten.
JayCe


3

R , 35 34 Bytes

(u=(n=scan())-n%%2-1)-n+(15+u^2)/8

Probieren Sie es online!

Erste Ausgabeoption. Gleiche Formel wie viele andere Antworten. (Ich möchte auf die erste Antwort verweisen, die die Formel enthält. Ich kann nicht herausfinden, um welche es sich handelt.)

Zweite und dritte Ausgabeoptionen unten:

R , 43 Bytes

function(m,n=1:m,u=n%%2+1)((n-u)^2-1)/8+2-u

Probieren Sie es online!

R , 51 Bytes

while(T){cat(((T-(u=T%%2+1))^2-1)/8+2-u," ");T=T+1}

Probieren Sie es online!


3

Matlab / Octave, 31 26 Bytes

5 Bytes gespart dank Luis Mendo!

@(n)sum(1:n/2+.5)-fix(n/2)

1
Sie können wahrscheinlich fixanstelle von floorund n/2+.5anstelle von verwendenceil(n/2)
Luis Mendo

@ LuisMendo Ty! Wusste nichts von fix()und erwartete nicht 1:n/2+.5zu arbeiten - so viele Dinge, die schief gehen könnten, aber sie tun es tatsächlich nicht :)
Leander Moesinger




3

QBasic, 31 Bytes

Die Just-Implement-the-Spec-Lösung ist etwas länger als Eriks Lösung .

DO
?n
i=i+1
n=n+i
?n
n=n-1
LOOP

Dies wird auf unbestimmte Zeit ausgegeben. Um es auszuführen, empfehle ich, die letzte Zeile in so etwas wie zu ändern LOOP WHILE INPUT$(1) <> "q", die nach jedem zweiten Eingeben und Verlassen der Sequenz auf einen Tastendruck wartet, wenn die gedrückte Taste gedrückt wird q.


2

C # (.NET Core) , 56 Byte

n=>{int a=0,i=0;for(;++i<n;)a+=i%2<1?-1:i/2+1;return a;}

-2 Bytes dank Kevin Crujssen

Probieren Sie es online!

1 indiziert. Kehrt zurücka(n)

Ungolf'd:

int f(int n)
{
    // a needs to be outside the for loop's scope,
    // and it's golfier to also define i here
    int a = 0, i = 1;
    // basic for loop, no initializer because we already defined i
    for (; ++i < n;)
    {
        if (i%2 < 1) {
            // if i is even, subtract 1
            a -= 1;
        }
        else
        {
            // if i is odd, add (i / 2) + 1
            // this lets us handle X without defining another int
            a += i / 2 + 1;
        }
    }
    // a is the number at index n
    return a;
}

1
i=1;for(;i<n;i++)kann sein i=0;for(;++i<n;)und i%2==0kann sein i%2<1.
Kevin Cruijssen

@ KevinCruijssen so kann ich, danke! Ich hätte den zweiten sehen sollen, aber ich habe nicht gedacht, dass der erste funktionieren würde, da ich dachte, dass für Schleifen nur die Bedingung nach der ersten Schleife geprüft wird. TIL
Skidsdev

Nein, es prüft schon vor der ersten Iteration. A do-whileprüft nach Abschluss der ersten Iteration. :)
Kevin Cruijssen

In sehr seltenen Fällen kann man sogar einen ifmit einem for-loop zusammenführen. Zum Beispiel: if(t>0)for(i=0;i<l;i++)bis for(i=0;t>0&i<l;i++). Ich habe dies jedoch fast nie in meinen Antworten verwenden können.
Kevin Cruijssen

das ist ziemlich genial, das muss ich mir auf jeden Fall merken, wenn ich das nächste Mal C # -Golf
spiele

2

Schale , 11 9 8 Bytes

ΘṁṠe→Θ∫N

Dank H.PWiz wurde ein Byte gespeichert.
Ausgaben als unendliche Liste.
Probieren Sie es online!

Erläuterung

ΘṁṠe→Θ∫N
      ∫N   Cumulative sum of natural numbers (triangular numbers).
     Θ     Prepend 0.
 ṁṠe→      Concatenate [n + 1, n] for each.
Θ          Prepend 0.

2

Dodos , 69 Bytes

	. w
w
	. h
	+ r . ' dab h '
h
	h ' '
	. dab
r
	
	r dip
.
	dot
'
	dip

Probieren Sie es online!


Irgendwie ist das die längste Antwort.

Erläuterung.

┌────┬─────────────────────────────────────────────────┐
│Name│Function                                         │
├────┼─────────────────────────────────────────────────┤
│.   │Alias for "dot", computes the sum.               │
├────┼─────────────────────────────────────────────────┤
│'   │Alias for "dip".                                 │
├────┼─────────────────────────────────────────────────┤
│r   │Range from 0 to n, reversed.                     │
├────┼─────────────────────────────────────────────────┤
│h   │Halve - return (n mod 2) followed by (n/2) zeros.│
└────┴─────────────────────────────────────────────────┘

1

Kohle , 15 Bytes

I∨ΣEN⎇﹪ι²±¹⊕⊘ι⁰

Probieren Sie es online! 0-indiziert. Link ist eine ausführliche Version des Codes. Die Formel wäre wahrscheinlich kürzer, aber was macht das für einen Spaß? Erläuterung:

    N           Input as a number
   E            Map over implicit range
     ⎇          Ternary
      ﹪ι²       Current value modulo 2
         ±¹     If true (odd) then -1
           ⊕⊘ι  Otherwise calculate X as i/2+1
  Σ             Take the sum
 ∨            ⁰ If the sum is empty then use zero
I               Cast to string and implicitly print

1

JavaScript, 49 48 45 Bytes

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')

Probieren Sie es online!

Nicht so hübsch wie @tsh Antwort, aber meine funktioniert für größere Zahlen.

Und nun danke @tsh für die evalLösung!


<=x+1kann sein<x+2
Kevin Cruijssen

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')sollte kürzer sein.
Dienstag,

Gibt evalden zuletzt geänderten Wert zurück? Ich verstehe immer noch nicht ganz, was es kann.
Der zufällige Kerl

Es gibt den Wert von statement zurück (which möglicherweise in der doAnweisung in einer späteren Version behandelt wird).
Dienstag,



1

Pyth , 8 Bytes

s<s,R_1S

Gibt die nNummer in der Sequenz mit dem Index 0 zurück. Probieren Sie es online aus

Erklärung mit Beispiel für n=5:

s<s,R_1SQQ   Final 2 Q's are implicit, Q=eval(input())

       SQ    1-indexed range        [1,2,3,4,5]
   ,R_1      Map each to [n,-1]     [[1,-1],[2,-1],[3,-1],[4,-1],[5,-1]]
  s          Sum (Flatten)          [1,-1,2,-1,3,-1,4,-1,5,-1]
 <       Q   Take 1st Q             [1,-1,2,-1,3]
s            Sum, implicit output   4

1

Perl 6 ,  38  26 Bytes

{(0,{$_+(($+^=1)??++$ !!-1)}...*)[$_]}

Versuch es

{(+^-$_+|1)**2 div 8+$_%2}

Basierend auf Reverse Engineering der Python-Antwort von TFeld .
Versuch es

Erweitert

38 Byte (Sequenzgenerator):

{  # bare block lambda with implicit parameter $_

  (
    # generate a new sequence everytime this function is called

    0,    # seed the sequence

    {     # bare block that is used to generate the rest of the values

      $_  # parameter to this inner block (previous value)

      +

      (
          # a statement that switches between (0,1) each time it is run
          ( $ +^= 1 )

        ??     # when it is 1 (truish)
          # a statement that increments each time it is run
          ++$ # &prefix:« ++ »( state $foo )

        !!     # or else subtract 1
          -1
      )
    }

    ...  # keep generating until:

    *    # never stop

  )[ $_ ] # index into the sequence
}

Beachten Sie, dass dies den Vorteil hat, den Sie weitergeben können * , um die gesamte Sequenz abzurufen, oder einen Bereich übergeben können, um mehrere Werte effizienter zu generieren.

26 Byte (direkte Berechnung):

{  # bare block lambda with implicit parameter $_

  (

    +^     # numeric binary negate
      -$_  # negative of the input
      +|   # numeric binary or
      1

  ) ** 2   # to the power of 2

  div 8     # integer divide it by 8

  + $_ % 2  # add one if it is odd
}

1

05AB1E , 8 Bytes

;L¨O>¹É-

Probieren Sie es online!

Basierend auf Jonathan Allans Jelly-Ansatz (der wahrscheinlich darauf beruhte, dass OP die Frage mit einer anderen Definition der Sequenz bearbeitete), also 1-indiziert.


+1. Ich hatte in 05AB1E einen ähnlichen Ansatz vorbereitet, den ich in ein paar Tagen veröffentlichen wollte, wenn niemand anderes einen veröffentlichte. Es ist etwas anders (ich verkleinere zuerst die Hälfte, bevor ich die Liste erstelle, anstatt den Schwanz zu entfernen; und ich verwende Istattdessen ¹), aber die allgemeine Vorgehensweise und die Anzahl der Bytes sind genau die gleichen:;<LO>IÉ-
Kevin Cruijssen

@ KevinCruijssen Hätte gestern gepostet, wenn ich die Fähigkeit gehabt hätte, tiefer zu denken, aber nun, dies ist die Endrunde, zu tief darüber nachzudenken ist verboten. : P
Erik der Outgolfer

Ah, ich bin froh, dass ich kein Finale mehr habe. Ich bin aber auch ziemlich beschäftigt bei der Arbeit und muss Code-Golf manchmal öfter aufschieben, als ich möchte. ; p Viel Glück bei deinen Prüfungen!
Kevin Cruijssen

1

Konvex , 10 9 Bytes

_½,ª)\2%-

Probieren Sie es online!

Basierend auf Jonathan Allans Jelly-Ansatz (der wahrscheinlich darauf beruhte, dass OP die Frage mit einer anderen Definition der Sequenz bearbeitete). 1-indiziert.

Erläuterung:

_½,ª)\2%- Stack: [A]
_         Duplicate. Stack: [A A]
 ½        Halve. Stack: [A [A]½]
  ,       Range, [0..⌊N⌋). Stack: [A [[A]½],]
   ª      Sum. Stack: [A [[A]½],]ª]
    )     Increment. Stack: [A [[[A]½],]ª])]
     \    Swap. Stack: [[[[A]½],]ª]) A]
      2   2. Stack: [[[[A]½],]ª]) A 2]
       %  Modulo. Stack: [[[[A]½],]ª]) [A 2]%]
        - Minus. Stack: [[[[[A]½],]ª]) [A 2]%]-]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.