Golfscript - 26 byte
{:i.)+.,{;10*i%.}%i>|,}:f;
Chỉnh sửa: được cập nhật thành đầu ra 1
nếu dấu thập phân chấm dứt, thay vì độ dài của biểu diễn thập phân.
Một phiên bản khá hiệu quả. Giá trị 67890 chạy trong khoảng 10 giây và 99991 khoảng 20 giây. Nó chậm hơn một chút so với trước đây (nhanh gần một nửa), bởi vì phạm vi được lặp lại đã tăng gấp đôi, nửa đầu trong số đó bị bỏ qua.
Thay thế, cũng 26 byte
{:i.)+.n*{*i%.}%i>)^^,}:f;
Cái này hoạt động bằng cách lặp qua chuỗi "\n"*(2*i+1)
, trong đó i
giá trị được truyền cho hàm. Giá trị được truyền cho khối mỗi lần là giá trị thứ tự của "\n"
, là 10 .
Các )^^
là một chút của một công việc xung quanh. Khi bạn hủy một ký tự từ một chuỗi, kết quả là giá trị thứ tự của ký tự bị xóa, như đã đề cập ở trên. Tuy nhiên, việc nối lại giá trị đó trở lại sẽ nối thêm biểu diễn chuỗi của số đó, thay vì ký tự - hành vi khá không đối xứng và theo tôi là một lỗ hổng thiết kế. Nếu bạn thực sự muốn làm điều đó, việc xâu chuỗi trước sẽ chỉ tốn một byte.
Một bản sao bổ sung của giá trị cuối cùng đã có trên ngăn xếp, vì vậy tôi xóa lại giá trị cuối cùng )
, xor nó với chuỗi và sau đó xor nó một lần nữa, để bất kỳ ký tự nào được thêm hoặc xóa bởi xor đầu tiên đều được khôi phục. Nếu int op string
được coi là một ký tự, thay vì đại diện chuỗi của nó, )^^
có thể được thay thế bằng |
.
Lưu ý rằng trong khi các chuỗi (trong Golfscript được lưu dưới dạng một mảng int) sẽ hiển thị giá trị của từng mod 256 ký tự , thì các giá trị của mỗi ký tự có thể nằm ngoài phạm vi này. Khi kiểm tra tính duy nhất (thông qua các thao tác thiết lập) hoặc tính chứa (thông qua ?
), đó là giá trị thực được so sánh, thay vì giá trị hiển thị.
Một tệp vá cho trình thông dịch Golfscript hiện tại :
61c61
< to_gs
---
> Gstring.new([self])
Ở trên sẽ chỉ ảnh hưởng đến hành vi của string op int
(và ngược lại), op
một trong những
+-|&^
. Mọi thứ khác vẫn không bị ảnh hưởng, bao gồm cả hành vi của Gint`
.
Giải pháp 24 byte sau đây sẽ trở thành hợp lệ:
{:i.)+.n*{*i%.}%i>|,}:f;
Và điều này cũng sửa chữa rất nhiều công việc thực sự xấu xí khác .
Python - 48 byte
f=lambda n:len(set(10**-~i%n for i in range(n)))
Không phải là giải pháp hiệu quả nhất, nhưng hợp lý cho các giá trị dưới 100000 .
FWIW, phần tử cốt lõi giống hệt với giải pháp của tôi để Tạo số chu kỳ theo số thập phân .
Một phiên bản hiệu quả hơn của cùng một mã ( 70 byte ):
def f(n):
a=[];i=10%n
while i not in a:a+=i,;i=i*10%n
return len(a)
Giá trị 99991 mất ít hơn một giây.