Hemos tenido muchos desafíos de quine , pero muchos de los formatos de quine son similares, creemos alguna variación en nuestras quines.
Su tarea es crear una selección de programas en el mismo idioma (al menos 2), todos los cuales generan su propio código fuente, sin embargo, ninguno de estos programas puede compartir ningún carácter.
Por ejemplo, si crea un programa usando:
printf+qw(printf+qw(%s)x2)x2
Su próximo programa no puede incluir ninguno de:
%()+2finpqrstwx
y así.
Reglas
- Puede usar caracteres unicode, pero aún debe puntuar en bytes.
- Todos los programas deben cumplir con la definición de la comunidad de una quine adecuada . Esto significa que la cadena vacía no cuenta como una quine válida, entre otras cosas.
- Las lagunas estándar están prohibidas.
- Se permiten funciones o programas completos siempre que cumplan con la definición anterior.
- Los idiomas independientes de los símbolos (incluidos Lenguage y Headsecks) no están permitidos.
- La mayoría de los programas ganan, con el código total más corto como un desempate.
code-challenge
restricted-source
quine
Dom Hastings
fuente
fuente
Respuestas:
V ,
3, 5 quines, 46 bytesPruébalo en línea!
Hexdump:
Explicación:
Pruébalo en línea!
Hexdump:
Explicación:
Pruébalo en línea!
Hexdump:
Explicación:
Aquí es donde comienzan a ponerse funky ...
Pruébalo en línea!
Hexdump:
Explicación:
Pruébalo en línea!
Hexdump:
Explicación:
Esta respuesta está llena de magia negra. Las quines 1 y 4 no son nuevas, pero las otras 3 nunca se han encontrado antes, por lo que hoy se descubrió más de la mitad de estas quines.
fuente
normie :p
"REEEEEE--
Gelatina ,
2 3 45 quines,14 18 81 65 59 56 326 265 247 229216 bytes3 bytes
Pruébalo en línea!
Quine estándar.
”Ṙ
es el único carácter literal paraṘ
.Ṙ
imprime la representación de cadena de esta, luego la cadenaṘ
se imprime implícitamente.4 bytes
Pruébalo en línea!
⁾
comienza un literal de cadena de dos caracteres yḤ
duplica su argumento. Con una entrada de cadena,Ḥ
se asigna a cada carácter. Por lo tanto,Ḥ
actuando sobre la cadena⁾Ḥ
produce⁾⁾ḤḤ
, el código fuente.11 bytes
Pruébalo en línea!
En el lado derecho,
“ȮṾṖƊ}
es la cadena literal paraȮṾṖƊ}
. El carácter de cierre de cadena se agrega tácitamente en EOF.A la izquierda del literal de cadena, se
Ɗ
envuelveȮṾṖ
en una sola mónada y la}
convierte en una díada que usa su argumento correcto, el literal de cadena.Ȯ
imprime la cadena (ȮṾṖƊ}
),Ṿ
crea una representación de cadena de la cadena (“ȮṾṖƊ}”
) yṖ
elimina el”
carácter. La cadena“ȮṾṖƊ}
se deja después de la mónada y se imprime implícitamente.38 4936 bytesPruébalo en línea!
La primera vez que he usado un espacio en Jelly golf.
La lista de números al principio contiene
ord
el resto de los caracteres en el código. Después de esto:270 198 180162 bytesPruébalo en línea!
Utiliza 250 números de base e índices en la página de códigos Jelly. Ahorró 72 bytes al cambiar el algoritmo. Estaba usando cada número para indexar en la página de códigos de Jelly, pero ahora estoy convirtiendo el entero de nuevo a la base 250 y luego indexando en la página de códigos de Jelly, básicamente reduciendo a la mitad el número de literales que necesito en la primera línea. Esto también reduce la cantidad de caracteres únicos necesarios, pero no puedo pensar en una forma de hacer más quines.
He usado los
⁾“”
que crean literales de cadenaỌ
y losØJ
que crean cadenas de números. No puedo pensar en ninguna otra forma de hacer cuerdas. Todavía tengo el dígito9
y‘’
disponible, así que si hay otra forma de hacer cadenas a partir de números, es posible hacer otra quine.fuente
Haskell , 3 quines, 1119 bytes
Quine 1, 51 bytes
Una
IO
acción anónima que se imprime directamente en stdout.Pruébalo en línea!
Quine 2, 265 bytes
La función
f
toma un argumento ficticio y devuelve una cadena.Pruébalo en línea!
Quine 3, 803 bytes
Todo lo que
LANGUAGE
sigue al pragma es una función cualquiera que toma un argumento ficticio y devuelve una cadena.Pruébalo en línea!
Caracteres
Quine 1:
Quine 2:
Quine 3:
Cómo funciona
Quine 1
Quine 1 es una versión modificada de mi reciente Golf, una respuesta quine (con mejoras de H.PWiz):
main=
se ha eliminado.<>
y$
han sido reemplazados por sus casi sinónimosmappend
yid
.Esto libera los caracteres vitales
=<>
y el operador útil$
para las otras quines.Quine 2
Quine 2 utiliza métodos algo similares para programar 2 de mi respuesta reciente de Quines mutuamente excluyentes , pero adaptado para quine directamente y especialmente para evitar el uso de literales de caracteres, que son necesarios para quine 3. Ambos se logran con la ayuda de la
show
función, que por pura suerte aún no se ha utilizado ninguno de sus personajes.Esta línea utiliza pestañas en lugar de espacios, pero he usado los espacios a continuación para facilitar la lectura.
g
son los datos de quine, como una lista de enteros al final del código. Cada número representa un carácter del resto del código.9
, de modo que la pestaña es0
. Esto hace que la codificación sea un poco más corta al permitir que las letras minúsculas para la función y los nombres de las variables quepan en 2 dígitos.b c=[[[show 9!!0,show 1!!0..]!!6..]!!c]
es una función para convertir un número en un carácter (en realidad, una cadena de un carácter).[[show 9!!0,show 1!!0..]!!6..]
es un rango de caracteres que comienza con un carácter de tabulación, que se indexa con!!c
.[show 9!!0,show 1!!0..]
, a partir de los caracteres de dígitos'9'
y'1'
y saltando hacia abajo en pasos de 8.show
cadena del dígito correspondiente.f c=[b=<<g]!!0++show g
Es la función principal.c
Es un argumento ficticio.b=<<g
utiliza=<<
para convertir cada número eng
su carácter. (El uso de, en=<<
lugar de, por ejemplo,map
es el motivo por el queb
debe incluir su carácter devuelto en una lista).show g
da la representación de cadena deg
la lista de 's, y++
concatena las cadenas.=<<
tiene una precedencia más baja que++
, se necesita un paréntesis. Para evitar el uso()
(reservado para quine 3),[...]!!0
indexa en una lista con un elemento.Quine 3
Por diseño de los otros quines, el quine 3 todavía tiene acceso a paréntesis, expresiones lambda, literales de caracteres y el constructor de cadenas / listas
:
. Esto será suficiente para construir una función que anteponga el código del quine a una cadena.Desafortunadamente,
y
se han usado todas las vocales en minúsculas (excepto algunas veces ), sin dejar funciones alfanuméricas incorporadas útiles. También[]""
se han ido. Esto no deja una forma normal de construir una cadena vacía para comenzar a simular el código.Sin embargo, casi todas las letras mayúsculas todavía están disponibles, por lo que
LANGUAGE
es posible un pragma para obtener una extensión de idioma. Nuevamente, por pura suerte,CPP
(habilitar el preprocesador C) es la única extensión de lenguaje nombrada con solo letras mayúsculas. Y las macros CPP a menudo tienen nombres en mayúscula.Entonces, para obtener la cadena vacía esencial, la función quine habilita
CPP
, usa la__TIME__
macro para obtener una cadena constante de la forma"??:??:??"
(convenientemente garantizada que siempre tenga la misma longitud), y coincide con el patrón.Después del pragma del lenguaje, la quine consiste en una expresión lambda que une sus parámetros a estos cuatro argumentos (dejando un parámetro ficticio final
_
que se aplicará más adelante):q
obligado a'\''
, dando una comilla simple;_:_:_:_:_:_:_:_:z
unido a__TIME__
, también conocido como una cadena"??:??:??"
, haciendo asíz
una cadena vacía;y
enlazado a(\(?)v k x->v$k?x)
, un combinador lambda usado para ayudar a convertir los datos de quine del formulario asociado a la izquierda ("foldl") al formulario asociado a la derecha ("foldr");(#)
vinculado a\(&)(%)v->v&'{'&'-'&...
los datos de quine en sí.Los datos de quine se dan en forma de codificación de Church, una expresión lambda con parámetros
(&)(%)v
.(&)
,(%)
yv
, esta codificación se puede usar para construir el código central de la quine o para reconstruir la representación de datos de quine en sí.&
y se%
convierten en operadores asociativos a la izquierda dentro de la lambda. Por lo tanto, los parámetros de caracteres se combinan con elv
inicio inicial desde la izquierda.k
, hay un correspondiente&'k'
.k
is'
o\
, que deben escaparse dentro de los literales de caracteres, la codificación es en su lugar%'\k'
.Dado que la codificación de datos se deja asociativa, pero las cadenas se construyen de manera asociativa derecha, el combinador
y = (\(?)v k x->v$k?x)
se introduce para cerrar la falta de coincidencia.y(...)
está destinado a construir funciones adecuadas para usar como datos(&)
y(%)
operadores de quine .v
es una función de cadenas a cadenas (los datos de quinev
son ejemplos).k
es un personaje,x
una cadena y?
un operador que los combina en una nueva cadena. (Para el código central,.(?)=(:)
Para reconstruir realmente la representación de datos de quine, es más complicado).y(?)v k = \x->v$k?x
lo tanto, es otra función de cadenas a cadenas.Como ejemplo de cómo esto cambia la asociatividad, si
(&)=y(:)
:En términos más generales, cuándo
(#)
es la función de datos de quine yf1,f2
son funciones que combinan caracteres con cadenas:aplicando la función de datos de quine con
(&)=y(f1)
y(%)=y(f2)
, y esto usa los caracteres prescritosf1
yf2
para combinar los datos de quine conx
, y luego pasa la cadena resultante av
.El cuerpo de la expresión lambda principal pone todo esto junto:
'&':q:k:q:x
para un carácterk
antecede&'k'
a la cadenax
, mientras que'%':q:'\\':k:q:x
antepone%'\k'
, que son sus formas originales de datos de quiney(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x
lo tanto, son los parámetros correctos para reconstruir la representación de datos de quine, antepuestos al finalz
(la cadena vacía) y luego pasados a la siguiente función.y(:)#y(:)
son los parámetros correctos para anteponer el código central de la quine a una cadena, sin otra modificación.\x->x
no puede hacer nada con la quine construida, que se devuelve.fuente
Perl 6 , 3 quines, 274 bytes
Quine 1, 52 bytes
Pruébalo en línea!
Quine 2, 102 bytes
Pruébalo en línea!
Quine 3, 120 bytes
Pruébalo en línea!
Verificación de conjuntos distintos de bytes
Hubo muchas maniobras para obtener esa tercera quine. Perl 6 tiene 4 métodos de salida (que yo sepa),
say
,put
,print
yprintf
. Ambas líneas de salidasay
yput
salida, ya que no puedo usar ambas.put
,print
,printf
Todos contienenp
yt
. Podemos solucionar esto parcialmente usandoEVAL
las mayúsculasPRINT
. A partir de ahí, no creo que sea posible obtener 4 quines ... (aunque quizás algo asíshell "echo 'quine'"
podría funcionar)Luego, podemos solucionar los problemas de espacio utilizando diferentes tipos de espacios en blanco para separar operadores, espacios, pestañas y líneas nuevas.
Explicaciones:
Quine 1:
Quine 2:
Esta es una quine en el formato
printf |(q[printf q[%s]]xx 2)
, es decir, formatea una copia de la cadena en sí misma. Sin embargo, no podemos usarlo,s
ya que se usó en las líneas anterioressay
. Entonces, utilizamos el operador OR (~|
) en la cadena@
y!3
, para producir la%s
parte, pero no podemos hacer eso tanto en la cadena de formato como en la cadena que se va a insertar, por lo que tenemos que verZ~
con la cadena adicional y una cadena vacía, aunque no podemos usar,
para separar los dos, entonces hacemosXx qw[1 0]
multiplicar por 1 y 0 la cadena.Quine 3:
Esta es una quine EVAL que hace todo lo posible para poner todo en mayúscula para evitar conflictos con las otras quines. Esto implica una gran cantidad de
EVAL
s, así como unos pocos,lc
y lauc
conversión entre casos.fuente
MathGolf ,
4 56 quines, 193,535 bytes9 bytes
Pruébalo en línea!
45 bytes
Pruébalo en línea!
49 bytes
Pruébalo en línea!
99 bytes
Pruébalo en línea!
4488 bytes
Pruébalo en línea!
188,845 bytes
Realmente no puedo vincularme con este, así que aquí hay un programa Perl 6 que genera la quine real
Verificación de distinción
Definitivamente puedo sacar otra quine de esto, aunque creo que me he quedado sin formas de empujar cadenas directamente a la pila, por lo que tendré que recurrir a métodos más extraños. Métodos aún más extraños cuando intento una sexta quine. En algunos casos, las cuotas pueden ser más cortas, pero estoy reduciendo los bytes usados en preparación.De acuerdo, técnicamente podría ser capaz de hacer una quine más, ya que todavía tengo algunos operadores que necesito (cadena de inserción, cadena de incremento, duplicación, mapeo, popping), es el bucle que nos constriñe. El
{}
son los únicos operadores que se pueden indicar un bloque de código de longitud arbitraria, y realmente los necesitan en el sexto quine. Podría usar algunos de los otros bloques de código, pero son limitados, y dudo que las secciones de bucle sean tan cortas, ya que nos estamos quedando sin operadores fáciles.Bien, algunas explicaciones tardías:
Todas las quines tienen casi la misma estructura:
Quine 1:
Esto es básicamente lo mismo que publiqué en la pregunta normal de quine.
Quine 2
Quine 3:
Quine 4:
Quine 5:
Quine 6:
La razón de esto es quine así mucho más tiempo que los otros es que incrementando cuerdas utiliza representaciones Unicode, que es una mierda para el algunos de los caracteres en el código, especialmente cuando estamos tratando de crear el personaje
⌂
en el código, que se infla el código en más de 8000 caracteres, que luego infla la parte de representación en una cantidad muy grandeEste último quine se reduciría significativamente si MathGolf fuera consistente en si las cadenas usaban la página de códigos nativa o no.
fuente
chr/ord
uno de ellos, creo que debería usar ambos la página de códigos.Python 2, 2, quines
434353349446 bytesEsto fue principalmente para ver si podía hacerlo en Python.
30 bytes (incluida una nueva línea final):
y 416 bytes, sin nueva línea final:
(Golfed 81 bytes gracias a Lynn pero agregó una carga debido a la preocupación por la nueva línea).
Explicación
El primero es solo la quine corta estándar de Python , pero modificada para no usar
_
. Como se trata de Python 2, tampoco usa(
o)
.El segundo pensó un poco. La cadena larga se codifica utilizando el
hex
códec (lo que garantiza que solo contendrá0
-9
ya
-f
) y se decodifica comoEsto utiliza el truco de quine para obtener su propio código fuente, luego lo codifica usando
hex_codec
, y luego lo imprime rodeadoexec"".decode("hex")
,sys.stdout.write
para evitar imprimir una nueva línea. La ejecución de este código genera el segundo quine, que es cómo lo generé.Sospecho que más de dos son imposibles en Python, ¡aunque me gustaría verlo si me equivoco!
Si no te importa evaluar quines
Ørjan Johansen sugirió lo siguiente para la segunda quine precodificada
que obtendría 30 + 248 = 278 bytes para la siguiente salida:
El uso de
exec
esta manera no es hacer trampa de acuerdo con las reglas de quine adecuadas de PPCG , pero me parece algo engañoso (elegante e inteligente, pero aún así es engañoso), porque algunos caracteres se utilizan como código y datos. (Aunque mi versión sí usaexec
, el código y los datos están separados). Así que mantendré mi puntaje en 446.fuente
"hex"
funciona en lugar de"hex_codec"
, lo que debería ahorrarle unos pocos bytes.print '<tab>',
no agrega un espacio al final. Usando esto, puede 85 bytes de la sugerencia de Jo King: tio.run/…Japt ,
23 quines,106172 bytesLa primera es una versión bastante detallada de mi respuesta N char quine .
Probar aquí .
La segunda quine es la quine más buena de ETHProduction , que es una buena quine estándar para Japt.
Probar aquí .
El tercero usa un
``
código de caracteres XORing para almacenar los datos.Probar aquí .
Dado que
()'
todavía están disponibles, que podría ser posible exprimir una quine más.fuente
"'[+U+']+R+(Umd)¬"q mc
brinda la primera línea para actualizaciones rápidas, si eso es de alguna ayuda.Gol> <> ,
23 quines,17 28 2726 bytes6 bytes
Pruébalo en línea!
11 109 bytesPruébalo en línea!
11 bytes
Pruébalo en línea!
Gol> <> tiene tres formas de imprimir cualquier carácter:
o
Pop un valor e imprimir como charH
Pop todo, imprimir como char, y detenerS"..."
Imprimir literal de cadena sin afectar la pila en absolutoPero no pude encontrar una manera de escribir un quine usando
S"..."
como único método de salida, así que se me ocurrieron los dos anteriores, utilizando los dos tipos de literales de cadena.El tercero (por Jo King) usa el
p
comando para crear el"
inS"
sobre la marcha, que a su vez imprime todo excepto el cero al final. LuegoEh
imprime el cero y sale.Ahora que utilizamos todos los comandos de salida Y el
p
comando, creo que es imposible crear otra quine (a menos que alguien presente laS"
quine sin ellap
).fuente
S"..."
?Ruby , 2 quines, 27 + 44 = 71 bytes
Pruébalo en línea!
Pruébalo en línea!
Estoy principalmente limitado por los métodos de salida, aquí. Hay bastantes formas de manipular cadenas, pero aparte de
$><<
todos los métodos de salida utilizables, parecen cruzarse demasiado. Creo que podría haber una salida,eval
pero es complicado tener que anidar múltiples manipulaciones de cadenas de diferentes tipos.fuente
Javascript ES6, 2 quines, 43 + 22 = 65 bytes
Quine 1:
Quine 2:
fuente
g=z=>"g="+g
una quine JS válida?> <> , 2 quines, 8 + 16 = 24 bytes
8 bytes
Pruébalo en línea!
Tomado de esta respuesta .
16 bytes
Pruébalo en línea!
Esto se basa en la
'r3d*>o<
quine, exceptoo
y<
no se puede utilizar, por lo que sustituye<
con|
y crea dinámicamenteo
(111 = 8 * 13 + 7) y la coloqué en el que el segundo>
es.2 quines es el límite
Desafortunadamente, estamos limitados por la cantidad de comandos de salida.
n
no es útil porque solo genera números, por lo queo
debe ejecutarse en cualquier quine. La única forma de crear dinámicamenteo
es conp
. Entonces, una quine puede usaro
y otra puede crearlap
, pero no puede haber una tercera quine.Es posible que una tercera quine deje el código fuente en la pila si eso cuenta.
fuente
Java 10, 2 quines,
14481248 bytes13501122 bytesPruébalo en línea.
Equivalente a:
Explicación:
126 bytes
System.console()
regresaránull
cuando no se proporcione ninguno, por lo que TIO devuelve unNullPointerException
en este caso .Para probar que es una quine funcional, reemplácela
System.console()
conSystem.out
: Pruébelo en línea.Explicación:
Explicación general:
En Java, una quine se suele hacer así:
String s
contiene el código fuente sin formato.%s
se utiliza para ingresar esta cadena en sí misma con els.format(...)
.%c
,%1$c
y34
se usan para formatear las comillas dobles.s.format(s,34,s)
lo pone todo juntoEn cuyo caso, la función lambda quine más corta en Java 10 sería esta ( 82 bytes ):
Pruébalo en línea.
Dado que la única forma de tener dos quines en Java es usar la versión Unicode con
\uHEXA
, que se convierte en caracteres durante la compilación, no puedo usar los caracteres0123456789ABCDEF\u
en la versión no Unicode. Entonces, la versión más pequeña no unicode usará enSystem.console()
lugar dereturn
oSystem.out
(ambas contienen una 'u'), y usará'}'-'['
y dos veces en%c
lugar de34
y%1$c
.Algunas cosas a tener en cuenta sobre la versión Unicode:
%04X
lugar de%04x
(para mayúsculas hexadecimales en lugar de minúsculas).92
,%c
y%3$c
para formatear las barras.\U
en minúscula\u
, de lo contrario, lo habría utilizadoreturn
en la versión más corta no unicode.fuente