Hồng ngọc, 158 154 146 128 122 100 byte
Lấy cảm hứng từ câu trả lời này .
eval s=%{$><<(D>198?'BREAKING NEWS: WORLD ENDS':'eval s=%%{%s}<<D=%d'%[s[0..-2],D<2?100:D+1])#}<<D=1
EDIT: Tôi đã có thể loại bỏ (s.split(35.chr)[0]+35.chr).inspect
và thay thế nó bằng s[0..-2]
(phạm vi của mọi giá trị ngoại trừ giá trị cuối cùng) và %{ ... }
cú pháp chuỗi tôi đã sử dụng trước đó. Đã lưu 22 byte!
Phiên bản cũ:
EDIT: Đã lưu một cặp parens (và cặp tương ứng trong phần dữ liệu) bằng cách nhận ra đó "BREAKING NEWS: WORLD ENDS"
là một chuỗi định dạng hoàn toàn hợp lệ và ruby bỏ qua mọi tham số extraneos.
END{$><<(q=S>198?"BREAKING NEWS: WORLD ENDS":%{END{$><<(q=S>198?"BREAKING NEWS: WORLD ENDS":%%{%s})%%[q,S<2?0:S-99]}
S=1%02d})%[q,S<2?0:S-99]}
S=1
Khi bắt đầu, tôi này nhận ra rằng kể từ khi số có để đi vào cuối của chương trình, và ruby không cho phép sử dụng các biến trước khi chúng được công bố, tôi sẽ phải làm cho mã chạy sau các chữ số bằng cách nào đó. Tôi đã có thể làm một cái gì đó giống như def a(s) ... end;a 1
sẽ trở thành ...end;a 100
, tuy nhiên bằng cách sử dụng ruby ít được biết đếnEND
cú pháp ít sử dụng ít byte hơn. Tuy nhiên, khối bên trong END
nằm trong một phạm vi khác, do đó S
phải là biến toàn cục hoặc hằng số.
Giải trình:
END{ ... };S=1
: Chạy khối mã ngay trước khi chương trình kết thúc; Đặt hằng số S
thành 1
(hoặc100
- 199
trong các lần lặp lại trong tương lai)
$><<( ... )
: $>
là một phím tắt trong ruby cho thiết bị xuất chuẩn và <<
trên IO ghi vào IO. Các parens là bắt buộc, nếu không nó sẽ trở thành($><<S)>198...
S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]
: Nếu tôi chia mã này thành mã hợp lý hơn một chút thì đó sẽ là:
if S > 198
"BREAKING NEWS: WORLD ENDS"
else
q = ...
number_to_append = if S < 2
0
else
S - 100 + 1
end
q % [q, number_to_append]
end
Các %
nhà điều hành áp dụng cho một chuỗi là một cách hiệu quảprintf
, với LHS là chuỗi định dạng và RHS là các đối số.
%{ ... (q=%%{%s}) ... S=1%02d}
: ruby có một cú pháp thú vị cho các chuỗi cũng cho phép các cặp dấu ngoặc nhọn xuất hiện trong chuỗi mà không có bất kỳ thoát nào miễn là chúng được cân bằng. Điều này rất hữu ích, vì nếu không, một quine tương tự sẽ phải thoát khỏi chuỗi để đưa nó vào chính nó như là một chuỗi theo nghĩa đen. Hai thay thế trong chuỗi định dạng là %s
cho một chuỗi thông thường và %02d
cho một số được đệm đúng với kích thước 2 bằng ký tự0
.
Suy nghĩ của tôi về rút ngắn hơn nữa:
Thật tốt khi có thể sử dụng s
thay vì $s
, nhưng xác định s s=$s;
hoặc tạo một chức năngdef a(s) ...
đều sử dụng nhiều byte hơn mức chúng lưu và tôi không thể nghĩ ra bất kỳ cách nào khác để làm điều đó. EDIT: Hằng là toàn cầu và có thể là một nhân vật!
- Sẽ tốt hơn nếu
S
luôn luôn ít hơn 100
để có thể so sánh bằng cách sử dụng các số có 2 chữ số thay vì số có 3 chữ số. Tuy nhiên, nếu tôi sử dụng S=0
cuối cùng, hai chữ số tiếp theo được hiểu như bát phân, và 8
và 9
không hợp lệ và tất cả là tầng. S=
đơn giản là không hợp lệ và tôi không biết cách nào khác để làm cho giá trị hợp lệ cả trước và sau khi nối hai chữ số. Đáng lưu ý, 0
(và mọi số nguyên khác) là trung thực trong ruby.
Bất kỳ suy nghĩ về cách làm cho điều này ngắn hơn, xin vui lòng cho tôi biết!
Hãy thử trực tuyến!
2Kparanoia: yes97
và sản xuất2Kparanoia: yes98
, vậy có nên (4) đọcRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"
không? (tức là2Kparanoia: yes99
tạo ra tin tức)