Kolejność znaków naprzemiennych

16

Wprowadzenie

Znak pewnej liczby jest albo +, albo -dla każdej niezerowej liczby całkowitej. Samo zero jest bez znaku ( +0jest takie samo jak -0). W poniższej sekwencji będziemy na przemian znak dodatni , zero i znak ujemny . Sekwencja zaczyna się od 1, więc piszemy 1ze znakiem dodatnim, zerem (ten jest dziwny, ale po prostu mnożymy liczbę przez 0) i znakiem ujemnym:

1, 0, -1

Następna liczba to 2i robimy to samo ponownie:

2, 0, -2

Sekwencja ostatecznie jest:

1, 0, -1, 2, 0, -2, 3, 0, -3, 4, 0, -4, 5, 0, -5, 6, 0, -6, 7, 0, -7, ...

Lub bardziej czytelna forma:

a(0) = 1
a(1) = 0
a(2) = -1
a(3) = 2
a(4) = 0
a(5) = -2
a(6) = 3
a(7) = 0
a(8) = -3
a(9) = 4
...

Zadanie

Biorąc pod uwagę nieujemną liczbę całkowitą n , wyślij n- ty składnik powyższej sekwencji. Możesz wybrać, czy używasz wersji z indeksem zerowym, czy z jedną indeksowaną .

Przypadki testowe:

Zero indeksowane:

a(0) = 1
a(11) = -4
a(76) = 0
a(134) = -45
a(296) = -99

Lub jeśli wolisz jeden indeksowany:

a(1) = 1
a(12) = -4
a(77) = 0
a(135) = -45
a(297) = -99

To jest , więc wygrywanie z najmniejszą liczbą bajtów wygrywa!

Adnan
źródło
Czy to w porządku, jeśli zaczniesz od[0, 0, 0, -1, 0, 1...
Blue
@muddyfish nie przepraszam, musi zacząć 1.
Adnan

Odpowiedzi:

6

Galaretka, 7 bajtów

+6d3’PN

Zero indeksowane. Przypadki testowe tutaj.

Wyjaśnienie:

+6      Add 6:     x+6
d3      Divmod:    [(x+6)/3, (x+6)%3]
’       Decrement: [(x+6)/3-1, (x+6)%3-1]
P       Product    ((x+6)/3-1) * ((x+6)%3-1)
Lynn
źródło
6

JavaScript ES6, 18 bajtów

n=>-~(n/3)*(1-n%3)

Okazało się, że jest bardzo podobny do odpowiedzi @ LeakyNun, ale widziałem go dopiero po opublikowaniu mojej.

Wyjaśnienie i nieprzygotowany

-~jest skrótem Math.ceillub zaokrąglaniem w górę:

n =>               // input in var `n`
    Math.ceil(n/3) // Get every 3rd number 1,1,1,2,2,2, etc.
    *
    (1-n%3)        // 1, 0, -1, 1, 0, -1, ...

Downgoat
źródło
1
(Niniejszym potwierdzam, że nie widział mojego rozwiązania, zanim opublikował swoje rozwiązanie)
Leaky Nun
Math.ceili -~są różne; Math.ceil(1) == 1mając na uwadze, że-~1 == 2
Cyoce
1
1 bajt krótszy:n=>~(n/3)*~-(n%3)
Cyoce
6

MarioLANG, 93 81 bajtów

z jednym indeksem

Wypróbuj online

;(-))+(-
"============<
>:(![<:![<:)![
 !=#="!#="!=#=
!  < !-< !- <
#==" #=" #=="

Objaśnienie:

zaczynamy od założenia

;

które nam dają

          v
... 0 0 input 0 0 ...

następnie zmniejszamy lewy bajt i zwiększamy prawy bajt o

;(-))+(
=======

kończymy z

           v
... 0 -1 input +1 0 ...

następnie konfigurujemy pętlę

;(-))+(-
"============<
>  ![< ![<  ![
   #=" #="  #=
!  < !-< !- <
#==" #=" #=="

pętla będzie działać, dopóki pamięć nie będzie wyglądać

         v 
... 0 -X 0 +X 0 ...

musimy jedynie przedstawić wynik

;(-))+(-
"============<
>:(![<:![<:)![
 !=#="!#="!=#=
!  < !-< !- <
#==" #=" #=="
Ether Frog
źródło
2
Ładny! Wygląda na to, że lubisz MarioLanga.
Rɪᴋᴇʀ
@EasterlyIrk To uczucie nie wydaje się jednakowe dla MarioLanga i EtherFrog: ;(i >:(. Chociaż dwa razy [<:można uznać za nieco szczęśliwy. ; P
Kevin Cruijssen
4

Python 2, 24 bajty

lambda n:(n/3+1)*(1-n%3)

Pełny program:

a=lambda n:(n/3+1)*(1-n%3)

print(a(0))   #   1
print(a(11))  #  -4
print(a(76))  #   0
print(a(134)) # -45
print(a(296)) # -99
Leaky Nun
źródło
4

MATL, 15 12 bajtów

3/XkG3X\2-*_

Korzysta z jednego indeksowania.

Wypróbuj online! lub zweryfikuj przypadki testowe

Wyjaśnienie:

    G          #Input
     3X\       #Modulus, except multiples of 3 give 3 instead of 0
        2-     #Subtract 2, giving -1, 0 or 1
3/Xk           #Ceiling of input divided by 3.
          *    #Multiply 
           _   #Negate
DJMcMayhem
źródło
Aby rozwiązać większość problemów, coś takiego Q3/Xk-1:1G_)*może działać lepiej. Prawdopodobnie można go jeszcze bardziej zmodyfikować w celu indeksowania 1.
Suever
4

Haskell, 27 bajtów

f x=div(x+3)3*(1-mod(x+3)3)

Nieco bardziej interesujące rozwiązanie 28-bajtowe:

(((\i->[i,0,-i])=<<[1..])!!)

(Oba są 0zindeksowane)

Michael Klein
źródło
3

MATL , 8 bajtów

:t~y_vG)

Wynik jest oparty na 1.

Wypróbuj online!

Wyjaśnienie

To tworzy tablicę 2D

 1  2  3  4  5 ...
 0  0  0  0  0 ...
-1 -2 -3 -4 -5 ...

a następnie używa indeksowania liniowego w celu wyodrębnienia pożądanego terminu. Liniowe środki indeksujące indeks w dół, a następnie poprzecznie (to w powyższej tablicy się pierwszymi wpisami w celu liniowych 1, 0, -1, 2, 0, ...)

:     % Vector [1 2 ... N], where N is implicit input
t~    % Duplicate and logical negate: vector of zeros
y_    % Duplicate array below the top and negate: vector [-1 -2 ... -N]
v     % Concatenate all stack contents vertically
G)    % Index with input. Implicit display
Luis Mendo
źródło
3

Perl 5, 22 bajtów

21 plus jeden za -p:

$_=(-$_,$_+2)[$_%3]/3

Wykorzystuje indeksowanie 1.

Wyjaśnienie:

-pustawia zmienną $_równą wejściu. Następnie kod ustawia go jako równy $_%3th elementu podzielonemu przez 3 z listy opartej na 0 (-$_,$_+2)(gdzie %jest modulo). Zauważ, że jeśli $_%3jest dwa, to nie ma takiego elementu, a kolejne dzielenie przez 3 oznacza niezdefiniowane na 0, -pa następnie drukuje $_.

msh210
źródło
3

Bash, 28 25 bajtów

echo $[(1+$1/3)*(1-$1%3)]
rexkogitans
źródło
@DigitalTrauma, tkx, nie wiedziałem o tym ...
rexkogitans
2

Perl 6 ,  26  23 bajtów

{({|(++$,0,--$)}...*)[$_]}
{($_ div 3+1)*(1-$_%3)}

(Krótszy został przetłumaczony z innych odpowiedzi)

Objaśnienie (pierwszego):

{ # bare block with implicit parameter 「$_」
  (

    # start of sequence generator

    { # bare block
      |(  # slip ( so that it flattens into the outer sequence )
        ++$, # incrementing anon state var =>  1, 2, 3, 4, 5, 6
        0,   # 0                           =>  0, 0, 0, 0, 0, 0
        --$  # decrementing anon state var => -1,-2,-3,-4,-5,-6
      )
    }
    ...  # repeat
    *    # indefinitely

    # end of sequence generator

  )[ $_ ] # get the nth one (zero based)
}

Test:

#! /usr/bin/env perl6
use v6.c;
use Test;

# store it lexically
my &alt-seq-sign = {({|(++$,0,--$)}...*)[$_]}
my &short-one = {($_ div 3+1)*(1-$_%3)}

my @tests = (
    0 =>   1,
   11 =>  -4,
   76 =>   0,
  134 => -45,
  296 => -99,
  15..^30  => (6,0,-6,7,0,-7,8,0,-8,9,0,-9,10,0,-10)
);

plan @tests * 2 - 1;

for @tests {
  is alt-seq-sign( .key ), .value, 'alt-seq-sign  ' ~ .gist;

  next if .key ~~ Range; # doesn't support Range as an input
  is short-one(    .key ), .value, 'short-one     ' ~ .gist;
}
1..11
ok 1 - alt-seq-sign  0 => 1
ok 2 - short-one     0 => 1
ok 3 - alt-seq-sign  11 => -4
ok 4 - short-one     11 => -4
ok 5 - alt-seq-sign  76 => 0
ok 6 - short-one     76 => 0
ok 7 - alt-seq-sign  134 => -45
ok 8 - short-one     134 => -45
ok 9 - alt-seq-sign  296 => -99
ok 10 - short-one     296 => -99
ok 11 - alt-seq-sign  15..^30 => (6 0 -6 7 0 -7 8 0 -8 9 0 -9 10 0 -10)
Brad Gilbert b2gills
źródło
2

J, 19 15 bajtów

>.@(%&3)*1-3|<:

Prawdopodobnie trzeba zagrać w golfa dalej ...

1-indeksowany.

Nie golfowany:

>> choose_sign      =: 1-3|<:      NB. 1-((n-1)%3)
>> choose_magnitude =: >.@(%&3)    NB. ceil(n/3)
>> f                =: choose_sign * choose_magnitude
>> f 1 12 77
<< 1 _4 0

Gdzie >>oznacza wejście (STDIN) i <<oznacza wyjście (STDOUT).

Leaky Nun
źródło
2

Pyke, 8 7 bajtów (stara wersja)

3.DeRt*

Wypróbuj tutaj! - Pamiętaj, że link prawdopodobnie nie potrwa długo

3.D      - a,b = divmod(input, 3)
   e     - a = ~a -(a+1)
     t   - b -= 1
      *  - a = a*b
         - implicit output a

Najnowsza wersja

3.DhRt*_

Wypróbuj tutaj!

3.D      - a,b = divmod(input, 3)
   h     - a+=1
     t   - b-=1
      *  - a = a*b
       _ - a = -a
         - implicit output a
niebieski
źródło
Czy możesz podać link do (starej wersji)
Downgoat
Najnowsze popełnić gdzie stary kod działa tutaj (to jest w dniu dzisiejszym)
Niebieski
2

J, 27 bajtów

Nie jestem najbardziej golfistą, ale podoba mi się to bardziej, ponieważ wykorzystuje program.

>.@(>:%3:)*1:`0:`_1:@.(3|])

Oto rozkład drzewa:

         ┌─ >.      
  ┌─ @ ──┤    ┌─ >: 
  │      └────┼─ %  
  │           └─ 3: 
  ├─ *              
──┤           ┌─ 1: 
  │      ┌────┼─ 0: 
  │      │    └─ _1:
  └─ @. ─┤          
         │    ┌─ 3  
         └────┼─ |  
              └─ ]  

Jest to bardzo podobne do odpowiedzi J Kenny'ego, ponieważ wybiera wielkość i znak, ale różni się tym, że używam programu do wyboru znaku.

Conor O'Brien
źródło
2

MATL, 8 bajtów

_3&\wq*_

To rozwiązanie wykorzystuje indeksowanie 1 do sekwencji.

Wypróbuj online

Zmodyfikowana wersja pokazująca wszystkie przypadki testowe

Wyjaśnienie

        % Implicitly grab the input
_       % Negate the input
3&\     % Compute the modulus with 3. The second output is floor(N/3). Because we negated
        % the input, this is the equivalent of ceil(input/3)
w       % Flip the order of the outputs
q       % Subtract 1 from the result of mod to turn [0 1 2] into [-1 0 1]
*       % Take the product with ceil(input/3)
_       % Negate the result so that the sequence goes [N 0 -N] instead of [-N 0 N]
        % Implicitly display the result
Suever
źródło
2

Właściwie 10 bajtów

3@│\u)%1-*

Wypróbuj online!

Wyjaśnienie:

3@│\u)%1-*
3@│         push 3, swap, duplicate entire stack ([n 3 n 3])
   \u)      floor division, increment, move to bottom ([n 3 n//3+1])
      %1-   mod, subtract from 1 ([1-n%3 n//3+1])
         *  multiply ([(1-n%3)*(n//3+1)])
Mego
źródło
2

05AB1E, 7 bajtów

Kod:

(3‰`<*(

Wyjaśniono:

(           # negate input: 12 -> -12
 3‰         # divmod by 3: [-4, 0]
   `        # flatten array: 0, -4
    <       # decrease the mod-result by 1: -1, -4
     *      # multiply: 4
      (     # negate -4
Emigna
źródło
2

GeoGebra, 44 bajty

Element[Flatten[Sequence[{t,0,-t},t,1,n]],n]

gdzie njest zindeksowany.

Wyjaśnienie:

Element[                      , n] # Return the nth element of the list                  .
 Flatten[                    ]     # Strip all the unnecessary braces from the list     /|\
  Sequence[{t,0,-t}, t, 1, n]      # Generate a list of lists of the form {t, 0, -t}     |
                             # This list will start with {1,0,-1} and end with {n,0,-n}  |

Nie jest konieczne generowanie wszystkich trojaczków {n, 0, -n}, ale jest ono krótsze niż pisanie ceil(n/3)lub coś w tym rodzaju. Pamiętaj, że nnależy zdefiniować, aby utworzyć ten obiekt (jeśli nie jest zdefiniowany w momencie jego uruchomienia, GeoGebra wyświetli monit o utworzenie suwaka n).

Joe
źródło
Witaj w PPCG! Czy masz link, który mogę przetestować (najlepiej online)?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ, dzięki! Oto link do apletu internetowego thingamabob. Strona przez chwilę wydawała się pusta, ale potem się pojawiła.
Joe
Fajnie. Ale jak mam wstawić formułę? > _> Próbowałem wkleić go w puste miejsce i pojawiło się polecenie utworzenia suwaka, ale nic innego się nie wydarzyło.
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ: Po lewej stronie, gdzie jest napisane „Input ...” Najpierw, aby zainicjować n, wprowadź coś takiego n=297(da ci to suwak, który jest ładnie skonfigurowany). Następnie wklej formułę do pola Input, które powinno znajdować się poniżej n. (Upewnij się, że naciśniesz return;) Formuła powinna oceniać do nth-tego ciągu sekwencji i powinna się zmieniać po przesunięciu suwaka.
Joe
2

Labirynt , 17 15 14 bajtów

Zaoszczędzono 3 bajty, korzystając z pomysłu Sok 1-(n%3)zamiast ~(n%3-2).

1?:#/)}_3%-{*!

Program kończy się błędem (dzielenie przez zero), ale komunikat o błędzie trafia do STDERR.

Wypróbuj online!

Wyjaśnienie

Program jest całkowicie liniowy, chociaż część kodu jest wykonywana na końcu w odwrotnej kolejności.

1     Turn top of stack into 1.
?:    Read input as integer and duplicate.
#     Push stack depth (3).
/)    Divide and increment.
}     Move over to auxiliary stack.
_3%   Take other copy modulo 3.
-     Subtract from 1. This turns 0, 1, 2 into 1, 0, -1, respectively.
{*    Move other value back onto main stack and multiply.
!     Output as integer.

Wskaźnik instrukcji trafia teraz w ślepy zaułek i odwraca się, więc zaczyna wykonywać kod od końca:

*     Multiply two (implicit) zeros.
{     Pull an (implicit) zero from the auxiliary to the main stack.
-     Subtract two (implicit) zeros from one another.
      Note that these were all effectively no-ops due to the stacks which are
      implicitly filled with zeros.
%     Attempt modulo, which terminates the program due to a division-by-zero error.
Martin Ender
źródło
2

Erlang, 40 bajtów

F=fun(N)->trunc((N/3+1)*(1-N rem 3))end.

Niestety Erlang nie ma operatora modulo „%”, a „rem” wymaga spacji, nawet przed 3.

fxk8y
źródło
2

Sześciokąt , 25 bajtów

?'+}@/)${':/3$~{3'.%(/'*!

Lub w formacie niezminimalizowanym:

    ? ' + }
   @ / ) $ {
  ' : / 3 $ ~
 { 3 ' . % ( /
  ' * ! . . .
   . . . . .
    . . . .

Wypróbuj online!

Mój pierwszy wypad do Hexagony, więc jestem pewien, że nie zrobiłem tego tak blisko, jak to możliwe ...

Oblicza -(n%3 - 1)na jednej krawędzi pamięci, n/3 + 1na sąsiedniej, a następnie mnoży je razem.

Sok
źródło
Wow, bardzo interesujące to zobaczyć! :)
Adnan
2

R, 28 bajtów

-((n=scan())%%3-1)*(n%/%3+1)

Wygląda na to, że jest to odmiana większości odpowiedzi tutaj. Zero oparty.

   n=scan()                  # get input from STDIN
  (        )%%3-1            # mod by 3 and shift down (0,1,2) -> (-1,0,1)
-(               )           # negate result (1,0,-1), this handles the alternating signs
                  *(n%/%3+1) # integer division of n by 3, add 1, multiply by previous

Zaletą jest to, że obsługuje wiele wejść

> -((n=scan())%%3-1)*(n%/%3+1)
1: 0 3 6 9 1 4 7 10 2 5 8 11
13: 
Read 12 items
 [1]  1  2  3  4  0  0  0  0 -1 -2 -3 -4
> 

Początkowo chciałem wykonać następujące czynności, ale nie mogłem usunąć dodatkowych bajtów.

rbind(I<-1:(n=scan()),0,-I)[n]

Używa rbinddodawania zer i negatywów do zakresu 1, na następnie zwraca ten ntermin (oparty na jednym).

# for n = 5
rbind(                    )    # bind rows 
            n=scan()           # get input from STDIN and assign to n
      I<-1:(        )          # build range 1 to n and assign to I
                     ,0        # add a row of zeros (expanded automatically)
                       ,-I     # add a row of negatives
                           [n] # return the n'th term
MickyT
źródło
2

Partia (Windows), 86 bajtów

Alternate.bat

SET /A r=%1%%3
SET /A d=(%1-r)/3+1
IF %r%==0 ECHO %d%
IF %r%==1 ECHO 0
IF %r%==2 ECHO -%d%

Ten program jest uruchamiany tak, jak Alternate.bat ngdzie njest numer, na który chcesz wywołać funkcję.

Drew Christensen
źródło
2

APL, 12 znaków

-×/1-0 3⊤6+⎕

0 3⊤jest APL divmod 3.

lstefano
źródło
2

Java 7, 38 37 36 bajtów

Mój pierwszy golf, bądź łagodny

int a(int i){return(1+i/3)*(1-i%3);}

Wypróbuj tutaj! (przypadki testowe w zestawie)

Edycja: miscounted, a także golfed się jeszcze jeden znak, zastępując (-i%3+1)z (1-i%3).

Steven H.
źródło
1
Witaj i witaj w PPCG! Możesz usunąć miejsce później returni użyć lambda Java 8.
NoOneIsHere
Powinienem jednak zaznaczyć, że to była Java 7. Usunę jednak to miejsce. Dzięki!
Steven H.
1

MATLAB / Octave, 27 bajtów

@(n)ceil(n/3)*(mod(-n,3)-1)

Tworzy to anonimową funkcję, którą można wywołać za pomocą ans(n) . To rozwiązanie wykorzystuje indeksowanie 1.

Wszystkie przypadki testowe

Suever
źródło
1

Mathematica 26 bajtów

Z 4 bajtami zapisanymi dzięki Martinowi Enderowi.

⎡#/3⎤(-#~Mod~3-1)&

Stosuje to samo podejście, co Suever.

DavidC
źródło
1

Oktawa, 23 bajty

Bez modów ...

@(n)(-[-1:1]'*[1:n])(n)

Wykorzystuje magię indeksowania 1.


Wyjaśnienie

Tworzy anonimową funkcję, która:

(-[-1:1]'*[1:n])(n)
  [-1:1]              % make a row vector [-1 0 1]
 -      '             % negate and take its transpose making a column vector
          [1:n]       % make a row vector [1..n], where n is the input
         *            % multiply with singleton expansion
               (n)    % use linear indexing to get the nth value

Po pomnożeniu otrzymamy macierz 3xn taką (dla n = 12):

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

Tworzenie nkolumn to przesada, ale jest to wygodna liczba, która z pewnością jest wystarczająco duża. Indeksowanie liniowe odlicza każdą kolumnę od lewej do prawej, więc element o indeksie liniowym 4będzie 2.

Wszystkie przypadki testowe na ideone .

zlewka
źródło
1

dc, 10

?2+3~1r-*p

Wykorzystuje indeksowanie 1.

?              # Push input to stack
 2+            # Add 2
   3~          # divmod by 3
     1r-       # subtract remainder from 1
        *      # multiply by quotient
         p     # print
Cyfrowa trauma
źródło