Cykl arytmetyczny

13

Wejście:

Liczba całkowita, nktóra jest >=0lub >=1( f(0)jest opcjonalna)

Wynik:

n-Tym liczba w poniższej sekwencji, lub sekwencję do i włącznie z n-tym liczbę.

Sekwencja:

(0),1,-1,-3,0,5,-1,-7,0,9,-1,-11,0,13,-1,-15,0,17,-1,-19,0,21,-1,-23,0,25,-1,-27,0,29,-1,-31,0,33,-1,-35,0,37,-1,-39,0,41,-1,-43,0,45,-1,-47,0,49,-1,-51,0,53,-1,-55,0,57,-1,-59,0,61,-1,-63,0,65,-1,-67,0,69,-1,-71,0,73,-1,-75,0,77,-1,-79,0,81,-1,-83,0,85,-1,-87,0,89,-1,-91,0,93,-1,-95,0,97,-1,-99

Jak zbudowana jest ta sekwencja?

f(n=0) = 0(opcjonalnie)
f(n=1) = f(0) + nlub f(n=1) = 1
f(n=2) = f(1) - n
f(n=3) = f(2) * n
f(n=4) = f(3) / n
f(n=5) = f(4) + n
itp.

Lub w pseudokodzie:

function f(integer n){
  Integer result = 0
  Integer i = 1
  Loop as long as i is smaller than or equal to n
  {
    if i modulo-4 is 1:
      result = result plus i
    if i modulo-4 is 2 instead:
      result = result minus i
    if i modulo-4 is 3 instead:
      result = result multiplied with i
    if i modulo-4 is 0 instead:
      result = result integer/floor-divided with i
    i = i plus 1
  }
  return result
}

Ale, jak mogłeś zauważyć, w sekwencji występują dwa wzorce:

0, ,-1,  ,0, ,-1,  ,0, ,-1,   ,0,  ,-1,   ,0,  ,-1,   ,...
 ,1,  ,-3, ,5,  ,-7, ,9,  ,-11, ,13,  ,-15, ,17,  ,-19,...

więc wszelkie inne podejścia prowadzące do tej samej sekwencji są oczywiście całkowicie w porządku.

Zasady konkursu:

  • Wejścia indeksowane 0 i indeksowane 1 będą dawać ten sam wynik (dlatego f(0)jest opcjonalny dla wejść indeksowanych 0, jeśli chcesz je uwzględnić).
  • Możesz wypisać ndziesiąty numer tej sekwencji. Lub cała sekwencja w górę, włączając w nto liczbę. (Więc f(5)może dać albo 5albo 0,1,-1,-3,0,5.)
    • Jeśli zdecydujesz się wyprowadzić sekwencję do nliczby włącznie , format wyjściowy jest elastyczny. Może być łańcuchem ograniczającym listę / tablicę, przecinek / spację / znak nowej linii lub może być drukowany do STDOUT itp.
  • Divide ( /) to dzielenie liczby całkowitej / podłogi, które zaokrągla w kierunku 0 (nie w kierunku ujemnej nieskończoności, jak ma to miejsce w niektórych językach).

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki kod-golfowe 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.
  • Do odpowiedzi mają zastosowanie standardowe reguły , 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.
  • W razie potrzeby dodaj również wyjaśnienie.

Dodatkowe przypadki testowe powyżej n=100:

Input     Output

1000      0
100000    0
123       -123
1234      -1
12345     12345
123456    0
Kevin Cruijssen
źródło
1
Nie mogłem tego znaleźć na stronie oeis.org, więc możesz chcieć to tam przesłać. To ciekawa sekwencja, dziwię się, że nikt jej nie zarejestrował.
rura
1
@pipe wydaje się dość arbitralny
qwr

Odpowiedzi:

20

JavaScript (ES6), 19 bajtów

n=>[0,n,-1,-n][n&3]

Wypróbuj online!

Dowód

Załóżmy, że mamy następujące relacje dla kilku n wielokrotności 4. Te relacje są trywialnie weryfikowane dla pierwszych składników sekwencji.

f(n)   = 0
f(n+1) = n+1
f(n+2) = -1
f(n+3) = -(n+3)

I niech N = n + 4 . Następnie z definicji:

f(N)   = f(n+4) = f(n+3) // (n+4) = -(n+3) // (n+4) = 0
f(N+1) = f(n+5) = f(n+4) + (n+5)  = 0 + (n+5)       = N+1
f(N+2) = f(n+6) = f(n+5) - (n+6)  = (n+5) - (n+6)   = -1
f(N+3) = f(n+7) = f(n+6) * (n+7)  = -1 * (n+7)      = -(N+3)

Co przez indukcję matematyczną dowodzi, że relacje zachodzą dla dowolnej N wielokrotności 4 .

Arnauld
źródło
2
Ponieważ większość odpowiedzi to porty tego rozwiązania, chcę dodać, że sprawdziłem, czy można to udowodnić.
Erik the Outgolfer
Mam alternatywny dowód.
Erik the Outgolfer,
Ach, orzechy, rozproszyła mnie praca podczas pracy nad czymś bardzo podobnym. +1
Kudłaty
Czy z powodu ciekawości istnieje powód, aby preferować „n & 3” nad „n% 4”?
IanF1
2
@ IanF1 Wydaje mi się, że jest to po prostu nawyk programowania na niskim poziomie (obliczanie bitowe ORAZ w asemblerze jest łatwiejsze i szybsze niż obliczanie modulo). Ale tutaj nie ma to większego sensu i tak naprawdę byłem w połowie kuszony, aby zmienić go na n%4później, aby działał z liczbami większymi niż 32-bit.
Arnauld
4

05AB1E , 8 bajtów

Zwraca nthliczbę

ÎD(®s)sè

Wypróbuj online!

05AB1E , 14 bajtów

Wysyła listę liczb do N przy użyciu wzorców w sekwencji

ÅÉāÉ·<*āÉ<‚øí˜

Wypróbuj online!

Wyjaśnienie

Przykład z użyciem N = 7

ÅÉ               # List of odd numbers upto N
                 # STACK: [1,3,5,7]
  ā              # Enumerate 1-based
   É             # is odd?
                 # STACK: [1,3,5,7],[1,0,1,0]
    ·<           # double and decrement
                 # STACK: [1,3,5,7],[1,-1,1,-1]
      *          # multiply
                 # STACK: [1,-3,5,-7]
       āÉ<       # enumerate, isOdd, decrement
                 # STACK: [1,-3,5,-7],[0,-1,0,-1]
          ‚ø     # zip
                 # STACK: [[1, 0], [-3, -1], [5, 0], [-7, -1]]
            í    # reverse each
             ˜   # flatten
                 # RESULT: [0, 1, -1, -3, 0, 5, -1, -7]
Emigna
źródło
4

Python 2 , 25 bajtów

Odpowiedź Portu Arnaulda:

lambda n:[0,n,-1,-n][n%4]

Wypróbuj online!


Naiwne rozwiązania:

Python 3 , 50 49 bajtów

lambda n:n and eval('int(f(n-1)%sn)'%'/+-*'[n%4])

Wypróbuj online!


Python 2 , 78 77 76 58 57 53 52 bajty

lambda n:n and eval('int(1.*f(n-1)%sn)'%'/+-*'[n%4])

Wypróbuj online!

Użyłem kilku bajtów int, ponieważ podłoga python dzieli się, a nie w kierunku 0, jak w pytaniu.

TFeld
źródło
@KevinCruijssen Tak, dziękuję :)
TFeld
3

J , 12 bajtów

Odpowiedź Portu Arnaulda:

4&|{0,],_1,-

Wypróbuj online!

J , 28 bajtów

Naiwne rozwiązanie:

{(0 _1$~]),@,.(_1^i.)*1+2*i.

Zwraca n-tą liczbę

Wypróbuj online!

Galen Iwanow
źródło
3

TIS -n 2 1 , 123 bajty

Zwraca nliczbę th dla 0 <= n <= 999. (Górny limit wynika z ograniczeń językowych).

@0
MOV UP ACC
MOV ACC ANY
L:SUB 4
JGZ L
JEZ L
ADD 5
JRO -5
@1
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY
HCF

Wypróbuj online!


TIS -n 2 1 , 124 bajty

Zwraca nliczbę th dla 0 <= n <= 999. (Górny limit wynika z ograniczeń językowych). nMożna podać wiele , oddzielonych spacjami.

@0
MOV UP ACC
MOV ACC ANY
L:SUB 4
JGZ L
JEZ L
ADD 5
MOV ACC ANY
@1
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY

Wypróbuj online!


TIS -n 3 1 , 192 bajty

Zwraca wartości 0..ndla 0 <= n <= 999. (Górny limit wynika z ograniczeń językowych).

@0
MOV UP ACC
ADD 1
MOV ACC ANY
JRO -1
@1
SUB UP
JLZ C
HCF
C:ADD UP
MOV ACC ANY
ADD 1
SWP
ADD 1
MOV ACC ANY
SUB 4
JEZ W
ADD 4
W:SWP
@2
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY

Wypróbuj online!


Wszystkie używają numerycznych we / wy ( -nflaga). Pierwsze dwa rozwiązania wykorzystują dwa węzły obliczeniowe, jeden umieszczony nad drugim. Trzeci ma stos trzech węzłów.

W przypadku dwóch pierwszych rozwiązań górny węzeł odczytuje dane wejściowe, wysyła pierwotną liczbę, a następnie kilkakrotnie odejmuje 4, aż osiągniemy wartość ujemną, a następnie dodaje 5 do indeksu dla naszej tabeli skoków. Jest to równoważne z (n % 4) + 1.

Trzecie rozwiązanie podzieliło to zadanie na dwa węzły; górny po prostu powtarza limit do końca czasu, a środkowy węzeł zlicza równolegle indeks (w porównaniu z tym limitem) i moduł jak wyżej.

Dolny węzeł wszystkich trzech rozwiązań jest taki sam; ma stół do skoków i tam właśnie dzieje się magia. Przechowujemy w oryginalny numer ACC, a następnie JRO(prawdopodobnie J UMP R elativus O ffset) do przodu przez 1, 2, 3lub 4, w zależności od tego, co powyżej węzeł mówi.

Praca wstecz:

  • 4będzie a ) NEGzjadł ACC, i b ) ACCzejść w dół do produkcji.
  • 3umieści 1się ACC, a następnie przeprowadzić etapy i b .44
  • 2przejdzie bezpośrednio do kroku 4b .
  • 1będzie SUBTract ACCod siebie (w praktyce zerowania ACC), a następnie do etapu 2, który przeskakuje do 4b .
Phlarx
źródło
2

C (gcc) , 62 bajty

f(n,k){k=~-n;n=n?n%4?k%4?n-2&3?f(k)*n:f(k)-n:f(k)+n:f(k)/n:0;}

Wypróbuj online!

Jonathan Frech
źródło
Możesz dokładnie zmniejszyć liczbę bajtów o połowę (31 bajtów), tworząc port odpowiedzi Java Oliviera Grégoire'a : f(n){n=n%2>0?n*(2-n%4):n%4/-2;}Dodałbym to jako drugą odpowiedź, ponieważ podoba mi się również twoje podejście rekurencyjne. :)
Kevin Cruijssen
@KevinCruijssen Widziałem ich rozwiązanie Java 10 i zauważyłem jego zwięzłość, chociaż nie chciałem po prostu kopiować ich rozwiązania, ponieważ składnie arytmetyczne dwóch języków są zbyt podobne.
Jonathan Frech,
1

Siatkówka , 46 bajtów

.+
*
r`(____)*$
_$.=
____
-
___.*
-1
__

_.*
0

Wypróbuj online! Wyjaśnienie:

.+
*

Konwertuj na unary.

r`(____)*$
_$.=

Konwertuj z powrotem na dziesiętne, ale pozostaw n%4+1podkreślenia.

____
-

W przypadku, gdy jest to 4, wynik jest następujący -n.

___.*
-1

Przypadek 3: -1

__

Przypadek 2: n

_.*
0

Przypadek 1: 0

Neil
źródło
1

Haskell , 50 bajtów

f 0=0
f n=([(+),(-),(*),quot]!!mod(n-1)4)(f(n-1))n

Wypróbuj online!

Rozwiązanie Arnaulda przeniesione do Haskell ma 23 bajty:

z n=cycle[0,n,-1,-n]!!n
Angs
źródło
1

APL (Dyalog Classic) , 22 12 bajtów

Ogromne 10 bajtów uratowanych dzięki uwagom Erika, Outgolfera. Dziękuję Ci!

4∘|⊃0,⊢,¯1,-

Wypróbuj online!

Zwraca n-tą liczbę

Nie znam APL-a, po prostu starałem się, aby mój port J rozwiązania Arnaulda działał w Dyalog APL.

Galen Iwanow
źródło
2
Niezła próba! Kilka uwag: 1) można zastąpić (0,⍵,¯1,-⍵)z (0⍵¯1,-⍵). 2) Możesz usunąć 1+, zakładając, że ⎕IOzmienna systemowa jest przypisana do 0(tak, to dozwolone). 3) Zazwyczaj nie liczymy tej f←części podczas przesyłania funkcji. 4) Możesz użyć tej funkcji zamiast []indeksowania. Wszyscy razem tworzą to: ⎕IO←0(nie licz tego){(4|⍵)⊃0⍵¯1,-⍵}
Erik the Outgolfer
@Erik the Outgolfer Dziękujemy!
Galen Iwanow
2
Bardziej zaawansowane golfa na podstawie tego podejścia: 4∘|⊃0,⊢,¯1,-.
Erik the Outgolfer,
1
@Erik the Outgolfer - Tak, rzeczywiście! Myślę, że twoje 4∘|⊃0,⊢,¯1,- jest dokładnie to, jak wyglądałoby moje rozwiązanie J 4&|{0,],_1,-w APL. Dzięki jeszcze raz!
Galen Iwanow
1
W rzeczywistości J jest wariantem APL, choć bardziej odległym niż inne bardziej podobne do APL, takie jak Dyalog i NARS2000.
Erik the Outgolfer
1

Cubix , 20 19 bajtów

Iun:^>s1ns:u@Ota3s0

Wypróbuj online!

Przenosi takie samo podejście do cubix.

Na sześcianie:

    I u
    n :
^ > s 1 n s : u
@ O t a 3 s 0 .
    . .
    . .

Pierwszy bit ^Iu:n>s1ns:u0sbuduje stos, a następnie 3atkopiuje odpowiedni element do TOS, a następnie Owysyła i @kończy program.

Giuseppe
źródło
0

Biała spacja, 84 83 bajtów

[S S S N
_Push_0][S N
S _Duplicate_0][T   T   S _Store][S S S T   S N
_Push_2][S S T  T   N
_Push_-1][T T   S _Store][S S S T   N
_Push_1][S N
S _Duplicate_1][T   N
T   T   _Read_STDIN_as_integer][S S S T T   N
_Push_3][S S S T    N
_Push_1][T  T   T   ][S S T T   N
_Push_-1][T S S N
_Multiply][T    T   S _Store][T T   T   _Retrieve_input][S S S T    S S N
_Push_4][T  S T T   _Modulo][T  T   T   _Retrieve_result][T N
S T _Print_as_integer]

Dodane litery S(spacja), T(tab) i N(nowa linia) tylko jako wyróżnienia.
[..._some_action]dodano tylko jako wyjaśnienie.

Wypróbuj online (tylko z surowymi spacjami, tabulatorami i nowymi wierszami).

Port odpowiedzi JavaScript na @Arnauld .

Objaśnienie (przykładowe dane wejściowe n=7):

Command   Explanation         Stack        Heap                  STDIN   STDOUT   STDERR

SSSN      Push 0              [0]
SNS       Duplicate top (0)   [0,0]
TTS       Store               []           {0:0}
SSSTSN    Push 2              [2]          {0:0}
SSTTN     Push -1             [2,-1]       {0:0}
TTS       Store               []           {0:0,2:-1}
SSSTN     Push 1              [1]          {0:0,2:-1}
SNS       Duplicate top (1)   [1,1]        {0:0,2:-1}
TNTT      Read STDIN as nr    [1]          {0:0,1:7,2:-1}        7
SSSTTN    Push 3              [1,3]        {0:0,1:7,2:-1}
SSSTN     Push 1              [1,3,1]      {0:0,1:7,2:-1}
TTT       Retrieve input      [1,3,7]      {0:0,1:7,2:-1}
SSTTN     Push -1             [1,3,7,-1]   {0:0,1:7,2:-1}
TSSN      Multiply (-1*7)     [1,3,-7]     {0:0,1:7,2:-1}
TTS       Store               [1]          {0:0,1:7,2:-1,3:-7}
TTT       Retrieve input      [7]          {0:0,1:7,2:-1,3:-7}
SSSTSSN   Push 4              [7,4]        {0:0,1:7,2:-1,3:-7}
TSST      Modulo (7%4)        [3]          {0:0,1:7,2:-1,3:-7}
TTT       Retrieve            [-7]         {0:0,1:7,2:-1,3:-7}
TNST      Print as integer    []           {0:0,1:7,2:-1,3:-7}           -7
                                                                                  error

Zatrzymuje się z błędem: nie zdefiniowano wyjścia.

Kevin Cruijssen
źródło