Y2K… у 2019 році?


18

10 серпня 2019 року, але ваше завдання все ще включає Y2K. Дивно, правда?

Створіть програму, яка друкує себе, до неї додається двоцифрове число. Перший раз, коли ви запускаєте його, він повинен додавати 00 до свого виводу (його вихідний код, оскільки це варіант quine). Коли ви запускаєте цей вихід, оригінальна програма без двозначного числа, вона повинна виводити оригінальну програму, але з додаванням до неї 01. Запустіть цей вихід, щоб отримати програму OG з доданим 02, а потім, щоб отримати програму з 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

Перл 6 , 122 114 106 байт

-8 байт завдяки Shelvacu

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

Спробуйте в Інтернеті!

Приймає стандартний формат quine і додає нову новину, а також новий виклик функції із доданим номером. Це використовується ENDдля виконання функції, коли програма закінчується.


Ви можете зберегти ще 3 байти за допомогою ENDта ourзмінної: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

EDIT: мені вдалося видалити (s.split(35.chr)[0]+35.chr).inspectта замінити його s[0..-2](діапазон кожного значення, крім останнього) та %{ ... }синтаксис рядків, який я використовував раніше. Збережено 22 байти!

Стара версія:

EDIT: Збережено пару паролів (і відповідну пару в розділі даних), зрозумівши, що "BREAKING NEWS: WORLD ENDS"це ідеально правильний рядок формату, а 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: Запустити блок коду перед тим, як програма закінчиться; Встановити константу Sна 1(або 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, з LHS є рядком формату і RHS бути аргументи.

  • %{ ... (q=%%{%s}) ... S=1%02d}: ruby ​​має цікавий синтаксис для рядків, який також дозволяє парам фігурних дужок з'являтися всередині рядка без будь-якого виходу, поки вони врівноважені. Це дуже корисно, оскільки в іншому випадку схожий квінт повинен був би уникнути рядка, щоб укласти його в себе як літеральний рядок. Дві заміни в рядку формату призначені %sдля звичайної рядка та %02dдля числа, розміщеного праворуч до розміру 2 із символом 0.

Мої думки щодо подальшого скорочення:

  • Було б непогано мати можливість використовувати sзамість $s, але визначаючи s s=$s;або робити функцію, def a(s) ...обидва використовують більше байтів, ніж вони економить, і я не можу придумати іншого способу зробити це.EDIT: Константи глобальні і можуть бути одним символом!
  • Було б добре, якби Sзавжди було менше 100, щоб можна було порівняти, використовуючи двоцифрові числа замість 3-значних чисел. Однак якщо я використовую S=0в кінці, наступні дві цифри інтерпретуються як восьмеричні, 8і 9є недійсними, і все є двояковим. S=просто недійсний, і я не знаю іншого способу зробити значення дійсним до і після додавання двох цифр. Зауважимо, що 0(і будь-яке інше ціле число) є трибуном у рубіні.

Будь-які думки щодо того, як зробити це коротше, будь ласка, повідомте мене!

Спробуйте в Інтернеті!


Можливо, якщо ви використовували s=100-1? Тоді sбуде 99, 0, -1 ...- 99, а -sбуде -99, 0 ... 99.
Фіолетовий P

@PurpleP Як би я не намагався, я не можу зрозуміти, як це зробити і зберегти символи.
Шельваку

5

Ідіть, 382 366 354 340 305 298 272 байт

Не виграю, але мені було цікаво з викликом.

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!

Виходячи з квінти. Якщо змінна nменше 199, то вона додає до змінної рядка nсерйозний наголос ( \x60), символ Go для багаторядкових рядків з подальшим комою ,. Він продовжує друкуючи перші 147 символів s(для запобігання друкуючи ,тому , що відбувається тільки в кінці) , а потім друкує sв цілому, і , нарешті , відбитки 100якщо n == 1і в n+1іншому випадку. Результат полягає в тому, що послідовні запуски змінюють змінну nв кінці програми на 100, 101 і т. Д. Якщо змінна nдорівнює 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}), це не лайка
Shelvacu


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.