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


38

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

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

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


Допустима ли пустая программа?
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 <, в результате чего программа печатает ровно на один символ меньше.


1
Как вам удалось найти эту фиксированную точку? (Или, как альтернатива, как работает код Brainfuck?)
Мартин Эндер,

1
@ MartinBüttner Первый большой цикл копирует и кодирует данные в форме «> +++ ...» (и обращает их вспять). Другой большой цикл выводит данные как целое число в унарном порядке. Это не так сложно, но долго только потому, что это Brainfuck.
jimmy23013

Ах да, так это как обычный брейнфукский кваин, но с другой функцией декодирования?
Мартин Эндер

@ MartinBüttner В некотором смысле. Но половина программы - это «функция декодирования».
jimmy23013

Похоже, вы могли бы использовать подобную технику для построения ответов произвольной оценки для codegolf.stackexchange.com/q/57257/8478 (хотя, как именно это работает, будет зависеть от ответа на мой последний комментарий).
Мартин Эндер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.