Trình tự nam và nữ


20

Câu hỏi này có lẽ khó hơn tất cả các nhiệm vụ "tạo ra một chuỗi số", bởi vì điều này đòi hỏi các chuỗi HAI làm việc cùng nhau.

Thực sự mong chờ câu trả lời!

Trong cuốn sách " Gôdel, Escher, Bach: Một bím tóc vàng vĩnh cửu ", Douglas Hofstadter có một vài dãy số bên trong, tất cả đều dựa vào thuật ngữ trước đó theo một cách nào đó. Để biết thông tin về tất cả các trình tự, xem trang Wikipedia này .

Một cặp trình tự thực sự thú vị là trình tự Nữ và Nam, được định nghĩa như vậy:

cho n > 0 .

Đây là trình tự Nữtrình tự Nam .

Nhiệm vụ của bạn là, khi được cung cấp một số nguyên nlàm đầu vào, trả về danh sách chuỗi Nữ và chuỗi Nam, với số lượng thuật ngữ bằngn , trong hai dòng đầu ra, với chuỗi Nữ trên dòng đầu tiên và chuỗi Nam trên thư hai.

Mẫu đầu vào và đầu ra: Đầu vào: 5 Đầu ra:[1, 1, 2, 2, 3] [0, 0, 1, 2, 2]

Đầu vào: 10 Đầu ra:[1, 1, 2, 2, 3, 3, 4, 5, 5, 6] [0, 0, 1, 2, 2, 3, 4, 4, 5, 6]

LƯU Ý: Sự tách biệt giữa các danh sách biểu thị ngắt dòng.

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte thắng. Ngoài ra, đặt một lời giải thích cũng như cho mã của bạn.

Bảng xếp hạng


5
Chúng ta có thể trả về một cặp danh sách từ một chức năng, thay vì in các danh sách không?
Zgarb

Những thách thức khác liên quan đến trình tự của Hofstadter: Trình tự Q , trình tự hình
Martin Ender

@Zgarb Bạn có thể, miễn là hai danh sách nằm trong các dòng khác nhau.
clismique

2
@DerpfacePython Không có dòng nào trong một cặp danh sách; nếu một hàm trả về một cặp danh sách, bạn có thể in chúng theo cách bạn muốn. Điều đó đang được nói, tôi không phải là một fan hâm mộ lớn của yêu cầu dòng, ngay cả khi in đầu ra. Các định dạng I / O cồng kềnh là một trong những điều cần tránh khi viết thử thách.
Dennis

4
Nó không phải là vấn đề lớn đối với một số cách tiếp cận / ngôn ngữ, nhưng nó có thể tạo ra sự khác biệt lớn cho những người khác. Trong C, rất nhiều byte có thể được lưu bằng cách in các chuỗi trong các cột thay vì các hàng. Trong Python, cách tiếp cận ngắn nhất tôi có thể nghĩ đến là lambda đệ quy tương tự như câu trả lời Julia đệ quy của tôi trả về một cặp danh sách, nhưng việc chuyển đổi chuỗi đó thành một chuỗi với nguồn cấp dữ liệu khiến nó dài hơn rất nhiều, thậm chí dài hơn cả chương trình đầy đủ đăng bởi Sp3000. Các cách tiếp cận khác, chẳng hạn như một giải pháp đệ quy đếm ngược thay vì lên, hoàn toàn bị loại trừ vì không thể thêm dòng mới.
Dennis

Câu trả lời:


3

Thạch , 22 20 byte

ṙṪḢạL}ṭ
çƓḤ¤Ð¡1ṫ-Ṗ€G

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

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

çƓḤ¤Ð¡1ṫ-Ṗ€G  Main link. No user arguments. Left argument defaults to 0.
   ¤          Combine the two links to the left into a niladic chain.
 Ɠ              Read an integer from STDIN.
  Ḥ             Unhalve/double it.
ç   С1       Call the helper link that many times. Return all results.
              In the first call, the left and right argument are 0 and 1 resp.
              After each iteration, the left argument is set to the return value
              and the right argument to the prior value of the left one.
       ṫ-     Tail -1; keep the last two items of the list of results.
         Ṗ€   Discard the last item of each list.
           G  Grid; format the pair of lists.


ṙṪḢạL}ṭ       Helper link. Arguments: x, y (lists)

ṙ             Rotate x k units to the left, for each k in y.
 Ṫ            Tail; extract the last rotation.
  Ḣ           Head; extract the last element.
              This essentially computes x[y[-1]] (Python notation), avoiding
              Jelly's 1-based indexing.
    L}        Yield the length of y.
   ạ          Take the absolute difference of the results to both sides.
      ṭ       Tack; append the difference to y and return the result.

5
Và đây là phần mà tôi cảm thấy tự hào về bản thân vì đã thực hiện một thử thách khiến Jelly sử dụng hơn 10 byte.
clismique

13

Julia, 52 48 byte

x->[n÷φ|(5n^2|4∈(2:3n).^2)for| =(+,-),n=1:x]

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

Lý lịch

Trong các chức năng kết hôn của On Hofstadter , tác giả cho thấy rằng

Công thức F / M

Trong đó φ biểu thị tỷ lệ vàng ,

công thức delta / epsilon

F n biểu thị số Fibonacci thứ n .

Hơn nữa, trong các Vấn đề và Giải pháp Nâng cao, H-187: Fibonacci là một hình vuông , người đề xuất cho thấy rằng

Nhận dạng Fibonacci / Lucas

trong đó L n biểu thị số Lucas thứ n và ngược lại - nếu

converse Fib nhận dạng / Lucas

thì n là số Fibonacci và m là số Lucas.

Từ đó, chúng tôi suy luận rằng

Định lý delta / epsilon

Bất cứ khi nào n> 0 .

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

Với đầu vào x , chúng ta xây dựng một 2 bởi x ma trận, nơi | là phép cộng trong cột đầu tiên và phép trừ trong cột thứ hai và n lặp trên các số nguyên nằm giữa 1x trong các hàng.

Thuật ngữ đầu tiên của cả F (n - 1)M (n - 1) chỉ đơn giản là n÷φ.

Chúng tôi tính (n)(n) bằng cách tính 5n² | 4 và kiểm tra nếu kết quả thuộc về mảng bình phương của các số nguyên trong khoảng từ 2 đến 3n . Điều này kiểm tra cả về độ vuông góc và, vì 1 không nằm trong phạm vi, cho n> 1 nếu | là phép trừ.

Cuối cùng, chúng tôi thêm hoặc trừ Boolean kết quả từ 5n^2|4∈(2:3n).^2đến hoặc từ số nguyên được tính toán trước đó.


điều này có thể được thể hiện theo cách không đệ quy / lặp không?, dạng đóng cho nó là gì?
Abr001am

Tôi đã thêm một lời giải thích.
Dennis

11

Python 2, 79 70 byte

a=0,;b=1,
exec"a,b=b,a+(len(a)-b[a[-1]],);"*~-input()*2
print b,'\n',a

Lặp đi lặp lại chứ không phải đệ quy, vì tại sao không. Dòng đầu tiên có một khoảng trắng ở cuối - nếu không ổn, nó có thể được sửa cho một byte thừa. -9 byte nhờ @Dennis.

Dưới đây là một số lambdas kết hợp mà không thực sự giúp đỡ:

f=lambda n,k:n and n-f(f(n-1,k),k^1)or k
f=lambda n,k:[k][n:]or f(n-1,k)+[n-f(f(n-1,k)[-1],k^1)[-1]]

Cả hai ntham số và k0 hoặc 1, chỉ định nam / nữ. Lambda đầu tiên trả về phần tử thứ n và lambda thứ hai trả về n phần tử đầu tiên (với thời gian chạy theo cấp số nhân).


9

MATL , 23 byte

1Oiq:"@XJth"yy0)Q)_J+hw

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

Giải trình

Điều này làm việc lặp đi lặp lại. Mỗi chuỗi được giữ trong một mảng. Đối với mỗi chỉ số n , thuật ngữ mới của mỗi chuỗi được tính toán và gắn vào mảng tương ứng. Một forvòng lặp với các điều khoản N −1 được sử dụng, trong đó N là số đầu vào.

Việc cập nhật cho chuỗi M cần được thực hiện trước tiên. Điều này là do chuỗi F luôn lớn hơn hoặc bằng chuỗi M cho cùng một chỉ mục, vì vậy nếu chúng tôi cố gắng cập nhật F trước tiên, chúng tôi sẽ cần một thuật ngữ M chưa được tính.

Hai phương trình cập nhật giống nhau là F và M. Do đó, mã cho việc cập nhật được sử dụng lại bằng cách áp dụng một forvòng lặp với hai lần lặp và hoán đổi các chuỗi trong ngăn xếp.

1        % Push 1: seed for F sequence
O        % Push 0: seed for M sequence
iq:      % Input N. Generate range [1 2 ... N-1]
"        % For each (i.e. iterate N-1 times)
  @      %   Push current index, n (starting at 1 and ending at N-1)
  XJ     %   Copy to clipboard J
  th     %   Duplicate and concatenate. This generates a length-2 array
  "      %   For each (i.e. iterate twice)
    yy   %   Duplicate top two elements, i.e. F and M sequences
    0)   %     In the *first* iteration: get last entry of M, i.e M(n-1)
    Q)   %     Add 1 and index into F. This is F(M(n-1))
    _J+  %     Negate and add n. This is n-F(M(n-1)), that is, M(n)
    h    %     Concatenate to update M
    w    %     Swap top two elements, to bring F to top.
         %     In the *second* iteration the procedure is repeated to update F,
         %     and then the top two elements are swapped to bring M to top again,
         %     ready for the next iteration of the outer loop
         %   End for implicitly
         % End for implicitly
         % Display implicitly from bottom to top: first line is F, second is M

6

J, 47 byte

f=:1:`(-m@f@<:)@.*
m=:0:`(-f@m@<:)@.*
(f,:m)@i.

Sử dụng định nghĩa đệ quy. Hai dòng đầu tiên xác định các động từ fmđại diện cho chức năng nữ và nam, tương ứng. Dòng cuối cùng là một động từ có một đối số duy nhất nvà đưa ra các nđiều khoản đầu tiên của chuỗi nữ và nam.

Sử dụng

   (f,:m)@i. 5
1 1 2 2 3
0 0 1 2 2
   (f,:m)@i. 10
1 1 2 2 3 3 4 5 5 6
0 0 1 2 2 3 4 4 5 6

6

JavaScript (ES6), 75 byte

g=n=>--n?([f,m]=g(n),m=[...m,n-f[m[n-1]]],[[...f,n-m[f[n-1]]],m]):[[1],[[0]]

Tôi có thể lưu 2 byte nếu tôi được phép trả về chuỗi Nam trước:

g=n=>--n?([f,m]=g(n),[m=[...m,n-f[m[n-1]]],[...f,n-m[f[n-1]]]]):[[1],[[0]]

6

Haskell, 57 byte

l#s=scanl(\a b->b-l!!a)s[1..]
v=w#1
w=v#0
(<$>[v,w]).take

Ví dụ sử dụng: (<$>[v,w]).take $ 5->[[1,1,2,2,3],[0,0,1,2,2]]

Hàm trợ giúp #xây dựng một danh sách vô hạn với giá trị bắt đầu svà danh sách ltìm kiếm tất cả các phần tử khác (tại chỉ mục của giá trị trước đó). v = w#1là trình tự nữ và w = v#0nam. Trong hàm chính, chúng ta lấy các nphần tử đầu tiên của cả hai vw.


4

Python 2, 107 byte

F=lambda n:n and n-M(F(n-1))or 1
M=lambda n:n and n-F(M(n-1))
n=range(input())
print map(F,n),'\n',map(M,n)

Dùng thử trực tuyến

Các giá trị đầu vào lớn hơn gây ra RuntimeError (quá nhiều đệ quy). Nếu đây là một vấn đề, tôi có thể viết một phiên bản mà lỗi không xảy ra.



3

Bình thường, 24 byte

Có lẽ không thể sử dụng reduceđể giảm số byte.

Thực hiện đơn giản.

L&b-b'ytbL?b-by'tb1'MQyM

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

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

L&b-b'ytb  defines a function y, which is actually the male sequence.

L          def male(b):
 &b            if not b: return b
   -b          else: return b-
     'ytb            female(male(b-1))


L?b-by'tb1 defines a function ', which is actually the female sequence.

L          def female(b):
 ?b            if b:
   -by'tb          return b-male(female(b-1))
         1     else: return 1


'MQ        print(female(i) for i from 0 to input)
yMQ        print(male(i) for i from 0 to input)

Tôi có bao gồm tên đảo chữ hoặc tên gốc của bạn trong bảng thành tích không? Ngoài ra, mã này là rất dài cho một chương trình Pyth.
clismique

Bạn ở đây bao lâu rồi ... sao bạn biết tôi đã đổi tên? Đặt tên mới của tôi ở đó.
Nữ tu bị rò rỉ

1
Tôi đã ở đây đủ lâu để biết rằng bạn đã thay đổi tên của bạn.
clismique

@DerpfacePython Thấy rằng các câu trả lời khác dài gấp gần 4 lần ... Tôi muốn nói rằng giải pháp của tôi không dài lắm.
Leaky Nun

Điều đó rất đúng, nhưng nó vẫn còn dài so với các chương trình Pyth khác cho các câu hỏi khác.
clismique

3

Brachylog , 65 byte

:{:1-:0re.}fL:2aw,@Nw,L:3aw
0,1.|:1-:2&:3&:?--.
0.|:1-:3&:2&:?--.

Nỗ lực của tôi trong việc kết hợp cả hai vị từ cho nam và nữ thành một thực sự làm cho mã dài hơn.

Bạn có thể sử dụng một lớp lót sau có cùng số byte:

:{:1-:0re.}fL:{0,1.|:1-:2&:3&:?--.}aw,@Nw,L:{0.|:1-:3&:2&:?--.}aw

chú thích : Điều này hoạt động với bộ chuyển đổi Prolog, không phải Java cũ.

Giải trình

Vị ngữ chính:

:{:1-:0re.}fL                Build a list L of integers from 0 to Input - 1
             :2aw            Apply predicate 2 to each element of L, write the resulting list
                 ,@Nw        Write a line break
                     ,L:3aw  Apply predicate 3 to each element of L, write the resulting list

Vị ngữ 2 (nữ):

0,1.                         If Input = 0, unify Output with 1
    |                        Else
     :1-                     Subtract 1 from Input
        :2&                  Call predicate 2 with Input - 1 as argument
           :3&               Call predicate 3 with the Output of the previous predicate 2
              :?-            Subtract Input from the Output of the previous predicate 3
                 -.          Unify the Output with the opposite of the subtraction

Vị ngữ 3 (nam):

0.                           If Input = 0, unify Output with 0
  |                          Else
   :1-                       Subtract 1 from Input
      :3&                    Call predicate 3 with Input - 1 as argument
         :2&                 Call predicate 2 with the Output of the previous predicate 3
            :?-              Subtract Input from the Output of the previous predicate 3
               -.            Unify the Output with the opposite of the subtraction

Đợi ... cái nào là vị ngữ 3?
clismique

@DerpfacePython rất tiếc, đã sửa. Cũng lưu ý rằng một vị ngữ là {:1-:0re.}, được sử dụng để tạo danh sách phạm vi.
Gây tử vong vào

3

Clojure, 132 131 byte

(fn [n](loop[N 1 M[0]F[1]](if(< N n)(let[M(conj M(- N(F(peek M))))F(conj F(- N(M(peek F))))](recur(inc N)M F))(do(prn F)(prn M)))))

Đơn giản chỉ cần xây dựng các chuỗi lặp đi lặp lại từ 0 đến n.

Phiên bản ung dung

(fn [n]
  (loop [N 1 M [0] F [1]]
    (if (< N n)
      (let [M (conj M (- N (F (peek M))))
            F (conj F (- N (M (peek F))))]
        (recur (inc N) M F))
      (do
        (prn F)
        (prn M)))))

Câu trả lời tốt đẹp, chào mừng đến với trang web! Là một không gian dấu hoặc dòng mới cần thiết? Tôi đang đếm 131 + một khoảng trắng ở cuối.
DJMcMayhem

Không, không cần khoảng trắng ở cuối. Sneaky vim đã thêm một dòng mới vào cuối để wc đếm.
đánh dấu

3

Bình thường, 23 byte

jCuaG-LHtPs@LGeGr1Q],1Z

Dùng thử trực tuyến: Trình diễn

Giải trình:

jCuaG-LHtPs@LGeGr1Q],1Z

  u                ],1Z    start with G = [[1, 0]]
                           (this will be the list of F-M pairs)
  u             r1Q        for each H in [1, 2, ..., Q-1]:
              eG              take the last pair of G [F(H-1), M(H-1)]
           @LG                lookup the pairs of these values:
                              [[F(F(H-1)), M(F(H-1))], [F(M(H-1)), M(M(H-1))]]
          s                   join them:
                              [F(F(H-1)), M(F(H-1)), F(M(H-1)), M(M(H-1))]
        tP                    get rid of the first and last element:
                              [M(F(H-1)), F(M(H-1))]
     -LH                      subtract these values from H
                              [H - M(F(H-1)), H - F(M(H-1))]
   aG                         and append this new pair to G
jC                         at the end: zip G and print each list on a line

Giải pháp thay thế sử dụng hàm thay vì giảm (cũng 23 byte):

L?>b1-LbtPsyMytb,1ZjCyM

Tốt đẹp. Thực sự rất tốt đẹp.
Leaky Nun

3

Ruby, 104 92 97 82 byte

f=->n,i{n>0?n-f[f[n-1,i],-i]:i>0?1:0}
->n{[1,-1].map{|k|p (0...n).map{|i|f[i,k]}}}

Chỉnh sửa: fmbây giờ là một chức năng nhờ Hop HopeHelpful . Tôi đã thay đổi chức năng thứ hai để in fsau đó m. Khoảng trắng saup có ý nghĩa, vì nếu không thì hàm in (0...n)thay vì kết quả củamap .

Hàm thứ ba in trước một mảng của n số hạng đầu tiên của f , tiếp theo là một mảng gồm n số hạng đầu tiên củam

Các hàm này được gọi như thế này:

> f=->n,i{n>0?n-f[f[n-1,i],-i]:i>0?1:0}
> s=->n{[1,-1].map{|k|p (0...n).map{|i|f[i,k]}}}
> s[10]
[1, 1, 2, 2, 3, 3, 4, 5, 5, 6]
[0, 0, 1, 2, 2, 3, 4, 4, 5, 6]

bạn có thể thả p và parens. Đầu ra không bắt buộc phải được in. Ngoài ra, bạn có thể dorp parens trên phạm vi.
Không phải Charles

bạn có thể thay thế hàm 2 bằng 1 có 2 đối số ni n>0?n-f(f(n-1,i),-i):i>0?1:0
Hy vọng có ích vào

@HopiouslyHelpful Cảm ơn rất nhiều: D
Sherlock9

@NotthatCharles Có phải đầu ra không được in? Trong Ruby, nếu tôi muốn dòng đó ngắt giữa fm, tôi cần in nó. Mặt khác, tôi chỉ nhận được một mảng như[[1, 1, 2, 2, 3, 3, 4, 5, 5, 6], [0, 0, 1, 2, 2, 3, 4, 4, 5, 6]]
Sherlock9

oh, nó nói "ngắt dòng". Quá tệ.
Không phải Charles

3

APL (Dyalog Unicode) , 45 25 byte

Chức năng ngầm ẩn danh. Yêu cầu ⎕IO←0, đó là tiêu chuẩn trên nhiều hệ thống APL.

1 0∘.{×⍵:⍵-(~⍺)∇⍺∇⍵-1⋄⍺}⍳

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

Điều này hoạt động bằng cách kết hợp FM thành một hàm dyadic duy nhất với đối số Boolean bên trái để chọn hàm để áp dụng. Chúng tôi sử dụng 1 cho F và 0 cho M để chúng tôi có thể sử dụng bộ chọn này làm giá trị trả về cho F  (0) và M  (0). Sau đó, chúng tôi quan sát rằng cả hai hàm cần phải tự gọi mình trước (trên đối số trừ đi một) và sau đó là hàm khác trên kết quả của điều đó, vì vậy trước tiên chúng tôi lặp lại với bộ chọn đã cho và sau đó với bộ chọn phủ định logic.

ɩ tin; không thông qua đối số trừ đi một

1 0∘.{... } bên ngoài (Descartes) "sản phẩm" (nhưng với bên dưới chức năng thay vì nhân) sử dụng [1,0]như các đối số còn lại ( ) và các chỉ số như các đối số bên phải ( ):

×⍵ nếu đối số đúng là hoàn toàn tích cực (nghĩa là dấu hiệu của đối số đúng):

  ⍵-1 trừ đi một từ đối số đúng

  ⍺∇ gọi bản thân với đó là đối số bên phải và đối số bên trái là đối số bên trái

  (~⍺)∇ gọi bản thân với điều đó là arg phải và phủ định logic của arg bên trái là arg trái

  ⍵- trừ đi từ đối số đúng và trả về kết quả

 khác:

   trả về đối số bên trái


Điều đó hoạt động tốt, nhưng giả sử đầu vào được lưu trữ trong một biến không được phép theo mặc định.
Dennis

@Dennis Nó không thực sự. Đó là một cơ thể tfn. Khi tôi mới ở đây, ngn nói với tôi rằng tôi không phải đếm tiêu đề tfn (sẽ là hai byte, một tên char + một dòng mới, giống như tên tệp nguồn không được tính và fns ẩn danh được phép Cũng vậy, ở đây, nơi tiêu đề là tên 1 char + dấu cách + tên đối số 1 char ( n) + cộng với một dòng mới.
Adám

Chính xác thì tfn là gì?
Dennis

@Dennis Tfns là cách trình bày APL truyền thống của các chức năng. Bao gồm các dòng mã với hầu như không có hạn chế nào của dfns . Ví dụ: bạn có thể có các cấu trúc điều khiển thích hợp và các biểu thức không có kết quả. Dòng "0" là một tiêu đề cho biết cú pháp của fn .
Adám

2

ES6, 89 85 83 byte

Lưu 2 byte nhờ @ Bálint

x=>{F=[n=1],M=[0];while(n<x){M.push(n-F[M[n-1]]);F.push(n-M[F[n++-1]])}return[F,M]}

Thực hiện ngây thơ.

Giải trình:

x => {
    F = [n = 1], //female and term number
    M = [0]; //male
    while (n < x) {
        M.push(n - F[M[n - 1]]); //naïve
        F.push(n - M[F[n++ - 1]]); //post-decrement means n++ acts as n in the calculation
    }
    return [F, M];
}

Tôi nghĩ bạn có thể biến nó thành một hàm ẩn danh và thay thế && - s bằng &
Bálint

Bạn không thể, &&ngắn mạch, điều mà tôi muốn, nhưng dù sao tôi cũng đã xóa nó vì cú pháp cú đúp cũng ngắn không kém
ASCII - chỉ

Sau đó, bạn có thể làm`F = [n = 1]
Bálint

2

Toán học, 69 62 byte

Cảm ơn Sp3000 đã đề xuất một hình thức chức năng đã lưu 14 byte.

k_~f~0=1-k
k_~f~n_:=n-f[1-k,f[k,n-1]]
Print/@Array[f,{2,#},0]&

Điều này xác định một hàm trợ giúp có tên fvà sau đó ước tính thành một hàm không tên để giải quyết công việc thực tế là in cả hai chuỗi.


2

Perl 5.10, 85 80 byte

Meh, dunno nếu tôi có thêm ý tưởng để đánh gôn này ...

@a=1;@b=0;for(1..<>-1){push@a,$_-$b[$a[$_-1]];push@b,$_-$a[$b[$_-1]]}say"@a\n@b"

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

Tôi đã phải thêm use 5.10.0vào Ideone để nó chấp nhậnsay hàm, nhưng nó không được tính vào số byte.

Đó là một triển khai ngây thơ của thuật toán, @alà danh sách "nữ" và@b "nam".

Vượt qua 85 vẫn là 85?


Xin giải thích?
clismique

Khá giống với câu trả lời JS của tôi
ASCII - chỉ

@DerpfacePython Thật là một triển khai ngây thơ. :)
Paul Picard

Tôi chưa thử nghiệm, nhưng tôi không nghĩ bạn nên cần các dấu ngoặc đơn quanh mỗi pushthuật ngữ ed, cũng không phải dấu chấm phẩy cuối cùng trước dấu ngoặc kép .
msh210

@ msh210 Thật vậy, quên mất điều này. Tiết kiệm tổng cộng 5 byte, cảm ơn!
Paul Picard

2

Java, tổng cộng 169 byte

int f(int n,int i){return n>0?n-f(f(n-1,i),-i):i>0?1:0;}void p(int n,int i){if(n>0)p(n-1,i);System.out.print(i==0?"\n":f(n,i)+" ");}void p(int n){p(n,1);p(0,0);p(n,-1);}

F (), M () 56 byte

int f(int n,int i){
    return n>0?n-f(f(n-1,i),-i):i>0?1:0;
}

đệ quy cho vòng lặp và in 77 byte

void p(int n,int i) {
    if(n>0) {
        p(n-1,i);
    }
    System.out.print(i==0?"\n":f(n,i)+" ");
}

xuất các danh sách thành hai dòng khác nhau 37 byte

void p(int n) {
    p(n,1);
    p(0,0);
    p(n,-1);
}

đầu vào: đầu ra p ( 10)
:

1 1 2 2 3 3 4 5 5 6 6 7 8 8 9 9 
0 0 1 2 2 3 4 4 5 6 6 7 7 8 9 9

1

C, 166 byte

#define P printf
#define L for(i=0;i<a;i++)
f(x);m(x);i;c(a){L P("%d ",f(i));P("\n");L P("%d ",m(i));}f(x){return x==0?1:x-m(f(x-1));}m(x){return x==0?0:x-f(m(x-1));}

Sử dụng:

main()
{
    c(10);
}

Đầu ra:

1 1 2 2 3 3 4 5 5 6
0 0 1 2 2 3 4 4 5 6

Ungolfed (331 byte)

#include <stdio.h>

int female(int x);
int male(int x);
int i;
int count(a){
    for(i=0;i<a;i++){
        printf("%d ",female(i));
    }
    printf("\n");
    for(i=0;i<a;i++){
        printf("%d ",male(i));
    }
}
int female (int x){
    return x==0?1:x-male(female(x-1));
}
int male(x){
    return x==0?0:x-female(male(x-1));
}
int main()
{
    count(10);
}

0

8 , 195 byte

defer: M
: F dup not if 1 nip else dup n:1- recurse M n:- then ;
( dup not if 0 nip else dup n:1- recurse F n:- then ) is M
: FM n:1- dup ( F . space ) 0 rot loop cr ( M . space ) 0 rot loop cr ;

Sử dụng

ok> 5 FM
1 1 2 2 3 
0 0 1 2 2 

ok> 10 FM
1 1 2 2 3 3 4 5 5 6 
0 0 1 2 2 3 4 4 5 6 

Giải trình

Mã này sử dụng đệ quytừ hoãn

defer: M- Từ Mđược tuyên bố sẽ được định nghĩa sau. Đây là một từ bị trì hoãn

: F dup not if 1 nip else dup n:1- recurse M n:- then ;- Xác định F đệ quy để tạo số nữ theo định nghĩa. Xin lưu ý rằng Mchưa được xác định

( dup not if 0 nip else dup n:1- recurse F n:- then ) is M- Xác định M đệ quy để tạo số nam theo định nghĩa

: FM n:1- dup ( F . space ) 0 rot loop cr ( M . space ) 0 rot loop cr ; - Từ được sử dụng để in chuỗi số nữ và nam

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.