Y2K…在2019?


18

今天是2019年8月10日,但是您的任务仍然涉及Y2K。奇怪吧?

创建一个可打印的程序,并在其后附加两位数字。首次运行时,应在其输出后附加00(其源代码,因为这是quine变体)。运行该输出时,没有两位数字的原始程序应该输出原始程序,但要附加01。运行该输出以获取附加02的OG程序,然后运行以03附加该程序。此链应持续到99。该程序应输出BREAKING NEWS: WORLD ENDS

如果您的程序是Y2Kparanoia: yes

  1. 它应该输出 Y2Kparanoia: yes00
  2. 该输出应打印 Y2Kparanoia: yes01
  3. 该输出应打印 Y2K paranoia: yes02
  4. 重复执行直到步骤100:此程序输出指定的世界末日新闻

这是代码高尔夫,因此可以遵循这些步骤进行打印的最短程序胜出。


7
根据描述,在第99次运行时,我们将运行2Kparanoia: yes97并进行生产2Kparanoia: yes98,因此(4)不应阅读Repeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"吗?(即2Kparanoia: yes99产生新闻)
乔纳森·艾伦

Answers:


7

Perl 6的122个114 106字节

-8字节感谢Shelvacu

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

在线尝试!

采用标准的quine格式,并添加突发新闻字符串以及带有附加数字的新函数调用。它使用END执行功能的程序结束时。


您可以使用ENDour变量再保存3个字节:END {<print $s-199??"END\{<$_>~~.EVAL};our\$s="~($s-1&&$s-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};our$s=1
Shelvacu,

目前,这是当前的赢家。
安德鲁

7

红宝石,158个 154 146 128 122 100字节

受到这个答案的启发。

eval s=%{$><<(D>198?'BREAKING NEWS: WORLD ENDS':'eval s=%%{%s}<<D=%d'%[s[0..-2],D<2?100:D+1])#}<<D=1

编辑:我能够删除(s.split(35.chr)[0]+35.chr).inspect并替换为s[0..-2](除最后一个值之外的每个值的范围)和%{ ... }我以前使用的字符串语法。保存了22个字节!

旧版本:

编辑:通过意识到这"BREAKING NEWS: WORLD ENDS"是一个完全有效的格式字符串,保存了一对parens(以及数据部分中的相应对),ruby忽略了任何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

开始时,我意识到由于数字必须放在程序的末尾,并且ruby不允许在声明变量之前使用变量,因此我必须使代码以某种方式在数字之后运行。我已经做了一些像def a(s) ... end;a 1这将成为...end;a 100,但是使用Ruby的鲜为人知的END语法使用的字节数更少。但是,内部的块位于END不同的范围内,因此S必须是全局变量或常量。

说明:

  • END{ ... };S=1:在程序终止之前运行代码块;将常量设置S1(或100- 199在以后的迭代中)
  • $><<( ... )$>是ruby中stdout的快捷方式,并且<<在IO上写入IO。需要括号,否则它将变成($><<S)>198...
  • S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]:如果我将其分解为更合理的代码,它将是:

    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

    %应用于字符串的运算符有效printf,LHS是格式字符串,而RHS是参数。

  • %{ ... (q=%%{%s}) ... S=1%02d}:ruby对字符串有一种有趣的语法,它还允许成对的大括号字符串中出现,只要它们是平衡的就可以。这非常有帮助,因为否则类似的quine将必须转义字符串以将其作为字符串文字放入自身。格式字符串中的两个替换分别%s是常规字符串和%02d用字符右填充到2的数字0

我对进一步缩短的想法:

  • 能够s代替使用$s,这很好,但是定义s s=$s;或使函数def a(s) ...都使用比保存的字节更多的字节,而且我想不出任何其他方法来做到这一点。编辑:常量是全局的,可以是一个字符!
  • 最好S总是小于100,这样可以使用2位数字而不是3位数字进行比较。但是,如果我S=0在末尾使用,则接下来的两位数字将被解释为八进制,8并且9是无效的,并且全部为上下位。S=完全是无效的,而且我不知道有任何其他方法可以使值在附加两位数之前和之后均有效。值得注意的是,0(以及其他所有整数)在Ruby中是真实的。

关于如何缩短时间的任何想法,请让我知道!

在线尝试!


也许您曾经使用过s=100-1?然后s将是99、0,-1 ...- 99,-s并将是-99、0 ... 99。
紫色P

@PurpleP无论我如何尝试,我都无法找到任何方法来保存字符。
谢尔瓦库

5

Go,382366354340305298272字节

不会赢,但是我很乐意接受挑战。

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

在Go Playground上尝试一下!

基于奎因。如果该变量n小于199,则在字符串变量中添加n一个重音符(\x60),多行字符串的Go字符,后跟一个逗号,。它继续通过印刷的第一147个字符s(以防止打印,,因为这仅发生在端)然后打印s作为一个整体,最后打印100如果n == 1n+1其它。结果是连续运行会将n程序末尾的变量更改为100、101等。如果变量n为199或更大,则它将打印突发新闻。


3

Haskell中240 232 218 216字节

p=putStr;h 1=100;h k=k+1;g _=p$"n="++show(h n);main|n>198=p"BREAKING NEWS: WORLD ENDS"|1>0=p<>print<>g$"p=putStr;h 1=100;h k=k+1;g _=p$\"n=\"++show(h n);main|n>198=p\"BREAKING NEWS: WORLD ENDS\"|1>0=p<>print<>g$"
n=1

在线尝试!

改编自奎因


2

JavaScript(ES6),116个字节

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

94个字节(如果允许使用字符串化功能)

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

2
您无法阅读自己的源代码(f=${f}),根据codegolf.meta.stackexchange.com/a/4878/13400
Shelvacu的


1

Pyth81 80字节

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

在线尝试!

说明:

.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

字符串中的代码为(最新新闻已缩短):

?>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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.