Đếm các chu kỳ trong một quy trình gấp và ép


8

Trong lý thuyết hỗn loạn , bản đồ móng ngựa là một ví dụ về cách hỗn loạn phát sinh trong một quá trình đơn giản là gấp và ép. Nó diễn ra như thế này: lấy một miếng bột tưởng tượng, gấp nó lại, và cuối cùng ép nó về kích thước ban đầu. Sự hỗn loạn nảy sinh theo mô hình làm thế nào các miếng bột kết thúc trong sự sắp xếp cuối cùng sau n lần lặp.

Ví dụ về một biện pháp bất biến

Trong trường hợp của chúng tôi, chúng ta sẽ xem xét cách một mô hình nhị phân đơn giản hoạt động khi chúng ta gấp và bóp nó . Dưới đây là các bước với ví dụ 8 bit (biểu diễn nhị phân của 201 hoặc 11001001).

  1. Cắt các bit thành hai phần có độ dài bằng nhau (thêm '0' ở đầu nếu có số bit lẻ).

    1100 | 1001

  2. Gấp nửa đầu so với nửa sau. Lưu ý rằng thứ tự của nửa đầu được đảo ngược, khi chúng ta xoay nó trong khi gấp.

    0011
    1001

  3. Squash để hình dạng ban đầu của nó. Trong khi đè bẹp, các bit trên được dịch chuyển sang trái theo các bit dưới vị trí ban đầu của chúng.

    01001011

Nếu chúng ta lặp lại điều này cho ví dụ này, chúng ta có thể thấy rằng sau 4 lần lặp, chúng ta sẽ trở lại chuỗi bit gốc:

Start  bits: 11001001
Iteration 1: 01001011
Iteration 2: 01001101
Iteration 3: 01011001
Iteration 4: 11001001

Vì vậy, đối với giá trị thập phân của năm 201, số chu kỳ là 4.

Các thách thức

  • Viết một chương trình đầy đủ lấy một số thập phân làm đầu vào và xuất ra số chu kỳ cần lặp lại trong quy trình gấp và nhị phân được mô tả ở trên.
  • Đầu vào (thập phân) phải được lấy từ stdin (phạm vi: từ 1 đến Googol hoặc 10 ^ 100).
  • Đầu ra (thập phân) phải được ghi vào thiết bị xuất chuẩn.
  • Điểm của bạn là số byte của mã của bạn.
  • Câu trả lời của bạn phải bắt đầu bằng [Ngôn ngữ lập trình] - [Điểm theo byte]
  • Sơ hở tiêu chuẩn không được phép.

Ví dụ

7 --> 3
43 --> 5
178 --> 4
255 --> 1
65534 --> 1
65537 --> 12
1915195950546866338219593388801304344938837974777392666909760090332935537657862595345445466245217915 --> 329

Lưu ý cuối cùng

Điều thú vị là số chu kỳ có liên quan đến độ dài của biểu diễn nhị phân, ngoại trừ một vài ngoại lệ trong đó số chu kỳ ngắn hơn do mô hình trong chuỗi bit (ví dụ: 111110chu kỳ sau 1 lần lặp). Điều này tạo ra một cơ hội thú vị để tối ưu hóa độ dài mã bằng cách sử dụng mẫu cơ bản thay vì tính toán số chu kỳ.


Nếu độ dài bit của số rút ngắn trong quá trình lặp, chúng ta sẽ cắt và gấp bằng cách sử dụng độ dài bit ban đầu hay chiều dài hiện tại?
xnor

2
@xnor Tôi sẽ giả sử bản gốc, nếu không bạn sẽ không bao giờ hoàn thành chu kỳ, phải không?
Martin Ender

Câu trả lời:


4

CJam, 34 byte

q~2b_,2%,\+{__,2//~\W%.\_W$=!}g;],

Không có gì lạ mắt, nó chỉ áp dụng bản đồ cho đến khi chúng tôi quay lại đầu vào và in số lần lặp lại.

Kiểm tra nó ở đây.


Đầu tiên ở! Nhìn vào bạn, bắn mã nhanh hơn bóng của bạn!
bất cứ lúc nào

3

Python 2, 175 154 149 byte

i=bin(input())[2:]
i=o='0'+i if len(i)%2 else i
c=0
j=len(i)/2
while i!=o or c==0:
 a=''
 for x,y in zip(i[:j][::-1],i[j:]):a+=x+y
 i,c=a,c+1
print c

Liên kết Ideone

Cảm ơn agtoever cho 27 byte!


1
Không cần lambda. Một khi chiều dài là chẵn, nó vẫn đồng đều.
bất cứ lúc nào

Điểm tuyệt vời, cảm ơn!
Celeo

Thay đổi `while 1` với while i!=o|c==0và thả if i==o:break. Tiết kiệm 5. Có thể (lưu ý chắc chắn) bạn cũng không cần a. Chỉ cần sử dụng i. Lưu một bài tập (4 byte). Ngoài ra sự phân công của j có thể được đặt bên ngoài vòng lặp.
bất cứ lúc nào

Cảm ơn các tiết kiệm bổ sung, @agtoever. Tôi đã nhận được TypeError khi cố gắng thực hiện while i!=c|c==0thay thế, nhưng vẫn có thể lưu một số byte với một tiêu chuẩn `hoặc`.
Celeo

2

Bình thường, 21 byte

Tôi đang gõ cái này trên điện thoại của mình, vì vậy hãy đảm bảo thông báo cho tôi về bất kỳ sai lầm nào.

fqu.i_hc2Gec2GTJ.BQJ1

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.