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
e
sea 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énexec
está codificado correctamente en los datos.La primera declaración compara la cadena, posiblemente con una cita antepuesta, a
" "
, y establece la variable enoct
consecuencia. (La variable podría haber sido cualquier construcción corta).El resto del código implementa la quine tradicional de Python usando
%r
formato de cadena, con algún código adicional que elimina las comillas adicionales si nooct
se modifica.Una versión alternativa que usa el "cheaty"
exec
viene 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
it
que se utiliza cuando no se proporciona un identificador explícito en una declaración.En el primer quine se
str(chr 34);
uneit
a la cadena que contiene"
,fn x=>
comienza una función anónima tomando un argumentox
, luego concatenax^it^x^it
e 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^it
produce<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
, oit
es 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
it
es mayor que 1. Si noit
es así, entonces"
estamos y estamos en el segundo caso, por lo que la parteelse
devuelve 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 it
es mayor que 1, estamos en la partethen
y 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 laelse
parte: una función anónima que toma una cadena y luego llamaprint
tiene tipostring -> <return type of print>
yprint
tiene tipostring -> unit
(unit
es de alguna manera similar avoid
en otros idiomas), por lo que el tipo resultante es nuevamentestring -> unit
.Entonces, si la
then
parte 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 -> unit
donde'a
representa un tipo arbitrario, por lo tanto, en el contexto de nuestro condicional que impone unstring -> unit
tipo, esto funcionaría. (La variable type'a
se 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-then
el 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ónprint
que 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.
éP
inserta un carácter 'P', pero"éP
es 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
"qp
suceda. 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