X bước về phía trước, lùi lại 1 bước


21

Đây là 100 số đầu tiên của một chuỗi dễ dàng:

0,1,0,2,1,4,3,7,6,11,10,16,15,22,21,29,28,37,36,46,45,56,55,67,66,79,78,92,91,106,105,121,120,137,136,154,153,172,171,191,190,211,210,232,231,254,253,277,276,301,300,326,325,352,351,379,378,407,406,436,435,466,465,497,496,529,528,562,561,596,595,631,630,667,666,704,703,742,741,781,780,821,820,862,861,904,903,947,946,991,990,1036,1035,1082,1081,1129,1128,1177,1176,1226

Trình tự này hoạt động như thế nào?

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

   0,      1-1=0,      2-1=1,      4-1=3,      7-1=6,       11-1=10,        16-1=15,      
     0+1=1,      0+2=2,      1+3=4,      3+4=7,      6+5=11,        10+6=16,        15+7=22
  • a(0) = 0
  • Đối với mỗi số lẻ n(được lập chỉ mục 0), nó a(n-1) + X(ở đâu X=1và tăng thêm 1 mỗi lần truy cập)
  • Đối với mọi chẵn n(0 chỉ mục), đó làa(n-1) - 1

Thử thách:

Một trong:

  • Cho một số nguyên đầu vào n, xuất nsố thứ 'trong chuỗi.
  • Cho một số nguyên đầu vào n, xuất các nsố đầu tiên của chuỗi.
  • Xuất trình tự vô thời hạn mà không lấy một đầu vào ( hoặc lấy một đầu vào không sử dụng trống ).

Quy tắc thử thách:

  • Đầu vào ncó thể là cả 0 hoặc 1 chỉ mục.
  • Nếu bạn xuất (một phần) chuỗi, bạn có thể sử dụng danh sách / mảng, in ra STDOUT với bất kỳ dấu phân cách nào (dấu cách, dấu phẩy, dòng mới, v.v.). Cuộc gọi của bạn.
  • Vui lòng cho biết một trong ba tùy chọn bạn đã sử dụng trong câu trả lời của mình.
  • Bạn sẽ phải hỗ trợ ít nhất 10.000 số đầu tiên (số thứ 10.000 là 12,497,501).

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu có thể.

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

Pastebin với 10,001 số đầu tiên trong chuỗi. Hãy chọn bất kỳ bạn muốn.

Một số số cao hơn:

n (0-indexed)    Output:

68,690           589,772,340
100,000          1,249,975,000
162,207          3,288,888,857
453,271          25,681,824,931
888,888          98,765,012,346
1,000,000        124,999,750,000

Câu trả lời:



8

Excel, 31 byte

Câu trả lời được 0lập chỉ mục. Xuất ra nsố lượng.

=(A1^2+IF(ISODD(A1),7,-2*A1))/8

Trình tự được mô tả cuối cùng chỉ là hai chuỗi xen kẽ:

ODD:   (x^2+x+2)/2
EVEN:  (x^2-x)/2

Việc xen kẽ những thứ này thành một 0chuỗi được lập chỉ mục sẽ cho:

a = (x^2 - 2x)/8 if even
a = (x^2 + 7 )/8 if odd

Cung cấp cho:

=IF(ISODD(A1),(A1^2+7)/8,(A1^2-2*A1)/8)

mà chúng tôi chơi golf xuống các 31byte.


Sử dụng cùng một cách tiếp cận, 1được lập chỉ mục cho 37byte:

=(A1^2-IF(ISODD(A1),4*A1-3,2*A1-8))/8



4

Haskell , 40 38 37 byte

scanl(flip($))0$[1..]>>=(:[pred]).(+)

Trả về một danh sách vô hạn, thử trực tuyến!

Giải trình

scanlmất ba đối số f, initxs( [ x 0 , x 1 ... ] ) và xây dựng một danh sách mới:

[ a 0 = init , a 1 = f (a 0 , x 0 ) , a 2 = f (a 1 , x 1 ) ... ]

Chúng tôi thiết lập init = 0và sử ($)dụng toán tử ứng dụng lật (do đó, nó áp dụng một i cho hàm x i ), bây giờ chúng tôi chỉ cần một danh sách các hàm - danh sách[1..]>>=(:[pred]).(+) là một danh sách vô hạn với các hàm đúng:

[(+1),(-1),(+2),(-1),(+3),(-1),(+4),...

Thay thế thú vị, 37 byte

flipcó loại (a -> b -> c) -> b -> a -> cchúng ta cũng có thể sử dụng id :: d -> dthay ($)vì suy luận kiểu của Haskell, loại dsẽ được thống nhất với a -> b, cho chúng ta giống nhau.

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

Chỉnh sửa

-2 byte bằng cách sử dụng (>>=)thay vì dochú thích.

-1 byte bằng cách sử dụng scanlthay vì zipWith.



3

05AB1E , 10 byte

ÎF<NÈi¼¾>+

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

Giải trình

Î             # initialize stack with: 0, input
 F            # for N in [0 ... input-1] do:
  <           # decrement the current number
   NÈi        # if N is even
      ¼       # increment a counter
       ¾>     # push counter+1
         +    # add to current number

10-byter khác: ÎFNÈN;Ì*<O


ÎGDN+D<tạo ra chuỗi, nhưng lấy phần tử thứ n có vẻ ... cứng trong 3 byte.
Bạch tuộc ma thuật Urn


3

APL (Dyalog Unicode) , 16 12 byte SBCS

Chức năng tiền tố ẩn danh. Chỉ số 0.

+/⊢↑∘∊¯1,¨⍨⍳

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

+/ Tổng của

⊢↑ những nyếu tố đầu tiên

∘∊ của ε nlisted (phẳng)

¯1,¨⍨ phủ định một-thêm-cho-mỗi

 đầu tiên n ɩ ndices (từ 0 đến n-1


Ah, đó là giải pháp của tôi ... đoán nó cũng tương tự.
Erik the Outgolfer

3

Thạch , 6 byte

HḶS‘_Ḃ

Một liên kết đơn được chấp nhận (1 chỉ mục) nmà trả về a(n).

Hãy thử trực tuyến! Hoặc xem bộ thử nghiệm

Làm sao?

HḶS‘_Ḃ - link: n
H      - halve         -> n/2.0
 Ḷ     - lowered range -> [0,1,2,...,floor(n/2.0)-1]
  S    - sum           -> TriangleNumber(floor(n/2.0)-1)
   ‘   - increment     -> TriangleNumber(floor(n/2.0)-1)+1
     Ḃ - bit = 1 if n is odd, 0 if it's even
    _  - subtract      -> TriangleNumber(floor(n/2.0)-1)+isEven(n)

Hừm, cách tiếp cận thú vị ngay đó.
Erik the Outgolfer

3

PHP , 73 64 55 51 47 byte

Phương pháp đầu tiên

Mã câu trả lời đầu tiên!
Tôi chắc chắn có các thủ thuật PHP để làm cho nó ngắn hơn và toán học có thể được cải thiện.

Lấy n làm đối số đầu tiên và xuất ra số thứ n trong chuỗi.

$y=$argv[1]/2;for(;$i<$y+1;)$x+=$i++;echo$x-($y|0);

Trừ đi 9 byte bằng cách xóa "$ x = 0;" và "$ i = 0".

Trừ đi 9 byte nhờ @Kevin Cruijssen cải thiện vòng lặp for và mất thẻ kết thúc.

Trừ đi 1 byte bằng cách sử dụng bitwise hoặc "|" thay vì "(int)"

Trừ 3 byte nhờ @Dennis vì bạn có thể xóa các thẻ bằng cách chạy nó từ dòng lệnh với "mã php -r 'ở đây'"

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

Phương pháp thứ hai

Kết hợp câu trả lời trước của tôi với một phương pháp hoàn toàn mới!

for(;$i<$argv[1];$i++)$x+=($y^=1)?$i/2+1:-1;echo$x;

Sử dụng XOR và toán tử tenary để chuyển đổi giữa các khoản tiền trong vòng lặp.

Chỉnh sửa: Điều này không hoạt động cho n = 0 và tôi không biết tại sao. $ i không được gán vì vậy nó phải là 0, do đó vòng lặp ($i<$argv[1])sẽ thất bại vì (0<0==false)vậy $ x không được gán sẽ xuất thành 0 chứ không phải 1.

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

Phương pháp thứ ba

Chuyển đổi công thức excel @Wernisch được tạo thành PHP cung cấp giải pháp 47 byte

$z=$argv[1];echo(pow($z,2)+(($z&1)?7:-2*$z))/8;

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


1
Xin chào, chào mừng đến với PPCG! Nếu bạn chưa có, mẹo chơi golf trong PHPmẹo chơi golf bằng <tất cả các ngôn ngữ> có thể rất thú vị để đọc qua. Một số điều để chơi golf: bạn có thể loại bỏ dấu vết ?>. Loại bỏ $x=0$i=0thực sự được cho phép (nếu không, $x=$i=0cũng sẽ ngắn hơn). Ngoài ra, vòng lặp có thể được rút ngắn để for(;$i<$y+1;)$x+=$i++;. Tổng cộng là -15 byte. Tận hưởng kì nghỉ của bạn! :)
Kevin Cruijssen

@KevinCruijssen cảm ơn rất nhiều!
Sam Dean

Không có gì. Btw, TIO của bạn hiện vẫn là 60 byte thay vì 58. Và không chắc tại sao bạn đã nêu 57. Hãy thử trực tuyến.
Kevin Cruijssen

@KevinCruijssen Tôi liên tục đăng TIO sai! TIO nói 58 bây giờ nhưng tôi đã đăng 55 vì bạn có thể xóa "php" khỏi thẻ mở, không phải trong TIO
Sam Dean

@Wernisch cảm ơn vì công thức của bạn!
Sam Dean

3

R , 35 byte

diffinv(rbind(n<-1:scan(),-1)[n-1])

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

Tôi nghĩ rằng đây là một giải pháp thay thế thú vị cho câu trả lời của @ JayCe vì nó không chuyển sang ngôn ngữ rất tốt mà không có sự hỗ trợ tích hợp cho ma trận, và tình cờ giống như chơi golf.

1-index, trả về các nphần tử đầu tiên của chuỗi.

Làm thế nào nó hoạt động:

rbind(n<-1:scan(),-1) xây dựng ma trận sau:

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]   -1   -1   -1   -1

Bởi vì R giữ ma trận theo thứ tự chính của cột, nếu chúng ta chuyển đổi nó thành a vector, chúng ta sẽ có được một vectơ

1 -1 2 -1 3 -1 4 -1

mà nếu chúng ta lấy một khoản tích lũy, chúng ta sẽ nhận được

1 0 2 1 4 3 7 6

đó là trình tự, chỉ cần không có hàng đầu 0. diffinvmay mắn thay thêm số 0 đứng đầu, vì vậy chúng tôi lấy các n-1giá trị đầu tiên từ ma trận và diffinvchúng, thu được các ngiá trị đầu tiên của chuỗi.


2
Tôi là một fan hâm mộ lớn của câu trả lời 'diffinv' của bạn.
JayCe


3

R , 35 34 byte

(u=(n=scan())-n%%2-1)-n+(15+u^2)/8

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

Tùy chọn đầu ra đầu tiên. Xem công thức như nhiều câu trả lời khác (Tôi muốn chỉ ra câu trả lời đầu tiên cung cấp công thức, tôi không thể tìm ra nó là gì).

Tùy chọn đầu ra thứ hai và thứ ba dưới đây:

R , 43 byte

function(m,n=1:m,u=n%%2+1)((n-u)^2-1)/8+2-u

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

R , 51 byte

while(T){cat(((T-(u=T%%2+1))^2-1)/8+2-u," ");T=T+1}

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


3

Matlab / Octave, 31 26 byte

5 byte đã lưu thx cho Luis Mendo!

@(n)sum(1:n/2+.5)-fix(n/2)

1
Bạn có thể có thể sử dụng fixthay vì floorn/2+.5thay vìceil(n/2)
Luis Mendo

@LuisMendo Ty! CHƯA BIẾT VỀ THƯƠNG fix()và không mong đợi 1:n/2+.5để công việc - rất nhiều điều mà có thể đi sai, nhưng họ thực sự không :)
Leander Moesinger




3

QBasic, 31 byte

Giải pháp just-exec-the-spec xuất hiện lâu hơn một chút so với giải pháp của Erik .

DO
?n
i=i+1
n=n+i
?n
n=n-1
LOOP

Điều này đầu ra vô thời hạn. Đối với mục đích chạy nó, tôi khuyên bạn nên thay đổi dòng cuối cùng thành một cái gì đó giống như LOOP WHILE INPUT$(1) <> "q", nó sẽ chờ nhấn phím sau mỗi lần nhập và thoát chuỗi thứ hai nếu nhấn phím q.


2

C # (.NET Core) , 56 byte

n=>{int a=0,i=0;for(;++i<n;)a+=i%2<1?-1:i/2+1;return a;}

-2 byte nhờ Kevin Crujssen

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

1 chỉ mục. Trả vềa(n)

Ungolf'd:

int f(int n)
{
    // a needs to be outside the for loop's scope,
    // and it's golfier to also define i here
    int a = 0, i = 1;
    // basic for loop, no initializer because we already defined i
    for (; ++i < n;)
    {
        if (i%2 < 1) {
            // if i is even, subtract 1
            a -= 1;
        }
        else
        {
            // if i is odd, add (i / 2) + 1
            // this lets us handle X without defining another int
            a += i / 2 + 1;
        }
    }
    // a is the number at index n
    return a;
}

1
i=1;for(;i<n;i++)có thể i=0;for(;++i<n;)i%2==0có thể i%2<1.
Kevin Cruijssen

@KevinCruijssen vì vậy tôi có thể, cảm ơn! Tôi đã nhìn thấy cái thứ 2, nhưng tôi không thấy cái thứ nhất hoạt động như tôi nghĩ vì các vòng lặp chỉ kiểm tra điều kiện sau vòng lặp đầu tiên. TIL
Skidsdev

Không, nó kiểm tra trước khi lặp lại đầu tiên. A do-whilesẽ kiểm tra sau khi hoàn thành lần lặp đầu tiên. :)
Kevin Cruijssen

Trong những trường hợp rất hiếm, bạn thậm chí có thể hợp nhất ifmột for-loop. Ví dụ: if(t>0)for(i=0;i<l;i++)để for(i=0;t>0&i<l;i++). Tôi gần như không bao giờ có thể sử dụng điều này trong câu trả lời của tôi.
Kevin Cruijssen

Điều đó thật tuyệt vời, tôi chắc chắn sẽ phải ghi nhớ điều đó vào lần tới khi tôi chơi golf C #, điều này khá hiếm ngày nay: P hầu hết công việc C # của tôi là vô duyên
Skidsdev

2

Husk , 11 9 8 byte

ΘṁṠe→Θ∫N

Đã lưu một byte nhờ H.PWiz.
Đầu ra như một danh sách vô hạn.
Hãy thử trực tuyến!

Giải trình

ΘṁṠe→Θ∫N
      ∫N   Cumulative sum of natural numbers (triangular numbers).
     Θ     Prepend 0.
 ṁṠe→      Concatenate [n + 1, n] for each.
Θ          Prepend 0.

2

Dodos , 69 byte

	. w
w
	. h
	+ r . ' dab h '
h
	h ' '
	. dab
r
	
	r dip
.
	dot
'
	dip

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


Bằng cách nào đó đây là câu trả lời dài nhất.

Giải trình.

┌────┬─────────────────────────────────────────────────┐
│Name│Function                                         │
├────┼─────────────────────────────────────────────────┤
│.   │Alias for "dot", computes the sum.               │
├────┼─────────────────────────────────────────────────┤
│'   │Alias for "dip".                                 │
├────┼─────────────────────────────────────────────────┤
│r   │Range from 0 to n, reversed.                     │
├────┼─────────────────────────────────────────────────┤
│h   │Halve - return (n mod 2) followed by (n/2) zeros.│
└────┴─────────────────────────────────────────────────┘

1

Than , 15 byte

I∨ΣEN⎇﹪ι²±¹⊕⊘ι⁰

Hãy thử trực tuyến! Chỉ số 0. Liên kết là phiên bản dài dòng của mã. Công thức có thể sẽ ngắn hơn, nhưng có gì vui trong đó? Giải trình:

    N           Input as a number
   E            Map over implicit range
     ⎇          Ternary
      ﹪ι²       Current value modulo 2
         ±¹     If true (odd) then -1
           ⊕⊘ι  Otherwise calculate X as i/2+1
  Σ             Take the sum
 ∨            ⁰ If the sum is empty then use zero
I               Cast to string and implicitly print

1

JavaScript, 49 48 45 byte

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')

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

Không đẹp như câu trả lời @tsh, nhưng của tôi hoạt động với số lượng lớn hơn.

Và bây giờ cảm ơn @tsh, cho evalgiải pháp!


<=x+1có thể<x+2
Kevin Cruijssen

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')nên ngắn hơn
tsh

evaltrả lại giá trị sửa đổi cuối cùng? Tôi vẫn không hoàn toàn hiểu những gì nó có thể làm.
chàng ngẫu nhiên

Nó trả về giá trị của câu lệnh ( có thể được trình bày trong docâu lệnh trong phiên bản sau).
tsh



1

Bình , 8 byte

s<s,R_1S

Trả về n số thứ tự trong chuỗi, được lập chỉ mục 0. Dùng thử trực tuyến

Giải thích, với ví dụ cho n=5:

s<s,R_1SQQ   Final 2 Q's are implicit, Q=eval(input())

       SQ    1-indexed range        [1,2,3,4,5]
   ,R_1      Map each to [n,-1]     [[1,-1],[2,-1],[3,-1],[4,-1],[5,-1]]
  s          Sum (Flatten)          [1,-1,2,-1,3,-1,4,-1,5,-1]
 <       Q   Take 1st Q             [1,-1,2,-1,3]
s            Sum, implicit output   4

1

Perl 6 ,  38  26 byte

{(0,{$_+(($+^=1)??++$ !!-1)}...*)[$_]}

Thử nó

{(+^-$_+|1)**2 div 8+$_%2}

Dựa trên câu trả lời Python của TFeld .
Thử nó

Mở rộng

38 byte (trình tạo chuỗi):

{  # bare block lambda with implicit parameter $_

  (
    # generate a new sequence everytime this function is called

    0,    # seed the sequence

    {     # bare block that is used to generate the rest of the values

      $_  # parameter to this inner block (previous value)

      +

      (
          # a statement that switches between (0,1) each time it is run
          ( $ +^= 1 )

        ??     # when it is 1 (truish)
          # a statement that increments each time it is run
          ++$ # &prefix:« ++ »( state $foo )

        !!     # or else subtract 1
          -1
      )
    }

    ...  # keep generating until:

    *    # never stop

  )[ $_ ] # index into the sequence
}

Lưu ý rằng điều này có lợi ích mà bạn có thể vượt qua * để có được toàn bộ chuỗi hoặc chuyển trong Phạm vi để tạo nhiều giá trị hiệu quả hơn.

26 byte (tính toán trực tiếp):

{  # bare block lambda with implicit parameter $_

  (

    +^     # numeric binary negate
      -$_  # negative of the input
      +|   # numeric binary or
      1

  ) ** 2   # to the power of 2

  div 8     # integer divide it by 8

  + $_ % 2  # add one if it is odd
}

1

05AB1E , 8 byte

;L¨O>¹É-

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

Dựa trên cách tiếp cận Jelly của Jonathan Allan (có lẽ dựa trên OP chỉnh sửa câu hỏi với một định nghĩa khác về trình tự), vì vậy 1 chỉ mục.


+1. Tôi đã có một cách tiếp cận tương tự được chuẩn bị trong 05AB1E mà tôi dự định sẽ đăng trong vài ngày nếu không có ai khác đăng. Nó hơi khác một chút (lần đầu tiên tôi giảm một nửa trước khi tạo danh sách, thay vì xóa đuôi; và tôi sử dụng Ithay vì ¹), nhưng cách tiếp cận chung và đếm byte hoàn toàn giống nhau:;<LO>IÉ-
Kevin Cruijssen

@KevinCruijssen Đã đăng ngày hôm qua nếu tôi có khả năng suy nghĩ sâu sắc hơn, nhưng, đây là thời kỳ chung kết, suy nghĩ quá sâu về điều này bị cấm. : P
Erik the Outgolfer

Ah, tôi mừng vì tôi không còn trận chung kết nữa. Mặc dù vậy, tôi cũng khá bận rộn trong công việc và phải hoãn thi đấu golf đôi khi thường xuyên hơn tôi muốn. ; p Chúc may mắn với kỳ thi của bạn!
Kevin Cruijssen

1

Lồi , 10 9 byte

_½,ª)\2%-

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

Dựa trên cách tiếp cận Jelly của Jonathan Allan (có lẽ dựa trên OP chỉnh sửa câu hỏi với một định nghĩa khác về trình tự). 1 chỉ mục.

Giải trình:

_½,ª)\2%- Stack: [A]
_         Duplicate. Stack: [A A]
 ½        Halve. Stack: [A [A]½]
  ,       Range, [0..⌊N⌋). Stack: [A [[A]½],]
   ª      Sum. Stack: [A [[A]½],]ª]
    )     Increment. Stack: [A [[[A]½],]ª])]
     \    Swap. Stack: [[[[A]½],]ª]) A]
      2   2. Stack: [[[[A]½],]ª]) A 2]
       %  Modulo. Stack: [[[[A]½],]ª]) [A 2]%]
        - Minus. Stack: [[[[[A]½],]ª]) [A 2]%]-]

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.