2000 год ... в 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

Perl 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

РЕДАКТИРОВАТЬ: я был в состоянии удалить (s.split(35.chr)[0]+35.chr).inspectи заменить его s[0..-2](диапазон каждого значения, кроме последнего) и %{ ... }синтаксис строки, которую я использовал ранее. Сохранено 22 байта!

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

РЕДАКТИРОВАТЬ: Сохранение пары символов (и соответствующей пары в разделе данных), понимая, что "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синтаксиса ruby использует меньше байтов. Однако блок внутри ENDнаходится в другой области видимости, поэтому Sдолжен быть глобальной переменной или константой.

Объяснение:

  • END{ ... };S=1: Запустить блок кода непосредственно перед завершением программы; Установить постоянный Sна 1(или 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(и любое другое целое число) верно в рубине.

Любые мысли о том, как сделать это короче, пожалуйста, дайте мне знать!

Попробуйте онлайн!


Может быть, если вы использовали s=100-1? Тогда sбудет 99, 0, -1 ...- 99, и -sбудет -99, 0 ... 99.
Фиолетовый Р

@PurpleP Как бы я ни старался, я не могу придумать, как это сделать и сохранить символы.
Шелваку

5

Go, 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серьезный accent ( \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}), это не квин, согласно codegolf.meta.stackexchange.com/a/4878/13400
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.