Trình tự đường cong rồng


23

Các chuỗi đường cong rồng (hoặc gấp dãy giấy thường xuyên) là một chuỗi nhị phân. a(n)được đưa ra bởi sự phủ định của bit còn lại của 1 ít quan trọng nhất n. Ví dụ để tính toán, a(2136)trước tiên chúng tôi chuyển đổi sang nhị phân:

100001011000

Chúng tôi tìm thấy bit ít quan trọng nhất của chúng tôi

100001011000
        ^

Lấy bit bên trái của nó

100001011000
       ^

Và trả lại phủ định của nó

0

Bài tập

Cho một số nguyên dương làm đầu vào, đầu ra a(n). (Bạn có thể xuất theo số nguyên hoặc boolean). Bạn nên đặt mục tiêu làm cho mã của bạn nhỏ nhất có thể được đo bằng byte.

Các trường hợp thử nghiệm

Dưới đây là 100 mục đầu tiên theo thứ tự

1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 1


9
Ít quan trọng nhất 100001011000là a 0. Bạn có nghĩa là ít quan trọng nhất 1?
phân tán

Câu trả lời:


16

Toán học 25 byte

1/2+JacobiSymbol[-1,#]/2&

Những cách khác để làm điều này:

56 byte

(v:=1-IntegerDigits[#,2,i][[1]];For[i=1,v>0,i++];i++;v)&

58 byte

1-Nest[Join[#,{0},Reverse[1-#]]&,{0},Floor@Log[2,#]][[#]]&

3
Ồ Một câu trả lời toán học và nó không chỉ được xây dựng. Có một upvote!
KeyWeeUsr

2
Điều duy nhất có thể làm cho câu trả lời này thậm chí còn tốt hơn là một lời giải thích cho lý do tại sao và làm thế nào nó hoạt động. : P
Martin Ender

2
@MartinEnder arxiv.org/pdf/1408.5770.pdf Xem nhận xét sau Ví dụ 13.
alephalpha

7

Python 3 , 22 21 byte

1 byte nhờ vào ETHproductions.

lambda n:n&2*(n&-n)<1

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

Số học bitw ftw.


2
"Bạn có thể xuất theo số nguyên hoặc bằng boolean" vì vậy tôi đoán bạn không cần 0+(...)?
Martin Ender

Trình tự hoạt động ở đây thực sự làm tôi bối rối. Có thể n&1được đặt trong ngoặc đơn? Hoặc là 1+(n^~-n)<1có thể được đặt trong ngoặc đơn? Hay là 1+(n^~-n)...
ETHproductions

trời ơi cái gì đây là những gì tôi đang tìm kiếm: o tốt đẹp!
HyperNeutrino

&có quyền ưu tiên thấp nhất, vì vậy nó là1+(n^~-n)
Leaky Nun

Ah, tìm thấy bảng ưu tiên. Bây giờ tất cả đều có ý nghĩa: P
Sản phẩm ETH

6

Võng mạc ,38 34 29 byte

\d+
$*
+`^(1+)\1$|1111
$1
^1$

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

Martin và Leaky về cơ bản đã nảy ra ý tưởng này, để có thêm 5 byte!

Chuyển đổi đầu vào thành unary và sau đó chia dần số cho 2. Khi không thể làm điều đó một lần nữa (tức là số lẻ), sau đó xóa các bản vá 4 khỏi đầu vào, tính toán kết quả của mod hoạt động cuối cùng 4 Cuối cùng, điều này kiểm tra nếu kết quả là 1, có nghĩa là chữ số bên trái của 1 bit có ý nghĩa nhỏ nhất bằng không. Nếu đó là sự thật, kết quả cuối cùng là 1, nếu không thì bằng không.


31 byte (tôi có nên tự đăng nó không?)
Leaky Nun

Tôi đã tìm ra cách để tránh chuyển đổi nhị phân đầy đủ và thay vào đó chỉ cần phân chia các yếu tố của 2 và kiểm tra sự bằng nhau với 1 (mod 4): tio.run/##K0otycxL/
Martin Ender

@MartinEnder về cơ bản là thuật toán của tôi ... với 2 byte tắt
Leaky Nun

@LeakyNun Oh yeah, cả hai đều cùng một ý tưởng. Những bộ óc vĩ đại và những thứ ...;)
Martin Ender

Tôi sẽ chỉnh sửa nó trong, nhưng nếu một trong hai bạn muốn đăng nó thì tôi sẽ hoàn nguyên, vì tôi có lẽ sẽ không nghĩ về điều đó;)
FryAmTheEggman

6

Thạch , 5 byte

&N&HṆ

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

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

&N&HṆ  Main link. Argument: n

 N     Negate; yield -n.
&      Bitwise AND; compute n&-n.
       This yields the highest power of 2 that divides n evenly.
   H   Halve; yield n/2.
  &    Bitwise AND; compute n&-n&n/2. This rounds n/2 down if n is odd.
    Ṇ  Take the logical NOT of the result.

4

Alice , 8 byte

I2z1xnO@

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

Lấy đầu vào là điểm mã của ký tự Unicode và xuất kết quả dưới dạng byte 0x00 hoặc 0x01 tương ứng.

Để kiểm tra, đây là phiên bản I / O thập phân ở mức 12 byte sử dụng cùng một thuật toán (chỉ I / O là khác nhau):

/o
\i@/2z1xn

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

Nếu Alice là ngôn ngữ chơi gôn và không yêu cầu I / O rõ ràng và chấm dứt chương trình, thì điều này sẽ chỉ ở mức 5 byte ( 2z1xn) đánh bại cả 05AB1E và Jelly.

Giải trình

I    Read input.
2z   Drop all factors of 2 from the input, i.e. divide it by 2 as long
     as its even. This shifts the binary representation to the right
     until there are no more trailing zeros.
1x   Extract the second-least significant bit.
n    Negate it.
O    Output it.
@    Terminate the program.


3

Khôn ngoan , 28 20 16 byte

::-~^~-&:[?>]~-^

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

Giải trình

Đây là một cổng của câu trả lời Python của Leaky Nun. Rất tiếc, nó không hoạt động trên TIO vì phiên bản trình thông dịch của TIO hơi lỗi thời.

Chúng tôi bắt đầu bằng cách tạo 3 bản sao đầu vào của chúng tôi ::, sau đó chúng tôi giảm số bản sao trên cùng xuống 1. Điều này sẽ lật tất cả các bit cho đến lần đầu tiên 1. Sau đó, chúng tôi xor cái này với một bản sao khác của đầu vào của chúng tôi. Vì tất cả các bit cho đến 1 đầu tiên trên đầu vào của chúng tôi đã được lật, điều này sẽ dẫn đến tất cả các bit đó là 1 trên kết quả. Sau đó, nếu chúng ta thêm một ~-vào kết quả, chúng ta sẽ nhận được 1 số duy nhất ở bên trái mức ít quan trọng nhất của chúng ta 1. Chúng ta VÀ cái này với đầu vào để lấy bit đó từ đầu vào. Bây giờ chúng ta sẽ có 0bit đó bị tắt và sức mạnh của 2 iff đó là bit, chúng ta có thể thay đổi nó thành một 1hoặc 0với :[?>]. Một khi điều này được thực hiện, chúng ta chỉ cần phủ định bit ~-^và chúng ta đã hoàn thành.



3

Haskell , 45 43 39 byte

6 byte được lưu nhờ nimi

f x|d<-div x 2=[f d,mod(1+d)2]!!mod x 2

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


Bạn có thể sử dụng divthay vì quot.
nimi

Thậm chí tốt hơn: divMod:f x|(d,m)<-divMod x 2=[mod(1+d)2,f d]!!m
Tên mẫu

@nimi Tôi thậm chí không hiểu cách thức hoạt động. Bạn có lẽ chỉ nên đăng nó cho mình.
Thuật sĩ lúa mì

Nó vẫn còn các thuật toán tương tự, nhưng chỉ là một cách khác nhau để chọn ngành (đệ quy gọi e lại vs trường hợp cơ sở), vì vậy cảm thấy tự do để chỉnh sửa nó trong. |(d,m)<-divMod x 2Là một bảo vệ mẫu để ràng buộc dđể div x 2mđể mod x 2. Chúng tôi sử dụng mđể lập chỉ mục danh sách hai yếu tố [...,...]!!m. Trong trường hợp m==0chúng tôi trở lại mod(1+d)2và trong trường hợp m==1 f d.
nimi

1
Ồ, xin lỗi, bạn phải lật các yếu tố danh sách : [f d,mod(1+d)2]. Hãy thử trực tuyến! .
nimi

3

Mã máy x86, 17 16 15 byte:

Giả sử ABI trong đó các tham số được đẩy trên ngăn xếp và giá trị trả về nằm trong thanh ALghi.

8B 44 24 04 0F BC C8 41 0F BB C8 0F 93 C0 C3

Điều này được tháo rời như sau:

_dragoncurve:
  00000000: 8B 44 24 04        mov         eax,dword ptr [esp+4]
  00000004: 0F BC C8           bsf         ecx,eax
  00000007: 41                 inc         ecx
  00000008: 0F BB C8           btc         eax,ecx
  0000000B: 0F 93 C0           setae       al
  0000000E: C3                 ret

1
@PeterTaylor Tôi đang đếm kích thước của lệnh CPU theo byte cho câu trả lời của tôi; đó là một thực tế khá phổ biến trên PPCG cho câu trả lời lắp ráp.
Govind Parmar

1
Tôi không thể nói mức độ phổ biến của nó, nhưng nó chắc chắn là sai
Peter Taylor

1
Nó không chỉ là mô phạm, nó cũng vô nghĩa. Không có sự phân biệt giữa "mã máy" và "mã lắp ráp" khi có liên quan đến máy tính. Sự khác biệt chỉ là một trong những giải thích. Chúng tôi gán mnemonics cho byte mã máy để giúp con người dễ đọc hơn. Nói cách khác, chúng tôi mở rộng các byte để làm cho chúng dễ hiểu hơn.
Cody Grey

3
Điều đó không liên quan, @Peter. Mã lắp ráp chỉ là bản dịch mã con người có thể đọc được. Chúng chính xác là cùng một ngôn ngữ, chỉ ở hai dạng / biểu diễn khác nhau. Nó không khác gì TI BASIC, nơi chúng ta thường chấp nhận rằng chúng ta đếm mã thông báo , thay vì byte ký tự, bởi vì đây là cách hệ thống lưu trữ chúng bên trong. Điều tương tự cũng đúng với ngôn ngữ hợp ngữ: các ký hiệu lệnh không được lưu dưới dạng các ký tự riêng lẻ, mà được biểu diễn dưới dạng byte của mã máy tương đương.
Cody Grey

2
Bên cạnh đó, nói thực tế, tại sao bất cứ ai bao giờ nhập mở rộng việc nhớ mật khẩu lắp ráp ngôn ngữ trong một cuộc thi mã golf, khi họ có thể chuyển chúng thành 100% mã máy tương đương, nơi entry là đảm bảo được ngắn miễn phí? Điều đó một mình làm nên sự khác biệt giữa hai điều vô nghĩa, nếu không muốn nói là hoàn toàn vô lý.
Cody Grey

3

JavaScript (ES6), 17 14 byte

f=
n=>!(n&-n&n/2)
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

Chỉnh sửa: Đã lưu 3 byte bằng cách chuyển câu trả lời của @ Dennis khi tôi nhận thấy rằng đầu ra boolean có thể chấp nhận được.


3

C (gcc) , 20 byte

f(n){n=!(n&-n&n/2);}

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


Điều này không thực sự "làm việc"; bạn đang dựa vào một công cụ tạo mã cho một phiên bản cụ thể của trình biên dịch nhắm vào một kiến ​​trúc cụ thể, trong đó các phép tính trung gian được thực hiện trong cùng một thanh ghi được sử dụng cho các giá trị trả về. Việc kích hoạt bất kỳ loại tối ưu hóa nào, thay đổi kiến ​​trúc đích hoặc sử dụng một phiên bản GCC khác sẽ phá vỡ điều này. Bạn cũng có thể chỉ cần nói "rác trên ngăn xếp của tôi chứa đầu ra đúng khi có trăng tròn vào ngày 13 tháng 10".
Cody Grey

Mặc dù tất cả mọi thứ bạn nói là đúng và mã như thế này không bao giờ được sử dụng trong mã sản xuất, chúng tôi xác định ngôn ngữ bằng cách triển khai chúng cho các mục đích của mã golf. Không có cờ bổ sung, điều này hoạt động trong tất cả các phiên bản gần đây của gcc và tcc và nó chỉ phải hoạt động trong một phiên bản để được coi là hợp lệ.
Dennis

"Chúng tôi xác định ngôn ngữ bằng cách triển khai chúng cho mục đích chơi gôn" Chờ đã, cái gì? Vì vậy, mỗi cờ biên dịch và mỗi phiên bản GCC định nghĩa một ngôn ngữ khác nhau? Bạn nhận ra rằng điều đó thật điên rồ, phải không? Tiêu chuẩn ngôn ngữ C là những gì xác định ngôn ngữ.
Cody Gray

Không phải ở đây. Nếu có tiêu chuẩn C nhưng không có triển khai, chúng tôi thậm chí sẽ không coi đó là ngôn ngữ. Như tôi đã nói trước đó, trình biên dịch định nghĩa ngôn ngữ . Kết quả là, dựa vào hành vi không xác định được cho phép . Một bộ cờ khác không được coi là ngôn ngữ khác, nhưng trừ khi bạn thêm chúng vào số byte của mình, tất cả các câu trả lời đều sử dụng cờ biên dịch chuẩn.
Dennis

Ồ Đó là các loại hạt. Ý tôi là, tôi có thể hiểu nếu bạn nói rằng hành vi xác định thực hiện được cho phép, nhưng hành vi không xác định không được xác định bởi việc thực hiện. Đó là nghĩa đen không xác định. Việc thực hiện được phép làm những điều ngẫu nhiên mỗi lần. Và khái niệm "cờ tổng hợp tiêu chuẩn" này là thứ mà bạn vừa phát minh ra. Cờ biên dịch tiêu chuẩn của tôi bao gồm một số mã phá vỡ mã của bạn. Và tôi hầu như không nghĩ rằng trình tối ưu hóa là không chuẩn. Vâng, rõ ràng trang web này không dành cho tôi.
Cody Gray

3

INTERCAL , 50 byte

DOWRITEIN.1DO.1<-!?1~.1'~#1DOREADOUT.1PLEASEGIVEUP

Các nhà khai thác unary INTERCALs khá phù hợp cho việc này, vì vậy tôi quyết định viết bài đầu tiên của mình.

DO WRITE IN .1
DO .1 <- !?1~.1'~#1
DO READ OUT .1
PLEASE GIVE UP



2

,,, , 10 9 byte

::0-&2*&¬

Giải trình

Lấy đầu vào là 3 chẳng hạn.

::0-&2*&1≥
               implicitly push command line argument       [3]
::             duplicate twice                             [3, 3, 3]
  0            push 0 on to the stack                      [3, 3, 3, 0]
   -           pop 0 and 3 and push 0 - 3                  [3, 3, -3]
    &          pop -3 and 3 and push -3 & 3 (bitwise AND)  [3, 1]
     2         push 2 on to the stack                      [3, 1, 2]
      *        pop 2 and 1 and push 2 * 1                  [3, 2]
       &       pop 2 and 3 and push 2 & 3                  [2]
        ¬      pop 2 and push ¬ 2 (logical NOT)            [0]
               implicit output                             []


2

Octave , 34 byte

@(x)~(k=[de2bi(x),0])(find(k,1)+1)

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

Giải trình:

@(x)                               % Anonymous function taking a decimal number as input
    ~....                          % Negate whatever comes next
     (   de2bi(x)   )              % Convert x to a binary array that's conveniently 
                                   % ordered with the least significant bits first
        [de2bi(x),0]               % Append a zero to the end, to avoid out of bound index
     (k=[de2bi(x),0])              % Store the vector as a variable 'k'
                     (find(k,1)    % Find the first '1' in k (the least significant 1-bit)
                               +1  % Add 1 to the index to get the next bit
     (k=[de2bi(x),0])(find(k,1)+1) % Use as index to the vector k to get the correct bit

Tại sao tôi chưa bao giờ nghe nói về de2bi ...: O
Sanchises

1

Nộp hồ sơ:

Python 2 , 41 39 byte

x=input()
while~-x&1:x/=2
print 1-x/2%2

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

-2 byte nhờ FryAmTheEggman

Giải pháp ban đầu:

Python 2 , 43 byte

lambda x:1-int(bin(x)[bin(x).rfind('1')-1])

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


Vì vậy, cái nào là trình của bạn?
Rò rỉ Nun

@LeakyNun Cái đầu tiên vì nó ngắn hơn; cái thứ hai là đệ trình ban đầu của tôi. Tôi có nên đăng chúng riêng?
HyperNeutrino

~-x&1làm việc cho điều kiện while thay vào đó, tôi nghĩ.
FryAmTheEggman

(Tôi quên tên người dùng); Tôi đã từ chối chỉnh sửa của bạn vì chỉnh sửa mã của người khác không được khuyên dùng trên PPCG. Bạn có thể gửi đề xuất (btw, cảm ơn @FryAmTheEggman), nhưng vui lòng không thực hiện chỉnh sửa chơi gôn. Cảm ơn!
HyperNeutrino

@StewieGriffin À đúng rồi, cảm ơn. Thật không may, tôi không thể ping người dùng vì chỉnh sửa đã bị từ chối.
HyperNeutrino

1

MATL , 11 10 byte

t4*YF1)Z.~

Hãy thử trực tuyến! Hoặc xem 100 đầu ra đầu tiên .

Giải trình

t    % Implicit input. Duplicate
4*   % Multiply by 4. This ensures that the input is a multiple of 2, and
     % takes into account that bit positions are 1 based
YF   % Exponents of prime factorization
1)   % Get first exponent, which is that of factor 2
Z.   % Get bit of input at that (1-based) position
~    % Negate. Implicit display


1

Befunge-98 , 19 byte

&#;:2%\2/\#;_;@.!%2

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

&#                       Initial input: Read a number an skip the next command
  ;:2%\2/\#;_;           Main loop: (Direction: East)
   :2%                    Duplicate the current number and read the last bit
      \2/                 Swap the first two items on stack (last bit and number)
                          and divide the number by two => remove last bit
         \                swap last bit and number again
          #;_;            If the last bit is 0, keep going East and jump to the beginning of the loop
                          If the last bit is 1, turn West and jump to the beginning of the loop, but in a different direction.
&#;           @.!%2      End: (Direction: West)
&#                        Jump over the input, wrap around
                 %2       Take the number mod 2 => read the last bit
               .!         Negate the bit and print as a number
              @          Terminate

1

SCALA, ký tự 99 (78?), 99 (78?) Byte

if(i==0)print(1)else
print(if(('0'+i.toBinaryString).reverse.dropWhile(x=>x=='0')(1)=='1')0 else 1)

nơi ilà đầu vào.

Như bạn có thể thấy, tôi sẽ lưu 21 byte nếu tôi không quan tâm đến số 0 (như tác giả đã làm trong trường hợp thử nghiệm của mình):

print(if(('0'+i.toBinaryString).reverse.dropWhile(x=>x=='0')(1)=='1')0 else 1)

Đây là codegolf đầu tiên của tôi vì vậy tôi hy vọng tôi đã làm tốt :)

Hãy thử trực tuyến! Mặc dù nó khá dài để tính toán lol.


Chào mừng đến với trang web!
DJMcMayhem



0

Japt , 10 8 9 byte

!+¢g¢a1 É

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

Giải trình

!+¢   g    a1 É
!+Us2 gUs2 a1 -1 # Implicit input (U) as number
!+               # Return the boolean NOT of
      g          #   the character at index
       Us2       #     the input converted to binary
           a1    #     the index of its last 1
              -1 #     minus 1
      g          #   in string
  Us2            #     the input converted to binary

Điều này trả về falsecho mọi thứ vì ký tự (0 hoặc 1) luôn là một chuỗi.
Xù xì

Rất tiếc, đã nhận thấy rằng ... Đã sửa ngay bây giờ
Luke

Có vẻ như bây giờ nó thất bại1 .
Xù xì

0

JavaScript (ES6), 53 34 byte

a=>eval("for(;~a&1;a/=2);~a>>1&1")

42 byte:a=>!+(a=a.toString(2))[a.lastIndexOf(1)-1]
Xù xì

Tôi đã tìm thấy một giải pháp (toán học) ngắn hơn ...
Luke

Đẹp :) Có phiền nếu tôi đăng cái đó 42 byte không?
Xù xì

@Shaggy, không hoàn toàn không
Luke



0

Chip , 93 byte

HZABCDEFG,t
 ))))))))^~S
H\\\\\\\/v~a
G\\\\\\/v'
F\\\\\/v'
E\\\\/v'
D\\\/v'
C\\/v'
B\/v'
A/-'

Đưa đầu vào dưới dạng byte cuối nhỏ. (TIO có một chút trăn làm điều này cho bạn). Cung cấp đầu ra như một trong hai 0x0hoặc 0x1. (TIO sử dụng xxd để kiểm tra giá trị).

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

Làm thế nào để làm điều này?

Chip xem xét một byte đầu vào tại một thời điểm, do đó, việc xử lý đầu vào đa nhân thêm một số lượng lớn, nhưng không nhiều như tôi đã sợ.

Chúng ta hãy đi vào nó:

HZABCDEFG

Đây là HZ, bit cao của byte trước đó (nếu có một) và A- G, bảy bit thấp hơn của byte hiện tại. Chúng được sử dụng để xác định vị trí bit thiết lập thấp nhất của số.

        ,t
))))))))^~S

Khi tìm thấy bit thiết lập thấp nhất, chúng ta có một vài việc phải làm. Đoạn đầu tiên này cho biết "nếu chúng ta có một bit được đặt (thì )), sau đó dừng Snhấn mạnh đầu ra và tlặp lại sau khi chúng ta in câu trả lời.

H\\\\\\\/v~a
G\\\\\\/v'
...
A/-'

Bất kỳ bit nào của byte hiện tại ( A- H) chỉ được đi trước bởi một số 0 sau đó một bit ( \/: chúng nhìn vào các bit trực tiếp về phía bắc của chúng; chúng ta có thể tin rằng tất cả các bit trước đó đều bằng 0) được truyền qua các dây trên bên phải ( v,, '...), sau đó giá trị nào được đảo ngược và được đưa ra dưới dạng bit đầu ra thấp ( ~a).

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.