ลำดับหญิงและชาย


20

คำถามนี้อาจยากกว่างาน "สร้างลำดับของตัวเลข" ทั้งหมดเนื่องจากต้องใช้ลำดับสองที่ทำงานอย่างพร้อมเพรียง

รอคำตอบจริงๆ!

ในหนังสือของเขา " Gödel, Escher, Bach: นิรันดร์สีทองถักเปีย ", Douglas Hofstadter มีลำดับของตัวเลขค่อนข้างน้อยภายในพวกเขาทั้งหมดขึ้นอยู่กับเทอมที่แล้วในทางใดทางหนึ่ง สำหรับข้อมูลในทุกลำดับให้ดูที่หน้าวิกิพีเดียนี้

หนึ่งคู่ของลำดับที่น่าสนใจจริง ๆ คือลำดับหญิงและชายซึ่งมีการกำหนดดังนี้:

n > 0สำหรับ

นี่คือลำดับหญิงและลำดับชาย

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

ตัวอย่างอินพุตและเอาต์พุต: อินพุต: 5 เอาต์พุต:[1, 1, 2, 2, 3] [0, 0, 1, 2, 2]

อินพุต: 10 เอาต์พุต:[1, 1, 2, 2, 3, 3, 4, 5, 5, 6] [0, 0, 1, 2, 2, 3, 4, 4, 5, 6]

หมายเหตุ: การแยกระหว่างรายการหมายถึงตัวแบ่งบรรทัด

นี่คือ code-golf ดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ รวมทั้งใส่คำอธิบายลงในโค้ดของคุณด้วย

ลีดเดอร์บอร์ด


5
เราสามารถส่งคืนรายการจากฟังก์ชันแทนที่จะพิมพ์รายการได้หรือไม่?
Zgarb

ความท้าทายอื่น ๆ ที่เกี่ยวข้องกับลำดับของ Hofstadter: ลำดับ Q , ลำดับตัวเลขตัวเลข
มาร์ตินเอนเดอร์

@Zgarb คุณสามารถตราบเท่าที่ทั้งสองรายการอยู่ในบรรทัดที่แตกต่างกัน
clismique

2
@DerpfacePython ไม่มีบรรทัดในรายการคู่หนึ่ง หากฟังก์ชั่นคืนคู่ของรายการคุณสามารถพิมพ์ได้ตามต้องการ ที่ถูกกล่าวว่าฉันไม่ได้เป็นแฟนตัวยงของความต้องการสายแม้ในขณะที่พิมพ์ออก รูปแบบ I / O ที่ยุ่งยากนั้นเป็นหนึ่งในสิ่งที่ควรหลีกเลี่ยงเมื่อเขียนความท้าทาย
Dennis

4
มันไม่ใช่เรื่องใหญ่สำหรับบางแนวทาง / ภาษา แต่มันสามารถสร้างความแตกต่างอย่างมากสำหรับผู้อื่น ใน C สามารถบันทึกจำนวนมากได้ด้วยการพิมพ์ลำดับในคอลัมน์แทนที่จะเป็นแถว ใน Python วิธีที่สั้นที่สุดที่ฉันคิดได้คือแลมบ์ดาแบบเรียกซ้ำซึ่งคล้ายกับคำตอบ Julia แบบเรียกซ้ำของฉันที่ส่งคืนรายการคู่หนึ่ง แต่ต้องแปลงเป็นสตริงด้วย linefeed ทำให้มันยาวกว่าโปรแกรมเต็ม โพสต์โดย Sp3000 วิธีการอื่น ๆ เช่นโซลูชันแบบเรียกซ้ำที่นับถอยหลังแทนที่จะขึ้นไปนั้นจะถูกตัดออกอย่างสมบูรณ์เนื่องจากไม่สามารถเพิ่มบรรทัดใหม่ได้
Dennis

คำตอบ:


3

เยลลี่ , 22 20 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

çƓḤ¤Ð¡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
และนี่คือส่วนที่ฉันรู้สึกภาคภูมิใจในตัวเองสำหรับความท้าทายที่ทำให้วุ้นใช้มากกว่า 10 ไบต์
clismique

13

จูเลีย52 52ไบต์

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

ลองออนไลน์!

พื้นหลัง

ในงานแต่งงานของ On Hofstadterผู้เขียนแสดงให้เห็นว่า

สูตร F / M

ที่φหมายถึงอัตราส่วนทองคำ ,

สูตรเดลต้า / เอปไซลอน

และF nหมายถึงn TH จำนวนฟีโบนักชี

นอกจากนี้ในปัญหาขั้นสูงและการแก้ปัญหา H-187: Fibonacci เป็นรูปสี่เหลี่ยมจัตุรัสผู้ยื่นข้อเสนอแสดงให้เห็นว่า

เอกลักษณ์ของ Fibonacci / Lucas

ที่L nหมายถึงn TH จำนวนลูคัสและที่ - ตรงกันข้าม - ถ้า

การสนทนา Fibonacci / Lucas เอกลักษณ์

ดังนั้นnคือหมายเลขฟีโบนักชีและmคือหมายเลขลูคัส

จากนี้เราอนุมานได้ว่า

ทฤษฎีบทเดลต้า / เอปไซลอน

เมื่อใดก็ตามที่n> 0

มันทำงานอย่างไร

รับอินพุตxเราสร้างเมทริกซ์ขนาด2 คูณ xโดยที่| เป็นการเพิ่มในคอลัมน์แรกและการลบในวินาทีและn ทำซ้ำเหนือจำนวนเต็มระหว่าง1ถึงxในแถว

ในระยะแรกของทั้งสองF (n - 1)และM (n - 1)n÷φเป็นเพียง

เราคำนวณδ (n)และε (n)โดยการคำนวณ5n² | 4และทดสอบว่าผลลัพธ์อยู่ในอาร์เรย์ของกำลังสองของจำนวนเต็มระหว่าง2ถึง3nหรือไม่ การทดสอบนี้ใช้เพื่อหากำลังสองและเนื่องจาก1ไม่อยู่ในช่วงสำหรับn> 1ถ้า| เป็นการลบ

ในที่สุดเราก็เพิ่มหรือลบบูลีนที่เป็นผลมาจาก5n^2|4∈(2:3n).^2หรือจากจำนวนเต็มที่คำนวณก่อนหน้า


สิ่งนี้สามารถแสดงออกในรูปแบบที่ไม่มีการเรียกซ้ำ / ซ้ำได้หรือไม่รูปแบบปิดสำหรับมันคืออะไร?
Abr001am

ฉันได้เพิ่มคำอธิบายแล้ว
Dennis

11

Python 2, 79 70 ไบต์

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

ทำซ้ำมากกว่าจะเรียกซ้ำเพราะเหตุใด บรรทัดแรกมีช่องว่างต่อท้าย - หากไม่เป็นไรก็สามารถแก้ไขได้สำหรับไบต์พิเศษ -9 ไบต์ขอบคุณ @Dennis

นี่คือเนื้อแกะรวมที่ไม่ได้ช่วย:

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

ทั้ง Take nและพารามิเตอร์kเป็น 0 หรือ 1 โดยระบุชาย / หญิง แลมบ์ดาแรกส่งคืนองค์ประกอบที่ n และแลมบ์ดาที่สองส่งคืนองค์ประกอบแรกที่ n (พร้อมรันไทม์แบบเอ็กซ์โปเนนเชียล)


9

MATL , 23 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

ต้องทำการอัพเดตสำหรับลำดับ M ก่อน นี่เป็นเพราะลำดับ F นั้นมากกว่าหรือเท่ากับลำดับ M สำหรับดัชนีเดียวกันเสมอดังนั้นหากเราพยายามอัปเดต F ก่อนเราจะต้องใช้คำ M ที่ยังไม่ได้คำนวณ

สมการการอัพเดทสองตัวนั้นมีการแลกเปลี่ยน F และ M เหมือนกันดังนั้นรหัสสำหรับการอัพเดทจะถูกนำกลับมาใช้ใหม่โดยใช้forลูปที่มีการวนซ้ำสองรอบและสลับลำดับในสแต็ก

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

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

ใช้นิยามแบบเรียกซ้ำ สองบรรทัดแรกกำหนดคำกริยาfและmเป็นตัวแทนของฟังก์ชั่นหญิงและชายตามลำดับ บรรทัดสุดท้ายเป็นคำกริยาที่ใช้อาร์กิวเมนต์เดียวnและส่งออกnคำแรกของลำดับหญิงและชาย

การใช้

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

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

ฉันสามารถบันทึก 2 ไบต์หากฉันได้รับอนุญาตให้กลับลำดับชายก่อน:

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

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

ตัวอย่างการใช้: (<$>[v,w]).take $ 5->[[1,1,2,2,3],[0,0,1,2,2]]

ฟังก์ชั่นตัวช่วย#สร้างรายการที่ไม่มีที่สิ้นสุดด้วยค่าเริ่มต้นsและรายการlสำหรับค้นหาองค์ประกอบเพิ่มเติมทั้งหมด (ที่ดัชนีของค่าก่อนหน้า) v = w#1เป็นลำดับตัวเมียและw = v#0ตัวผู้ ในฟังก์ชั่นหลักที่เราใช้เป็นครั้งแรกnองค์ประกอบของทั้งสองและvw


4

Python 2, 107 ไบต์

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)

ลองออนไลน์

ค่าอินพุตที่ใหญ่ขึ้นทำให้ RuntimeError (เรียกซ้ำมากเกินไป) หากนี่เป็นปัญหาฉันสามารถเขียนเวอร์ชันที่ไม่มีข้อผิดพลาดเกิดขึ้น



3

Pyth, 24 ไบต์

อาจเป็นไปไม่ได้ที่จะใช้reduceเพื่อลดจำนวนไบต์

การใช้งานที่ไม่ซับซ้อน

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

ลองออนไลน์!

มันทำงานอย่างไร

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)

ฉันจะรวมชื่อแบบแอนนาแกรมหรือชื่อดั้งเดิมของคุณไว้ในกระดานผู้นำหรือไม่ นอกจากนี้รหัสนี้มีความยาวมากสำหรับโปรแกรม Pyth
clismique

คุณอยู่ที่นี่มานานแค่ไหน ... คุณรู้ได้อย่างไรว่าฉันเปลี่ยนชื่อของฉัน? ใส่ชื่อใหม่ของฉันที่นั่น
Leun Nun

1
ฉันอยู่ที่นี่นานพอที่จะรู้ว่าคุณเปลี่ยนชื่อ
clismique

@DerpfacePython เห็นว่าคำตอบอื่น ๆ นั้นมีความยาวเกือบ 4 เท่า ... ฉันจะบอกว่าวิธีแก้ปัญหาของฉันนั้นไม่นานนัก
Leun Nun

เป็นเรื่องจริงมาก แต่ก็ยังคงยาวนานเมื่อเทียบกับโปรแกรม Pyth อื่น ๆ สำหรับคำถามอื่น ๆ
clismique

3

Brachylogขนาด 65 ไบต์

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

ความพยายามของฉันในการรวมภาคแสดงสำหรับชายและหญิงเป็นหนึ่งทำให้รหัสยาวขึ้น

คุณสามารถใช้หนึ่งซับต่อไปนี้ซึ่งมีจำนวนไบต์เท่ากัน:

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

หมายเหตุ : สิ่งนี้ใช้ได้กับ Prolog transpiler ไม่ใช่ Java ตัวเก่า

คำอธิบาย

ภาคแสดงหลัก:

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

คำกริยา 2 (หญิง):

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

คำกริยา 3 (ชาย):

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

เดี๋ยวก่อน ... ว่าภาคไหนของ 3
clismique

@DerpfacePython อ๊ะคงที่ โปรดทราบว่าเพรดิเคตนั้น{:1-:0re.}ใช้เพื่อสร้างรายการช่วง
เสียชีวิต

3

Clojure, 132 131 ไบต์

(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

เวอร์ชันที่ไม่ดี

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

คำตอบที่ดียินดีต้อนรับสู่เว็บไซต์! จำเป็นต้องมีพื้นที่ต่อท้ายหรือขึ้นบรรทัดใหม่หรือไม่ ฉันนับ 131 + ช่องว่างต่อท้าย
DJMcMayhem

ไม่ไม่จำเป็นต้องมีช่องว่างต่อท้าย กลุ่มส่อเสียดเพิ่มขึ้นบรรทัดใหม่ในตอนท้ายสำหรับ wc ที่จะนับ
ทำเครื่องหมาย

3

Pyth, 23 ไบต์

jCuaG-LHtPs@LGeGr1Q],1Z

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

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

โซลูชันทางเลือกที่ใช้ฟังก์ชั่นแทนการลด (เช่น 23 ไบต์):

L?>b1-LbtPsyMytb,1ZjCyM

ดี ดีมากจริงๆ
Leun Nun

3

Ruby, 104 92 97 82 ไบต์

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

แก้ไข: fและmตอนนี้มีฟังก์ชั่นหนึ่งต้องขอบคุณHopefullyHelpful ผมเปลี่ยนฟังก์ชั่นที่สองที่จะพิมพ์แล้วf mช่องว่างหลังจากที่pมีความสำคัญเป็นอย่างอื่นฟังก์ชั่นพิมพ์แทนผลมาจากการ(0...n)map

ฟังก์ชั่นที่สามพิมพ์อาร์เรย์แรกของคำศัพท์แรกของ n fแล้วตามด้วยอาร์เรย์ของคำแรกที่ n ของm

ฟังก์ชั่นเหล่านี้เรียกว่า:

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

คุณสามารถวาง p และ parens ไม่จำเป็นต้องพิมพ์เอาต์พุต นอกจากนี้คุณสามารถ dorp parens รอบระยะ
ไม่ใช่ชาร์ลส์ที่

คุณสามารถแทนที่ 2 ฟังก์ชั่นด้วย 1 ที่มี 2 ข้อโต้แย้งnและi n>0?n-f(f(n-1,i),-i):i>0?1:0
หวังว่าช่วย

@HopefullyHelpful ขอบคุณพวง: D
Sherlock9

@NotthatCharles ไม่จำเป็นต้องพิมพ์เอาต์พุตหรือไม่? ใน Ruby ถ้าฉันต้องการให้เส้นแบ่งระหว่างfและmฉันต้องพิมพ์มัน มิฉะนั้นฉันจะได้รับอาร์เรย์เช่น[[1, 1, 2, 2, 3, 3, 4, 5, 5, 6], [0, 0, 1, 2, 2, 3, 4, 4, 5, 6]]
Sherlock9

โอ้มันจะพูดว่า "ตัวแบ่งบรรทัด" เลวร้ายเกินไป.
ไม่ใช่ Charles ที่

3

APL (Dyalog Unicode) , 45 25 ไบต์

ฟังก์ชั่นเงียบโดยไม่ระบุชื่อ ต้องการ⎕IO←0ซึ่งเป็นมาตรฐานสำหรับระบบ APL จำนวนมาก

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

ลองออนไลน์!

สิ่งนี้ทำงานโดยการรวมFและMเข้ากับฟังก์ชัน dyadic เดียวกับอาร์กิวเมนต์บูลีนซ้ายซึ่งเลือกฟังก์ชันที่จะใช้ เราใช้ 1 สำหรับFและ 0 สำหรับMเพื่อให้เราสามารถใช้ตัวเลือกนี้เป็นค่าตอบแทนสำหรับF  (0) และM  (0) จากนั้นเราสังเกตว่าทั้งสองฟังก์ชั่นจำเป็นต้องเรียกตัวเองก่อน (ในอาร์กิวเมนต์ลบหนึ่ง) จากนั้นฟังก์ชั่นอื่น ๆ เกี่ยวกับผลลัพธ์ของสิ่งนั้นดังนั้นก่อนอื่นเราจะเรียกคืนด้วยตัวเลือกที่กำหนดและจากนั้นด้วยตัวเลือก

ɩ ndices; ศูนย์ผ่านการโต้แย้งลบหนึ่ง

1 0∘.{} outer (คาร์ทีเซียน) "product" (แต่ด้วยฟังก์ชันด้านล่างแทนการคูณ) โดยใช้[1,0]เป็นอาร์กิวเมนต์ด้านซ้าย ( ) และดัชนีเป็นอาร์กิวเมนต์ขวา ( ):

×⍵ ถ้าอาร์กิวเมนต์ที่ถูกต้องเป็นบวกอย่างเคร่งครัด (สว่างสัญญาณของอาร์กิวเมนต์ที่ถูกต้อง):

  ⍵-1 ลบหนึ่งจากอาร์กิวเมนต์ที่ถูกต้อง

  ⍺∇ เรียกตัวเองว่าเป็นอาร์กิวเมนต์ที่ถูกต้องและอาร์กิวเมนต์ซ้ายเป็นอาร์กิวเมนต์ซ้าย

  (~⍺)∇ เรียกตัวเองว่า ARG ที่ถูกต้องและลบล้างเหตุผลของ ARG ด้านซ้ายเป็น ARG ด้านซ้าย

  ⍵- ลบออกจากอาร์กิวเมนต์ที่ถูกต้องและส่งคืนผลลัพธ์

 อื่น:

   ส่งคืนอาร์กิวเมนต์ที่เหลือ


ใช้งานได้ดี แต่สมมติว่าอินพุตถูกเก็บในตัวแปรไม่ได้รับอนุญาตตามค่าเริ่มต้น
Dennis

@Dennis มันไม่ได้จริงๆ มันเป็นร่างกาย เมื่อฉันใหม่ที่นี่ ngn บอกฉันว่าฉันไม่จำเป็นต้องนับส่วนหัวของ tfn (ซึ่งจะเป็นสองไบต์, ชื่อ char เดี่ยว + ขึ้นบรรทัดใหม่เช่นเดียวกับชื่อไฟล์ต้นฉบับที่ไม่ถูกนับและอนุญาตให้ใช้ fns แบบไม่ระบุชื่อ . ดังนั้นที่นี่เกินไปที่ส่วนหัวเป็นชื่อ 1 ถ่าน + พื้นที่ + ชื่ออาร์กิวเมนต์ 1 ถ่าน ( n) + บวกขึ้นบรรทัดใหม่.
อดัม

อะไรคือ tfn
Dennis

@Dennis Tfnsเป็นตัวแทน APL ดั้งเดิมของฟังก์ชั่น ประกอบด้วยบรรทัดของโค้ดโดยแทบไม่มีข้อ จำกัดของdfns เช่นคุณสามารถมีโครงสร้างการควบคุมที่เหมาะสมและการแสดงออกที่ไม่มีผลลัพธ์ สาย "0" เป็นส่วนหัวซึ่งบ่งชี้ Fn ฯไวยากรณ์
Adám

2

ES6, 89 85 83 ไบต์

บันทึก 2 ไบต์ด้วย@ 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]}

ไร้เดียงสา

คำอธิบาย:

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

ฉันคิดว่าคุณสามารถทำให้เป็นฟังก์ชันไม่ระบุชื่อและแทนที่ && - ด้วย &
Bálint

คุณไม่สามารถ&&ลัดวงจรซึ่งเป็นที่ต้องการ แต่ฉันลบมันออกไปเพราะไวยากรณ์รั้งสั้นพอ ๆ กัน
ASCII- เท่านั้น

จากนั้นคุณสามารถทำได้ `F = [n = 1]
Bálint

2

Mathematica, 69 62 ไบต์

ขอบคุณ Sp3000 สำหรับการแนะนำรูปแบบการทำงานซึ่งบันทึกได้ 14 ไบต์

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

สิ่งนี้จะกำหนดฟังก์ชั่นผู้ช่วยที่ตั้งชื่อfแล้วประเมินผลไปยังฟังก์ชั่นที่ไม่ได้ตั้งชื่อซึ่งจะช่วยแก้ไขงานที่แท้จริงของการพิมพ์ทั้งสองซีเควนซ์


2

Perl 5.10, 85 80 ไบต์

ฉันคิดว่าถ้าฉันมีไอเดียที่จะตีมันลงอีก ...

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

ลองออนไลน์!

ฉันต้องเพิ่มuse 5.10.0Ideone เพื่อให้สามารถรับsayฟังก์ชั่นได้ แต่มันไม่นับรวมกับจำนวนไบต์

เป็นการใช้อัลกอริทึมที่ไร้เดียงสา@aเป็นรายการ "หญิง" และรายการ@b"ชาย"

ข้าม 85 ยังคง 85?


ได้โปรด
clismique

สวยมากเหมือนกับคำตอบ JS ของฉัน
ASCII เท่านั้น

@DerpfacePython มันใช้งานได้จริง :)
Paul Picard

ฉันยังไม่ได้ทดสอบ แต่ฉันไม่คิดว่าคุณควรต้องใช้วงเล็บในแต่ละpushเทอมหรือเซมิโคลอนสุดท้ายก่อนที่จะปิดวงเล็บ
msh210

@ msh210 แน่นอนลืมไปแล้ว บันทึกทั้งหมด 5 ไบต์ขอบคุณ!
Paul Picard

2

Java, 169 ไบต์ทั้งหมด

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

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

วนซ้ำเพื่อการวนซ้ำและการพิมพ์ 77 ไบต์

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

แสดงรายการในสองบรรทัดที่ต่างกัน 37 Bytes

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

อินพุต: 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 ไบต์

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

การใช้งาน:

main()
{
    c(10);
}

เอาท์พุท:

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

Ungolfed (331 ไบต์)

#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

8th , 195 ไบต์

รหัส

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 ;

การใช้

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 

คำอธิบาย

รหัสนี้ใช้การเรียกซ้ำและคำที่ถูกเลื่อนออกไป

defer: M- คำMจะประกาศให้มีการกำหนดในภายหลัง นี่คือคำที่ถูกเลื่อนออกไป

: F dup not if 1 nip else dup n:1- recurse M n:- then ;- กำหนดF ซ้ำเพื่อสร้างตัวเลขเพศหญิงตามคำจำกัดความ โปรดทราบว่าMยังไม่ได้กำหนด

( dup not if 0 nip else dup n:1- recurse F n:- then ) is M- กำหนดM ซ้ำเพื่อสร้างตัวเลขเพศชายตามคำจำกัดความ

: FM n:1- dup ( F . space ) 0 rot loop cr ( M . space ) 0 rot loop cr ; - Word ใช้ในการพิมพ์ลำดับของตัวเลขหญิงและชาย

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