Trình tự ký hiệu xen kẽ


16

Giới thiệu

Các dấu hiệu của một số hoặc là một +, hoặc một -cho mỗi khác không số nguyên. Bản thân Zero là vô nghĩa ( +0giống như -0). Trong chuỗi sau đây, chúng ta sẽ xen kẽ giữa dấu dương , số 0dấu âm . Chuỗi bắt đầu bằng 1, vì vậy chúng tôi viết 1bằng dấu dương, bằng 0 (số này là lạ, nhưng chúng tôi chỉ nhân số với 0) và dấu âm:

1, 0, -1

Số tiếp theo là 2, và chúng tôi làm lại điều tương tự:

2, 0, -2

Trình tự cuối cùng là:

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

Hoặc một hình thức dễ đọc hơn:

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
...

Nhiệm vụ

Cho một số nguyên n không âm , xuất ra số hạng thứ n của dãy trên. Bạn có thể chọn nếu bạn sử dụng phiên bản không có chỉ mục hoặc một chỉ mục .

Các trường hợp thử nghiệm:

Không có chỉ mục:

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

Hoặc nếu bạn thích một chỉ mục:

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

Đây là , vì vậy bài nộp có số byte nhỏ nhất sẽ thắng!


Có ổn không nếu bạn bắt đầu với[0, 0, 0, -1, 0, 1...
Blue

@muddyfish không xin lỗi, nó phải bắt đầu bằng 1.
Ad Nam

Câu trả lời:



6

JavaScript ES6, 18 byte

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

Hóa ra rất giống với câu trả lời của @ LeakyNun nhưng tôi đã không thấy câu trả lời của anh ấy cho đến khi tôi đăng bài của mình.

Giải thích và Ungolfed

-~là viết tắt cho Math.ceil, hoặc làm tròn lên:

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, ...


1
(Tôi xác nhận rằng anh ấy đã không nhìn thấy giải pháp của tôi trước khi anh ấy đăng giải pháp của mình)
Leaky Nun

Math.ceil-~khác nhau; Math.ceil(1) == 1trong khi đó-~1 == 2
Cyoce

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

6

MarioLANG, 93 81 byte

một chỉ mục

Dùng thử trực tuyến

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

Giải trình :

chúng tôi bắt đầu bằng cách tham gia

;

muốn cho chúng tôi

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

sau đó chúng ta giảm byte bên trái và tăng byte bên phải với

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

chúng tôi kết thúc với

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

sau đó chúng tôi thiết lập vòng lặp

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

vòng lặp sẽ đi cho đến khi bộ nhớ trông như thế nào

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

sau đó chúng ta chỉ cần xuất kết quả

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

2
Đẹp! Bạn có vẻ thích MarioLang.
Rɪᴋᴇʀ

@EasterlyIrk Cảm giác không giống nhau từ MarioLang đến EtherFrog, mặc dù: ;(>:(. Mặc dù, hai lần [<:có thể được coi là hạnh phúc. ; P
Kevin Cruijssen

4

Python 2, 24 byte

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

Chương trình đầy đủ:

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

4

MATL, 15 12 byte

3/XkG3X\2-*_

Điều này sử dụng một chỉ mục dựa trên.

Hãy thử trực tuyến! hoặc xác minh các trường hợp thử nghiệm

Giải trình:

    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

Để chăm sóc hầu hết các vấn đề một cái gì đó như Q3/Xk-1:1G_)*có thể hoạt động tốt hơn. Thay vào đó, nó có thể được sửa đổi để lập chỉ mục dựa trên 1.
Suever

4

Haskell, 27 byte

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

Giải pháp 28 byte thú vị hơn một chút:

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

(Cả hai đều được tìm thấy 0)


3

MATL , 8 byte

:t~y_vG)

Kết quả là dựa trên 1.

Hãy thử trực tuyến!

Giải trình

Điều này xây dựng mảng 2D

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

và sau đó sử dụng lập chỉ mục tuyến tính để trích xuất thuật ngữ mong muốn. Tuyến tính phương tiện đánh chỉ số index xuống, sau đó trên (vì vậy trong mảng trên mục đầu tiên theo thứ tự tuyến tính là 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

3

Perl 5, 22 byte

21 cộng một cho -p:

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

Sử dụng lập chỉ mục 1 dựa trên.

Giải trình:

-pđặt biến $_bằng với đầu vào. Đoạn mã sau đó đặt nó bằng $_%3phần tử thứ, chia cho 3, của danh sách dựa trên 0 (-$_,$_+2)(trong đó %là modulo). Lưu ý rằng nếu $_%3là hai, thì không có phần tử nào như vậy và phép chia tiếp theo cho 3 số không xác định thành 0. -psau đó in $_.



2

Perl 6 ,  26  23 byte

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

(Câu ngắn hơn được dịch từ các câu trả lời khác)

Giải thích (của cái đầu tiên):

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

Kiểm tra:

#! /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)

2

J, 19 15 byte

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

Có lẽ cần phải chơi golf này hơn nữa ...

1 chỉ mục.

Ung dung:

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

Trong đó >>có nghĩa là đầu vào (STDIN) và <<có nghĩa là đầu ra (STDOUT).


2

Pyke, 8 7 byte (phiên bản cũ)

3.DeRt*

Hãy thử nó ở đây! - Lưu ý rằng liên kết có thể sẽ không tồn tại lâu

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

Phiên bản mới nhất

3.DhRt*_

Hãy thử nó ở đây!

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

Bạn có thể cung cấp một liên kết đến (phiên bản cũ)
Downgoat

Cam kết mới nhất nơi mã cũ hoạt động tại đây (sớm hơn hôm nay)
Blue

2

J, 27 byte

Mặc dù không phải là môn đánh gôn nhất, tôi thích nó hơn, vì nó sử dụng một chương trình nghị sự.

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

Đây là sự phân hủy cây của nó:

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

Điều này rất giống với câu trả lời J của Kenny, ở chỗ nó chọn độ lớn và dấu hiệu, nhưng khác ở chỗ tôi sử dụng một chương trình nghị sự để chọn dấu hiệu.


2

MATL, 8 byte

_3&\wq*_

Giải pháp này sử dụng lập chỉ mục dựa trên 1 vào chuỗi.

Dùng thử trực tuyến

Phiên bản sửa đổi hiển thị tất cả các trường hợp thử nghiệm

Giải trình

        % 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


2

Trên thực tế, 10 byte

3@│\u)%1-*

Hãy thử trực tuyến!

Giải trình:

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)])

2

05AB1E, 7 byte

Mã số:

(3‰`<*(

Giải thích:

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

2

GeoGebra, 44 byte

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

trong đó nmột chỉ mục.

Giải trình:

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

Không cần thiết phải tạo ra tất cả các bộ ba thông qua {n, 0, -n}, nhưng nó ngắn hơn viết ceil(n/3)hoặc một cái gì đó để có hiệu lực. Lưu ý rằng nphải được xác định để tạo đối tượng này (nếu nó không được xác định tại thời điểm này được chạy, GeoGebra sẽ nhắc bạn tạo một thanh trượt cho n).


Xin chào và chào mừng đến với PPCG! Bạn có một liên kết tôi có thể kiểm tra điều này (tốt nhất là trực tuyến)?
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ, cảm ơn! Đây là một liên kết đến một điều táo khuyết trực tuyến. Trang này trông trống rỗng một lúc, nhưng sau đó nó xuất hiện.
Joe

Ồ tuyệt. Nhưng làm thế nào để tôi đặt trong công thức? > _> Tôi đã thử dán nó vào chỗ trống và nó đã nhắc tạo một thanh trượt, nhưng không có gì khác xảy ra.
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ: Ở phía bên trái, nơi có chữ "Nhập ..." Đầu tiên, để khởi tạo n, hãy nhập một cái gì đó như n=297(điều này sẽ cung cấp cho bạn một thanh trượt được cấu hình độc đáo). Sau đó dán công thức vào hộp Nhập liệu, giờ sẽ nằm bên dưới n. (Đảm bảo nhấn return;) Công thức sẽ đánh giá đến số hạng nthứ tự của chuỗi và nó sẽ thay đổi khi bạn di chuyển thanh trượt.
Joe

2

Mê cung , 17 15 14 byte

Đã lưu 3 byte bằng cách sử dụng ý tưởng của Sok sử dụng 1-(n%3)thay vì ~(n%3-2).

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

Chương trình kết thúc với một lỗi (chia cho số 0), nhưng thông báo lỗi chuyển đến STDERR.

Hãy thử trực tuyến!

Giải trình

Chương trình hoàn toàn tuyến tính, mặc dù một số mã được thực thi ngược lại ở cuối.

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.

Con trỏ lệnh bây giờ chạm vào ngõ cụt và quay lại, vì vậy nó bắt đầu thực thi mã từ cuối:

*     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.

2

Erlang, 40 byte

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

Đáng buồn thay, Erlang không có toán tử modulo '%' và 'rem' yêu cầu khoảng trắng, thậm chí trước cả 3.


2

Lục giác , 25 byte

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

Hoặc, ở định dạng không rút gọn:

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

Hãy thử trực tuyến!

Lần đầu tiên tôi đến Hexagony, vì vậy tôi chắc chắn rằng tôi đã không làm điều này ở bất cứ đâu gần như hiệu quả như nó có thể được thực hiện ...

Tính toán -(n%3 - 1)trên một cạnh bộ nhớ, n/3 + 1trên một cạnh liền kề, sau đó nhân chúng lại với nhau.


Wow, rất thú vị để xem điều này! :)
Ad Nam

2

R, 28 byte

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

Có vẻ như đây là một biến thể của hầu hết các câu trả lời ở đây. Không dựa.

   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

Điều tốt đẹp về nó là nó xử lý nhiều đầu vào

> -((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
> 

Ban đầu tôi muốn làm như sau, nhưng không thể cắt bớt các byte thừa.

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

Sử dụng rbindđể thêm 0 và phủ định vào phạm vi 1 để nsau đó trả về nthuật ngữ thứ nhất (dựa trên một).

# 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

2

Batch (Windows), 86 byte

Thay thế.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%

Chương trình này được chạy như Alternate.bat nnơi nlà số bạn muốn gọi hàm trên.


2

APL, 12 ký tự

-×/1-0 3⊤6+⎕

0 3⊤là của APL divmod 3.


2

Java 7, 38 37 36 byte

Golf đầu tiên của tôi, hãy nhẹ nhàng

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

Hãy thử nó ở đây! (bao gồm các trường hợp thử nghiệm)

Chỉnh sửa: Tôi đã nhầm lẫn, và cũng đánh golf thêm một nhân vật bằng cách thay thế (-i%3+1)bằng (1-i%3).


1
Xin chào, và chào mừng đến với PPCG! Bạn có thể xóa khoảng trắng sau returnvà sử dụng lambda Java 8.
NoOneIsHãy

Tôi nên xác định rằng đây là Java 7. Tuy nhiên, tôi sẽ xóa khoảng trống đó. Cảm ơn!
Steven H.



1

Toán học 26 byte

Với 4 byte được lưu nhờ Martin Ender.

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

Sử dụng phương pháp tương tự như Suever.


1

Octave, 23 byte

Không có khuyết điểm mod ...

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

Sử dụng phép thuật lập chỉ mục 1 dựa trên.


Giải trình

Tạo một hàm ẩn danh sẽ:

(-[-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

Sau bước nhân, chúng ta sẽ có một ma trận 3xn như vậy (với 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

Làm ncột là quá mức cần thiết, nhưng đó là một số thuận tiện được đảm bảo đủ lớn. Lập chỉ mục tuyến tính đếm ngược từng cột từ trái sang phải, vì vậy phần tử tại chỉ mục tuyến tính 4sẽ là 2.

Tất cả các trường hợp thử nghiệm trên ideone .


1

đc, 10

?2+3~1r-*p

Sử dụng lập chỉ mục 1 dựa trên.

?              # Push input to stack
 2+            # Add 2
   3~          # divmod by 3
     1r-       # subtract remainder from 1
        *      # multiply by quotient
         p     # print
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.