Y2K…2019年?


18

2019年8月10日ですが、あなたの仕事はまだY2Kに関係しています。変だよね?

2桁の数字を追加して、それ自体を印刷するプログラムを作成します。初めて実行するときは、その出力に00を追加する必要があります(これはソースコードです。これは、変種であるためです)。その出力、2桁の番号のない元のプログラムを実行すると、元のプログラムが出力されますが、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、ニュースを作成します)
ジョナサンアラン

回答:


7

Perl 6の122の114 106バイト

Shelvacuのおかげで-8バイト

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

オンラインでお試しください!

標準のquine形式を取り、ニュース速報文字列と、追加された番号を持つ新しい関数呼び出しを追加します。これはEND、プログラムの終了時に関数を実行するために使用します。


あなたはより多くの3を保存することができます使用してバイトENDour変数を: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"が完全に有効なフォーマット文字列であることを認識して保存し、rubyは余分なパラメーターを無視します。

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

    %オペレータは、文字列に適用される効果であるprintfLHSは、書式文字列であるとRHS引数であると、。

  • %{ ... (q=%%{%s}) ... S=1%02d}:rubyには文字列の興味深い構文があります。これにより、バランスが取れている限り、エスケープせずに中括弧のペアを文字列内に表示できます。これは非常に役立ちます。そうしないと、同様のクインが文字列をエスケープして、文字列リテラルとしてそれ自体に入れる必要があります。書式文字列の2つの置換は、%s通常の文字列と%02d、文字で2のサイズに右詰めされた数値0です。

さらに短縮に関する私の考え:

  • s代わりに使用できるのは良いことですが$s、sを定義するs=$s;か、関数がdef a(s) ...両方とも保存するよりも多くのバイトを使用するようにし、他の方法を考えることはできません。編集:定数はグローバルであり、1文字にすることができます!
  • S常により小さい場合は100、3桁の数字ではなく2桁の数字を使用して比較できるようになります。私が使用している場合しかし、S=0最後に、次の2桁は8進数として解釈され、8かつ9無効であり、すべての段です。S=単に無効であり、2桁を追加する前後に値を有効にする他の方法は知りません。注目すべきは、0(および他のすべての整数)ルビーでは真実です。

これを短くする方法についての考えは、私に知らせてください!

オンラインでお試しください!


たぶんあなたが使用した場合s=100-1?その後s、99、0、-1 ...- 99、および-s-99、0 ... 99になります。
パープルP

@PurplePどんな方法を試しても、それを実行してキャラクターを保存する方法はわかりません。
シェルバック

5

Go、382366354340340305298バイト

勝つことはできませんが、私は挑戦を楽しんでいました。

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の文字、その後にコンマが追加されます,s,最後にのみ印刷されるのを防ぐため)の最初の147文字を印刷sし、全体として印刷し、最終的には100そうn == 1n+1ない場合に印刷します。その結果、連続して実行するnと、プログラムの最後の変数nが100、101などに変更されます。変数が199以上の場合、ニュース速報が出力されます。



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}に従ってQUINEではありません)、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.