Trình tự Back-and-Forth


18

Hãy tưởng tượng một con đường tạo thành <>và kết thúc bằng một @, ví dụ:

><>@

Một walker bắt đầu trên các tế bào bên trái nhất. Anh ta sẽ đi qua con đường như sau:

  • Nếu người đi bộ ở trên một @phòng giam, anh ta đã đạt được mục tiêu và đã hoàn thành.
  • Nếu người đi bộ ở trên một >tế bào, toàn bộ con đường sẽ dịch chuyển một bước sang phải, theo chu kỳ, đưa người đi bộ với nó .
  • Nếu người đi bộ ở trên một <tế bào, toàn bộ con đường sẽ dịch chuyển một bước sang trái, theo chu kỳ, đưa người đi bộ với nó .
  • Sau đó, người đi bộ thực hiện một bước duy nhất. Nếu anh ta ở hai đầu của con đường, anh ta di chuyển từ cuối. Nếu không, anh ta tiếp tục di chuyển theo hướng anh ta di chuyển ở bước cuối cùng (bỏ qua vòng quay), bước đi ngay ban đầu.

Hãy làm việc qua ví dụ trên. Vị trí của người đi bộ được đánh dấu bằng ^:

><>@   --rotate-->  @><>
^                    ^
step right (first step):
@><>   --rotate-->  ><>@
  ^                  ^
step right:
><>@   --rotate-->  @><>
  ^                    ^
step left (dead end):
@><>   --rotate-->  ><>@
  ^                  ^
step left:
><>@   --rotate-->  @><>
^                    ^
step left:
@><>   Goal reached!
^

Người đi bộ đã truy cập 6 ô trong quá trình (bao gồm ô bắt đầu cũng như @và đếm từng ô thường xuyên khi truy cập).

Đây là một ví dụ nhỏ, nơi người đi bộ được vận chuyển qua các cạnh bằng một vòng quay:

>>@   --rotate-->  @>>
^                   ^
step right (first step):
@>>   --rotate-->  >@>
  ^                ^
step right (dead end):
>@>   Goal reached!
 ^

Lần này người đi bộ đã ghé thăm 3 ô.

Chúng ta có thể dễ dàng biến điều này thành một chuỗi số nguyên:

  • Bạn được cho một số nguyên dương N , vd 9.
  • Bạn tính toán biểu diễn nhị phân của số nguyên này, vd 1001.
  • Sau đó biến 1thành >0vào <và nối thêm @: ><<>@.
  • Chúng tôi liên kết với N số lượng ô được người đi bộ ghé thăm theo số lượng được xây dựng theo cách này.

Một số yếu tố đầu tiên của chuỗi kết quả là:

2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7

Điều này có vẻ khá độc đoán, nhưng chuỗi kết quả thực sự hóa ra có rất nhiều cấu trúc:

nhập mô tả hình ảnh ở đây

Để tham khảo, bạn có thể tìm thấy 2048 số đầu tiên của chuỗi trong pastebin này .

Các thách thức

Bạn đã đoán ra: bạn đang tính toán trình tự trên. Bạn có thể làm một trong ba cách sau:

  • Bạn có thể tạo một chuỗi vô hạn (trong khi bộ nhớ cho phép), bằng cách liên tục xuất ra các giá trị (được phân tách bằng các ký tự không phải là số) hoặc bằng cách sử dụng một số dạng trình tạo vô hạn trong các ngôn ngữ hỗ trợ chúng. Nếu bạn in một luồng vô hạn thành STDOUT, bạn không phải in từng số một, nhưng hãy đảm bảo rằng mọi số sẽ được in sau một khoảng thời gian hữu hạn (và theo thứ tự). Nếu bạn sử dụng tùy chọn này, bạn không nên lấy bất kỳ đầu vào nào.
  • Bạn có thể lấy một số nguyên N làm đầu vào và tạo ra số hạng thứ N của chuỗi.
  • Bạn có thể lấy một số nguyên N làm đầu vào và tạo ra mọi thứ cho đến số hạng thứ N của chuỗi, dưới dạng danh sách hoặc chuỗi bằng cách sử dụng dấu phân cách rõ ràng.

Vì tôi không muốn xử phạt các ngôn ngữ không thể dễ dàng chuyển đổi giữa các cơ sở, thay vì số nguyên N , thay vào đó, bạn có thể lấy biểu diễn nhị phân của N , sử dụng 0s và 1s như bình thường (dưới dạng danh sách hoặc chuỗi), với hầu hết bit đáng kể đầu tiên.

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).

Luật tiêu chuẩn được áp dụng.

Lý lịch

Điều này thực sự tính toán số lượng "đánh dấu" một trình thông dịch chuyển tiếp thẳng của ngôn ngữ lập trình bí truyền của tôi Labyrinth sẽ cần diễn giải "đường dẫn" là mã nguồn. Trong trường hợp đó, "walker" chỉ đơn giản là con trỏ lệnh (có vị trí và hướng), @lệnh chấm dứt chương trình <>là các lệnh sửa đổi mã nguồn.


cái nào là bắt buộc? 1, 2 hoặc 3 và các bài nộp của chúng tôi được tính điểm như thế nào
Abr001am

@ Agawa001 "Bạn có thể thực hiện một trong ba cách sau:" Chọn một trong số chúng, bất cứ cách nào bạn nghĩ là dễ nhất cho cách tiếp cận và ngôn ngữ bạn muốn sử dụng.
Martin Ender

Tại sao tất cả các số lặp lại ngày hôm nay!?! codegolf.stackexchange.com/questions/78787/ từ : D
mèo

Câu trả lời:


6

Thạch , 10 byte

ð+\ḤiḤoµL‘

Hàm này chấp nhận một số nguyên duy nhất dưới dạng danh sách các chữ số nhị phân của nó làm đầu vào.

Thuật toán tương đương với thuật toán từ câu trả lời của @ Agawa001 .

Hãy thử trực tuyến! hoặc tạo các số 2048 đầu tiên .

Lý lịch

Liệt kê các vị trí bên dưới đường dẫn từ 0 đến L , cho tổng số vị trí L + 1 . L trùng với số chữ số nhị phân của số N mã hóa đường dẫn. Với ký hiệu này, người đi bắt đầu từ vị trí 0 , mục đích ở vị trí L .

Với mỗi bước của người đi bộ, anh ta tiến gần hơn đến mục tiêu (theo hướng anh ta đang đi). Ngoài ra, với mỗi bước dịch chuyển, tùy thuộc vào việc anh ta đi cùng hay ngược với hướng dịch chuyển, anh ta sẽ tăng hoặc giảm vị trí của mình thêm 2 modulo L + 1 , hoặc anh ta giữ nguyên vị trí hiện tại.

Để đổi hướng, anh ta phải hạ cánh ở vị trí L - 1 (đối mặt với L ) hoặc vị trí 1 (đối mặt với 0 ), sau đó được chuyển sang hướng của mình. Bước tiếp theo anh ta thực hiện sẽ đưa anh ta trở lại vị trí trước đó, đối mặt với hướng ngược lại.

  • Nếu L chẵn, L - 1 là số lẻ, vì vậy anh ta không thể tiến từ vị trí ban đầu của mình lên L - 1 trực tiếp. Cách duy nhất để tiếp cận nó là đi qua L , được chuyển về 0 và thực hiện bước tiếp theo để hạ cánh trên 1 , sau đó tiến về bên phải. Điều này đòi hỏi phải tiến lên các vị trí 2L , có thể được thực hiện trong không ít hơn các bước L.

    Tuy nhiên, sau khi thực hiện các bước L mà không thay đổi hướng, anh ta sẽ đạt được mục tiêu. Thêm một ô cho ô bắt đầu, chúng ta sẽ có tổng số ô L + 1 đã truy cập trong trường hợp này.

  • Nếu L là số lẻ, L - 1 là số chẵn, vì vậy anh ta có thể đạt được vị trí đó bằng cách dịch chuyển (L - 1) / 2 lần sang phải. Nếu vị trí L - 1 ở dưới số 1 tại thời điểm đó, anh ta sẽ được chuyển sang vị trí L , quay lại và bước lên vị trí L - 1 (quay mặt sang trái).

    Điều này có thể hoặc không thể xảy ra trước khi anh ta đạt được mục tiêu của mình, vì vậy có hai trường hợp để phân tích:

    • Nếu có ít hơn (L + 1) / 2 lần xuất hiện 1 trong quá trình mở rộng nhị phân của N , thực hiện các bước L sẽ không đủ để chuyển hướng. Vì các bước L này đưa người đi bộ đến mục tiêu của mình, thêm một bước cho ô bắt đầu, chúng tôi nhận được tổng số L + 1 ô đã truy cập trong trường hợp này.

    • Nếu có ít nhất (L + 1) / 2 lần xuất hiện của 1 trong việc mở rộng nhị phân của N , tiến tới ((L + 1) / 2) thứ xảy ra sẽ yêu cầu tôi bước, nơi tôi là vị trí ban đầu xảy ra mà của 1 .

      Do đó, sau khi tôi bước tôi , người đi bộ ở vị trí L - 1 , quay mặt sang trái. Để chuyển hướng một lần nữa, anh ta sẽ phải đi về phía trước sang vị trí 1 . Tuy nhiên, như trong trường hợp chẵn, vì (L - 1) - 1 là số lẻ, điều này sẽ yêu cầu trải qua 0 và thực hiện không ít bước L tha .

      Vì khoảng cách ban đầu đến mục tiêu theo hướng bên trái là 1 , sau khi thực hiện các bước tôi , người đi bộ thấy mình ở khoảng cách I + 1 từ mục tiêu sau khi đổi hướng. Vì tôi <L , chúng tôi có I + 1 L , vì vậy các bước I + 1 tiếp theo sẽ đưa anh ta đến mục tiêu.

      Điều này cho tổng số I + I + 1 = 2I + 1 bước thực hiện. Thêm một ô cho ô bắt đầu, chúng tôi nhận được tổng cộng 2I + 1 + 1 = 2 (I + 1) ô đã truy cập trong trường hợp này.

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

ð+\ḤiḤoµL‘  Main link. Argument: x (list of binary digits of N)

       µ    Monadic chain. Argument: x
        L   Compute L, the length of x.
         ‘  Increment to yield L + 1.

ð           Dyadic chain. Left argument: x. Right argument: L + 1
 +\         Compute the cumulative sum of x.
            This replaces the k-th one (and all zeroes to its right) with k.
   Ḥ        Unhalve; multiply all partial sums by 2.
    i       Find the first index of L + 1.
            This either gives I + 1, the 1-based index of the ((L + 1) / 2)-th one
            or 0 if the list doesn't contain L + 1.
            The result will be 0 if x contains less than (L + 1) / 2 ones
            or if L + 1 is an odd integer.
     Ḥ      Unhalve; yield either 2(I + 1) or 0.
      o     Logical OR with L + 1; if the previous operation returned a falsy
            value (i.e., if it yielded 0), replace that value with L + 1.

9

Matlab (điểm = 230, n = inf)

function w(s,f),b=[];e=0;for i=s:f,a=dec2bin(i);c=find(a=='1');g=numel(a)+1;if numel(c)>=g/2;if mod(g,2)==1,fprintf('%d ',g);else,d=c(g/2);fprintf('%d ',2*d);end,else,fprintf('%d ',g);end,e=e+1;if(e==100),e=0;fprintf('\n');end;end
  • Hàm lấy s làm chỉ số bắt đầu và f là kết thúc (gõ infnếu bạn muốn tiếp tục đến vô hạn).
  • Hàm có thể đi mãi mãi mà không có bất kỳ độ trễ thời gian đáng chú ý nào giữa hai loại đầu ra h=1000000000000000000000000000000000000000000000000000;w(h,h+1)để đảm bảo.
  • Thuật toán tuân theo cách tiếp cận toán học mà tôi sẽ giải thích sau và nó xác nhận danh sách tham chiếu của Martin, dựa trên chương trình này:

    stored=[2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 14, 8, 8, 8, 14, 8, 14, 12, 12, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13];
    b=[];for i=1:numel(stored)
    a=dec2bin(i);
    c=find(a=='1');
    if numel(c)>=(numel(a)+1)/2
    if mod(numel(a)+1,2)==1
    b=[b numel(a)+1];
    else
    d=c((numel(a)+1)/2);
    b=[b 2*d];
    end
    else
    b=[b numel(a)+1];
    end
    end
    for i=1:numel(stored)
    if (b(i))
    if b(i)~=stored(i)
    'error',
    end
    end
    end
    
  • Vì thuật toán xác minh 2048 testcase đầu tiên, tôi sẽ mù quáng cho rằng nó sẽ làm cho bất kỳ trường hợp thử nghiệm nào, vì vậy thuật toán của tôi hoạt động liên quan đến một số thuộc tính tôi đã phát hiện ra trong quá trình này mà không phải chịu sự dịch chuyển và di chuyển con trỏ:

    1- nếu số lượng gấp đôi số 1 trong bản dịch nhị phân không vượt quá độ dài của phần tiếp Ltheo thì đầu ra làL+1

    2- nếu độ dài chuỗi là chẵn và điều kiện trước không được đặt để đầu ra giống nhau L+1

    3- nếu không, đầu ra gấp đôi L/2chỉ số thứ 1.


Bạn có thể làm rõ ý của bạn với "đầu ra gấp đôi chỉ số L / 2 của 1." ? Nó cực kỳ không rõ ràng.
orlp

@orlp trong chuỗi này 10010001 lần xuất hiện thứ hai của 1 là 4, bởi 2 là 8.
Abr001am

1
Điều này có thể được đánh xuống ít nhất 89 byte, a=dec2bin(input(''));c=find(a=='1');g=nnz(a)+1;if nnz(c)<g/2|mod(g,2);g,else,2*c(g/2),endchỉ cung cấp một yếu tố duy nhất của chuỗi.
David

8

Python, 122 119 113 110 108 107 103 byte

def l(b):
 p=e=w=len(b);d=i=1
 while e:p+=1-2*b[w-e];d*=2*(1!=d-p>~w)-1;p-=d;e=(e-d)%-~w;i+=1
 return i

Lấy đầu vào là một danh sách các chữ số nhị phân. Chức năng trợ giúp để kiểm tra:

b = lambda n: [int(d) for d in bin(n)[2:]]

Tín dụng cho Lynn để tiết kiệm 7 byte.


4
Pew pew pew. : D
admBorkBork

Nó không nhiều, nhưng tôi cho rằng p-d-1in[-2,w]tiết kiệm một byte.
Lynn

Thay đổi tuyên bố để d*=2*(1!=d-p>~w)-1tiết kiệm thêm bốn! ° v °
Lynn

@Lynn Sử dụng tốt luật của de Morgan!
orlp

Bạn có thể vui lòng cung cấp một phạm vi đầu ra rộng để so sánh với tôi không? thanx
Abr001am

3

Python 2, 99 byte

def l(b):l=len(b);return(l>=sum(b)*2or l%2<1)and-~l or[i+1for i,c in enumerate(b)if b[i]][l/2]*2

Cổng Python của câu trả lời tuyệt vời của Agawa001.

Phiên bản dễ đọc:

def l(b):
    if len(b) >= 2*sum(b) or len(b)%2 == 0:
        return len(b) + 1

    return 2*[i+1 for i, c in enumerate(b) if b[i]][len(b)//2]

@ Agawa001 Tôi chưa hiểu thuật toán của bạn, nhưng tôi đã xác minh thử nghiệm lên tới 10 triệu.
orlp

3

MATL, 31 , 25 byte

BXHnQtHsy2/<w2\+~?2/Hfw)E

Đây chỉ là phiên bản MATL của thuật toán Agawa001, ngoại trừ việc nó lấy đầu vào số nguyên N và trả về số hạng N trong chuỗi. Đó là khó khăn để theo kịp với tất cả các yếu tố trong ngăn xếp! Tôi đã phải sử dụng một bảng tạm để tránh phát điên. Bạn có thể dùng thử trực tuyến!

Có thể được tạo thành một vòng lặp in N thuật ngữ đầu tiên bằng cách thêm :"@trước mã và ]Dsau.

Cảm ơn Luis Mendo vì đã lưu 6 byte toàn bộ!


2

Julia 0,4, 4̷4̷ 42 byte

x->(k=endof(x)+1;try k=2find(x)[k/2]end;k)

Hàm này chấp nhận một số nguyên duy nhất dưới dạng danh sách các chữ số nhị phân của nó làm đầu vào.

Thuật toán tương đương với thuật toán từ câu trả lời của @ Agawa001câu trả lời Jelly của tôi .

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

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

find(x)trả về các chỉ số dựa trên 1 của tất cả các phần tử khác không của x . Chúng tôi cố gắng truy cập mảng kết quả ở chỉ mục k / 2 và, nếu thành công, ghi đè lên k với hai lần chỉ mục được chọn.

Điều này sẽ thất bại nếu và chỉ khi một trong những điều sau là đúng:

  • k / 2 là một số float không tách rời, và InexactError được nâng lên.

  • Mảng chỉ mục có ít hơn k / 2 phần tử, do đó, BoundError được nâng lên.

Trong cả hai trường hợp, ghi đè k sẽ thất bại, vì vậy giá trị ban đầu của nó sẽ được trả về.


1

JavaScript (ES6), 65 byte

s=>(l=s.length+1)%2|!(m=s.match(`(0*1){$l/2}}`))?l:m[0].length*2

Chấp nhận một chuỗi nhị phân. Sử dụng kiểm tra thoát từ các câu trả lời khác nhau.


1

Python 2, 74 byte

def f(x):k=len(x)+1;print next((i*2for i in range(k)if k==2*sum(x[:i])),k)

Hàm này chấp nhận một số nguyên duy nhất dưới dạng danh sách các chữ số nhị phân của nó làm đầu vào.

Thuật toán tương đương với thuật toán từ câu trả lời của @ Agawa001câu trả lời Jelly của tôi .

Kiểm tra nó trên Ideone .

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

nextnỗ lực để tìm ra số nguyên đầu tiên 2ik==2*sum(x[:i])trả về true. Vì x[:i]có chứa các phần tử i , điều này mang lại chỉ số dựa trên 1 của (k / 2) thứ 1 .

nextsẽ thất bại nếu k / 2 không tách rời hoặc nếu x chứa ít hơn k / 2 . Trong trường hợp này, giá trị mặc định k được trả về.


0

> <> , 63 byte

2r11&>}:?v{1->:l2-%?vr{{$>1+$}$:2=$@&101.
 +&?!^&n;>{1+^ .0+bf<

Từ lúc nhìn thấy mẫu ví dụ trong thử thách này, tôi đã biết nên sử dụng ngôn ngữ nào :)

Sử dụng N để có được N thuật ngữ thứ

Đầu vào giả định là nhị phân tại ngăn xếp. Thay vì di chuyển người đi bộ xung quanh, giải pháp này chủ yếu dựa vào việc di chuyển băng dưới khung tập đi.

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

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.