Thue-Morseシーケンスの違いを出力する


10

注:「否定する」とは、すべて1をゼロに置き換えることを意味します(つまり、ビットごとの否定)

Thue-Morseシーケンスは01101001のようになります。

生成方法は次のとおりです。

最初は0から始めます。残っているものを無効にし、最後に追加します。

だから、取る0。それを否定し、それを最後に追加します-01

次にそれを取り、それを否定して最後に追加します- 0110

等々。

これのもう1つの興味深い特性は、ゼロ間の距離が「不合理な」非反復文字列を作成することです。

そう:

0110100110010110
|__|_||__||_|__|
 2  1 0 2 01 2          <------------Print this!

nを入力すると、文字列の最初のn桁を出力するプログラムを作成できますか?

これはコードゴルフなので、最短バイト数が勝ちます!


6
出力に特定のベースを必要としないのは、抜け道のようです。Thue-Morseシーケンス自体が目的の出力であり、単項で、セパレーターとして0が使用されます。
Dennis

回答:


2

ゼリー、9バイト

;¬$‘¡TI’ḣ

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

使い方

;¬$‘¡TI’ḣ  Main link. Argument: n

  $        Create a monadic chain that does the following to argument A (list).
 ¬         Negate all items of A.
;          Concatenate A with the result.
   ‘¡      Execute that chain n + 1 times, with initial argument n.
     T     Get all indices of truthy elements (n or 1).
      I    Compute the differences of successive, truthy indices.
       ’   Subtract 1 from each difference.
        ḣ  Keep the first n results.

4

Pythonの3 2、104の 92 88 84バイト

これは、三元Thue-Morseシーケンスをゼロから構築することに基づく、かなり基本的なソリューションです。このシーケンスは、要求されているものと同じですが、他の誰かがその理由をより詳しく説明する必要があります。とにかく、このシーケンスは、このシーケンスA036580のほんの小さな変更です。

編集: forループをリスト内包表記に変更し、関数からプログラムに変更し、全体をPython 2に変更しました。ゴルフのヘルプを提供してくれたDennisに感謝します。

n=input()
s="2"
while len(s)<n:s="".join(`[1,20,210][int(i)]`for i in s)
print s[:n]

3

ジュリア、56 50バイト

n->(m=1;[m=[m;1-m]for _=0:n];diff(find(m))[1:n]-1)

これは、整数を受け入れ、整数配列を返す無名関数です。これを呼び出すには、変数に割り当てます。

我々は整数で開始することにより、ビットスワップThue-Morseのシーケンスを生成m = 1し、我々は、追加1-mm、アレイとしてn+1倍、n入力されます。これにより、必要以上の用語が生成されます。次に、を使用してfind(m)値を特定し、を使用して連続する値の差を取得し、diff要素ごとに1を減算します。n結果の配列の最初の項を取得すると、必要なものが得られます。

6バイトを節約し、デニスのおかげで問題を修正しました!


3

PowerShell、102バイト

filter x($a){2*$a+([convert]::toString($a,2)-replace0).Length%2}
0..($args[0]-1)|%{(x($_+1))-(x $_)-1}

少し異なる計算方法。PowerShellには、「この配列のすべてのインデックスを取得し、そのインデックスの値がsuch -and- suchに等しい」という簡単な方法がないため、少し工夫する必要があります。

ここでは、A001969を使用しています。これは、「バイナリ展開で1の偶数の数」であり、Thue-Morseシーケンスの0のインデックスを完全に偶然に与えます。;-)

filterその数を計算します。たとえば、x 4を与えるでしょう9。次に、ゼロからインデックスが付けられているため、単純にfromからループ0して入力$args[0]を減算し1ます。ループの各反復では、次の数値と現在の数値の差が出力されます。出力はパイプラインに追加され、暗黙的に改行で出力されます。

PS C:\Tools\Scripts\golfing> .\print-the-difference-in-the-thue-morse.ps1 6
2
1
0
2
0
1

A001969との関係は素晴らしい発見です!
Luis Mendo 2016年

3

Haskell、42バイト

l=2:(([[0..2],[0,2],[1]]!!)=<<l)
(`take`l)

使用例:(`take`l) 7-> [2,1,0,2,0,1,2]

これはa036585_listA036585から01およびにシフトダウンした実装です2。ゴルフ:concat (map f l)is f =<< lf 0=[0,1,2]; f 1=[0,2]; f 2=[1]is ([[0..2],[0,2],[1]]!!)です。

注:lは無限シーケンスです。take-first- nelements機能を実装するには、10バイトまたは約25%かかります。



3

MATL14 11バイト

Q:qB!Xs2\dQ

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

@TimmyDが彼の回答で指摘したように、望ましいシーケンスはA001969の連続した差によって与えられます。後者は、Thue-Morseシーケンス+ 2 * nとして取得できます。したがって、目的のシーケンスは、(Thue-Morseシーケンスの連続した差)に1を加えたものです。

一方、Thue-Morseシーケンスnのバイナリ表現の1の数として取得できn = 0 から始まります。

Q:q    % take input n implicitly and generate row vector [0,1,...,n]
B!     % 2D array where columns are the binary representations of those numbers
Xs     % sum of each column. Gives a row vector of n+1 elements
2\     % parity of each sum
d      % consecutive differences. Gives a row vector of n elements
Q      % increase by 1. Display implicitly

(Thue-Morseシーケンスの連続する違い)+ 1で括弧をリクエストできますか?
CalculatorFeline

@CatsAreFluffyあなたは完全に正しいです。完了
Luis Mendo


2

Python、69バイト

t=lambda n:n and n%2^t(n/2)
lambda n:[1+t(i+1)-t(i)for i in range(n)]

iこのシーケンスのth項は1+t(i+1)-t(i)tあり、Thue-Morse関数です。コードはそれを再帰的に実装します。

t=lambda n:bin(n).count('1')%2

1

Mathematica、65バイト

SubstitutionSystem[{"0"->"012","1"->"02","2"->"1"},"0",#][[;;#]]&

私の他の答えを打つが、非常にスパイシーなゴルフバージョンを打つことはありません。Mathematicaはコードにスペースを追加するのが大好きなので(何もしない)、通常はコードを引用符で囲み、それを引き出しますが、文字列を混乱させることはありませんが、それ自体が引用符のあるコードでは機能しません...

とにかく、私はこのために組み込みの魔法を使っています。出力は文字列です。


これで、4つのMathematicaの回答が得られました。私のオリジナル、非言語的なもの(1つの記号だけが数える場合は5です)、余分にゴルフされたもの、そして私の魔法の組み込み。
CalculatorFeline

1

Mathematica、58バイト

Differences[Nest[Join[#,1-#]&,{0},#]~Position~0][[;;#]]-1&

1
あなたが私の解決策を取り、それをゴルフしなかったことをどうやって知るのですか
CalculatorFeline

@catsarefluffy私はあなたのアイデアをシーケンスを生成するように調整しましたが(インフィックス演算子をカットすることでそれを解決しました)、それを意図された出力に変換するここで使用される方法は非常に異なり、提案された編集より新しい回答に適していると感じました。
シモンズ

@catsarefluffyあなたの編集を見たところです。最後に見たのは、これを行ったときの元の形でした。私はこの回答を削除しますが、それが独立していることを私に信頼してもらう必要があります:)
A Simmons

1;;#簡単に交換できます;;#
LegionMammal978 2016年

実際、私はTimmyDの答えから出力変換を取得しました。(具体的には、最初の段落でについて覚えていましたPosition。)
CalculatorFeline

1

Perl、45 + 2 = 47バイト

$_=2;s/./(1,20,210)[$&]/ge until/.{@F}/;say$&

-pおよび-aフラグが必要です。

$ perl -pa morse-seq.pl <<< 22                                                                            
2102012101202102012021

@ Sherlock9回答のポート

Tonのおかげで9バイト節約


-aオプションでは、そう、あなたの入力の無料コピーを提供します$_=2;s/./(1,20,210)[$&]/ge until/.{@F}/;$_=$&
トンHospel

@TonHospel完璧です。信じられませんでした:-)そして、Perl> v5.18と仮定すると、最後に-pwith -Esay$&を保存できます
andlrc

1

JavaScript(ES6)、73 67バイト

f=(n,s="2")=>s[n]?s.slice(0,n):f(n,s.replace(/./g,c=>[1,20,210][c]))

@ Sherlock9の回答のポート。

編集:@WashingtonGuedesのおかげで6バイト節約されました。


!s[n]代わりに機能しs.length<nますか?それとも、ただs[n]?:反転?
削除

1

CJam(19バイト)

1ri){2b:^}%2ew::-f-

オンラインデモ

これは、Thue-Morseシーケンスの要素間の連続する差分をインクリメントするアプローチを使用します。


書き換えルールを使用する私の最短のアプローチは21バイトです。

ri_2a{{_*5*)3b~}%}@*<

(警告:遅い)。これは書き換えルールをエンコードします

0  ->  1
1  ->  20
2  ->  210

なので

x -> (5*x*x + 1) in base 3

0

Ruby、57バイト

xnorのPython回答の移植版。変更は主に、Rubyで真実であり、バイトを節約して使用することと、リスト内包を直接インポートすることに起因するt代わりに、三項ステートメントにあります。and0(1..n).map1+t[i]-t[i-1]

t=->n{n<1?n:n%2^t[n/2]}
->n{(1..n).map{|i|1+t[i]-t[i-1]}}

0本当ですか?それはどのように機能しますか?
CalculatorFeline

@CatsAreFluffy私の経験では、貧弱です
Sherlock9

0

Mathematica(ほとんど非言語的)、107 110バイト

({0}//.{n__/;+n<2#}:>{n,{n}/.x_:>(1-x)/._[x__]:>x}//.{a___,0,s:1...,0,b___}:>{a,+s/.(0->o),0,b}/.o->0)[[;;#]]&

シーケンスは、置換ルールを繰り返し適用することによって生成されます。別のルールは、それを目的の出力に変換します。気になる人がいれば、詳しく説明します。

非英数字バージョン

({$'-$'}//.{$__/;+$/#
<($'-$')!+($'-$')!}:>
{$,{$}/.$$_:>(($'-$')
!-$$)/.{$$__}:>$$}//.
{$___,$'-$',$$:($'-$'
)!...,$'-$',$$$___}:>
{$,+$$/.($'-$'->$$$$)
,$'-$',$$$}/.$$$$->$'
-$')[[;;#]]

CatsAreFluffyによって提案されています。


どんな答えでも、人々は説明に十分に興味があると思うのが無難だと思います。私自身のためだけに言えば、(アプローチが明白でない限り)私は説明なしで提出物を賛成しない。
Alex A.

そして、あなたはのシーケンスにすべての文字を入れた場合$と置き換える0x-x(xは未使用のシーケンスです$)(と使用(x-x)!1(同上)のために)、我々は英数字がないこと。
CalculatorFeline

Bytesave:{x__}代わりに使用_[x__]
CalculatorFeline

Mathematicaがシンボルのみまたは$[_]:=-/;(両方ともカウンターマシンエミュレーションによる)チューリング完全であると実際に確信しています
CalculatorFeline
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.