CJam, 25 - 25 = 0 byte
q~1,*_@{[\{1$^}/_](;)\}/;
Đây chỉ là một cổng CJam thẳng của câu trả lời GolfScript bên dưới, vì sau khi đọc câu trả lời của Martin Büttner , tôi nhận ra rằng tôi có thể tiết kiệm được một byte do cách xử lý các kiểu số nguyên và ký tự của CJam. (Về cơ bản, CJam không cần 1&sử dụng để buộc các ký tự ASCII thành các bit trong mã GolfScript, nhưng không yêu cầu qphải đọc trước đầu vào.) Tôi thường coi một cổng tầm thường như vậy là một mánh khóe rẻ tiền, nhưng đạt được điểm 0 IMO đáng giá.
Trong mọi trường hợp, chương trình này hoạt động chính xác như chương trình GolfScript gốc bên dưới, vì vậy vui lòng tham khảo hướng dẫn sử dụng và mô tả. Như thường lệ, bạn có thể kiểm tra phiên bản CJam bằng trình thông dịch trực tuyến này .
GolfScript, 26 - 25 = 1 byte
~1,*.@{[1&\{1$^}/.](;)\}/;
Giải pháp này chỉ lặp lại chuỗi đầu vào một lần, vì vậy tôi tin rằng nó đủ điều kiện nhận phần thưởng byte25 byte. Nó hoạt động bằng cách duy trì một nội k mảng -element rằng các cửa hàng các bit hiện tại của mỗi k -lặp trước.
Đầu vào phải được cung cấp thông qua stdin, theo định dạng "1111111" 3, tức là dưới dạng một chuỗi 0và 1ký tự được trích dẫn , theo sau là số k . Đầu ra sẽ là thiết bị xuất chuẩn, dưới dạng một chuỗi bit không có dấu ngoặc kép.
Kiểm tra mã này trực tuyến. (Nếu chương trình hết thời gian, hãy thử chạy lại; máy chủ Web GolfScript nổi tiếng với thời gian chờ ngẫu nhiên.)
Đây là phiên bản mở rộng của chương trình này, với các bình luận:
~ # eval the input, leaving a string and the number k on the stack
1,* # turn the number k into an array of k zeros ("the state array")
. # make a copy of the array; it will be left on the stack, making up the
# first k bits of the output (which are always zeros)
@ # move the input string to the top of the stack, to be iterated over
{
[ # place a start-of-array marker on the stack, for later use
1& # zero out all but the lowest bit of this input byte
\ # move the state array to the top of the stack, to be iterated over
{ 1$^ } / # iterate over each element of the state array, XORing each
# element with the previous value on the stack, and leave
# the results on the stack
. # duplicate the last value on the stack (which is the output bit we want)
] # collect all values put on the stack since the last [ into an array
(; # remove the first element of the array (the input bit)
) # pop the last element (the duplicated output bit) off the array
\ # move the popped bit below the new state array on the stack
}
/ # iterate the preceding code block over the bytes in the input string
; # discard the state array, leaving just the output bits on the stack
Về cơ bản, giống như hầu hết các giải pháp lặp lại, mã này có thể được hiểu là áp dụng sự lặp lại
b i , j : = b i , ( j −1) ⊕ b ( i 1), ( j 1) ,
Trong đó b 0, j là bit đầu vào thứ j (với j 1), b k , j là bit đầu ra thứ j và b i , 0 = 0 theo giả định. Sự khác biệt là, trong khi các giải pháp lặp, về hiệu quả, tính toán "lặp lại theo hàng" (tức là b 1, j đầu tiên cho tất cả j , sau đó b 2, j , v.v.), giải pháp này thay vào đó tính toán "cột theo cột "(hoặc chính xác hơn là" đường chéo theo đường chéo "), tính toán đầu tiên b i , i cho 1 ≤ i≤ k , sau đó b i , i +1 , sau đó b i , i +2 , v.v.
Một ưu điểm (về mặt lý thuyết) của phương pháp này là về nguyên tắc, phương pháp này có thể xử lý chuỗi đầu vào dài tùy ý chỉ sử dụng lưu trữ O ( k ). Tất nhiên, trình thông dịch GolfScript sẽ tự động đọc tất cả đầu vào vào bộ nhớ trước khi chạy chương trình, chủ yếu là phủ nhận lợi thế này.