Y2K… 2019'da mı?


18

10 Ağustos 2019, ancak göreviniz hala Y2K'yı içeriyor. Tuhaf, değil mi?

Kendisine yazdıran ve kendisine iki basamaklı bir sayı ekleyerek bir program oluşturun. İlk çalıştırdığınızda, çıkışına 00 eklemelidir (kaynak kodu, çünkü bu bir quine varyantıdır). Bu çıktıyı çalıştırdığınızda, orijinal program iki basamaklı bir sayı olmadan, orijinal programın çıktısını almalı, ancak 01'e eklenmiş olmalıdır. Bu programı 02 ile OG programını almak için çalıştırın, daha sonra programı 03 ile almak için ... Bu zincir 99'a kadar devam etmelidir BREAKING NEWS: WORLD ENDS.

Programınız o Y2Kparanoia: yeszaman:

  1. Çıktı almalı Y2Kparanoia: yes00
  2. Bu çıktı yazdırılmalıdır Y2Kparanoia: yes01
  3. Bu çıktı yazdırılmalıdır Y2K paranoia: yes02
  4. 100. adıma kadar tekrarlayın: bu program belirtilen kıyamet haberlerini verir

Bu kod golf, bu nedenle bu adımları takip ederken kendini yazdırabilirsiniz en kısa program kazanır.


7
Açıklamaya göre, koştuğumuzda 99. kez koşup 2Kparanoia: yes97üreteceğiz 2Kparanoia: yes98, bu yüzden okumamalıyız (4) Repeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"? (yani 2Kparanoia: yes99haberleri üretir)
Jonathan Allan

Yanıtlar:


7

Perl 6 , 122114106 bayt

Shelvacu sayesinde -8 bayt

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

Çevrimiçi deneyin!

Standart quine biçimini alır ve son dakika haber dizesini ve ekli numara ile yeni bir işlev çağrısını ekler. Bu END, program sona erdiğinde işlevi yürütmek için kullanır .


Kullanarak ENDve bir ourdeğişkeni kullanarak 3 bayt daha kaydedebilirsiniz :END {<print $s-199??"END\{<$_>~~.EVAL};our\$s="~($s-1&&$s-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};our$s=1
Shelvacu

Şimdilik bu kazanan.
Andrew

7

Yakut, 158 154 146 128 122 100 bayt

Bu cevaptan esinlenildi .

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

DÜZENLEME: Daha önce kullandığım dize sözdizimi ( son hariç her değerin aralığı) ve (s.split(35.chr)[0]+35.chr).inspectonu kaldırabilir ve değiştirebildim . 22 bayt kaydedildi!s[0..-2]%{ ... }

Eski versiyon:

EDIT: "BREAKING NEWS: WORLD ENDS"Mükemmel geçerli bir biçim dizesi olduğunu fark ederek bir çift parens (ve veri bölümünde karşılık gelen çifti) kaydetti ve ruby ​​herhangi bir extraneos parametresini yok sayar.

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

Numara beri fark bu ben başlatırken vardır programın en sonuna gitmek ve yakut, beyan önce değişkenleri kullanarak izin vermez, ben kod çalışmasını sağlamak zorunda kalacak sonra nasılsa basamak. Ben gibi bitti bir şey yapabilirdim def a(s) ... end;a 1olacaktı ...end;a 100ancak Ruby'nin az bilinen kullanarak, ENDsözdizimi kullanır az bayt. Bununla birlikte, içerideki blok ENDfarklı bir kapsamdadır, bu nedenle Sküresel bir değişken veya sabit olmalıdır.

Açıklama:

  • END{ ... };S=1: Program bitmeden hemen önce kod bloğunu çalıştırın; Sabit Solarak ayarlayın 1(veya 100- 199gelecek yinelemelerde)
  • $><<( ... ): $>stdout için ruby ​​kısayoludur ve <<IO'da IO'ya yazar. Parens gerekli, aksi takdirde olur($><<S)>198...
  • S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]: Eğer biraz daha makul bir koda bu kırmak olsaydı olurdu:

    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

    %Bir dize uygulanan operatör etkili bir olduğunu printfLHS biçim dizesi olan ve RHS argümanlar olmak üzere.

  • %{ ... (q=%%{%s}) ... S=1%02d}: ruby, dizeler için ilginç bir sözdizimine sahiptir, bu da kıvırcık parantez çiftlerinin dengelendiği sürece herhangi bir kaçış olmadan dizenin içinde görünmesini sağlar . Bu çok yararlıdır, aksi takdirde benzer bir kine, dizgi değişmezi olarak kendi içine koymak için dizeden kaçmak zorunda kalacaktır. Biçim dizesindeki iki ikame, %snormal bir dize ve %02dkarakterle 2 boyutuna sağa doğru doldurulmuş bir sayı içindir 0.

Kısaltma konusundaki düşüncelerim:

  • Bunun syerine kullanabilmek güzel olurdu $s, ancak s'yi tanımlamak s=$s;veya bir işlevi yapmak def a(s) ..., kaydettiklerinden daha fazla bayt kullanır ve bunu yapmanın başka bir yolunu düşünemiyorum. EDIT: Sabitler küresel ve bir karakter olabilir!
  • Her Szaman daha az olsaydı iyi olurdu 100, böylece 3 basamaklı sayılar yerine 2 basamaklı sayılar kullanılarak karşılaştırılabilirdi. Ancak, S=0sonunda kullanırsam , sonraki iki basamak sekizlik olarak yorumlanır 8ve 9geçersizdir ve hepsi ranzadır. S=sadece geçerli değil ve bir değeri iki basamak eklemeden önce ve sonra geçerli kılmanın başka bir yolunu bilmiyorum. Not, 0(ve diğer her tam sayı) yakutta doğrudur .

Bunu nasıl kısaltacağınız hakkında herhangi bir düşünce, lütfen bana bildirin!

Çevrimiçi deneyin!


Belki kullandıysan s=100-1? Sonra s99, 0, -1 ...- 99 -solacak ve -99, 0 ... 99 olacak.
Purple P

@PurpleP Nasıl denersem deneyim bunu yapmanın ve karakterleri kaydetmenin bir yolunu bulamıyorum.
Shelvacu

5

Git, 382366354 340305298 272 bayt

Kazanmayacağım ama meydan okuma ile eğlendim.

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'da deneyin!

Bir quine dayanarak. Değişken n199'dan küçükse, dize değişkenine nmezar aksanı ( \x60), Go'nun çok satırlı dizeler için karakterini ve ardından virgül ekler ,. Bu ilk 147 karakteri yazdırarak devam s(baskı önlemek için ,daha sonra yazdırır sadece sonunda oluşur) sbir bütün olarak ve son olarak baskılar 100eğer n == 1ve n+1aksi. Sonuç, ardışık çalışmaların nprogramın sonunda değişkeni 100, 101 vb. Olarak değiştirmesidir. Değişken n199 veya daha fazla ise, son dakika haberleri yazdırır.



2

JavaScript (ES6), 116 bayt

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

Dize oluşturma işlevlerine izin veriliyorsa 94 bayt

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

2
Kendi kaynak kodunuzu ( f=${f}) okuyamazsınız
Shelvacu


1

Pyth , 81 80 bayt

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

Çevrimiçi deneyin!

Açıklama:

.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

Ve dizedeki kod (son dakika haberi kısaldı):

?>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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.