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.