Quine amaciado por radiação


38

É simples: faça um quine adequado onde, se você remover qualquer personagem, ele ainda será um quine.

A diferença entre isso e um quine endurecido por radiação é que, se o seu programa estiver AB, em um quine endurecido por radiação Aproduziria AB, mas aqui, Aseria produzido A.

Código de golfe, todas as regras padrão, brechas padrão aplicáveis, sem trapaça.


Um programa vazio é válido?
Loovjo 20/02

4
@Loovjo No.
Martin Ender

3
@feersum O desafio declara "Faça uma solução onde ...", assim como a ABsaída AB.
Mego

1
@Mego Eu sei que diz isso, mas as especificações nem sempre são tão precisas e não são indicadas nos exemplos.
feersum 21/02

4
@feersum "Fazer um quine" significa fazer um quine. "A diferença entre isso e um quine reforçado com radiação ..." significa que a única diferença é que o programa com qualquer byte removido resulta em um quine, não em um programa que imprime a fonte do programa original. Não há ambiguidade aqui.
Mego

Respostas:


22

> <> (Peixe), 145 107 bytes

Esta resposta usa a instrução de salto de> <> para corrigir o problema.

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

Na verdade, esse quine contém dois geradores de quine diferentes. Começa com alguma lógica de salto e, por padrão, usa o quine esquerdo. Se um caractere for removido da lógica de salto ou da margem esquerda, o programa salta para a margem direita.

Você pode tentar aqui

Explicação

O código pode ser dissecado em algumas partes:

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 

Explicação das diferentes partes:

  • A: Salta para a direita de C. Se algum caractere for excluído de A, ele salta para a esquerda de D ou para a direita de E, acionando o segundo quine. Se algum caractere for excluído de B ou C, o código será deslocado 1 caractere para a esquerda, fazendo com que ele pule para a esquerda de D.
  • C: Este código salta para a esquerda de B.
  • B: Quine # 1
  • D: Quine # 2
  • E: Salta para a esquerda de D

Explicação do quine (com # 1 como exemplo):

Uma vez que o ponteiro da instrução chegue a um dos quines, você tem certeza de que o quine está completamente intacto.

>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.

Explicação, por favor.
CalculatorFeline

Reiterando acima.
CalculatorFeline

1
Isso é claro o suficiente?
Thijs ter Haar

36

Linguagem , 4.54 × 10 761 bytes

Tem este número de caracteres nulos:

453997365974271498471447945720930600149036031871190716908688344432973027776681259141680552038829875159204621651993092104775733418288411812715164994750890484868305218411129600012389568016974351721147925344946382782884546247102886167837964612372737300786173159265347137401863281368021545169383664534228503236761742285358985343373496184959796553930661837467682191561275123057706776367104142995491262443697167483190110516522677811931124842961701222425076750211774387637740969301686178545299089832300154448308384461700726890067468872402133010536518468336342175124002115991866466700174974019423711837589532744970385003356612639263433822126850314801275940879069069974437167102618471264140597777702065896715558989678487253830854848740247786166790545462769498303055791292

Vendo como o critério nesse desafio entra em conflito com a definição de "quine apropriado", seriamente, acho que uma variante do Unary vai vencer.

Código Brainfuck expandido:

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

Se um caractere for removido do programa Lenguage, o último caractere se tornará um <, o que fará com que o programa imprima exatamente um caractere a menos.


1
Como você conseguiu encontrar esse ponto fixo? (Ou, em alternativa, como funciona o código Brainfuck?)
Martin Ender

1
@ MartinBüttner O primeiro grande loop copia e codifica os dados na forma de "> +++ ..." (e reverte-os). O outro grande loop imprime os dados como um número inteiro em unário. Não é tão complicado, mas é longo apenas porque é Brainfuck.
precisa saber é o seguinte

Ah, certo, então é como uma simples solução de Brainfuck, mas com uma função de decodificação diferente?
Martin Ender

@ MartinBüttner Um pouco. Mas metade do programa é a "função de decodificação".
precisa saber é o seguinte

Parece que você poderia usar uma técnica semelhante para construir respostas de pontuação arbitrária para codegolf.stackexchange.com/q/57257/8478 (embora exatamente como isso funcione dependa da resposta ao meu último comentário).
Martin Ender
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.