Durch Strahlung erweichtes Quin

38

Es ist ganz einfach: ein Make richtigen quine wo , wenn Sie ein beliebiges Zeichen entfernen, es ist immer noch ein quine.

Der Unterschied zwischen diesem und einem strahlungsgehärteten Quine ist, dass, wenn Ihr Programm AB, in einem strahlungsgehärteten Quine Aausgegeben würde AB, aber hier Aausgegeben würde A.

Code Golf, alle Standardregeln, Standardlücken gelten, kein Schummeln.

CalculatorFeline
quelle
Ist ein leeres Programm gültig?
Loovjo
4
@ Loovjo No.
Martin Ender
3
@feersum Die Challenge lautet "Make a quine where ...", ABsollte also ausgegeben werden AB.
Mego
1
@Mego Ich weiß, dass es das sagt, aber die Spezifikationen sind nicht immer so genau und es ist nicht in den Beispielen angegeben.
Feersum
4
@feersum "Quine machen" bedeutet Quine machen. "Der Unterschied zwischen diesem und einem strahlungsgehärteten Quine ..." bedeutet, dass der einzige Unterschied darin besteht, dass das Programm, bei dem ein Byte entfernt wurde, ein Quine ergibt und kein Programm, das die Quelle des ursprünglichen Programms druckt. Hier gibt es keine Mehrdeutigkeit.
Mego

Antworten:

22

> <> (Fisch), 145 107 Bytes

Diese Antwort verwendet die Sprunganweisung von> <>, um das Problem zu beheben.

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

Diese Quine enthält tatsächlich zwei verschiedene Quine-Generatoren. Es beginnt mit einer Sprunglogik und verwendet standardmäßig das linke Quine. Wird ein Zeichen aus der Sprunglogik oder aus der linken Reihe entfernt, springt das Programm in die rechte Reihe.

Sie können es hier ausprobieren

Erläuterung

Der Code kann in einige Teile zerlegt werden:

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 

Erklärung der verschiedenen Teile:

  • A: Springt nach rechts von C. Wenn ein Zeichen aus A gelöscht wird, springt dies nach links von D oder rechts von E und löst die zweite Quine aus. Wenn ein Zeichen aus B oder C gelöscht wird, wird der Code um ein Zeichen nach links verschoben, wodurch dieser nach links von D springt.
  • C: Dieser Code springt links von B.
  • B: Quine # 1
  • D: Quine # 2
  • E: Springt nach links von D

Erklärung der Quine (mit # 1 als Beispiel):

Sobald der Anweisungszeiger eines der Quines erreicht, sind Sie sicher, dass dieses Quine vollständig intakt ist.

>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.
Thijs ter Haar
quelle
Erklärung bitte.
CalculatorFeline
Oben wiederholen.
CalculatorFeline
1
Ist das klar genug?
Thijs ter Haar
36

Sprache 4,54 × 10 761 Bytes

Es hat diese Anzahl von Nullzeichen:

453997365974271498471447945720930600149036031871190716908688344432973027776681259141680552038829875159204621651993092104775733418288411812715164994750890484868305218411129600012389568016974351721147925344946382782884546247102886167837964612372737300786173159265347137401863281368021545169383664534228503236761742285358985343373496184959796553930661837467682191561275123057706776367104142995491262443697167483190110516522677811931124842961701222425076750211774387637740969301686178545299089832300154448308384461700726890067468872402133010536518468336342175124002115991866466700174974019423711837589532744970385003356612639263433822126850314801275940879069069974437167102618471264140597777702065896715558989678487253830854848740247786166790545462769498303055791292

Angesichts der Tatsache, dass das Kriterium in dieser Herausforderung im Widerspruch zur Definition eines "richtigen Quines" steht, denke ich, dass eine unäre Variante gewinnen wird.

Erweiterter Brainfuck-Code:

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

Wenn ein Zeichen aus dem Lenguage-Programm entfernt wird, wird das letzte Zeichen zu a <, wodurch das Programm genau ein Zeichen weniger druckt.

jimmy23013
quelle
1
Wie haben Sie es geschafft, diesen Fixpunkt zu finden? (Oder alternativ, wie funktioniert der Brainfuck-Code?)
Martin Ender
1
@ MartinBüttner Die erste große Schleife kopiert und codiert die Daten in Form von "> +++ ..." (und kehrt sie um). Die andere große Schleife gibt die Daten als Ganzzahl in Unary aus. Es ist nicht so kompliziert, aber lang, nur weil es Brainfuck ist.
Jimmy23013
Ach ja, es ist also wie eine einfache Brainfuck-Quine, aber mit einer anderen Dekodierungsfunktion?
Martin Ender
@ MartinBüttner Irgendwie. Aber die Hälfte des Programms ist die "Dekodierungsfunktion".
Jimmy23013
Es scheint, dass Sie eine ähnliche Technik verwenden könnten, um Antworten mit willkürlicher Punktzahl für codegolf.stackexchange.com/q/57257/8478 zu konstruieren (obwohl es von der Antwort auf meinen letzten Kommentar abhängt, wie genau das funktioniert).
Martin Ender