Y2K… 2019 년?


18

2019 년 8 월 10 일이지만 귀하의 작업에는 여전히 Y2K가 포함됩니다. 이상한가요?

두 자리 숫자가 추가 된 자체 인쇄 프로그램을 작성하십시오. 처음 실행할 때는 00을 출력에 추가해야합니다 (소스 코드는 퀴인 변형이므로). 두 자리 숫자가없는 원래 프로그램에서 해당 출력을 실행하면 원래 프로그램이 출력되지만 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, 뉴스를 생산합니다)
Jonathan Allan

답변:


7

Perl 6 , 122114106 바이트

쉘 바쿠 덕분에 -8 바이트

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

이것을 시작할 때 나는 숫자 프로그램의 마지막에 있어야하기 때문에 루비는 변수가 선언되기 전에 변수를 사용할 수 없기 때문에 어떻게 든 숫자 뒤에서 코드를 실행해야한다는 것을 깨달았습니다 . 나는 될 것 같은 def a(s) ... end;a 1것을 할 수 ...end;a 100있었지만 루비의 덜 알려진 END구문을 사용하면 더 적은 바이트를 사용합니다. 그러나 내부 블록 END은 다른 범위에 있으므로 S전역 변수 또는 상수 여야합니다.

설명:

  • END{ ... };S=1: 프로그램이 종료되기 직전에 코드 블록을 실행하십시오. 설정 상수 S1(또는 100- 199미래의 반복에서)
  • $><<( ... ): $>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좌변이 형식 문자열 인 및 RHS가 인수 인 상태.

  • %{ ... (q=%%{%s}) ... S=1%02d}: 루비에는 문자열에 대한 흥미로운 구문이 있으며 , 균형을 유지 하는 한 중괄호 쌍이 문자열 내에 이스케이프되지 않고 나타날 수 있습니다. 그렇지 않으면 비슷한 quine이 문자열을 이스케이프하여 문자열 리터럴로 배치해야하기 때문에 매우 유용합니다. 형식 문자열에서 두 개의 대체 %s는 일반 문자열과 %02d문자를 사용하여 크기가 2로 오른쪽에 채워진 숫자 0입니다.

더 단축에 대한 나의 생각 :

  • s대신 대신 사용할 수는 $s있지만 s를 정의 s=$s;하거나 함수를 만들면 def a(s) ...둘 다 저장하는 것보다 많은 바이트를 사용하므로 다른 방법으로는 생각할 수 없습니다. 편집 : 상수는 전역 적이며 하나의 문자가 될 수 있습니다!
  • S항상 다음보다 작 으면 좋을 것이므로 1003 자리 숫자 대신 2 자리 숫자를 사용하여 비교할 수 있습니다. 내가 사용하는 경우, S=0마지막에, 다음 두 자리 8 진수로 해석되고 89유효하지 않으며 모든 침대입니다. S=단순히 유효하지 않으며 두 자리를 추가하기 전후에 값을 유효하게 만드는 다른 방법을 모르겠습니다. 루비 에서는 0(그리고 다른 모든 정수) 진실 합니다.

더 짧게 만드는 방법에 대한 생각이 있으면 알려주십시오!

온라인으로 사용해보십시오!


아마도 당신이 사용한다면 s=100-1? 그런 다음 s99, 0, -1 ...- 99 -s가되고 -99, 0 ... 99가됩니다.
퍼플 P

@PurpleP 아무리 노력해도 그 방법을 찾아 문자를 저장할 수 없습니다.
Shelvacu

5

Go, 382366354340305299872 바이트

이길 수는 없지만 도전에 재미있었습니다.

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에서 사용해보십시오!

quine을 기반으로합니다. 변수 n가 199보다 작 으면 문자열 변수 n에 억음 악센트 ( \x60), 여러 줄 문자열에 대한 Go의 문자, 쉼표가 추가 ,됩니다. 그것은 처음 147 개 문자를 인쇄하여 계속 s합니다 (인쇄 방지하기 위해 ,다음 인쇄 즉, 마지막에만 발생하기 때문에) s전체, 그리고 마지막으로 인쇄 100하는 경우 n == 1n+1그렇지 않은 경우를. 결과적으로 연속적인 런 n은 프로그램 끝의 변수 를 100, 101 등으로 변경합니다. 변수 n가 199 이상인 경우 속보를 인쇄합니다.



2

자바 스크립트 (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



1

Pyth , 81 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.