Излучение смягчено

38

Все просто: создайте правильный quine, где, если вы удалите какого-либо персонажа, это все еще quine.

Разница между этим и радиационно-упрочненным квинем заключается в том, что если ваша программа ABв радиационно-упрочненном квинте Aбудет выводить AB, а здесь - Aвыводить A.

Код гольф, все стандартные правила, стандартные лазейки применяются, без читерства.

CalculatorFeline
источник
Допустима ли пустая программа?
Loovjo
4
@Loovjo Нет.
Мартин Эндер
3
@feersum Задача гласит: «Создай квинну, где ...», поэтому ABдолжен выводиться AB.
Mego
1
@Mego, я знаю, это говорит об этом, но спецификации не всегда так точны, и это не указано в примерах.
feersum
4
@feersum "Сделать квайн" означает сделать квайн. «Разница между этим и радиационно-стойкой квин…» означает, что единственная разница состоит в том, что программа с удаленным одним байтом приводит к квине, а не программе, которая печатает исходный текст программы. Здесь нет никакой двусмысленности.
Mego

Ответы:

22

> <> (Рыба), 145 107 байт

В этом ответе используется инструкция перехода> <> для решения проблемы.

!<0078*+00~..>0[!."r43a*+8a+&{ee+00&1-:&(?.~~ol?!;4b*0.0f<>0['r3d*159*+&}7a*00&1-:&(?.~~ol?!;68a*+0.0+*a58 

Эта квинна фактически содержит два разных генератора квин. Он начинается с некоторой логики прыжка и по умолчанию использует левый квин. Если персонаж удаляется из логики прыжка или из левой строки, программа переходит к правой строке.

Вы можете попробовать это здесь

объяснение

Код можно разбить на несколько частей:

A: !<0078*+00~..>0[!. 
B:              >0[!."r43a*+8a+&{ee+00&1-:&(?.~~ol?!;4b*0.
C:                                                    .0f<
D:                                                        >0['r3d*159*+&}7a*00&1-:&(?.~~ol?!;68a*+0.
E:                                                                                                 .0+*a58 

Объяснение различных частей:

  • A: Переход вправо от C. Если какой-либо символ удален из A, он перемещается влево от D или справа от E, вызывая вторую квинну. Если какой-либо символ удален из B или C, код смещается на 1 символ влево, в результате чего он переходит влево от D.
  • C: этот код переходит слева от B.
  • B: Quine # 1
  • D: Quine # 2
  • E: прыжки слева от D

Объяснение сущности (на примере № 1):

Как только указатель инструкции достигает любой из строк, вы уверены, что эта строка полностью исправна.

>0[!.                                       //Fix the instruction pointer's direction and empty the stack (The '!.' is a leftover from codepart A)
     "r43a*+                                //Start reading all of the code and add the '"' character to the stack
            8a+&                            //Because the quine started reading at the 19th character instead of the first, the stack has to move 18 characters. 
                                            //This part saves the number 18 to the register.
                {ee+00&1-:&(?.              //Move the stack one to the left, decrease the stack by 1. If the stack is not empty yet, jump back to the start of this section.
                              ~~              //Clean the temporary variables from the stack. It should now contain the whole quine.
                                ol?!;4b*0.  //Print the first character from the stack. As long as the stack isn't empty, jump back to the start of this section.
Тийс тер Хаар
источник
Пояснения пожалуйста.
CalculatorFeline
Повторяя выше.
CalculatorFeline
1
Это достаточно ясно?
Тийс тер Хаар
36

Lenguage , 4,54 × 10 761 байт

Он имеет это количество нулевых символов:

453997365974271498471447945720930600149036031871190716908688344432973027776681259141680552038829875159204621651993092104775733418288411812715164994750890484868305218411129600012389568016974351721147925344946382782884546247102886167837964612372737300786173159265347137401863281368021545169383664534228503236761742285358985343373496184959796553930661837467682191561275123057706776367104142995491262443697167483190110516522677811931124842961701222425076750211774387637740969301686178545299089832300154448308384461700726890067468872402133010536518468336342175124002115991866466700174974019423711837589532744970385003356612639263433822126850314801275940879069069974437167102618471264140597777702065896715558989678487253830854848740247786166790545462769498303055791292

Видя, как критерий в этой задаче вступает в противоречие с определением «правильной квайны», я думаю, что унарный вариант победит.

Расширенный код Brainfuck:

>>+++>++++++++>+++>+++>+>+>+>+>+>+>+>+++>+>+>+>+>+>+>+>+>+++>+>+>+>+>+>+>+>+>++++++++>++++>++++++++>++++>+++++++>++>+++>+>+++>++>+++>+++>+>+>+>+>+>+>+>+>++++>++++>+++++++>+>++++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>+++++>++++++++>++++>+++++++>+++++++>+>+>+++>+>+>+>++++++++>+++>+++++++>+>+++>+>+++>+>+++>+>++++++++>++++>++++++++>++++>++++++++>++++>++++>+>+++>+++>++>+++++++>+++++++>+>+>+>++++++++>+++>+>++++++++>++++>+>+++>++>+++++++>++>+++++++>++++>++++>++++++++>+++>++++++++>+++>+++>+>++++>++++>++>+++++++>+++>+++>++++++++>++++>+>+++>++>+++++++>++++>++++>+++++++>+++>+++>+++>+++>++++++++>++++>++++>+>+++>+>+++>++>+++++++>+++++++
[
    [->+>+<<]
    >>>>[<<[->+<]>>[-<<+>>]>]
    <<[-[->+<]+>]+++
    [[->>+<<]<]<
]
+>+>+>+
[>]+++>++
[
    [<].
    >[-]>[-]>[-]>[-]
    <+[<<++++++++>>->+>-[<]<]
    ++++++++>++++++++>+++++++>>
]
.

Если один из символов удаляется из программы Lenguage, последний символ становится символом a <, в результате чего программа печатает ровно на один символ меньше.

jimmy23013
источник
1
Как вам удалось найти эту фиксированную точку? (Или, как альтернатива, как работает код Brainfuck?)
Мартин Эндер,
1
@ MartinBüttner Первый большой цикл копирует и кодирует данные в форме «> +++ ...» (и обращает их вспять). Другой большой цикл выводит данные как целое число в унарном порядке. Это не так сложно, но долго только потому, что это Brainfuck.
jimmy23013
Ах да, так это как обычный брейнфукский кваин, но с другой функцией декодирования?
Мартин Эндер
@ MartinBüttner В некотором смысле. Но половина программы - это «функция декодирования».
jimmy23013
Похоже, вы могли бы использовать подобную технику для построения ответов произвольной оценки для codegolf.stackexchange.com/q/57257/8478 (хотя, как именно это работает, будет зависеть от ответа на мой последний комментарий).
Мартин Эндер