女性と男性のシーケンス


20

この質問は、「数字のシーケンスを生成する」タスクのすべてよりも難しいでしょう。これは、2つのシーケンスが同時に動作する必要があるためです。

答えを本当に楽しみにしています!

彼の著書「Gödel、Escher、Bach:An Eternal Golden Braid」では、ダグラス・ホフスタッターは内部にかなりの数のシーケンスを持ち、それらはすべて何らかの形で前の用語に依存しています。すべてのシーケンスの詳細については、このウィキペディアのページを参照してください

本当に興味深いシーケンスのペアは、女性と男性のシーケンスです。

のためにn > 0

これが女性のシーケンス男性のシーケンスです。

n入力として整数を指定すると、タスクは、n2行の出力で項の量がに等しい女性シーケンスと男性シーケンスのリストを返します。最初の行に女性シーケンスがあり、男性シーケンスがあります。二番目。

サンプルの入力と出力:入力: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]

注:リスト間の区切りは、改行を意味します。

これはコードゴルフなので、バイト単位の最短コードが優先されます。また、コードの説明も記入してください。

リーダーボード


5
リストを印刷する代わりに、関数からリストのペアを返すことはできますか?
ズガルブ

ホフスタッターのシーケンスを含む他の課題:Qシーケンスフィギュアフィギュア系列
マーティン・エンダー

@Zgarb 2つのリストが異なる行にある限り可能です。
clismique

2
@DerpfacePython リストのペアにはがありません。関数リストのペアを返す場合、それらを必要に応じて印刷できます。そうは言っても、出力を印刷するときでさえ、私は行の要件の大ファンではありません。面倒なI / O形式は、課題を書くときに避けるべきものの1つです。
デニス

4
アプローチ/言語によっては大したことではありませんが、他の人にとっては大きな違いを生むことができます。Cでは、シーケンスを行ではなく列に出力することで、多くのバイトを節約できます。Pythonでは、私が考えることができる最も短いアプローチは、リストのペアを返す再帰的なジュリアの答えに似た再帰的なラムダですが、それを改行で文字列に変換する必要があるため、プログラム全体よりもはるかに長くなりますSp3000によって投稿されました。改行を追加することは不可能であるため、カウントアップする代わりにカウントダウンする再帰的なソリューションなどの他のアプローチは完全に除外されます。
デニス

回答:


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
そして、これは、Jellyが10バイト以上を使用するという挑戦をしたことで、私が誇りに思う部分です。
clismique

13

ジュリア、52 48バイト

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

オンラインでお試しください!

バックグラウンド

にはホフスタッターの結婚の機能、著者の示すこと

F/M formula

ここで、φ黄金比

delta/epsilon formula

そして、F nが表すN 番目の フィボナッチ数を

さらに、高度な問題と解決策では、H-187:フィボナッチは正方形であり、提案者は

Fibonacci/Lucas identity

ここで、L nn 番目の ルーカス数を表し、逆に-

converse Fibonacci/Lucas identity

次いで、Nフィボナッチ数であり、mはルーカス番号です。

これから、

delta/epsilon theorem

いつでもN> 0

使い方

入力を考えると、X、我々が構築2のx行列、どこ| は、最初の列の加算と2番目の列の減算であり、nは、行の1からxまでの整数を反復します。

F(n-1)M(n-1)の両方の最初の項は単純n÷φです。

5n²|を計算して、δ(n)ε(n)を計算します。4と試験結果は間の整数の正方形のアレイに属する場合2及び3N。これは、直角度と、1が範囲内にないため、n> 1の場合にテストします減算です。

最後に5n^2|4∈(2:3n).^2、以前に計算された整数から、またはその整数から得られるブール値を加算または減算します。


これは非再帰的/反復的な方法で表現できますか?、それの閉じた形は何ですか?
Abr001am

説明を追加しました。
デニス

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

なぜかというと、再帰的ではなく反復的です。最初の行には末尾のスペースがあります-それで問題ない場合は、余分なバイトを修正できます。@Dennisのおかげで-9バイト。

以下は、実際には役に立たなかった結合ラムダです。

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

男性と女性を指定するnパラメータとk0または1の両方を取ります。最初のラムダはn番目の要素を返し、2番目のラムダは最初のn個の要素を(指数ランタイムで)返します。


9

MATL、23バイト

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

オンラインでお試しください!

説明

これは繰り返し動作します。各シーケンスは配列に保持されます。インデックスnごとに、各シーケンスの新しい項が計算され、対応する配列に関連付けられます。N -1 個の項を持つforループが使用されます。ここで、Nは入力番号です。

シーケンスMの更新を最初に行う必要があります。これは、同じインデックスのシーケンスFは常にシーケンスM以上であるため、最初にFを更新しようとした場合、まだ計算されていないMの項が必要になるためです。

2つの更新式は同じFとMを交換します。したがって、更新用のコードは、for2回の反復でループを適用し、スタック内のシーケンスを交換することにより再利用されます。

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.

再帰的な定義を使用します。最初の2行は動詞fを定義しm、それぞれ女性と男性の機能を表します。最後の行は、1つの引数を取り、女性と男性のシーケンスの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]]

最初にMaleシーケンスを返すことが許可されていれば、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]]

ヘルパー関数#は、開始値slすべての追加要素を検索するためのリスト(前の値のインデックスで)を持つ無限リストを作成します。v = w#1は、女性とw = v#0男性のシーケンスです。メイン関数nでは、vとの両方の最初の要素を取りwます。


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

どれくらいここにいましたか...どうして私が私の名前を変えたことを知ったのですか?そこに私の新しい名前を入れてください。
漏れの修道女

1
私はあなたがあなたの名前を変えたことを知るのに十分長い間ここにいました。
clismique

@DerpfacePython他の回答の長さはほぼ4倍であることがわかりました...私の解決策はそれほど長くはありません。
リーキー修道女

それは非常に真実ですが、他の質問については他のPythプログラムと比べてまだ長いです。
clismique

3

Brachylog、65バイト

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

男性と女性の両方の述語を1つに結合するという私の試みは、実際にコードを長くしました。

同じバイト数を持つ次の1つのライナーを使用できます。

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

:これは、古いJavaのものではなく、Prologトランスパイラーで機能します。

説明

主な述語:

:{: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 whoops、修正済み。また、述語1が{:1-:0re.}範囲リストの作成に使用されることに注意してください。
16年

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

いいえ、末尾の空白は必要ありません。卑劣なvimは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

reduce(23バイト)の代わりに関数を使用する代替ソリューション:

L?>b1-LbtPsyMytb,1ZjCyM

いいね とてもいいですね。
リーキー修道女

3

ルビー、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そしてmHopefullyHelpfulのおかげで1つの機能になりました。f次に、印刷する2番目の関数を変更しましたm。後の空白pは重要(0...n)ですmap。そうでない場合、関数はの結果の代わりに出力します。

3番目の関数は、の最初の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と括弧を削除できます。出力を印刷する必要はありません。また、範囲の周りに括弧を付けることができます。
チャールズが

2つの関数を、2つの引数を持つ1に置き換えることができます。nそして、i n>0?n-f(f(n-1,i),-i):i>0?1:0
HopefullyHelpful

@HopefullyHelpfulたくさんありがとう:D
Sherlock9

@NotthatCharles出力を印刷する必要はありませんか?私は間の改行をしたい場合はRubyでは、fm、私はそれを印刷する必要があります。そうでなければ、私はちょうどのような配列を取得[[1, 1, 2, 2, 3, 3, 4, 5, 5, 6], [0, 0, 1, 2, 2, 3, 4, 4, 5, 6]]
Sherlock9

ああ、それは「改行」と言う。残念な。
はないチャールズ

3

APL(Dyalog Unicode)45 25バイト

匿名の暗黙関数。⎕IO←0多くのAPLシステムの標準であるが必要です。

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

オンラインでお試しください!

これは、FMを組み合わせて、適用する関数を選択するブール型の左引数を持つ単一の2項関数に結合することで機能します。Fに 1を使用し、Mに 0を使用して、このセレクターをF  (0)およびM  (0)の戻り値として使用できるようにします。次に、両方の関数が最初に(引数から1を引いて)自分自身を呼び出し、次にその結果でもう1つの関数を呼び出す必要があることを観察します。

ɩndices ; ゼロから引数マイナス1

1 0∘.{… 左引数()および右引数としてインデックス()} を使用する外側(直交)「積」(ただし、乗算の代わりに以下の関数を使用):[1,0]

×⍵ 右の引数が厳密に正の場合(右の引数の符号):

  ⍵-1 正しい引数から1を引く

  ⍺∇ それを右引数として、左引数を左引数としてselfを呼び出します

  (~⍺)∇ それを右引数として、左引数の論理否定を左引数としてselfを呼び出します

  ⍵- 正しい引数からそれを引き、結果を返します

 その他:

   左引数を返します


これはうまく機能しますが入力が変数に格納されていると仮定することはデフォルトでは許可されていません。
デニス

@デニスそれは実際にはありません。これはtfn本体です。私がここに来たとき、ngnはtfnヘッダー(2バイト、単一文字の名前+改行、ソースファイル名がカウントされないように、匿名のfnsが許可される)をカウントする必要がないと言っただからここにも、ヘッダは1文字の名前+スペース+ 1-char引数名(ここでn)+プラス改行。
アダム

tfnとは正確には何ですか?
デニス

@Dennis Tfnsは、関数の従来のAPL表現です。ほとんどないとのコードの行で構成DFNSの制限。たとえば、適切な制御構造と結果のない式を使用できます。行「0」は、fnの構文を示すヘッダーです。
アダム

2

ES6、89の 85 83バイト

@Bálintのおかげで2バイト節約

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

S& -私はあなたがそれanonymus機能させる、および&&を置き換えることができると思う
バリント

あなたは、することができない&&短絡、たかったが、ブレースの構文はとにかく同じように短いですので、私はとにかくそれを除去する
ASCIIのみ

次に、あなたでしdo`F = [N = 1]
バリント

2

Mathematica、69 62バイト

14バイトを節約した機能的なフォームを提案してくれたSp3000に感謝します。

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

これは、名前付きヘルパー関数fを定義してから、両方のシーケンスを印刷する実際のタスクを解決する名前なし関数に評価されます。


2

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.0を受け入れるためにIdeone を追加する必要sayがありましたが、バイトカウントにはカウントされません。

これは、アルゴリズムの単純な実装であり@a、「女性」リストと@b「男性」リストです。

取り消し線85はまだ85です。


説明してください?
clismique

ほとんど私のJSの答えと同じ
ASCIIのみ

@DerpfacePythonこれは実際には単純な実装です。:)
ポールピカード

私はテストしていませんが、各pushed用語を括弧で囲む必要も、閉じ括弧の前の最後のセミコロンも必要とは思わないでしょう。
msh210

@ msh210確かに、これを忘れていました。合計で5バイト節約します、ありがとう!
ポールピカード

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

再帰的for-loopおよび77バイトの印刷

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

2つの異なる行でリストを出力する37バイト

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

8番目、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 ; -女性と男性の数字のシーケンスを印刷するために使用される単語

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.