Thu-Morse 시퀀스의 차이를 인쇄


10

"네거티브"라고 말하면 모든 것을 0으로 바꿉니다 (즉, 비트 부정).

Thu-Morse 시퀀스는 01101001과 같습니다.

생성하는 방법은 다음과 같습니다.

남은 것을 무효화하고 끝에 추가하십시오.

따라서 0. 그것을 부정하고 끝에 추가하십시오-01

그런 다음 그것을 가지고 부정하고 그것을 끝에 추가하십시오- 0110

등등.

이것의 또 다른 흥미로운 속성은 0 사이의 거리가 "비이성적"이고 반복되지 않는 문자열을 생성한다는 것입니다.

그래서:

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

파이썬 3 2, 104 92 88 84 바이트

이것은 처음부터 3 차 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-모스 시퀀스를 생성 m = 1, 우리는 추가 1-mm배열로서 n+1n입력된다. 이것은 우리가 필요로하는 것보다 더 많은 용어를 생성합니다. 그런 다음을 사용하여 find(m)값을 diff찾고을 사용하여 연속 값의 차이를 얻고 1을 요소별로 뺍니다. n결과 배열 의 첫 번째 항을 취하면 원하는 것을 얻을 수 있습니다.

6 바이트를 절약하고 Dennis 덕분에 문제를 해결했습니다!


3

PowerShell, 102 바이트

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

약간 다른 컴퓨팅 방식. PowerShell은 "해당 인덱스의 값이 이와 같은 위치에있는이 인덱스의 모든 인덱스를 얻을 수있는"쉬운 방법이 없기 때문에 약간의 창의성을 가져야합니다.

여기서 우리는 "이진 확장에서 짝수의 1을 갖는 숫자"인 A001969를 사용하고 있는데 , 이는 Thue-Morse 시퀀스에서 0의 인덱스 를 완전히 우연히 제공합니다. ;-)

filter그 수를 계산합니다. 예를 들어, x 4을 줄 것 9입니다. 우리는 단순히 0에서 인덱스되기 때문에 뺄셈에서 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

3

하스켈, 42 바이트

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

사용 예 : (`take`l) 7-> [2,1,0,2,0,1,2].

그것은의 구현의 a036585_list에서 A036585가 아래로 이동 0, 12. 골프 : concat (map f l)있습니다 f =<< lf 0=[0,1,2]; f 1=[0,2]; f 2=[1]입니다 ([[0..2],[0,2],[1]]!!).

참고 : l무한 시퀀스입니다. take-first-- nelements 기능 을 구현하는 데 10 바이트 또는 약 25 %가 소요 됩니다.


3

Mathematica, 79 68 70 바이트

(Differences[Join@@Position[Nest[#~Join~(1-#)&,{0},#+2],0]]-1)[[;;#]]&

1
에 실패합니다 n<3.
murphy

3

MATL , 14 11 바이트

Q:qB!Xs2\dQ

온라인으로 사용해보십시오!

그의 답변 에서 @TimmyD에 의해 지적 된 바와 같이 , 원하는 순서는 A001969 의 연속적인 차이에 의해 주어진다 . 후자는 Thue-Morse 시퀀스 + 2 * n 으로 얻을 수 있습니다 . 따라서 원하는 시퀀스는 (Thue-Morse 시퀀스의 연속적인 차이)에 1을 더한 값으로 주어집니다 .

한편, 모스 Thue - 시퀀스 를 얻을 수 의 이진 표현에서 사람의 수가 N 부터 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

(Tue-Morse 시퀀스의 연속적인 차이)에 1을 더한 괄호를 요청할 수 있습니까?
CalculatorFeline

@CatsAreFluffy 당신은 완전히 옳습니다. 완료
Luis Mendo

2

05AB1E , 14 13 바이트

암호:

ÎFDSÈJJ}¥1+¹£

설명:

Î              # Push 0 and input
 F     }       # Do the following n times
  DS           # Duplicate and split
    È          # Check if even
     JJ        # Join the list then join the stack
        ¥1+    # Compute the differences and add 1
           ¹£  # Return the [0:input] element

온라인으로 사용해보십시오!


2

파이썬, 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이 순서 의 세 번째 항은입니다 1+t(i+1)-t(i). 여기서 tThu-Morse 함수입니다. 코드는 재귀 적으로 구현하는데,

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

1

Mathematica, 65 바이트

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

내 다른 대답은 이기지 만 매운 골프 버전을 이기는 것은 아닙니다 . 이제 일반적으로 코드를 따옴표로 묶은 다음 Mathematica는 코드에 공백을 추가하는 것을 좋아하지만 (아무것도하지 않음) 문자열로 엉망이되지 않지만 따옴표가있는 코드에는 작동하지 않습니다.

어쨌든, 나는 이것을 위해 내장 된 마법을 사용하고 있습니다. 출력은 문자열입니다.


우리는 이제 4 가지 Mathematica 답변을 가지고 있습니다 : 나의 독창적, 비언어적 답변 (심볼 만 1이면 중요하다), 골프 골이없는 것, 내 마법 내장.
CalculatorFeline

1

Mathematica, 58 바이트

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

1
내 솔루션을 가져 가지 않고 골프를 쳤다는 것을 어떻게 알 수 있습니까?
CalculatorFeline

@catsarefluffy 나는 시퀀스를 생성하기 위해 당신의 아이디어를 수정했지만 (중위 연산자를 잘라서 그것을 골핑), 그것을 의도 된 출력으로 변환하는 데 사용 된 방법이 매우 다르며 제안 된 편집과는 다른 새로운 대답에 더 적합하다고 느꼈습니다.
시몬스

@catsarefluffy 방금 편집 한 내용을 보았습니다. 내가 본 마지막은 내가 이것을했을 때의 원래 형태였습니다. 나는이 대답을 제거 할 수 있습니다하지만 당신은 그냥 독립적 :)라고 저를 신뢰해야합니다
시몬스을

1;;#간단하게 교체 할 수 있습니다 ;;#.
LegionMammal978

실제로 TimmyD의 답변에서 출력 변환을 얻었습니다. (구체적으로, 첫 번째 문단은 나를 기억하게 만들었습니다 Position.)
CalculatorFeline

1

Perl, 45 + 2 = 47 바이트

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

-pand -a플래그가 필요합니다 .

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

@ Sherlock9 포트 답변

Ton 덕분에 9 바이트 절약


-a옵션은 그래서, 당신에게 입력의 무료 사본을 제공합니다$_=2;s/./(1,20,210)[$&]/ge until/.{@F}/;$_=$&
톤 Hospel에게

@TonHospel 그게 전부 완벽, 내가 그 생각을하지 않았다 :-) 그리고 나는 저장할 수 있습니다 믿을 수 없어 -p함께 -E: say$&끝에서 우리가 가정하면 그 펄> v5.18
andlrc

1

자바 스크립트 (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

루비, 57 바이트

xnor의 Python 답변 포트. 변화는 대부분의 삼항 성명에서 거짓말 t의 장소 and로 인해 0루비 truthy되고, 그리고 사용 (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

티카 ( 거의 비언어적) 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.

그리고 당신의 순서로 모든 문자를 켜면 $및 교체 0와 함께 x-x(x는 사용되지 않는의 순서입니다 $(사용) (x-x)!, 우리는 숫자가 없음 (1) (저두)에 대한이).
CalculatorFeline

Bytesave : {x__}대신 사용_[x__]
CalculatorFeline

나는 확신 티카 심볼에 튜링 완료되었다는 사실이야 전용 또는 $[_]:=-/;(모두 카운터 기계 에뮬레이션에 의해)
CalculatorFeline
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.