In sự khác biệt trong chuỗi Thue-Morse


10

Lưu ý, khi tôi nói "phủ định", ý tôi là thay thế tất cả những cái bằng số không (nghĩa là phủ định bitwise)

Trình tự Thue-Morse diễn ra như 01101001

Cách bạn tạo ra nó là:

Bắt đầu bằng cách lấy 0. Phủ định những gì còn lại và nối nó vào cuối.

Vì vậy, lấy 0. Phủ định nó và thêm nó vào cuối -01

Sau đó lấy nó và phủ nhận nó và thêm nó vào cuối - 0110

Và như thế.

Một đặc tính thú vị khác của điều này là khoảng cách giữa các số 0 tạo ra một chuỗi "không hợp lý" và không lặp lại.

Vì thế:

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

Bạn có thể viết một chương trình mà khi nhập n, sẽ xuất ra n chữ số đầu tiên của chuỗi cần in không?

Đây là mã golf, vì vậy số byte ngắn nhất sẽ thắng!


6
Không yêu cầu một cơ sở cụ thể cho đầu ra có vẻ loopholey. Trình tự Thue-Morse là đầu ra mong muốn, ở dạng đơn và với 0 là dấu phân cách.
Dennis

Câu trả lời:


2

Thạch, 9 byte

;¬$‘¡TI’ḣ

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

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

;¬$‘¡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 byte

Đây là một giải pháp khá thô sơ dựa trên việc xây dựng trình tự Thue-Morse từ đầu. Trình tự này giống hệt với câu hỏi, mặc dù người khác sẽ phải viết một lời giải thích kỹ lưỡng hơn về lý do tại sao. Ở bất kỳ giá nào, chuỗi này chỉ là một sửa đổi nhỏ của cái này, A036580 .

Chỉnh sửa: Thay đổi vòng lặp for thành một danh sách hiểu, thay đổi từ hàm thành chương trình và thay đổi toàn bộ thành Python 2. Cảm ơn Dennis vì đã giúp đỡ chơi golf.

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

3

Julia, 56 50 byte

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

Đây là một hàm ẩn danh chấp nhận một số nguyên và trả về một mảng số nguyên. Để gọi nó, gán nó cho một biến.

Chúng tôi tạo ra chuỗi Thue-Morse được hoán đổi bit bằng cách bắt đầu bằng một số nguyên m = 1, sau đó chúng tôi nối 1-mvào mdưới dạng n+1thời gian mảng , trong đó nlà đầu vào. Điều này tạo ra nhiều điều khoản hơn chúng ta cần. Sau đó, chúng tôi xác định vị trí của những người sử dụng find(m), nhận được sự khác biệt giữa các giá trị liên tiếp bằng cách sử dụng diffvà trừ đi 1 phần tử. Lấy các nđiều khoản đầu tiên của mảng kết quả cho chúng ta những gì chúng ta muốn.

Đã lưu 6 byte và khắc phục sự cố nhờ Dennis!


3

PowerShell, 102 byte

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

Một chút về một cách tính toán khác. PowerShell không có cách dễ dàng để "lấy tất cả các chỉ mục trong mảng này trong đó giá trị tại chỉ mục đó bằng và tương tự ", vì vậy chúng ta cần sáng tạo một chút.

Ở đây chúng tôi đang sử dụng A001969 , "các số có số chẵn 1 trong phần mở rộng nhị phân của chúng", hoàn toàn ngẫu nhiên đưa ra các chỉ số của 0 trong chuỗi Thue-Morse. ;-)

Các filtertính toán số đó. Ví dụ, x 4sẽ cung cấp cho 9. Sau đó, chúng tôi chỉ đơn giản lặp từ 0đầu vào của mình $args[0], trừ đi 1vì chúng tôi được lập chỉ mục bằng 0 và mỗi lần lặp của vòng lặp in ra sự khác biệt giữa số tiếp theo và số hiện tại. Đầu ra được thêm vào đường ống và đầu ra ngầm với dòng mới.

Thí dụ

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

Mối quan hệ với A001969 là một phát hiện tuyệt vời!
Luis Mendo

3

Haskell, 42 byte

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

Ví dụ sử dụng: (`take`l) 7-> [2,1,0,2,0,1,2].

Đó là một thực hiện a036585_listtừ A036585 chuyển xuống 0, 12. Chơi gôn: concat (map f l)f =<< lf 0=[0,1,2]; f 1=[0,2]; f 2=[1]([[0..2],[0,2],[1]]!!).

Lưu ý: llà chuỗi vô hạn. Phải mất 10 byte hoặc khoảng 25% để thực hiện ntính năng lấy trước .


3

Toán học, 79 68 70 byte

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

1
Thất bại cho n<3.
murumb

3

MATL , 14 11 byte

Q:qB!Xs2\dQ

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

Như @TimmyD đã chỉ ra trong câu trả lời của mình , trình tự mong muốn được đưa ra bởi sự khác biệt liên tiếp của A001969 . Cái sau có thể lần lượt được lấy là chuỗi Thue-Morse cộng với 2 * n . Do đó, chuỗi mong muốn được đưa ra bởi (sự khác biệt liên tiếp của chuỗi Thue-Morse) cộng với một .

Mặt khác, chuỗi Thue-Morse có thể được lấy là số lượng trong biểu diễn nhị phân của n , bắt đầu từ 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

Tôi có thể yêu cầu ngoặc đơn trong (sự khác biệt liên tiếp của chuỗi Thue-Morse) cộng với 1 không?
Máy

@CatsAreFluffy Bạn hoàn toàn đúng. Xong
Luis Mendo

2

05AB1E , 14 13 byte

Mã số:

ÎFDSÈJJ}¥1+¹£

Giải trình:

Î              # 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

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


2

Python, 69 byte

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

Các ithuật ngữ thứ của dãy này là 1+t(i+1)-t(i), nơi tlà hàm Thue-Morse. Mã thực hiện đệ quy, nó ngắn hơn

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

1

Toán học, 65 byte

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

Đánh bại câu trả lời khác của tôi, nhưng không đánh bại phiên bản chơi gôn quá cay . Bây giờ, thông thường tôi dán mã của mình vào dấu ngoặc kép, sau đó rút nó ra vì Mathicala thích thêm khoảng trắng vào mã của bạn (không làm gì cả) nhưng nó không bao giờ gây rối với chuỗi, nhưng điều đó không hoạt động đối với mã mà chính nó có dấu ngoặc kép ...

Sao cũng được, tôi chỉ đang sử dụng ma thuật dựng sẵn cho việc này. Đầu ra là một chuỗi.


Bây giờ chúng ta có 4 câu trả lời Mathicala: Bản gốc của tôi, câu trả lời không lời (đó là 5 nếu là số một trong số một cách tượng trưng), câu trả lời bổ sung và phép thuật tích hợp của tôi.
Máy

1

Toán học, 58 byte

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

1
Làm thế nào để tôi biết bạn đã không đưa giải pháp của tôi và chơi nó?
Máy

@catsarefluffy Tôi đã điều chỉnh ý tưởng của bạn để tạo ra chuỗi (đánh gôn bằng cách cắt toán tử infix), nhưng cảm thấy rằng phương pháp được sử dụng ở đây để chuyển đổi nó thành đầu ra dự định rất khác và phù hợp với câu trả lời mới hơn là chỉnh sửa được đề xuất.
Một Simmons

@catsarefluffy Tôi vừa xem chỉnh sửa của bạn. lần cuối cùng tôi nhìn thấy nó ở dạng ban đầu khi tôi làm điều này. Tôi sẽ xóa câu trả lời này nhưng bạn sẽ phải tin tưởng rằng nó độc lập :)
Một Simmons

1;;#có thể được thay thế bằng đơn giản ;;#.
LegionMammal978

Trên thực tế, tôi đã nhận được chuyển đổi đầu ra từ câu trả lời của TimmyD. (Cụ thể, đoạn đầu tiên khiến tôi nhớ về Position.)
CalculatorFeline

1

Perl, 45 + 2 = 47 byte

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

Yêu cầu -p-acờ:

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

Cảng @ Sherlock9 trả lời

Đã lưu 9 byte nhờ Ton


Các -atùy chọn cung cấp cho bạn một bản sao miễn phí của đầu vào, vì vậy$_=2;s/./(1,20,210)[$&]/ge until/.{@F}/;$_=$&
Tôn Hospel

@TonH rửa Đó là hoàn hảo, không thể tin rằng tôi đã không nghĩ về điều đó :-) Và tôi có thể lưu lại -pvới -E: say$&cuối cùng nếu chúng ta giả sử rằng Perl> v5.18
andlrc 15/03/2016

1

JavaScript (ES6), 73 67 byte

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

Câu trả lời của cảng @ Sherlock9.

chỉnh sửa: Đã lưu 6 byte nhờ @WashingtonGuedes.


Sẽ !s[n]làm việc thay s.length<nthế? Hoặc có thể chỉ s[n]với ?:đảo ngược?
xóa

1

CJam (19 byte)

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

Bản demo trực tuyến

Điều này sử dụng phương pháp gia tăng sự khác biệt kế tiếp giữa các yếu tố của chuỗi Thue-Morse.


Cách tiếp cận ngắn nhất của tôi bằng cách sử dụng các quy tắc viết lại là 21 byte:

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

(Cảnh báo: chậm). Điều này mã hóa các quy tắc viết lại

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

như

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

0

Ruby, 57 byte

Một cổng của câu trả lời Python của xnor. Những thay đổi chủ yếu nằm ở câu lệnh ternary tthay andcho 0sự trung thực trong Ruby, và sử dụng (1..n).map1+t[i]-t[i-1]để lưu byte so với nhập trực tiếp sự hiểu danh sách.

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

0có thật không Làm thế nào mà làm việc ??
Máy

@CatsAreFluffy Theo kinh nghiệm của tôi, thật tệ
Sherlock9

0

Mathicala ( gần như không lời), 107 110 byte

({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)[[;;#]]&

Trình tự được tạo ra bằng cách liên tục áp dụng một quy tắc thay thế. Một quy tắc khác biến nó thành đầu ra mong muốn. Nếu đủ người quan tâm, tôi sẽ giải thích chi tiết.

phiên bản không chữ và số

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

theo đề xuất của CatsAreFluffy.


Tôi nghĩ thật an toàn khi cho rằng mọi người đủ quan tâm đến một lời giải thích cho bất kỳ câu trả lời nào. Chỉ nói cho bản thân tôi, tôi không đưa ra các bài nộp mà không có lời giải thích (trừ khi cách tiếp cận là rõ ràng).
Alex A.

Và nếu bạn biến tất cả các chữ cái thành chuỗi $và thay thế 0bằng x-x(trong đó x là một chuỗi không được sử dụng $) (và sử dụng (x-x)!cho 1 (ditto)), chúng ta sẽ không có chữ và số.
Máy

Bytesave: Sử dụng {x__}thay vì_[x__]
CalculatorFeline

Tôi thực sự khá chắc chắn rằng Mathicala hoàn thành Turing chỉ trên các biểu tượng hoặc $[_]:=-/;(cả bằng cách mô phỏng máy đối ứng)
CalculatorFeline
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.