Y2K năm 2019?


18

Đó là ngày 10 tháng 8 năm 2019, nhưng nhiệm vụ của bạn vẫn liên quan đến Y2K. Lạ nhỉ?

Tạo một chương trình tự in, với một số có hai chữ số được thêm vào nó. Lần đầu tiên bạn chạy nó, nó sẽ nối 00 vào đầu ra của nó (mã nguồn của nó, bởi vì đây là một biến thể quine). Khi bạn chạy đầu ra đó, chương trình gốc không có số có hai chữ số, nó sẽ xuất chương trình gốc, nhưng có thêm 01 đầu vào. Chạy đầu ra đó để có được chương trình OG với 02 được nối thêm, sau đó để có được chương trình với 03 ... Chuỗi này sẽ tiếp tục cho đến 99. Chương trình đó sẽ xuất ra BREAKING NEWS: WORLD ENDS.

Nếu chương trình của bạn là Y2Kparanoia: yes:

  1. Nó sẽ xuất Y2Kparanoia: yes00
  2. Đầu ra đó nên in Y2Kparanoia: yes01
  3. Đầu ra đó nên in Y2K paranoia: yes02
  4. Lặp lại cho đến bước 100: chương trình này xuất ra tin tức ngày tận thế được chỉ định

Đây là mã golf, vì vậy chương trình ngắn nhất có thể tự in trong khi thực hiện theo các bước này sẽ thắng.


7
Theo mô tả lần thứ 99 chúng tôi chạy chúng tôi sẽ chạy 2Kparanoia: yes97và sản xuất 2Kparanoia: yes98, vậy có nên (4) đọc Repeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"không? (tức là 2Kparanoia: yes99tạo ra tin tức)
Jonathan Allan

Câu trả lời:


7

Perl 6 , 122 114 106 byte

-8 byte nhờ Shelvacu

END {<print $!-199??"END \{<$_>~~.EVAL};\$!="~($!-1&&$!-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};$!=1

Hãy thử trực tuyến!

Lấy định dạng quine tiêu chuẩn và thêm chuỗi tin tức mới cũng như một cuộc gọi chức năng mới với số được nối thêm. Điều này sử dụng ENDđể thực hiện chức năng khi chương trình kết thúc.


Bạn có thể lưu thêm 3 byte bằng cách sử dụng ENDvà một ourbiến:END {<print $s-199??"END\{<$_>~~.EVAL};our\$s="~($s-1&&$s-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};our$s=1
Shelvacu

Hiện tại, đây là người chiến thắng hiện tại.
Andrew

7

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).inspectvà 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ố để đ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 1sẽ 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 ENDnằm trong một phạm vi khác, do đó Sphả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ố Sthành 1(hoặc100 - 199trong 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à %scho một chuỗi thông thường và %02dcho 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 sthay 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 Sluô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=0cuối cùng, hai chữ số tiếp theo được hiểu như bát phân, và 89khô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!


Có lẽ nếu bạn đã sử dụng s=100-1? Sau đó ssẽ là 99, 0, -1 ...- 99 và -ssẽ là -99, 0 ... 99.
Tím P

@PurpleP Cho dù tôi cố gắng thế nào tôi cũng không thể tìm ra cách nào để làm điều đó và lưu các ký tự.
Shelvacu

5

Đi, 382 366 354 340 305 298 272 byte

Sẽ không chiến thắng nhưng tôi rất vui với thử thách.

package main
func main(){if n<199{s+="\x60,"
print(s[:135],s,100+(n/100)*(n%100+1))}else{print("BREAKING NEWS: WORLD ENDS")}}
var s,n=`package main
func main(){if n<199{s+="\x60,"
print(s[:135],s,100+(n/100)*(n%100+1))}else{print("BREAKING NEWS: WORLD ENDS")}}
var s,n=`,1

Hãy thử nó trên Sân chơi Go!

Dựa trên một quine. Nếu biến nnhỏ hơn 199, thì nó sẽ thêm vào biến chuỗi nmột dấu trọng âm ( \x60), ký tự của Go cho các chuỗi nhiều dòng, theo sau là dấu phẩy ,. Nó tiếp tục bằng cách in 147 ký tự đầu tiên của s(để ngăn in ,vì điều đó chỉ xảy ra ở cuối) sau đó in stoàn bộ, và cuối cùng in 100nếu n == 1n+1nếu không. Kết quả là các lần chạy liên tiếp thay đổi biến nở cuối chương trình thành 100, 101, v.v ... Nếu biến nlà 199 trở lên, thì nó sẽ in tin nóng.



2

JavaScript (ES6), 116 byte

setTimeout(s="alert((n-1?++n:n=100)-200?`setTimeout(s=${JSON.stringify(s)}),n=`+n:'BREAKING NEWS: WORLD ENDS')"),n=1

94 byte, nếu chức năng xâu chuỗi được cho phép

f=_=>((p=`f=${f}`.split`|`)[4]=p[4]-1?-~p[4]:100)-200?p.join`|`:'BREAKING NEWS: WORLD ENDS'||1

2
Bạn không thể đọc mã nguồn của riêng mình ( f=${f}), đó không phải là một câu hỏi theo codegolf.meta.stackexchange.com/a/4878/13400
Shelvacu


1

Bình thường , 81 80 byte

.vh,K"?>J198\"BREAKING NEWS: WORLD ENDS\"s[\".vh,K\"N:KN+C92NN\"J\"?<J2*TT+J1"J1

Hãy thử trực tuyến!

Giải trình:

.vh,K" ... "J1
.v               Eval pyth code
  h              Get the first item in list
   ,             Make a list of the next two items
            J1   Set J = 1 (J = 100 to 199 in future iterations)
    K" ... "     Set K to the given string

Và mã trong chuỗi là (tin ngắn gọn):

?>J198"BNWE"s[".vh,K"N:KN+C92NN"J"?<J2*TT+J1
?                                              Ternary: If A then B else C
 >J198                                         Test if J > 198
      "BNWE"                                   String literal; If ternary was true, return this (which is then implicitly printed)
            s[".vh,K"N:KN+C92NN"J"?<J2*TT+J1   ternary else
            s                                  concatenate list of strings
             [                                 create list
              ".vh,K"                          string literal, list[0]
                     N                         N is set to the double-quote character, list[1]
                      :KN+C92N                 list[2]
                      :                        Regex substitution. In A, replace B with C
                       K                       Variable K (set to the string being eval'd)
                        N                      N is double-quote
                         +C92N                 A backslash followed by a double-quote
                         +                     concat two strings
                          C92                  character with code point 92 (backslash)
                             N                 N is double-quote
                              N                N is double-quote, list[3]
                               "J"             String literal, list[4]
                                  ?<J2*TT+J1   Inner ternary, list[5]
                                   <J2         If J < 2 ..
                                      *TT      return T * T (10 * 10), else
                                          +J1  return J+1
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.