X kroków do przodu, 1 krok do tyłu


21

Oto pierwsze 100 liczb łatwej sekwencji:

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

Jak działa ta sekwencja?

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
  • Dla każdego nieparzystego n(indeksowanego 0) jest a(n-1) + X(gdzie X=1i rośnie o 1 za każdym razem, gdy jest uzyskiwany dostęp)
  • Dla każdego parzystego n(indeksowane 0) jesta(n-1) - 1

Wyzwanie:

Jeden z:

  • Biorąc pod uwagę całkowitą liczbę wejściową n, nwypisz liczbę w sekwencji.
  • Biorąc podaną liczbę całkowitą wejściową n, wypisz pierwsze nliczby sekwencji.
  • Wyprowadza sekwencję w nieskończoność bez wprowadzania danych wejściowych ( lub przyjmowania pustych nieużywanych danych wejściowych ).

Zasady konkursu:

  • Dane wejściowe nmogą być indeksowane 0 lub 1.
  • Jeśli wypisujesz (część) sekwencji, możesz użyć listy / tablicy, wydrukować do STDOUT z dowolnym separatorem (spacja, przecinek, nowa linia itp.). Twoja decyzja.
  • Podaj, której z trzech opcji użyłeś w swojej odpowiedzi.
  • Będziesz musiał obsługiwać co najmniej pierwsze 10 000 numerów (10 000 to liczba 12,497,501).

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Obowiązują standardowe zasadyDo odpowiedzi , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • Jeśli to możliwe, dodaj wyjaśnienie.

Przypadki testowe:

Wklejanie z pierwszymi 10,001 liczbami w sekwencji.Wybierz dowolne.

Niektóre wyższe liczby:

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

Odpowiedzi:



8

Excel, 31 bajtów

Odpowiedź jest 0indeksowana. Zwraca nliczbę.

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

Opisana sekwencja to ostatecznie tylko dwie sekwencje z przeplotem:

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

Przeplatanie ich w jedną 0indeksowaną sekwencję daje:

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

Co daje:

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

które gramy w golfa do 31bajtów.


Stosując to samo podejście, 1indeksowane daje 37bajty:

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



4

Haskell , 40 38 37 bajtów

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

Zwraca nieskończoną listę, spróbuj online!

Wyjaśnienie

scanltrwa trzy argumenty f, inita xs( [ x 0 , x 1 ... ] ) i buduje nową listę:

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

Ustawiamy init = 0i używamy odwróconego ($)operatora aplikacji (dlatego stosuje on i do funkcji x i ), teraz potrzebujemy tylko listy funkcji - lista [1..]>>=(:[pred]).(+)jest nieskończoną listą z odpowiednimi funkcjami:

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

Ciekawa alternatywa, 37 bajtów

flipmając typ, (a -> b -> c) -> b -> a -> cktórego moglibyśmy użyć również id :: d -> dzamiast z ($)powodu wnioskowania typu Haskell, typ dbyłby zunifikowanya -> b , dając nam to samo.

Wypróbuj online!

Edytować

-2 bajty przy użyciu (>>=)zamiast do-notacji.

-1 bajt przy użyciu scanlzamiast zipWith.



3

05AB1E , 10 bajtów

ÎF<NÈi¼¾>+

Wypróbuj online!

Wyjaśnienie

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

Kolejny 10 bajtów: ÎFNÈN;Ì*<O


ÎGDN+D<generuje sekwencję, ale chwytanie n-tego elementu wydaje się ... trudne w 3 bajtach.
Magic Octopus Urn


3

APL (Dyalog Unicode) , 16 12 bajtów SBCS

Anonimowa ukryta funkcja prefiksu. 0-indeksowane.

+/⊢↑∘∊¯1,¨⍨⍳

Wypróbuj online!

+/ suma

⊢↑ pierwszy n elementy

∘∊ z ϵ nlistowanych (spłaszczonych)

¯1,¨⍨ negatyw-jeden-dołączony do każdego

 pierwsze n d ndices (od 0 do n–1


Ach, to było moje rozwiązanie ... chyba było wystarczająco podobne.
Erik the Outgolfer

3

Galaretka , 6 bajtów

HḶS‘_Ḃ

Link monadyczny akceptuje (1-indeksowany), nktóry zwraca a(n).

Wypróbuj online! Lub zobacz zestaw testowy

W jaki sposób?

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, interesujące podejście właśnie tam.
Erik the Outgolfer

3

PHP , 73 64 55 51 47 bajtów

Pierwsza metoda

Pierwsza odpowiedź na golfa!
Jestem pewien, że istnieją sztuczki PHP, które skracają czas, a matematykę można prawdopodobnie poprawić.

Bierze n jako pierwszy argument i zwraca n-tą liczbę w sekwencji.

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

Minus 9 bajtów poprzez usunięcie „$ x = 0;” i „$ i = 0”.

Minus 9 bajtów dzięki @Kevin Cruijssen poprawiając pętlę for i utratę tagu końcowego.

Minus 1 bajt przy użyciu bitowego lub „|” zamiast „(int)”

Minus 3 bajty dzięki @Dennis, ponieważ możesz usunąć tagi, uruchamiając go z wiersza polecenia z kodem „php -r” tutaj ”

Wypróbuj online!

Druga metoda

Dopasowałem moją poprzednią odpowiedź z zupełnie nową metodą!

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

Używanie XOR i operatora tenary do przełączania między sumami w pętli.

Edycja: To nie działa dla n = 0 i nie mam pojęcia, dlaczego. $ i nie jest przypisane, więc powinno mieć wartość 0, dlatego pętla ($i<$argv[1])powinna zawieść jako (0<0==false), dlatego nieprzypisane $ x powinno być wyprowadzane jako 0, a nie 1.

Wypróbuj online!

Trzecia metoda

Konwersja formuły excel @Wernisch utworzonej na PHP daje 47-bajtowe rozwiązanie

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

Wypróbuj online!


1
Cześć, witamy w PPCG! Jeśli jeszcze tego nie zrobiłeś, wskazówki dotyczące gry w golfa w PHP i wskazówki dotyczące gry w <wszystkie języki> mogą być interesujące do przeczytania. Kilka rzeczy do gry w golfa: możesz usunąć końcowe ?>. Usunięcie $x=0i $i=0rzeczywiście jest dozwolone (jeśli nie, $x=$i=0byłoby również krótsze). Pętlę można również skrócić for(;$i<$y+1;)$x+=$i++;. Co łącznie wynosi -15 bajtów. Miłego pobytu! :)
Kevin Cruijssen

@KevinCruijssen wielkie dzięki!
Sam Dean

Nie ma za co. Btw, twoje TIO ma obecnie 60 bajtów zamiast 58. Nie jestem pewien, dlaczego podałeś 57. Wypróbuj online.
Kevin Cruijssen

@KevinCruijssen Nadal publikowałem niewłaściwe TIO! TIO mówi teraz 58, ale opublikowałem 55, ponieważ możesz usunąć „php” z tagu otwierającego, tylko nie w TIO
Sam Dean

@Wernisch dzięki za twoją formułę!
Sam Dean

3

R , 35 bajtów

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

Wypróbuj online!

Myślałem, że to interesująca alternatywa dla odpowiedzi @ JayCe ponieważ nie jest zbyt dobrze przystosowana do języków bez wbudowanej obsługi matryc, a zdarza się, że jest równie golfowa.

1-indeksowany, zwraca pierwsze nelementy sekwencji.

Jak to działa:

rbind(n<-1:scan(),-1) konstruuje następującą macierz:

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

Ponieważ R utrzymuje macierze w porządku głównym kolumny, gdybyśmy przekonwertowali to na a vector, otrzymalibyśmy wektor

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

które, gdybyśmy wzięli łączną sumę, otrzymalibyśmy

1 0 2 1 4 3 7 6

która jest sekwencją, tylko bez prowadzenia 0. diffinvna szczęście dodaje wiodące zero, więc bierzemy pierwsze n-1wartości z macierzy i diffinvje, uzyskując pierwsze nwartości sekwencji.


2
Jestem wielkim fanem twoich odpowiedzi „diffinv”.
JayCe

@JayCe kredyt dla użytkownika 2390246 za przedstawienie diffinvsię mi!
Giuseppe

3

R , 35 34 bajtów

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

Wypróbuj online!

Pierwsza opcja wyjściowa. Taka sama formuła, jak wiele innych odpowiedzi (chciałbym wskazać pierwszą odpowiedź podającą formułę, nie wiem, która to jest).

Druga i trzecia opcja wyjścia poniżej:

R , 43 bajty

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

Wypróbuj online!

R , 51 bajtów

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

Wypróbuj online!


3

Matlab / Octave, 31 26 bajtów

5 bajtów zaoszczędzonych dzięki Luisowi Mendo!

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

1
Prawdopodobnie możesz użyć fixzamiast floori n/2+.5zamiastceil(n/2)
Luis Mendo

@LuisMendo Ty! Nie wiedziałem fix()i nie spodziewałem 1:n/2+.5się, że zadziała - tak wiele rzeczy może się nie udać, ale tak naprawdę nie :)
Leander Moesinger




3

QBasic, 31 bajtów

Rozwiązanie „tylko zaimplementuj specyfikację” jest nieco dłuższe niż rozwiązanie Erika .

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

To daje wynik w nieskończoność. Na potrzeby uruchomienia polecam zmienić ostatnią linię na coś podobnego LOOP WHILE INPUT$(1) <> "q", co będzie czekać na naciśnięcie klawisza po co drugim wpisie sekwencji i wyjdzie, jeśli klawisz jest wciśnięty q.


2

C # (.NET Core) , 56 bajtów

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

-2 bajty dzięki Kevin Crujssen

Wypróbuj online!

1 indeksowany. Zwrotya(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++)może być i=0;for(;++i<n;)i i%2==0może być i%2<1.
Kevin Cruijssen

@KevinCruijssen, więc mogę, dzięki! Powinienem był zobaczyć drugi, ale nie sądziłem, że pierwszy zadziała, ponieważ myślałem, że pętle sprawdzają warunek tylko po pierwszej pętli. TIL
Skidsdev

Nie, sprawdza już przed pierwszą iteracją. A do-whilesprawdzi po zakończeniu pierwszej iteracji. :)
Kevin Cruijssen

W bardzo rzadkich przypadkach można nawet łączyć ifz for-loop. Na przykład: if(t>0)for(i=0;i<l;i++)do for(i=0;t>0&i<l;i++). Jednak prawie nigdy nie byłem w stanie użyć tego w moich odpowiedziach.
Kevin Cruijssen

to całkiem niesamowite, na pewno będę musiał pamiętać o tym następnym razem, gdy będę grał w golfa w C #, co w dzisiejszych czasach jest dość rzadkie: P większość mojej pracy w C # jest zdecydowanie niegrzeczna
Skidsdev

2

Łuska , 11 9 8 bajtów

ΘṁṠe→Θ∫N

Zapisano bajt dzięki H.PWiz.
Wyprowadza jako nieskończoną listę.
Wypróbuj online!

Wyjaśnienie

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

2

Dodos , 69 bajtów

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

Wypróbuj online!


Jakoś to najdłuższa odpowiedź.

Wyjaśnienie.

┌────┬─────────────────────────────────────────────────┐
│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

Węgiel drzewny , 15 bajtów

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

Wypróbuj online! 0-indeksowane. Link jest do pełnej wersji kodu. Formuła byłaby prawdopodobnie krótsza, ale jaka jest w tym zabawa? Wyjaśnienie:

    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 bajtów

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

Wypróbuj online!

Nie tak ładna jak odpowiedź @tsh, ale moja działa dla większej liczby.

A teraz dziękuję @tsh za evalrozwiązanie!


<=x+1może być<x+2
Kevin Cruijssen

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')powinien być krótszy.
tsh

Czy evalzwraca ostatnią zmodyfikowaną wartość? Nadal nie do końca rozumiem, co może zrobić.
Przypadkowy facet

Zwraca wartość instrukcji (która może być uwzględniona w doinstrukcji w późniejszej wersji).
tsh



1

Pyth , 8 bajtów

s<s,R_1S

Zwraca nliczbę w sekwencji 0-indeksowaną. Wypróbuj online

Objaśnienie, na przykład dla 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 bajtów

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

Spróbuj

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

Na podstawie odpowiedzi w Pythonie na inżynierię odwrotną TFeld .
Spróbuj

Rozszerzony

38 bajtów (generator sekwencji):

{  # 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
}

Zauważ, że ma to tę zaletę, że możesz przekazać, *aby uzyskać całą sekwencję, lub przekazać w zakresie, aby bardziej efektywnie wygenerować wiele wartości.

26 bajtów (bezpośrednie obliczenie):

{  # 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 bajtów

;L¨O>¹É-

Wypróbuj online!

W oparciu o podejście Jelathana Jonathana Allana (które prawdopodobnie opierało się na edycji przez OP pytania z inną definicją sekwencji), więc 1-indeksowane.


+1. Miałem podobne podejście przygotowane w 05AB1E, które planowałem opublikować za kilka dni, jeśli nikt inny tego nie opublikował. Jest nieco inny (najpierw zmniejszam połowę przed utworzeniem listy, zamiast zdejmować ogon; i używam Izamiast ¹), ale ogólne podejście i liczba bajtów są dokładnie takie same:;<LO>IÉ-
Kevin Cruijssen

@KevinCruijssen napisałbym wczoraj, gdybym miał możliwość głębszego myślenia, ale cóż, to jest okres finałowy, zbyt głębokie myślenie o tym jest zabronione. : P
Erik the Outgolfer

Ach, cieszę się, że nie mam już finałów. Jestem również dość zajęty w pracy i czasami muszę odkładać golfa częściej niż chciałbym. ; p Powodzenia w egzaminach!
Kevin Cruijssen

1

Wypukły , 10 9 bajtów

_½,ª)\2%-

Wypróbuj online!

Na podstawie podejścia Jelathana Jonathana Allana (które prawdopodobnie opierało się na edycji przez OP pytania z inną definicją sekwencji). 1-indeksowany.

Wyjaśnienie:

_½,ª)\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]%]-]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.