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

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 .


2
Ponieważ większość odpowiedzi to porty tego rozwiązania, chcę dodać, że sprawdziłem, czy można to udowodnić.
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]



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 .

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!


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


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

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.


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.


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.

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.