Alternatif İşaret Sırası


16

Giriş

İşaret , bir dizi ya da bir olduğu +, ya da -her sıfır olmayan tamsayı. Sıfırın kendisi anlamsızdır ( +0aynıdır -0). Aşağıdaki sırada pozitif işaret , sıfır ve negatif işaret arasında geçiş yapacağız . Dizi ile başlar 1, bu yüzden 1sıfır ile pozitif bir işaretle yazıyoruz (bu garip, ancak sayıyı 0 ile çarpıyoruz) ve negatif işaretle:

1, 0, -1

Bir sonraki sayı, 2aynı şeyi tekrar yapıyoruz:

2, 0, -2

Sıra sonunda:

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

Veya daha okunabilir bir form:

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

Görev

Bir negatif olmayan bir sayıyı göz önüne alındığında , n çıkış, N inci yukarıda görülen diziye ait bir terimdir. Sıfır dizinli veya tek dizinli sürümü kullanıp kullanmayacağınızı seçebilirsiniz .

Test senaryoları:

Sıfır endeksli:

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

Veya tek endeksli tercih ediyorsanız:

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

Bu , bu yüzden en az bayt ile gönderme kazanır!


İle başlarsanız sorun değil mi[0, 0, 0, -1, 0, 1...
Blue

@muddyfish üzgünüm, başlamak zorunda 1.
Adnan

Yanıtlar:


6

Jöle, 7 bayt

+6d3’PN

Sıfır endekslendi. Test örnekleri burada.

Açıklama:

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

6

JavaScript ES6, 18 bayt

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

@ LeakyNun'un cevabına çok benziyordu ama benimkini gönderene kadar onun görmedim.

Açıklama ve Ungolfed

-~kısaltmasıdır Math.ceilveya yuvarlanı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, ...


1
(Bu vesileyle, çözümünü göndermeden önce çözümümü görmediğini kanıtlarım)
Leaky Nun

Math.ceilve -~farklı; Math.ceil(1) == 1oysa-~1 == 2
Cyoce

1
1 bayt daha kısa:n=>~(n/3)*~-(n%3)
Cyoce

6

MarioLANG, 93 81 bayt

Bir endeksli

Çevrimiçi Deneyin

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

Açıklama:

itici güç alarak başlarız

;

bize ne verecek

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

daha sonra sol byte'ı azaltır ve sağ byte'ı

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

Sonunda

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

sonra döngüyü kurduk

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

bellek hafızası görünene kadar döngü devam edecek

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

o zaman sadece sonucu çıkarmamız gerekir

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

2
Güzel! MarioLang'ı seviyor gibisin.
Rɪᴋᴇʀ

@EasterlyIrk Bu duygu MarioLang ile EtherFrog arasında karşılıklı görünmüyor: ;(ve >:(. Bununla birlikte, iki kez [<:biraz mutlu sayılabilir. ; P
Kevin Cruijssen

4

Python 2, 24 bayt

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

Tam 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

4

MATL, 15 12 bayt

3/XkG3X\2-*_

Bu bir tabanlı indeksleme kullanır.

Çevrimiçi deneyin! veya test senaryolarını doğrulayın

Açıklama:

    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

Sorunların çoğunu halletmek gibi bir şey Q3/Xk-1:1G_)*daha iyi olabilir. Muhtemelen 1 tabanlı indeksleme için daha fazla değiştirilebilir.
Suever

4

Haskell, 27 bayt

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

Biraz daha ilginç 28 bayt çözümü:

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

(Her ikisi de 0-dizinlidir)


3

MATL , 8 bayt

:t~y_vG)

Sonuç 1 tabanlıdır.

Çevrimiçi deneyin!

açıklama

Bu 2D dizisini oluşturur

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

ve sonra istenen terimi çıkarmak için doğrusal indeksleme kullanır. Doğrusal indeksleme aracı endeksi aşağı, daha sonra karşısında (dolayısıyla yukarıdaki dizide lineer sırayla ilk girişlerdir 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 bayt

21 artı bir şunlar için -p:

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

1 tabanlı indeksleme kullanır.

Açıklama:

-pdeğişkeni $_girdiye eşit olarak ayarlar . Daha sonra kod $_%3, 0 tabanlı listenin (-$_,$_+2)( %modulo olduğu) 3'e bölünen th öğesine eşit olarak ayarlar . Eğer $_%3iki ise , böyle bir eleman olmadığını ve sonraki 3'e bölünmenin tanımsız olanı 0 olarak rakamladığını ve -pardından yazdırdığını unutmayın $_.



2

Perl 6 ,  26  23 bayt

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

(Daha kısa olan diğer yanıtlardan çevrilmiştir)

Açıklama (birincisinin):

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

Ölçek:

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

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

Muhtemelen bu golf daha gerekir ...

1 endeksli.

Ungolfed:

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

Burada >>girdi (STDIN) ve <<çıktı (STDOUT) anlamına gelir.


2

Pyke, 8 7 bytes (eski versiyon)

3.DeRt*

Burada deneyin! - Bağlantının muhtemelen uzun sürmeyeceğini unutmayın

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

En yeni sürüm

3.DhRt*_

Burada deneyin!

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

(Eski versiyona) bir bağlantı sağlayabilir misiniz
Downgoat

Eski kodun burada çalıştığı son taahhüt (bu, bugün daha erken)
Mavi

2

J, 27 bayt

En golf olmasa da, bir gündem kullandığından daha çok hoşuma gidiyor.

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

İşte ağaç ayrışması:

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

Bu, Kenny'nin J cevabına çok benziyor, çünkü büyüklüğü ve işareti seçiyor, ancak işareti seçmek için bir gündem kullanmam farklı.


2

MATL, 8 bayt

_3&\wq*_

Bu çözüm sekansta 1 tabanlı indeksleme kullanır.

Çevrimiçi Deneyin

Tüm test senaryolarını gösteren değiştirilmiş versiyon

açıklama

        % 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

Aslında, 10 bayt

3@│\u)%1-*

Çevrimiçi deneyin!

Açıklama:

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 bayt

Kod:

(3‰`<*(

Açıklaması:

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

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

burada ntek dizinli.

Açıklama:

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

Tüm üçüzleri oluşturmak gerekli değildir {n, 0, -n}, ancak yazmaktan ceil(n/3)veya bu konuda bir şeyden daha kısadır . nBu nesneyi oluşturmak için tanımlanması gerektiğini unutmayın (bu, çalıştırıldığı sırada tanımlanmamışsa, GeoGebra için bir kaydırıcı oluşturmanızı ister n).


Merhaba ve PPCG'ye hoş geldiniz! Bunu test edebileceğim bir bağlantınız var mı (tercihen çevrimiçi)?
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ, teşekkürler! İşte çevrimiçi bir uygulama şeyine bir bağlantı . Sayfa bir süre boş görünüyordu, ama sonra ortaya çıktı.
Joe

Vaay havalı. Ama formüle nasıl koyabilirim? > _> Boşluğa yapıştırmayı denedim ve bir kaydırıcı oluşturmayı istedim, ancak başka bir şey olmadı.
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ: Sol tarafta, "Giriş ..." yazdığı yerde İlk olarak, başlatmak için nbenzer bir şey girin n=297(bu size güzel yapılandırılmış bir kaydırıcı verecektir). Ardından, formülü, şimdi simgesinin altında olması gereken Giriş kutusuna yapıştırın n. (Return tuşuna nbastığınızdan emin olun;) Formül dizinin terimine göre değerlendirilmeli ve kaydırıcıyı hareket ettirdiğinizde değişmelidir.
Joe

2

Labirent , 17 15 14 bayt

Sok 1-(n%3)yerine kullanma fikrini kullanarak 3 bayt kaydedildi ~(n%3-2).

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

Program bir hata ile sonlanır (sıfıra bölme), ancak hata mesajı STDERR'a gider.

Çevrimiçi deneyin!

açıklama

Program tamamen doğrusaldır, ancak bazı kodlar sonunda tersine yürütülür.

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.

Talimat işaretçisi şimdi çıkmaz bir noktaya çarpıyor ve geri dönüyor, bu yüzden kodu sondan yürütmeye başlıyor:

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

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

Ne yazık ki Erlang'ın '%' modulo operatörü yoktur ve 'rem' 3'ten önce bile boşluk gerektirir.


2

Altıgen , 25 bayt

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

Veya küçültülmemiş biçimde:

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

Çevrimiçi deneyin!

Hexagony'e ilk adımım, bu yüzden bunu olabildiğince verimli bir şekilde yapmadığımdan eminim ...

-(n%3 - 1)Bir bellek kenarında, n/3 + 1bitişik bir tarafta hesaplar , sonra bunları birlikte çarpar.


Vay, bunu görmek çok ilginç! :)
Adnan

2

R, 28 bayt

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

Buradaki cevapların çoğunun bir varyasyonu gibi görünüyor. Sıfır tabanlı.

   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

Bununla ilgili güzel olan şey, çoklu girişleri işlemesi

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

Başlangıçta aşağıdakileri yapmak istedim, ancak fazladan baytları kesemedim.

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

Kullanımları rbind1 aralığına 0'lar ve negatifleri eklemek nsonra dönmek n'inci dönem (esaslı bir).

# 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

Toplu İşlem (Windows), 86 bayt

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%

Bu program, işlevi çağırmak istediğiniz numaranın olduğu Alternate.bat nyerde çalıştırılır n.


2

APL, 12 karakter

-×/1-0 3⊤6+⎕

0 3⊤APL's divmod 3.


2

Java 7, 38 37 36 bayt

İlk golfüm, nazik ol

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

Burada deneyin! (test senaryoları dahil)

Düzenleme: miscounted ve ayrıca değiştirerek bir daha karakterli kapalı golfed (-i%3+1)ile (1-i%3).


1
Merhaba, PPCG'ye hoş geldiniz! Sonraki alanı kaldırabilir returnve bir Java 8 lambda kullanabilirsiniz.
NoOneIsHere

Bunun Java 7 olduğunu belirtmeliyim. Yine de bu alanı kaldıracağım. Teşekkürler!
Steven H.


1

MATLAB / Oktav, 27 bayt

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

Bu, kullanılarak çağrılabilen anonim bir işlev oluşturur ans(n). Bu çözüm 1 tabanlı indeksleme kullanır.

Tüm test örnekleri


1

Mathematica 26 bayt

Martin Ender sayesinde 4 bayt kurtardı.

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

Suever ile aynı yaklaşımı kullanır.


1

Oktav, 23 bayt

Hiçbir mod eksileri ile ...

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

1 tabanlı indeksleme büyüsü kullanır.


açıklama

Anonim bir işlev oluşturur:

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

Çarpma adımından sonra şöyle bir 3xn matrisimiz olacaktır (n = 12 için):

 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

nSütun yapmak çok fazladır, ancak yeterince büyük olması garanti edilen uygun bir sayıdır. Doğrusal indeksleme her sütunu soldan sağa doğru sayar, bu nedenle doğrusal dizindeki öğe 4olur 2.

Tüm test örnekleri ideone üzerinde .


1

dc, 10

?2+3~1r-*p

1 tabanlı indeksleme kullanır.

?              # Push input to stack
 2+            # Add 2
   3~          # divmod by 3
     1r-       # subtract remainder from 1
        *      # multiply by quotient
         p     # print
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.