สลับลำดับสัญญาณ


16

บทนำ

สัญญาณของตัวเลขเป็นทั้ง+หรือ-ทุกที่ไม่ใช่ศูนย์จำนวนเต็ม ศูนย์ตัวเองนั้นไม่มีความหมาย ( +0เหมือนกัน-0) ในลำดับต่อไปนี้เราจะสลับกันระหว่างสัญญาณบวกที่ศูนย์และเครื่องหมายลบ ลำดับเริ่มต้นด้วย1เราเขียน1ด้วยเครื่องหมายบวกโดยมีศูนย์ (อันนี้แปลก แต่เราแค่คูณจำนวนด้วย 0) และเครื่องหมายลบ:

1, 0, -1

หมายเลขถัดไปคือ2และเราทำสิ่งเดียวกันอีกครั้ง:

2, 0, -2

ลำดับในที่สุดคือ:

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

หรือรูปแบบที่อ่านได้มากขึ้น:

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

งาน

ได้รับจำนวนเต็มไม่เป็นลบnเอาท์พุทn THระยะของลำดับข้างต้น คุณสามารถเลือกได้หากคุณใช้เวอร์ชันที่มีดัชนีเป็นศูนย์หรือที่มีดัชนีเดียว

กรณีทดสอบ:

ศูนย์การจัดทำดัชนี:

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

หรือหากคุณต้องการทำดัชนีหนึ่งรายการ:

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

นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!


มันก็โอเคถ้าคุณเริ่มต้นด้วย[0, 0, 0, -1, 0, 1...
สีฟ้า

@muddyfish 1ไม่ขอโทษก็มีการเริ่มต้นด้วย
Adnan

คำตอบ:



6

JavaScript ES6, 18 ไบต์

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

กลายเป็นคล้ายกับคำตอบของ @ LeakyNun แต่ฉันไม่เห็นเขาจนกระทั่งฉันโพสต์ของฉัน

คำอธิบายและ Ungolfed

-~เป็นการจดชวเลขMath.ceilหรือการปัดเศษ:

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
(ฉันขอยืนยันว่าเขาไม่ได้เห็นวิธีแก้ปัญหาของฉันก่อนที่เขาจะโพสต์วิธีแก้ปัญหาของเขา)
Leaky Nun

Math.ceilและ-~มีความแตกต่าง; Math.ceil(1) == 1ในขณะที่-~1 == 2
Cyoce

1
สั้นลง 1 ไบต์:n=>~(n/3)*~-(n%3)
Cyoce

6

MarioLANG, 93 81 ไบต์

หนึ่งในการจัดทำดัชนี

ลองออนไลน์

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

คำอธิบาย:

เราเริ่มต้นด้วยการใส่ความ

;

ที่ให้เรา

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

จากนั้นเราจะลดไบต์ซ้ายและเพิ่มไบต์ขวาด้วย

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

เราจบลงด้วย

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

จากนั้นเราจะตั้งค่าลูป

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

ลูปจะไปจนกว่าหน่วยความจำจะมีลักษณะเหมือน

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

จากนั้นเราเพียงแค่ต้องการผลลัพธ์

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

2
ดี! คุณดูเหมือนจะชอบ MarioLang
Rɪᴋᴇʀ

@EasterlyIrk ความรู้สึกที่ดูเหมือนจะไม่ร่วมกันจากการ MarioLang EtherFrog แม้ว่า: และ;( >:(แม้ว่าสองครั้ง[<:อาจถือว่ามีความสุขเล็กน้อย ; P
Kevin Cruijssen


4

MATL, 15 12 ไบต์

3/XkG3X\2-*_

สิ่งนี้ใช้การจัดทำดัชนีตามหนึ่ง

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบ

คำอธิบาย:

    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

เพื่อดูแลปัญหาส่วนใหญ่บางอย่างเช่นQ3/Xk-1:1G_)*อาจทำงานได้ดีขึ้น มันอาจจะสามารถแก้ไขเพิ่มเติมสำหรับการจัดทำดัชนีแบบ 1 แทนได้
Suever

4

Haskell, 27 ไบต์

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

โซลูชัน 28 ไบต์ที่น่าสนใจยิ่งขึ้นเล็กน้อย:

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

(ทั้งคู่ถูกทำ0ดัชนีไว้)


3

MATL , 8 ไบต์

:t~y_vG)

ผลลัพธ์จะเป็นแบบ 1

ลองออนไลน์!

คำอธิบาย

สิ่งนี้จะสร้างอาร์เรย์ 2 มิติ

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

จากนั้นใช้การจัดทำดัชนีเชิงเส้นเพื่อแยกคำที่ต้องการ การจัดทำดัชนีเชิงเส้นหมายถึงดัชนีลงแล้วข้าม (ดังนั้นในอาร์เรย์ข้างต้นรายการแรกในการสั่งซื้อเชิงเส้น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 ไบต์

21 บวกหนึ่งสำหรับ-p:

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

ใช้การจัดทำดัชนีแบบอิง 1

คำอธิบาย:

-pตั้งค่าตัวแปร$_เท่ากับอินพุต จากนั้นโค้ดจะตั้งค่าเท่ากับ$_%3อิลิเมนต์ th หารด้วย 3 ของรายการ(-$_,$_+2)ที่%เป็น0 (โดยที่modulo) โปรดทราบว่าถ้า$_%3เป็นสองแล้วไม่มีองค์ประกอบดังกล่าวและส่วนที่ตามมาด้วย 3 numifies undefined 0 พิมพ์แล้ว-p$_



2

Perl 6 ,  26  23 ไบต์

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

(อันที่สั้นกว่านั้นแปลมาจากคำตอบอื่น ๆ )

คำอธิบาย (ของอันแรก):

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

ทดสอบ:

#! /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 ไบต์

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

อาจจำเป็นต้องเล่นกอล์ฟต่อไป ...

1 การจัดทำดัชนี

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

ที่ไหน>>วิธีการป้อนข้อมูล (STDIN) และ<<วิธีการส่งออก (STDOUT)


2

Pyke, 8 7 ไบต์ (เวอร์ชั่นเก่า)

3.DeRt*

ลองที่นี่! - โปรดทราบว่าลิงก์อาจไม่คงอยู่นาน

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

รุ่นใหม่ล่าสุด

3.DhRt*_

ลองที่นี่!

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

คุณสามารถให้ลิงค์ไปยัง (เวอร์ชั่นเก่า)
Downgoat

ความมุ่งมั่นล่าสุดที่รหัสเก่าทำงานที่นี่ (นี่คือก่อนหน้านี้วันนี้)
สีฟ้า

2

J, 27 ไบต์

ในขณะที่ไม่ใช่นักกอล์ฟฉันก็ชอบดีกว่าเพราะใช้เวลาในการพิจารณา

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

นี่คือการย่อยสลายต้นไม้ของมัน:

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

นี่คล้ายกับคำตอบ J ของ Kenny มากเพราะมันเลือกขนาดและเครื่องหมาย แต่มันต่างกันตรงที่ฉันใช้ระเบียบวาระเพื่อเลือกสัญลักษณ์


2

MATL, 8 ไบต์

_3&\wq*_

โซลูชันนี้ใช้การจัดทำดัชนีแบบอิง 1 ลำดับ

ลองออนไลน์

เวอร์ชั่นที่แก้ไขแสดงกรณีทดสอบทั้งหมด

คำอธิบาย

        % 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

Pyth, 10 ไบต์

*h/Q3-1%Q3

ลองออนไลน์!

คำอธิบาย:

*     : Multiply following two arguments
h/Q3  : 1 + Input/3
-1%Q3 : 1 - Input%3

หมายเหตุ: ฉันได้สมมติลำดับที่ไม่มีดัชนี


1
คุณอาจต้องการรวมลิงค์นี้ นอกจากนี้ยินดีต้อนรับสู่ PPCG!
Leun Nun

ฉันได้ใกล้เคียงกับวิธีแก้ปัญหาของคุณ ...*@(1ZtZ)%Q3h/Q3
FliiFe

@FliiFe (1ZtZ)=-L1 2
Nun


2

05AB1E, 7 ไบต์

รหัส:

(3‰`<*(

อธิบาย:

(           # 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 ไบต์

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

อยู่ที่ไหนnหนึ่งดัชนี

คำอธิบาย:

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

มันไม่ได้เป็นสิ่งที่จำเป็นในการสร้างแฝดตลอด{n, 0, -n}แต่ก็สั้นกว่าการเขียนceil(n/3)หรืออะไรที่มีผล โปรดทราบว่าnจะต้องกำหนดเพื่อสร้างวัตถุนี้ (หากไม่ได้กำหนดไว้ในเวลาที่ใช้งาน GeoGebra จะแจ้งให้คุณสร้างตัวเลื่อนสำหรับn)


สวัสดีและยินดีต้อนรับสู่ PPCG! คุณมีลิงค์ที่ฉันสามารถทดสอบได้หรือไม่ (ออนไลน์กว่า)
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋขอบคุณ! นี่คือลิงค์ไปยังแอปเพล็ตออนไลน์แอปเพล็ต หน้าดูว่างเปล่าซักพัก แต่หลังจากนั้นมันก็ปรากฏตัวขึ้น
Joe

โอ้เยี่ยมมาก แต่ฉันจะใส่สูตรได้อย่างไร? > _> ฉันลองวางมันลงในที่ว่างเปล่าและได้รับแจ้งให้สร้างตัวเลื่อน แต่ไม่มีอะไรเกิดขึ้น
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ: กว่าในด้านซ้ายมือที่มันว่า "Input ..." ครั้งแรกที่จะเริ่มใช้nใส่สิ่งที่ต้องการn=297(นี้จะให้เลื่อนที่มีการกำหนดค่าอย่างหนึ่ง) nแล้ววางสูตรลงในกล่องขาเข้าซึ่งขณะนี้ควรจะเป็นดังต่อไปนี้ (ตรวจสอบให้แน่ใจว่าได้รับผลตอบแทน;) สูตรควรประเมินเป็นnคำที่ลำดับของลำดับและควรเปลี่ยนเมื่อคุณเลื่อนตัวเลื่อน
Joe

2

เขาวงกต , 17 15 14 ไบต์

ที่บันทึกไว้ 3 ไบต์โดยใช้ความคิดสกของใช้แทน1-(n%3)~(n%3-2)

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

โปรแกรมสิ้นสุดด้วยข้อผิดพลาด (หารด้วยศูนย์) แต่ข้อความแสดงข้อผิดพลาดไปที่ STDERR

ลองออนไลน์!

คำอธิบาย

โปรแกรมมีลักษณะเป็นเส้นตรงสมบูรณ์แม้ว่าบางรหัสจะถูกดำเนินการในสิ่งที่ตรงกันข้าม

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.

ตอนนี้ตัวชี้คำสั่งกระทบกับเดดเอนด์แล้วหมุนไปรอบ ๆ ดังนั้นมันจึงเริ่มรันโค้ดจากปลาย:

*     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 ไบต์

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

น่าเศร้า Erlang ไม่มีโอเปอเรเตอร์แบบ '%' และ 'rem' ต้องการช่องว่างแม้กระทั่งก่อน 3


2

Hexagony 25 ไบต์

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

หรือในรูปแบบที่ไม่ย่อเล็กสุด:

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

ลองออนไลน์!

การจู่โจมครั้งแรกของฉันสู่ Hexagony ดังนั้นฉันมั่นใจว่าฉันไม่ได้ทำสิ่งนี้ทุกที่ใกล้เคียงอย่างมีประสิทธิภาพเท่าที่จะทำได้ ...

คำนวณ-(n%3 - 1)บนขอบหน่วยความจำเดียวบนขอบn/3 + 1ที่อยู่ติดกันแล้วคูณเข้าด้วยกัน


ว้าวน่าสนใจมากที่ได้เห็นสิ่งนี้! :)
Adnan

2

R, 28 ไบต์

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

ดูเหมือนว่านี่เป็นคำตอบส่วนใหญ่ที่นี่ เป็นศูนย์

   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

สิ่งที่ดีเกี่ยวกับมันคือมันจัดการกับอินพุตหลาย

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

เดิมทีฉันต้องการทำสิ่งต่อไปนี้ แต่ไม่สามารถตัดส่วนเกินพิเศษได้

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

ใช้rbindเพื่อเพิ่ม 0 และเชิงลบในช่วง 1 nจากนั้นส่งคืนคำที่n'(ตามหนึ่ง)

# 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

แบตช์ (Windows) 86 ไบต์

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%

โปรแกรมนี้ทำงานตามAlternate.bat nที่nเป็นหมายเลขที่คุณต้องการเรียกใช้ฟังก์ชั่น



2

Java 7, 38 37 36 ไบต์

กอล์ฟครั้งแรกของฉันอ่อนโยน

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

ลองที่นี่! (รวมถึงกรณีทดสอบ)

แก้ไข: ฉัน miscounted และยังแข็งแรงเล่นกอล์ฟออกตัวละครอีกหนึ่งโดยการแทนที่ด้วย(-i%3+1)(1-i%3)


1
สวัสดีและยินดีต้อนรับสู่ PPCG! คุณสามารถลบช่องว่างหลังจากreturnนั้นและใช้ lambda Java 8
NoOne อยู่ที่

ฉันควรระบุว่านี่คือ Java 7 แต่ฉันจะลบพื้นที่นั้นออก ขอบคุณ!
สตีเวนเอช.

1

เรติน่า 45 ไบต์

.+
11$&$*
(111)+(1)*
$#2$#1
T`d`+0-`^.
^0.+
0

ลองออนไลน์!

ชุดทดสอบ

รับอินพุต / เอาต์พุตเป็นฐานสิบ 1 การจัดทำดัชนี

อินพุตแบบเอกนารีเอาต์พุตฐานสิบ, 1 ดัชนี: 40 ไบต์

$
11
(111)+(1)*
$#2$#1
T`d`+0-`^.
^0.+
0

ลองออนไลน์!

ชุดทดสอบ


1

MATLAB / Octave, 27 ไบต์

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

สิ่งนี้จะสร้างฟังก์ชั่นนิรนามที่สามารถเรียกใช้ ans(n)นี้จะสร้างฟังก์ชั่นที่ไม่ระบุชื่อที่สามารถเรียกใช้วิธีนี้ใช้การจัดทำดัชนีแบบ 1

กรณีทดสอบทั้งหมด


1

Mathematica 26 ไบต์

ด้วย 4 ไบต์ที่บันทึกไว้ต้องขอบคุณ Martin Ender

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

ใช้วิธีการเดียวกันกับ Suever


1

อ็อกเทฟ 23 ไบต์

ไม่มีข้อเสีย mod ...

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

ใช้เวทย์มนตร์สร้างดัชนี 1 ฐาน


คำอธิบาย

สร้างฟังก์ชั่นที่ไม่ระบุชื่อที่จะ:

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

หลังจากขั้นตอนการคูณเราจะมีเมทริกซ์ 3xn ดังนี้ (สำหรับ 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

การสร้างnคอลัมน์เกินความจริง แต่เป็นจำนวนที่สะดวกที่รับประกันว่าจะมีขนาดใหญ่พอ เป็น Linear นับการจัดทำดัชนีลงแต่ละคอลัมน์จากซ้ายไปขวาดังนั้นองค์ประกอบที่ดัชนีเชิงเส้นจะเป็น42

ทุกกรณีทดสอบideone


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.