Perl 69 byte
s;.;y/XVI60-9/CLXVIX/dfor$a[$_].="32e$&"%72726;gefor 1..100;print"@a"
Hoạt động bằng công thức ma thuật. Biểu thức "32e$&"%72726
biến đổi từng chữ số theo cách sau:
0⇒32, 1⇒320, 2⇒3200, 3⇒32000, 4⇒29096, 5⇒56, 6⇒560, 7⇒5600, 8⇒56000, 9⇒50918
Sau khi áp dụng bản dịch y/016/IXV/
, chúng tôi có cái này thay thế:
0⇒32, 1⇒32 I , 2⇒32 II , 3⇒32 III , 4⇒29 I 9 V , 5⇒5 V , 6⇒5 VI , 7⇒5 VII , 8⇒5 VIII , 9⇒5 I 9 X 8
Phần còn lại của các chữ số ( 2-57-9
) được loại bỏ. Lưu ý rằng điều này có thể được cải thiện bằng một byte bằng cách sử dụng một công thức mà dịch 012
thay vì 016
, đơn giản hóa /XVI60-9/
để /XVI0-9/
. Tôi không thể tìm thấy một cái, nhưng có lẽ bạn sẽ gặp may mắn hơn.
Khi một chữ số đã được chuyển đổi theo cách này, quy trình sẽ lặp lại cho chữ số tiếp theo, nối thêm kết quả và dịch các chữ số trước XVI
sang CLX
cùng lúc dịch cho chữ số mới xảy ra.
Cập nhật
Tìm kiếm đầy đủ không tiết lộ bất cứ điều gì ngắn hơn. Tôi đã làm, tuy nhiên, tìm một giải pháp 69 byte thay thế:
s;.;y/XVI0-9/CLXIXV/dfor$a[$_].="57e$&"%474976;gefor 1..100;print"@a"
Cái này sử dụng 0-2
thay thế cho IXV
, nhưng có một modulo dài hơn một chữ số.
Cập nhật: 66 65 byte
Phiên bản này là khác biệt đáng chú ý, vì vậy tôi có lẽ nên nói một vài từ về nó. Công thức nó sử dụng thực sự dài hơn một byte!
Không thể rút ngắn công thức nhiều hơn nó, tôi quyết định đánh golf những gì tôi có. Nó đã không lâu cho đến khi tôi nhớ người bạn cũ của tôi $\
. Khi một đạo luật print
được ban hành, $\
sẽ tự động được thêm vào cuối của đầu ra. Tôi đã có thể thoát khỏi $a[$_]
cấu trúc khó xử để cải thiện hai byte:
s;.;y/XVI60-9/CLXVIX/dfor$\.="32e$&"%72726;ge,$\=!print$"for 1..100
Tốt hơn nhiều, nhưng điều đó $\=!print$"
vẫn có vẻ hơi dài dòng. Sau đó, tôi nhớ một công thức thay thế có độ dài bằng nhau mà tôi đã tìm thấy không chứa số 3
trong bất kỳ biến đổi chữ số nào của nó. Vì vậy, nó có thể được sử dụng $\=2+print
thay thế và thay thế kết quả 3
bằng một khoảng trắng:
s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;ge,$\=2+print for 1..100
Cũng 67 byte, do khoảng trắng cần thiết giữa print
và for
.
Chỉnh sửa : Điều này có thể được cải thiện bởi một byte, bằng cách di chuyển print
về phía trước:
$\=2+print!s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;gefor 1..100
Bởi vì sự thay thế cần phải đánh giá hoàn toàn trước print
, việc chuyển nhượng $\
vẫn sẽ diễn ra sau cùng. Xóa khoảng trắng giữa ge
và for
sẽ đưa ra cảnh báo khấu hao, nhưng nếu không thì hợp lệ.
Nhưng, nếu có một công thức không sử dụng ở 1
bất cứ đâu, $\=2+print
sẽ trở thành $\=print
một khoản tiết kiệm trị giá hai byte khác. Ngay cả khi nó dài hơn một byte, nó vẫn sẽ là một cải tiến.
Hóa ra, một công thức như vậy tồn tại, nhưng nó dài hơn một byte so với ban đầu, dẫn đến số điểm cuối cùng là 65 byte :
$\=print!s;.;y/XVI60-9/CLXXI V/dfor$\.="37e$&"%97366;gefor 1..100
Phương pháp luận
Câu hỏi đã được hỏi làm thế nào người ta có thể đi tìm một công thức như vậy. Nói chung, việc tìm ra một công thức ma thuật để khái quát bất kỳ tập hợp dữ liệu nào là vấn đề xác suất. Đó là, bạn muốn chọn một hình thức có khả năng nhất có thể để tạo ra một cái gì đó tương tự với kết quả mong muốn.
Kiểm tra một vài chữ số La Mã đầu tiên:
0:
1: I
2: II
3: III
4: IV
5: V
6: VI
7: VII
8: VIII
9: IX
có một số thường xuyên được nhìn thấy. Cụ thể, từ 0-3 và sau đó lại từ 5-8 , mỗi thuật ngữ liên tiếp tăng chiều dài thêm một chữ số. Nếu chúng ta muốn tạo ánh xạ từ chữ số sang chữ số, chúng ta sẽ muốn có một biểu thức cũng tăng chiều dài thêm một chữ số cho mỗi thuật ngữ liên tiếp. Một lựa chọn logic là k • 10 d trong đó d là chữ số tương ứng và k là hằng số nguyên bất kỳ.
Điều này hoạt động cho 0-3 , nhưng 4 cần phải phá vỡ mô hình. Những gì chúng ta có thể làm ở đây là giải quyết một modulo:
k • 10 d % m , trong đó m nằm ở đâu đó giữa k • 10 3 và k • 10 4 . Điều này sẽ khiến phạm vi 0-3 không bị ảnh hưởng và sửa đổi 4 sao cho nó không chứa bốn I
giây. Nếu chúng tôi bổ sung hạn chế thuật toán tìm kiếm của chúng tôi sao cho dư lượng mô-đun là 5 , hãy gọi nó là j , nhỏ hơn m / 1000 , điều này sẽ đảm bảo rằng chúng tôi cũng có độ đều đặn từ 5-8 . Kết quả là một cái gì đó như thế này:
0: k
1: k0
2: k00
3: k000
4: ????
5: j
6: j0
7: j00
8: j000
9: ????
Như bạn có thể thấy, nếu chúng tôi thay thế 0
bằng I
, 0-3 và 5-8 đều được đảm bảo để được ánh xạ chính xác! Các giá trị cho 4 và 9 cần phải được ép buộc mặc dù. Cụ thể, 4 cần chứa một 0
và một j
(theo thứ tự đó) và 9 cần chứa một 0
, theo sau là một chữ số khác không xuất hiện ở bất kỳ nơi nào khác. Chắc chắn, có một số công thức khác, mà bởi một số sự trùng hợp ngẫu nhiên có thể tạo ra kết quả mong muốn. Một số trong số họ thậm chí có thể ngắn hơn. Nhưng tôi không nghĩ có cái nào có khả năng thành công như cái này.
Tôi cũng đã thử nghiệm với nhiều sự thay thế cho I
và / hoặc V
với một số thành công. Nhưng than ôi, không có gì ngắn hơn những gì tôi đã có. Dưới đây là danh sách các giải pháp ngắn nhất tôi tìm thấy (số lượng giải pháp nặng hơn 1-2 byte là quá nhiều để liệt kê):
y/XVI60-9/CLXVIX/dfor$\.="32e$&"%72726
y/XVI0-9/CLXIXV/dfor$\.="57e$&"%474976
y/XVI0-9/CLXIVXI/dfor$\.="49e$&"%87971
y/XVI0-9/CLXIIXIV/dfor$\.="7e$&"%10606 #
y/XVI0-9/CLXIIXIV/dfor$\.="7e$&"%15909 # These are all essentially the same
y/XVI0-9/CLXIIXIV/dfor$\.="7e$&"%31818 #
y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535 # Doesn't contain 3 anywhere
y/XVI60-9/CLXXI V/dfor$\.="37e$&"%97366 # Doesn't contain 1 anywhere