Su tarea es simple: escriba un programa (o función) que no reciba entradas y produzca (o devuelva) su código fuente. El problema es que cuando el programa está envuelto en "quotes"(carácter Unicode 34), debería generar nuevamente su código fuente (ahora citado).
Se aplican las reglas estándar para quines. Este es el código de golf , por lo que gana el programa más corto (en bytes).

!..."? Algunos idiomas admiten dos o tres caracteres de comillas.Respuestas:
Noodel ,
97 bytesEsta versión funciona de la misma manera que la otra, solo que olvidé que Noodel tiene una forma de ejecutar un bloque de código una vez e hice el lenguaje ...
Ḷ1ḥ-Ð1ḥ@€Intentalo:)
Cómo funciona
Cotización-Seguridad
Colocar el
"personaje antes y después del programa funciona porque Noodel tiene un conjunto de personajes dedicados a lo que yo llamo imprimibles . Estos se analizan inmediatamente como literales de cadena cuando se colocan solos y permiten imprimir fácilmente algo en la pantalla. Entonces, a diferencia de la mayoría de los lenguajes, Noodel ve el conjunto ASCII normal que se considera digno de impresión como literales de cadena directos (excepto el espacio y el avance de línea) en el que citar el código simplemente se ve como presionar cadenas."Intentalo:)"
Fragmentos
fuente
esea válido. La pregunta no pide el carácter codificado como el byte 34, sino el carácter Unicode 34. No importa qué codificación utilice, solo hay uno:"". (Lo siento, solo trato de asegurarme de que entiendo lo que estás diciendo) Además, ¿debo eliminar todo el texto en la respuesta que se refiere al usoe?"funciona, simplemente eliminaría la discusión y simplemente la usaría".Python
23,181152130124122 bytesPruébalo en línea! El TIO viene con un encabezado y un pie de página que prueban automáticamente la validez de la quine. Puede borrarlos para ejecutar la quine.
Este código funciona utilizando las cadenas entre comillas triples en Python.
""" """es igual a' 'y"""" """es igual a'" '.El código usa
exec, pero no para la forma "no quiney" de ejecutar datos como código, solo para establecer una variable desde dentro de una expresión. El tambiénexecestá codificado correctamente en los datos.La primera declaración compara la cadena, posiblemente con una cita antepuesta, a
" ", y establece la variable enoctconsecuencia. (La variable podría haber sido cualquier construcción corta).El resto del código implementa la quine tradicional de Python usando
%rformato de cadena, con algún código adicional que elimina las comillas adicionales si nooctse modifica.Una versión alternativa que usa el "cheaty"
execviene en 126 bytes con un código menos repetido:Pruébalo en línea!
fuente
StandardML ,
182176108bytesVersión sin comillas: Pruébelo en codingground.
Versión citada: Pruébelo en codingground.
Tenga en cuenta que la salida se parece a esto
porque el código se interpreta declaración por declaración (cada
;una termina una declaración) y muestra el valor y el tipo de cada declaración.Antecedentes
En SML hay una quine de la forma
<code>"<code in quotes>":y uno en la forma
"<code in quotes>"<code>:Ambos se basan en el hecho de que la parte
<code>no contiene comillas y, por lo tanto, se puede citar sin la necesidad de escapar de nada, el"necesidad de generar la quine está dada porstr(chr 34).También dependen en gran medida del identificador implícito
itque se utiliza cuando no se proporciona un identificador explícito en una declaración.En el primer quine se
str(chr 34);uneita la cadena que contiene",fn x=>comienza una función anónima tomando un argumentox, luego concatenax^it^x^ite imprime la cadena resultante. Esta función anónima se aplica directamente a una cadena que contiene el código del programa, por lo que la concatenaciónx^it^x^itproduce<code>"<code>".La segunda quine comienza solo con el código del programa como cadena
";str(chr 34)^it;print(it^it)";que está vinculadait. Luegostr(chr 34)^it;concatena una cita al comienzo de la cadena y, como tampoco se proporciona un identificador explícito, la cadena resultante"<code>está vinculadait. Finalmenteprint(it^it)concatena la cadena produciendo la misma"<code>"<code>que luego se imprime.Explicación
Editar: ya no está actualizado con la versión de 108 bytes, sin embargo, uno podría entenderlo también después de leer esta explicación.
La cita segura para presupuestos combina los dos enfoques anteriores y es en sí misma de la forma
"<code>"<code>. Poner esto de nuevo entre comillas rinde""<code>"<code>", por lo que obtenemos una cadena vacía y luego una quine de la otra forma.Eso significa que el
"<code>identificador le da al programa su propia fuente en la formait, oites justo"y se nos da nuestra propia fuente<code>como argumento y, por lo tanto, debe ser una función que maneje dicho argumento.Para identificar en qué caso estamos, verificamos si el tamaño de
ites mayor que 1. Si noites así, entonces"estamos y estamos en el segundo caso, por lo que la parteelsedevuelve una función anónimafn x=>print(it^it^x^it^x^it)que luego se llama porque es seguida por la fuente como cadena . Tengait^it^en cuenta el inicio que se necesita para la cadena vacía al comienzo del programa.Si
size ites mayor que 1, estamos en la partetheny solo actuamosprint(it^it), ¿verdad? No del todo, porque olvidé decirte que SML está fuertemente tipado, lo que significa que un condicionalif <cond> then <exp_1> else <exp_2>siempre debe tener el mismo tipo, lo que nuevamente significa que las expresiones<exp_1>y<exp_2>deben tener el mismo tipo. Ya sabemos el tipo de laelseparte: una función anónima que toma una cadena y luego llamaprinttiene tipostring -> <return type of print>yprinttiene tipostring -> unit(unites de alguna manera similar avoiden otros idiomas), por lo que el tipo resultante es nuevamentestring -> unit.Entonces, si la
thenparte fuera solo laprint(it^it)que tiene tipounit, obtendríamos un error de desajuste de tipo. ¿Y qué talfn _=>print(it^it)? (_es un comodín para un argumento que no se usa) Esta función anónima por sí sola tiene un tipo'a -> unitdonde'arepresenta un tipo arbitrario, por lo tanto, en el contexto de nuestro condicional que impone unstring -> unittipo, esto funcionaría. (La variable type'ase instancia con typestring.) Sin embargo, en este caso no imprimiríamos nada ya que nunca se llama a la función anónima. Recuerde, cuando vamos en la parte-thenel código general es"<code>"<code>, entonces la parte se<code>evalúa como una función pero, como nada viene después, no se llama.En su lugar se utiliza un sequentialisation que tiene la forma
(<exp_1>; ...; <exp_n>)en<exp_1>que<exp_n-1>pueden tener tipos arbitrarios y el tipo de<exp_n>proporciona el tipo de todo el sequentialisation. Desde un punto de vista funcional, los valores de<exp_1>to<exp_n-1>simplemente se descartan, sin embargo, SML también admite construcciones imperativas, por lo que las expresiones pueden tener efectos secundarios. En resumen, tomamos(print(it^it);print)como partethen, imprimiendo primero y luego devolviendo la funciónprintque tiene el tipo correcto.fuente
V ,
27, 23 bytesPruébalo en línea!
Como contiene algunos caracteres no imprimibles, aquí hay una versión legible:
y aquí hay un hexdump:
Entonces, lo primero que debemos hacer es determinar si el primer carácter es una cita.
éPinserta un carácter 'P', pero"éPes un NOOP. Después de eso, ejecutamos una ligera modificación en la quine extensible estándar, que es:Sin embargo, lo haremos de manera ligeramente diferente. En primer lugar, debemos insertar el texto inicial "éP". Entonces hacemos
Aquí es donde ocurre la ramificación. El texto actualmente en el búfer es
A menos que lo envuelvamos entre comillas, en ese caso, la 'P' nunca se habría insertado, y el búfer es:
Como todavía estamos grabando, podemos hacer lo que queramos aquí, y se agregará al búfer cuando
"qpsuceda. Entonces, desde aquí, es bastante fácil eliminar condicionalmente las comillas:fuente
JavaScript (ES6),
239237 bytesProcure probar cada versión en un entorno nuevo (por ejemplo, una nueva pestaña del navegador)
Tiene que haber al menos una forma de simplificar esto ...
fuente