var QUESTION_ID=69;
var OVERRIDE_USER=98;
var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;function answersUrl(index){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}
function commentUrl(index,answers){return"https://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}
function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=!1;comment_page=1;getComments()}})}
function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}
getAnswers();var SCORE_REG=(function(){var headerTag=String.raw `h\d`
var score=String.raw `\-?\d+\.?\d*`
var normalText=String.raw `[^\n<>]*`
var strikethrough=String.raw `<s>${normalText}</s>|<strike>${normalText}</strike>|<del>${normalText}</del>`
var noDigitText=String.raw `[^\n\d<>]*`
var htmlTag=String.raw `<[^\n<>]+>`
return new RegExp(String.raw `<${headerTag}>`+String.raw `\s*([^\n,]*[^\s,]),.*?`+String.raw `(${score})`+String.raw `(?=`+String.raw `${noDigitText}`+String.raw `(?:(?:${strikethrough}|${htmlTag})${noDigitText})*`+String.raw `</${headerTag}>`+String.raw `)`)})();var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}
function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))
body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)
valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,})});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)
lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<i>'+a.language+'</i>').text().toLowerCase();languages[lang]=languages[lang]||{lang:a.language,user:a.user,size:a.size,link:a.link,uniq:lang}});var langs=[];for(var lang in languages)
if(languages.hasOwnProperty(lang))
langs.push(languages[lang]);langs.sort(function(a,b){if(a.uniq>b.uniq)return 1;if(a.uniq<b.uniq)return-1;return 0});for(var i=0;i<langs.length;++i)
{var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;float:left}#language-list{padding:10px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/primary.css?v=f52df912b654"> <div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table>
Respuestas:
Hexagonía , longitud lateral
1716,816705 bytesPruébalo en línea!
Esto es lo que parece desplegado:
Ah, bueno, esta fue la montaña rusa emocional ... Dejé de contar la cantidad de veces que cambié entre "jaja, esto es una locura" y "espera, si hago esto debería ser bastante factible". Las restricciones impuestas en el código por las reglas de diseño de Hexagony fueron ... severas.
Es posible reducir la longitud del lado en 1 o 2 sin cambiar el enfoque general, pero será difícil (solo las celdas con
#
las que no se utilizan actualmente y están disponibles para el decodificador). Por el momento tampoco tengo absolutamente ninguna idea de cómo un enfoque más eficiente, pero estoy seguro de que existe. Pensaré en esto durante los próximos días y tal vez intente jugar golf a un lado, antes de agregar una explicación y todo.Bueno, al menos, he demostrado que es posible ...
Algunos scripts de CJam para mi propia referencia futura:
fuente
!
y luego con un espejo/
en la 2da última línea ingresa al decodificador para imprimir el código del decodificador para completar el quine. Esto tiene un uso milagroso<
y>
lee el entero multilínea muy grande y construyó el área para almacenar el decodificador. Realmente me encantaría saber qué "docenas de enfoques" se están considerando?MySQL, 167 caracteres
Eso es correcto. :-)
Realmente escribí este yo mismo. Fue publicado originalmente en mi sitio .
fuente
GolfScript, 2 bytes
(nota nueva línea final) Esto empuja el número 1 en la pila. Al final del programa, GolfScript imprime todos los elementos de la pila (sin espacios en el medio), luego imprime una nueva línea.
Esta es una quine verdadera (como se enumera en la pregunta), porque realmente ejecuta el código; no solo "lee el archivo fuente e lo imprime" (a diferencia del envío de PHP).
Para otro ejemplo, aquí hay un programa GolfScript para imprimir
12345678
:9
: empuje 9 a la pila,
: consume el 9 como argumento, empuja la matriz[0 1 2 3 4 5 6 7 8]
a la pila(
: consume la matriz como argumento, empuja la matriz[1 2 3 4 5 6 7 8]
y el elemento0
a la pila;
: descarta el elemento superior de la pilaLa pila ahora contiene la matriz
[1 2 3 4 5 6 7 8]
. Esto se escribe en la salida estándar sin espacios entre los elementos, seguido de una nueva línea.fuente
1
no es una quine en GolfScript: genera1\n
, donde\n
denota una nueva línea. Sin embargo, el programa de dos char1\n
es una quine.\n
probablemente también lo es?Cerebro-Flak ,
9.8e5801.3e5629.3e51612818110244452433242404200418038523656361635402485 + 3 = 2488 bytes¡Ahora cabe en el universo observable!
Pruébalo en línea!
Explicación
Este Quine funciona como la mayoría de los Quines en lenguajes esotéricos; Tiene dos partes, un codificador y un decodificador. El codificador es todos los paréntesis al principio y el decodificador es la parte más compleja al final.
Una forma ingenua de codificar el programa sería colocar el valor ASCII de cada carácter en el decodificador en la pila. Esta no es una muy buena idea porque Brain-Flak solo usa 8 caracteres (
()<>[]{}
), por lo que terminas pagando unos pocos bytes para codificar muy poca información. Una idea más inteligente, y la utilizada hasta ahora es asignar cada una de las 8 llaves a un número mucho menor (1-8) y convertirlas a los valores ASCII con nuestro decodificador. Esto es bueno porque no cuesta más de 18 bytes codificar un carácter en lugar de los 252 anteriores.Sin embargo, este programa tampoco. Se basa en el hecho de que los programas Brain-Flak están todos equilibrados para codificar los 8 aparatos con los números hasta el 5. Los codifica de la siguiente manera.
Todas las llaves cerradas se asignan 1 porque podemos usar el contexto para determinar cuál de ellas necesitamos usar en un escenario particular. Esto puede sonar como una tarea desalentadora para un programa Brain-Flak, pero realmente no lo es. Tomemos, por ejemplo, las siguientes codificaciones con las llaves abiertas decodificadas y las llaves cerradas reemplazadas por a
.
:Esperemos que pueda ver que el algoritmo es bastante simple, leemos de izquierda a derecha, cada vez que encontramos un paréntesis abierto empujamos su paréntesis cerrado a una pila imaginaria y cuando encontramos un
.
pop, colocamos el valor superior y lo colocamos en lugar del.
. Esta nueva codificación nos ahorra una enorme cantidad de bytes en el codificador y solo nos pierde un puñado de bytes en el decodificador.Explicación de bajo nivel
Trabajo en progreso
fuente
Preludio ,
51574514234817611537664569535423241214184178175169148142136133 bytesGracias a Sp3000 por guardar 3 bytes.
Esto es bastante largo ...(bueno, todavía es largo ... al menos está superando la quineBrainfuckC # más cortaconocidaen este desafío ahora) pero es la primera quine que descubrí (mis presentaciones de Lua y Julia son solo traducciones de técnicas estándar de quine en otros idiomas) y hasta donde yo sé, nadie ha escrito un quine en Prelude hasta ahora, por lo que estoy muy orgulloso de esto. :)Esa gran cantidad de dígitos es solo una codificación del código central, por lo que la cantidad es tan larga.
Los dígitos que codifican la quine se han generado con este script CJam .
Esto requiere un intérprete que cumpla con los estándares, que imprime caracteres (usando los valores como códigos de caracteres). Entonces, si está utilizando el intérprete de Python , deberá configurarlo
NUMERIC_OUTPUT = False
.Explicación
Primero, algunas palabras sobre Prelude: cada línea en Prelude es una "voz" separada que manipula su propia pila. Estas pilas se inicializan a un número infinito de ceros. El programa se ejecuta columna por columna, donde todos los comandos de la columna se ejecutan "simultáneamente" en función de los estados anteriores de la pila. Los dígitos se insertan en la pila individualmente
42
lo que presionarán a4
, luego a2
. No hay forma de empujar números más grandes directamente, tendrás que sumarlos. Los valores se pueden copiar de pilas adyacentes conv
y^
. Los bucles de estilo Brainfuck se pueden introducir entre paréntesis. Vea el enlace en el título para más información.Aquí está la idea básica de la quine: primero empujamos cargas de dígitos en la pila que codifican el núcleo de la quine. Dicho núcleo toma esos dígitos, los decodifica para imprimirse y luego imprime los dígitos a medida que aparecen en el código (y el final
)
).Esto es un poco complicado por el hecho de que tuve que dividir el núcleo en varias líneas. Originalmente tenía la codificación al principio, pero luego necesitaba rellenar las otras líneas con el mismo número de espacios. Es por eso que las puntuaciones iniciales fueron tan grandes. Ahora he puesto la codificación al final, pero esto significa que primero necesito omitir el núcleo, luego presionar los dígitos y volver al inicio e imprimir.
La codificación
Dado que el código solo tiene dos voces, y adyacencia es cíclico,
^
yv
son sinónimos. Eso es bueno porquev
tiene, con mucho, el código de caracteres más grande, por lo que evitarlo usando siempre^
hace que la codificación sea más simple. Ahora todos los códigos de caracteres están en el rango de 10 a 94, inclusive. Esto significa que puedo codificar cada carácter con exactamente dos dígitos decimales. Sin embargo, hay un problema: algunos caracteres, especialmente el salto de línea, tienen un cero en su representación decimal. Eso es un problema porque los ceros no se distinguen fácilmente del fondo de la pila. Afortunadamente, hay una solución simple para eso: compensamos los códigos de caracteres, por2
lo que tenemos un rango de 12 a 96, inclusive, que todavía cabe cómodamente en dos dígitos decimales. Ahora, de todos los personajes que pueden aparecer en el programa Preludio,0
tiene un 0 en su representación (50), pero realmente no necesitamos0
nada. Así que esa es la codificación que estoy usando, empujando cada dígito individualmente.Sin embargo, dado que estamos trabajando con una pila, las representaciones se envían en reversa. Entonces, si nos fijamos en el final de la codificación:
Divídase en pares e invierta, luego reste dos, y luego busque los códigos de caracteres:
donde
32
es corresponde a espacios. El núcleo hace exactamente esta transformación y luego imprime los caracteres.El núcleo
Así que veamos cómo se procesan realmente estos números. Primero, es importante tener en cuenta que los paréntesis coincidentes no tienen que estar en la misma línea en Prelude. Solo puede haber un paréntesis por columna, por lo que no hay ambigüedad en el paréntesis. En particular, la posición vertical del paréntesis de cierre es siempre irrelevante: la pila que se verifica para determinar si el ciclo termina (o se omite por completo) siempre será la que tenga el
(
.Queremos ejecutar el código exactamente dos veces: la primera vez, omitimos el núcleo y presionamos todos los números al final, la segunda vez que ejecutamos el núcleo. De hecho, después de ejecutar el núcleo, presionaremos todos esos números nuevamente, pero dado que el ciclo termina después, esto es irrelevante. Esto le da el siguiente esqueleto:
Primero, empujamos un
7
a la primera voz: si no hacemos esto, nunca entraríamos en el bucle (para el esqueleto, solo es importante que esto no sea cero ... por qué específicamente7
lo veremos más adelante) . Luego entramos en el bucle principal. Ahora, la segunda voz contiene otro bucle. En la primera pasada, este bucle se omitirá porque la segunda pila está vacía / contiene solo 0s. Entonces saltamos directamente a la codificación y empujamos todos esos dígitos a la pila. El7
que empujamos en la primera pila todavía está allí, por lo que el ciclo se repite.Esta vez, también hay un
7
en la segunda pila, por lo que ingresamos el bucle en la segunda voz. El bucle en la segunda voz está diseñado de modo que la pila esté vacía nuevamente al final, por lo que solo se ejecuta una vez. Será también agotar la primera pila ... Así que cuando dejamos el bucle de la segunda voz, que empujar todos los dígitos de nuevo, pero ahora el7
de la primera pila se ha descartado, por lo que los principales extremos del asa y el programa termina.A continuación, veamos el primer bucle en el núcleo real. Hacer cosas simultáneamente con un
(
o)
es bastante interesante. He marcado el cuerpo del bucle aquí con=
:Eso significa que la columna que contiene
(
no se considera parte del bucle (los caracteres allí solo se ejecutan una vez, e incluso si se omite el bucle). Pero la columna que contiene)
es parte del bucle y se ejecuta una vez en cada iteración.Entonces comenzamos con un single
-
, que convierte el7
primer stack en un-7
... otra vez, más sobre eso después. En cuanto al bucle real ...El ciclo continúa mientras la pila de dígitos no se ha vaciado. Procesa dos dígitos a la vez. El propósito de este bucle es decodificar la codificación, imprimir el carácter y al mismo tiempo cambiar la pila de dígitos a la primera voz. Entonces esta parte primero:
La primera columna mueve el 1 dígito a la primera voz. La segunda columna copia los 10 dígitos a la primera voz y al mismo tiempo copia el dígito de 1 a la segunda voz. La tercera columna mueve esa copia de nuevo a la primera voz. Eso significa que la primera voz ahora tiene el 1 dígito dos veces y los 10 dígitos intermedios. La segunda voz tiene solo otra copia de los 10 dígitos. Eso significa que podemos trabajar con los valores en la parte superior de las pilas y asegurarnos de que quedan dos copias en la primera pila para más adelante.
Ahora recuperamos el código de caracteres de los dos dígitos:
La parte inferior es un pequeño bucle que solo disminuye los 10 dígitos a cero. Para cada iteración queremos agregar 10 a la parte superior. Recuerde que el primero
2
no es parte del bucle, por lo que el cuerpo del bucle es en realidad el+8+2
que agrega 10 (usando el2
empujado anteriormente) y empuja otro 2. Entonces, cuando terminamos con el bucle, la primera pila realmente tiene la base- Valor 10 y otro 2. Restamos ese 2 con-
para tener en cuenta el desplazamiento en la codificación e imprimimos el carácter con!
. El#
just descarta el cero al final del bucle inferior.Una vez que se completa este ciclo, la segunda pila está vacía y la primera pila contiene todos los dígitos en orden inverso (y a
-7
en la parte inferior). El resto es bastante simple:Este es el segundo bucle del núcleo, que ahora imprime todos los dígitos. Para hacerlo, necesitamos 48 por cada dígito para obtener su código de carácter correcto. Hacemos esto con un ciclo simple que ejecuta
8
tiempos y agrega6
cada vez. El resultado se imprime con!
y8
al final es para la siguiente iteración.¿Y qué hay del
-7
? Sí,48 - 7 = 41
cuál es el código de personaje de)
. ¡Magia!Finalmente, cuando terminamos con ese bucle, descartamos el
8
que acabamos de presionar#
para asegurarnos de dejar el bucle externo en la segunda voz. Empujamos todos los dígitos nuevamente y el programa termina.fuente
Hexagonía , longitud lateral 11, 314 bytes
Pruébalo en línea!
Versión antigua:
Hexagonía , longitud del lado 11, 330 bytes
Pruébalo en línea!
Codificador: ¡ Pruébelo en línea!
El programa es más o menos equivalente a este código Python: ¡ Pruébelo en línea!
Código desplegado:
Dos
.
s toma 1 bit. Cualquier otro carácter toma 1 bit y un dígito base-97.Explicación
Haga clic en las imágenes para ampliarlas. Cada parte de la explicación tiene el código Python correspondiente para ayudar a comprender.
Parte de datos
En lugar de la compleja estructura se utiliza en algunas otras respuestas (con
<
,"
y algunas otras cosas), acabo de dejar pasar la IP a través de la mitad inferior.Primero, la IP atraviesa muchos números y no-op's (
.
) y mirrors (\
). Cada dígito se agrega al número en la memoria, por lo que al final el valor de la memoria es igual al número al inicio del programa.!
lo imprimey
$
salta por el siguiente>
.A partir de la
<
. Si el valor de la memoriamem
es falso (<= 0
es decir, la condiciónmem > 0
no se cumple), hemos terminado de imprimir el programa y deberíamos salir. La IP seguiría el camino superior.(deje que la IP se ejecute en
todo el mundodurante aproximadamente 33 comandos antes de presionar el@
(que termina el programa) porque colocarlo en cualquier otro lugar incurre en algunos bytes adicionales)Si es cierto, seguimos el camino inferior, nos redireccionamos algunas veces y ejecutamos algunos comandos más antes de presionar otro condicional.
Ahora el recuerdo se ve así:
Si el valor es verdadero:
se ejecuta el siguiente código:
Véase la explicación detallada de la
Q4
en respuesta HelloWorld Hexagony de MartinEnder . En resumen, este código se imprime.
dos veces.Originalmente planeé imprimir esto
.
una vez. Cuando se me ocurrió esto (imprimir.
dos veces) e implementarlo, se guardaron unos 10 dígitos.Entonces,
Aquí hay un hecho importante que me di cuenta de que me ahorró unos 14 dígitos: no es necesario que esté en el lugar donde comenzó.
Para entender lo que digo, tengamos una analogía BF. (omita esto si ya lo entendió)
Dado el código
Suponiendo que seamos
a
el valor de la celda actual yb
el valor de la celda derecha, una traducción directa de esto a BF es:Sin embargo, tenga en cuenta que no necesitamos estar en la misma posición todo el tiempo durante el programa. Podemos dejar que el valor de
a
sea lo que somos al comienzo de cada iteración, luego tenemos este código:que es varios bytes más corto.
Además, el comportamiento de envoltura de la esquina también me evita tener un
\
espejo allí; sin él, no sería capaz de ajustar los dígitos (+2 dígitos para\
sí mismo y +2 dígitos para un no emparejado.
a la derecha, sin mencionar el banderas)(detalles:
\
reflejo, ahora se dirige hacia arriba)
Si el valor (de la operación mod 2 anterior) es falso (cero), entonces seguimos esta ruta:
No explicaré demasiado detallado aquí, pero el desplazamiento en realidad no es exactamente
33
, pero es congruente con el33
mod256
. Ychr
tiene una implícita% 256
.fuente
Vim, 11 bytes
iq"qP<Esc>
: Inserte manualmente un duplicado del texto que debe estar fuera de la grabación.q"
yhqP
: Grabe el interior directamente en el""
registro sin nombre , para que pueda pegarse en el medio. Elh
es el único reposicionamiento requerido; si lo coloca dentro de la macro, se pegará en el resultado.Editar
Una nota sobre la grabación con
q"
: El registro sin nombre""
es algo divertido. No es realmente un registro verdadero como los demás, ya que el texto no está almacenado allí. En realidad, es un puntero a otro registro (generalmente"-
para eliminaciones sin nueva línea,"0
para yanks o"1
para eliminaciones con una nueva línea).q"
rompe las reglas; en realidad escribe a"0
. Si""
ya estaba apuntando a otro registro que no sea"0
,q"
se sobrescribirá"0
pero""
no se modificará. Cuando inicia un Vim nuevo,""
apunta automáticamente"0
, por lo que está bien en ese caso.Básicamente, Vim es raro y con errores.
fuente
y
o algo antes de correr puede ayudar␛
para mostrar presionando la tecla <Esc>? Parte de este " Unicode Block" Control Pictures "<Esc>
notación es estándar en las asignaciones de Vim (:help <>
) y eso es lo que utiliza vimgolf.com. Cualquier vimgolfer experimentado estará acostumbrado a leerlo. En cuanto al Unicode, tengo que entrecerrar los ojos para leer las pequeñas letras, y oscurecen el método de escribirlas y buscar el archivo de ayuda.Cubix , 20 bytes
Casi tengo el
\o/
...Neto :
Pruébalo en línea
Pruébalo aquí !
Notas adicionales
Historia de fondo
Después de estar impresionado al leer esta gran respuesta de @ ais523, comencé a pensar en seguir jugando al golf. Después de todo, había bastantes no-ops allí, y eso no se sentía muy comprimido. Sin embargo, como la técnica que usa su respuesta (y la mía también), requiere que el código abarque líneas completas, se necesitaba un ahorro de al menos 12 bytes. Hubo un comentario en su explicación que realmente me hizo pensar:
Entonces, de repente, cuando me puse de pie y me alejé para tomar algo de beber, me di cuenta: ¿Qué pasaría si el programa no usara códigos de caracteres, sino más bien números para representar la cara superior? Esto es especialmente corto si el número que imprimimos tiene 2 dígitos. Cubix tiene 3 instrucciones de un byte para empujar los números de dos dígitos:
N
,S
yQ
, que empujan10
,32
y34
, respectivamente, por lo que este debe ser bastante golfy, pensé.La primera complicación con esta idea es que la cara superior ahora está llena de números inútiles, por lo que ya no podemos usar eso. La segunda complicación es que la cara superior tiene un tamaño que es el tamaño del cubo al cuadrado, y necesitaba tener un tamaño par, de lo contrario un número también terminaría en la posición inicial del puntero de instrucción, lo que llevaría a una pila contaminada. Debido a estas complicaciones, mi código necesitaba caber en un cubo de tamaño 2 (que puede contener 'solo' 24 bytes, así que tuve que jugar al menos 21 bytes). Además, debido a que las caras superior e inferior no se pueden usar, solo tenía 16 bytes efectivos.
Entonces comencé eligiendo el número que se convertiría en la mitad de la cara superior. Comencé con
N
(10), pero eso no funcionó por el enfoque que estaba tomando para imprimir todo. De cualquier manera, comencé de nuevo y uséS
(32) por alguna razón. Eso resultó en una quine adecuada, o eso pensé. Todo funcionó muy bien, pero faltaban las citas. Entonces, se me ocurrió que elQ
(34) sería realmente útil. Después de todo, 34 es el código de caracteres de la comilla doble, que nos permite mantenerlo en la pila, ahorrando (2, en el diseño que utilicé entonces) bytes preciosos. Después de cambiar un poco la ruta IP, todo lo que quedaba era un ejercicio para completar los espacios en blanco.Cómo funciona
El código se puede dividir en 5 partes. Los revisaré uno por uno. Tenga en cuenta que estamos codificando las caras intermedias en orden inverso porque el modelo de pila es el primero en entrar, el último en salir.
Paso 1: imprimir la cara superior
Las instrucciones irrelevantes han sido reemplazadas por no-ops (
.
). El IP comienza la tercera línea, a la izquierda, apuntando hacia el este. La pila está (obviamente) vacía.La IP termina en la posición más a la izquierda en la cuarta línea, apuntando hacia el oeste, a punto de pasar a la posición más a la derecha en esa misma línea. Las instrucciones ejecutadas son (sin el carácter de flujo de control):
La pila contiene solo 34, que representan el último carácter de la fuente.
Paso 2: codifica la cuarta línea
Esto hace más o menos lo que espera que haga: codificar la cuarta línea. La IP comienza con la comilla doble al final de esa línea, y va hacia el oeste mientras empuja los códigos de caracteres de cada personaje en el que aterriza hasta que encuentra una comilla doble correspondiente. Esta doble comilla coincidente es también el último carácter en la cuarta línea, porque la IP se ajusta nuevamente cuando llega al borde izquierdo.
Efectivamente, la IP se ha movido una posición hacia la izquierda, y la pila ahora contiene la representación de la cuarta línea en códigos de caracteres y orden inverso.
Paso 3: empuje otra cita
Necesitamos impulsar otra cita, y ¿qué mejor manera que reciclarla
Q
al comienzo del programa al abordarla desde la derecha? Esto tiene la ventaja adicional de que la IP se encuentra directamente con la cita que codifica la tercera línea.Aquí está la versión neta para este paso. Las instrucciones irrelevantes han sido reemplazadas por no-ops nuevamente, las no-ops que se ejecutan han sido reemplazadas por hashtags (
#
) con fines ilustrativos y la IP comienza en el último carácter en la cuarta línea.La IP termina en la tercera línea en la primera instrucción, a punto de ajustarse al final de esa línea porque apunta hacia el oeste. Se exceden las siguientes instrucciones (excluyendo el flujo de control):
Esta comilla doble representa la que está al final de la tercera línea.
Paso 4: codificar la tercera línea
Esto funciona exactamente igual que el paso 2, así que busque una explicación.
Paso 5: imprima la pila
La pila ahora contiene las líneas cuarta y tercera, en orden inverso, por lo que todo lo que tenemos que hacer ahora es imprimirla. La IP comienza en la penúltima instrucción en la tercera línea, moviéndose hacia el oeste. Aquí está la parte relevante del cubo (nuevamente, las partes irrelevantes han sido reemplazadas por no-ops).
Este es un bucle, como habrás visto / esperado. El cuerpo principal es:
El ciclo finaliza si el elemento superior es 0, lo que solo ocurre cuando la pila está vacía. Si el ciclo finaliza,
@
se ejecuta y finaliza el programa.fuente
Javascript ES6 - 21 bytes
Yo llamo a esta quine "The Bling Quine".
A veces, tienes que jugar al golf con estilo.
fuente
!$=_=>`!$=${$}()`()
Te ahorra 2 bytes?Invalid assignment left hand side
. Ojalá funcionara :(Array.prototype.join
.alert
oconsole.log
después de la función de flecha y envolver la cadena de plantilla entre paréntesis funcionaría.Brainf * ck (755 caracteres)
Esto se basa en una técnica desarrollada por Erik Bosman (ejbosman en cs.vu.nl). Tenga en cuenta que el "Quine de ESultanik!" ¡el texto es realmente necesario para que sea un quine!
fuente
ESultanik's Quine!
configura la memoria como una codificación de pilaESultanik's Quine!
y hacia adelante, con dos bytes de memoria para cada carácter (el valor ASCII se compensa desde 0x1F). El último bit de código recorre la memoria, primero reproduce mediante programación los++>+++…
códigos para cada carácter y luego imprime los caracteres.Hexagonia , longitud lateral
15 14 1312,616 533 456383 bytesDespués de varios días de golf cuidadoso, reorganizando bucles y comenzando de nuevo, finalmente he logré llevarlo a un lado 12 hexágono.
Pruébalo en línea!
Desplegado:
Si bien no parece el código de Hexagony más desarrollado, el tipo de codificación que utilicé está optimizado para tiradas más largas de no-ops, que es algo que de otro modo evitarías.
Explicación
Esto supera la respuesta anterior de Hexagony al codificar las no-ops (
.
) de una manera diferente. Si bien esa respuesta ahorra espacio al hacer que cada otro personaje sea a.
, el mío codifica el número de no-ops. También significa que la fuente no tiene que ser tan restringida.Aquí utilizo una codificación de base 80, donde los números por debajo de 16 indican carreras sin operaciones, y los números entre 16 y 79 representan el rango 32 (
!
) a 95 (_
) (ahora me estoy dando cuenta de que saqué todos los_
s de mi código lol). Algunos pseudocódigo Pythonic:El número está codificado en la primera mitad del hexágono, con todos los
en el lado izquierdo y el
en el lado derecho redirigiendo el puntero para codificar el número en una celda. Esto está tomado de la respuesta de Martin Ender (gracias), porque no pude encontrar una manera más eficiente.
Luego ingresa a la sección inferior a través de
->
:!
imprime el número y'
navega a la celda de memoria correcta antes de comenzar el ciclo.P='%
modifica el número actual en 80. Si el resultado es 0, sube hasta la terminación@
, de lo contrario, baja y crea una celda junto al resultado de la modificación con el valor-16
.Establezca la celda en (valor de mod + -16). Si ese valor es negativo, suba en la bifurcación
>+'\
, de lo contrario, baje.Si el valor es positivo:
El puntero termina en el
;-<
que establece la celda en (valor mod - -16) e imprime.El valor es negativo:
Baja a la
> ) <
sección que comienza el ciclo. Aquí está aislado:Que ejecuta el código
'Q4;="=
que imprime un.
(gracias de nuevo a Martin Ender, quien escribió un programa para encontrar las combinaciones de letras y números para los caracteres) y regresa a la celda inicial. Luego incrementa ()
) la celda de valor de mod y vuelve a recorrer, hasta que el valor de mod es positivo.Cuando se hace eso, se mueve hacia arriba y se une con la otra sección en:
El puntero luego regresa al inicio del bucle más grande nuevamente.
Esto se ejecuta
='=:'
y divide el número actual entre 80 y navega a la celda correcta.Versión antigua (Longitud lateral 13)
Pruébalo en línea!
Definitivamente puedo jugar golf a otro lado de esto, pero tendré que dejarlo hasta mañana porque se está haciendo tarde.Resulta que soy impaciente y no puedo esperar hasta mañana.¿Quizás otro lado puede jugar al golf?:(ahhhhhhhhh hice!Incluso jugué un par de dígitos adicionales con una codificación base 77, pero en realidad no importa, ya que tiene el mismo bytecount.
fuente
PostScript, 20 caracteres
Corto y legítimo. 20 caracteres incluyendo nueva línea final.
fuente
Cubix , 45 bytes
Puedes probar este código aquí .
Este programa es bastante difícil de seguir, pero para tener alguna posibilidad de hacerlo, debemos comenzar expandiéndolo en un cubo, como lo hace el intérprete de Cubix:
Esta es una quine de estilo Befunge, que funciona mediante la explotación de la envoltura para hacer que los literales de cadena "envuelvan" el código ejecutable (con solo uno
"
marca, el código está dentro y fuera de la cita al mismo tiempo, algo que se hace posible cuando tienes programas que no son lineales y no planas). Tenga en cuenta que esto se ajusta a nuestra definición de una quine adecuada, porque dos de las comillas dobles no se codifican a sí mismas, sino que se calculan más tarde mediante el uso de la aritmética.Sin embargo, a diferencia de Befunge, estamos usando cuatro cuerdas aquí, en lugar de una. Así es como son empujados a la pila;
El programa comienza en la parte superior del borde izquierdo, yendo hacia la derecha; gira a la derecha dos veces (
R
), haciéndolo ir hacia la izquierda a lo largo de la tercera y última línea que envuelve todo el cubo. La comilla doble coincide, por lo que empujamos toda la tercera línea hacia atrás en la pila. Luego, la ejecución continúa después de la doble cita.El
u
comando hace un giro en U a la derecha, por lo que lo siguiente que estamos ejecutando es desde'"
adelante en la línea media. Eso empuja un"
sobre la pila. Continuando con la vuelta, golpeamos el<
lado izquierdo del cubo y nos recuperamos. Cuando nos acercamos desde esta dirección, vemos un"
comando simple , no'"
, por lo que toda la segunda línea se empuja hacia la pila hacia atrás por encima de la tercera línea y la comilla doble.Comenzamos empujando a
!
sobre la pila ('!
) e incrementándola ()
); esto produce una comilla doble sin necesidad de una comilla doble en nuestro código fuente (que terminaría la cadena). Un espejo (\
) refleja la dirección de ejecución hacia el norte; entonces elW
comando se desvía hacia la izquierda. Esto nos deja yendo hacia arriba en la séptima columna, que debido a que es un cubo, se envuelve hacia la izquierda en la tercera fila, luego hacia abajo en la tercera columna. Tocamos unR
, para girar a la derecha y avanzar hacia la izquierda a lo largo de la fila superior; luego$
omite laR
vía por la que ingresamos al programa, por lo que la ejecución se ajusta al"
final de la línea y capturamos la primera línea en una cadena de la misma manera que lo hicimos para el segundo y el tercero.El
^
comando nos envía hacia el norte hasta la undécima columna, que está (permitiendo el ajuste del cubo) hacia el sur en la quinta. Lo único que encontramos allí es!
(omitir si no es cero; la parte superior de la pila es de hecho distinta de cero), que omite elo
comando, haciendo que la quinta columna esté completamente vacía. Así que volvemos alu
comando, que una vez más gira en U, pero esta vez nos quedamos en la columna final hacia el sur, que se envuelve en la cuarta columna hacia el norte. Sin embargo, alcanzamos una comilla doble durante el giro en U, por lo que capturamos toda la cuarta columna en una cadena, de abajo hacia arriba. A diferencia de la mayoría de las comillas dobles en el programa, esta no se cierra sola; más bien, está cerrado por la"
esquina superior derecha, lo que significa que capturamos la cadena de nueve caracteres...>.....
.Entonces, el diseño de la pila es ahora, de arriba a abajo: cuarta columna; fila superior;
"
; fila del medio;"
; fila inferior. Cada uno de estos se representa en la pila con el primer carácter más cercano a la parte superior de la pila (Cubix empuja cadenas en el reverso de este orden, como lo hace Befunge, pero cada vez que la IP se movía en la dirección opuesta a la dirección de lectura natural, por lo que efectivamente se invirtió dos veces). Se puede observar que el contenido de la pila es casi idéntico al programa original (porque la cuarta columna y la cara norte / superior del cubo contienen los mismos caracteres en el mismo orden; obviamente, fue diseñado así intencionalmente).El siguiente paso es imprimir el contenido de la pila. Después de todos los empujes, la IP va hacia el norte en la cuarta columna, por lo que golpea
>
allí y entra en un bucle cerrado>>o;?
(es decir, "gire hacia el este, gire hacia el este, salga como carácter, pop, gire a la derecha si es positivo"). Debido a que la séptima línea está llena de NOP, la?
va a volver a la primera>
, por lo que esto empuja efectivamente todo el contenido de la pila (?
es un no-op en una pila vacía). ¡Casi imprimimos todo el programa! Desafortunadamente, aún no está hecho; nos falta la comilla doble al final.Una vez que finaliza el bucle, reflexionamos sobre la línea central, moviéndonos hacia el oeste, a través de un par de espejos. (Usamos el "otro lado" del
\
espejo antes; ahora estamos usando el lado suroeste. El/
espejo no se ha usado antes). Encontramos'!
, así que empujamos un signo de exclamación (es decir, 33; estamos usando ASCII y Cubix no distingue entre enteros y caracteres) en la pila. (Convenientemente, esto es lo mismo!
que se usó para omitir elo
comando anterior). Nos encontramos con un par deR
comandos y los usamos para hacer un giro en U "manual" (el segundoR
comando aquí se usó antes para llegar al primero fila, por lo que parecía más natural encajar otroR
comando junto a él.W
comando, para esquivar a la izquierda. El paso lateral choca directamente con el>
comando en la segunda línea, recuperando la ejecución exactamente donde estaba. Entonces, volvemos a la izquierda, pero esta vez vamos hacia el sur, por lo que el siguiente comando para ejecutar es)
(incrementando el signo de exclamación en una comilla doble), seguido de uno
(para generarlo). Finalmente, la ejecución se ajusta a lo largo de la octava línea a la segunda columna, donde encuentra una@
para salir del programa.Pido disculpas por el apóstrofe perdido en la tercera línea. No hace nada en esta versión del programa; Era parte de una idea anterior que tenía pero que resultó no ser necesaria. Sin embargo, una vez que obtuve un quine funcional, solo quería enviarlo en lugar de perder el tiempo con él, especialmente porque eliminarlo no cambiaría el recuento de bytes. Sobre el tema de jugar golf más abajo en esta línea, no me sorprendería si esto fuera posible en 3 × 3 usando solo las primeras cinco líneas, pero no puedo ver una manera obvia de hacerlo, y necesitaría un empaquetamiento aún más estricto de todo el flujo de control junto con alguna otra forma de representar la cara superior del cubo (o bien modificar el algoritmo para que pueda continuar usando la cuarta columna a pesar de que ahora tendría diez u once caracteres de longitud) .
fuente
"
esQ
.Python 2, 30 bytes
Tomado de aquí
fuente
_
, pero se lee mejor si lo asigna a cualquier letra, es decir, s:s='s=%r;print s%%s';print s%s
Vim,
17, 14 pulsaciones de teclasAlguien votó al azar esto, así que recordé que existe. Cuando lo volví a leer, pensé "¡Oye, puedo hacerlo mejor que eso!", Así que jugué dos bytes. Todavía no es el más corto, pero al menos es una mejora.
Durante mucho tiempo, me he estado preguntando si un vim quine es posible. Por un lado, debe ser posible, ya que vim se está completando. Pero después de buscar un vim quine durante mucho tiempo, no pude encontrarlo. Me hice encuentro este desafío PPCG , pero está cerrado y no exactamente sobre quines literales. Así que decidí hacer uno, ya que no pude encontrar uno.
Estoy realmente orgulloso de esta respuesta, debido a dos primicias :
Esta es la primera quine que he hecho, y
Que yo sepa, este es el primer mundo vim-quine del mundo que se publica! Podría estar equivocado sobre esto, así que si sabes de uno, por favor avísame.
Entonces, después de esa larga introducción, aquí está:
Pruébalo en línea!
Tenga en cuenta que cuando escribe esto, mostrará la
<esc>
pulsación de tecla como^[
. Esto todavía es preciso, ya que^[
representa0x1B
, que es escape en ASCII , y la forma en que vim representa internamente la<esc>
clave.También tenga en cuenta que probar esto podría fallar si carga una sesión vim existente. Escribí una respuesta de consejos explicando que aquí , si quieres más información, pero básicamente necesitas iniciar vim con
o escriba
qqq
antes de ejecutar esto.Explicación:
En una nota al margen, esta respuesta es probablemente un récord mundial para la mayoría de las 'q' en una respuesta PPCG, o algo así.
fuente
2i2i<esc>
está muy cerca Siento que debe haber algo que pueda hacer para que esto funcione.<Esc>
está implícito en V, por lo que funciona . Desafortunadamente, también agrega una nueva línea, por lo que aún no la he publicado.q"iq"qbP<Esc>qbP
es 11. Después de poner esto en reddit , investigué el vimgolf aquí y decidí hacer una cuenta. Esta es la respuesta que publiqué allí.Perdido ,
120116 98 96 76 7066 bytesEditar: yay, menos de 100
Editar: guardado un montón de bytes cambiando a todos los
/
s en la línea inferiorPruébalo en línea! + verificación es determinista para todos los estados posibles
Lost es un lenguaje 2D en el que la posición y dirección de inicio son completamente aleatorias. Esto significa que debe haber una gran cantidad de verificación de errores en cada etapa para asegurarse de que tiene el puntero de instrucción correcto, y no es uno que se haya desplazado al azar.
Explicación:
Todos los
/
s en la línea inferior están ahí para asegurarse de que todos los punteros que se generan en una dirección vertical o en la línea inferior se canalicen en la dirección correcta. A partir de ahí, terminan en varios lugares diferentes, pero todos terminan yendo directamente a laLo que borra todos los números que no son cero en la pila. El
([
después de que borra cualquier 0s adicionales también.En el medio del claro, golpea el
%
, lo que apaga la 'seguridad', lo que permite que el programa termine cuando golpea el@
(sin esto, el programa podría terminar inmediatamente si un puntero se iniciara en el@
).A partir de ahí, hace una línea de lenguaje 2D bastante simple, al envolver un literal de cadena (
"
) alrededor de la primera línea, empujar un"
carácter al duplicar un espacio (:2+
) y luego una nueva línea (52*
). Para la segunda línea, crea un/
carácter (95*2+
) y lo duplica un montón (>::1?:[:[[[[
), antes de terminar finalmente en@
e imprimir la pila implícitamente. El?1
objetivo es evitar que el proceso cree demasiados ceros si el puntero ingresa temprano, ahorrando tener que borrarlos más tarde.Ahorré 20 bytes aquí haciendo que la última línea tenga el mismo carácter, lo que significa que podría pasar directamente del proceso de duplicación al final
@
.Explicación sobre el proceso de duplicación:
[
es un personaje conocido como 'Puerta'. Si el puntero golpea el lado plano de a[
o a]
, se refleja, de lo contrario, lo atraviesa. Cada vez que el puntero interactúa con una puerta, cambia al tipo opuesto. Usando este conocimiento podemos construir una fórmula simple para cuántas veces se ejecutará una instrucción en un>:[
bloque.Agregue la cantidad inicial de instrucciones. Para cada uno
[
, agregue 2 veces la cantidad de instrucciones a la izquierda. Para el ejemplo>::::[:[[[
, comenzamos con 5 como la cantidad inicial. La primera puerta tiene 4 instrucciones de duplicación, por lo que agregamos 4 * 2 = 8 a 5 para obtener 13. Las otras tres puertas tienen 5 duplicados a su izquierda, por lo que agregamos 3 * (5 * 2) = 30 a 13 para obtener 43 instrucciones duplicadas ejecutadas, y tienen 44>
s en la pila. El mismo proceso se puede aplicar a otras instrucciones, como(
empujar una gran cantidad de elementos de la pila al alcance, o como se usa aquí, para borrar elementos de la pila.Un truco que he usado aquí para evitar duplicar demasiados ceros es el
1?
. Si el carácter es 0,?
no omite el 1, lo que significa que duplica 1 para el resto del engaño. Esto hace que sea mucho más fácil limpiar la pila más adelante.fuente
Estas son las dos quines rubí más cortas de SO :
y
No me preguntes cómo funciona el segundo ...
fuente
<<2
comienza una cadena en la siguiente línea y*2
repite la cadenaFisión , 6 bytes.
Parece que esta es la quine "adecuada" más corta entre estas respuestas.
Explicación
El flujo de control comienza en
R
con un solo(1,0)
átomo a la derecha . Se golpea"
alternar el modo de impresión y luego se envuelve alrededor de la línea, la impresión'!+OR
antes de llegar a la misma"
de nuevo y salir del modo de impresión.Eso deja el
"
mismo para ser impreso. La forma más corta es'"O
(donde'"
establece la masa del átomo en el código de caracteres"
eO
imprime el carácter y destruye el átomo), pero si lo hiciéramos"
, interferiría con el modo de impresión. Por lo tanto, establecemos el valor del átomo en'!
(uno menos que"
), luego incrementamos con+
y luego imprimimos el resultado conO
.Alternativas
Aquí hay un par de alternativas, que son más largas, pero tal vez sus técnicas inspiren a alguien a encontrar una versión más corta usándolas (o tal vez sean más útiles en ciertas citas generalizadas).
8 bytes usando
J
umpDe nuevo, el código comienza en
R
. Los@
intercambios de masa y energía para dar(0,1)
. Por lo tanto,J
hace que el átomo salte sobre laO
recta hacia"
. Entonces, como antes, todos menos el"
se imprimen en modo de cadena. Después, el átomo golpea|
para invertir su dirección, y luego pasa a través de la'"O
impresión"
. El espacio es un poco molesto, pero parece necesario, porque de lo contrario'
, el átomo trataría al|
personaje como un personaje en lugar de un espejo.8 bytes usando dos átomos
Esto tiene dos átomos, comenzando desde la izquierda y desde la
L
derechaR
. El átomo de la izquierda obtiene su valor establecido por el'"
cual se imprime inmediatamente conO
(y el átomo destruido). Para el átomo de la derecha, intercambiamos masa y energía nuevamente, saltamos sobre elO
para imprimir el resto del código en modo de impresión. Posteriormente, su valor se establece por'L
pero eso no importa porque el átomo se descarta con;
.fuente
'!+
codifica"
.|R@JO"'
funcionaría, ¿o aún necesitarías ese espacio después del'
?'
primero.JavaScript de navegador cruzado (41 caracteres)
Funciona en los 5 principales navegadores web (IE> = 8, Mozilla Firefox, Google Chrome, Safari, Opera). Ingrese en la consola del desarrollador en cualquiera de esos:
No es "trampa", a diferencia del quine de un solo byte de Chris Jester-Young, ya que podría modificarse fácilmente para usar la
alert()
función (que cuesta 14 caracteres):O convertido a un marcador (con un costo de 22 caracteres):
fuente
C,
6460 bytesHasta ahora, esta es la quina C más corta conocida. Hay un recompensa extendida si encuentras una más corta.
Esto funciona en GCC , Clang y TCC en un entorno POSIX . Invoca una cantidad excesiva de comportamiento indefinido con todos ellos.
Solo por diversión, aquí hay un repositorio que contiene todas las C quines que conozco. No dude en bifurcar / PR si encuentra o escribe uno diferente que agrega algo nuevo y creativo sobre los existentes.
Tenga en cuenta que solo funciona en un entorno ASCII . Esto funciona para EBCDIC , pero aún requiere POSIX . Buena suerte para encontrar un entorno POSIX / EBCDIC de todos modos: P
Cómo funciona:
main(s)
abusamain
de los argumentos, declarando una variable prácticamente sin tipos
. (Tenga en cuenta ques
realidad no está sin tipo, pero dado que los compiladores enumerados lo autoemiten según sea necesario, también podría ser *).printf(s="..."
conjuntoss
en la cadena proporcionada y pasa el primer argumento aprintf
.s
se establece enmain(s){printf(s=%c%s%1$c,34,s);}
.%c
esté configurado como ASCII34
,"
. Esto hace posible la quine. Ahora ses
ve así:main(s){printf(s="%s%1$c,34,s);}
.%s
se establece ens
sí mismo, lo cual es posible debido a # 2. Ahora ses
ve así:main(s){printf(s="main(s){printf(s=%c%s%1$c,34,s);}%1$c,34,s);}
.%1$c
se establece en ASCII 34"
,printf
el primer argumento **. Ahora ses
ve así:main(s){printf(s="main(s){printf(s=%c%s%1$c,34,s);}",34,s);}
... que resulta ser el código fuente original.
* Ejemplo gracias a @Pavel
** primer argumento después del especificador de formato, en este caso,
s
. Es imposible hacer referencia al especificador de formato.Creo que es imposible que esto se acorte con el mismo enfoque. Si se pudiera
printf
acceder al especificador de formato$
, esto funcionaría para 52 bytes:fuente
s
es de tipoint
, no una "variable sin tipo".s=3
obviamente no funcionaría porque necesita pasar la cadena dos vecesprintf
.Java, 528 bytes:
Una solución Java con un enfoque original:
en forma legible:
fuente
if(++i==92)
,a*
como la matriz no sale en Java, esa es C. Algunas otras partes del golf:,import java.math.*;class a{public static void main(String[]a){BigInteger b=new BigInteger("abc",36);int i=0;for(int c:b.toByteArray())System.out.printf("%s%c",++i==92?b.toString(36):"",c);}}
dondeabc
sería la cadena mágica recién calculada. En java 8+ también es posible cambiarclass a{public static void main
ainterface a{static void main
, y en Java 10+ también es posible cambiarimport java.math.*;
yBigInteger b=new BigInteger(
avar b=new java.math.BigInteger(
.Pollo , 7
No, esto no se repite directamente :)
fuente
chicken
!Retina ,
201497 bytesAntes de comenzar, me gustaría mencionar la solución trivial de un archivo que contiene uno
0
. En ese caso, Retina intentará contar las0
s en la entrada vacía, cuyo resultado también es0
. Sin embargo, no lo consideraría una quine adecuada.Así que aquí hay uno apropiado:
Pruébalo en línea!
Alternativamente, podríamos usar en
;
lugar de>
.Explicación
El programa consiste en un solo reemplazo que imprimimos dos veces.
En la primera línea,
`
separa la configuración de la expresión regular, por lo que la expresión regular está vacía. Por lo tanto, la cadena vacía (es decir, la entrada inexistente) se reemplaza con la segunda línea, textualmente.Para imprimir el resultado dos veces, lo envolvemos en dos etapas de salida. El interno,
\
imprime el resultado con un salto de línea final, y el externo>
, lo imprime sin uno.Si está un poco familiarizado con Retina, es posible que se pregunte qué pasó con la salida implícita de Retina. La salida implícita de Retina funciona envolviendo la etapa final de un programa en una etapa de salida. Sin embargo, Retina no hace esto, si la etapa final ya es una etapa de salida. La razón de ello es que en un programa normal es más útil ser capaz de reemplazar la etapa de salida implícita con uno especial como
\
o;
para un solo byte (en lugar de tener que deshacerse de la implícita con la.
bandera también). Desafortunadamente, este comportamiento termina costando dos bytes para la quine.fuente
Javascript (36 caracteres)
Esta es, AFAICT, la más corta javascript publicada hasta ahora.
fuente
a
, puede acceder a su contenido llamandoa.toString
.a
exactamente de la misma manera que se ha escrito anteriormente. Sin embargo, es probable que la salida de este código sea una quine en cualquier implementación de JavaScript.!function a(){alert("!"+a+"()")}()
.(a=()=>alert(
($ {a})))()
GolfScript, 8 bytes
Siempre pensé que la cantidad más corta (verdadera) de GolfScript era de 9 bytes:
Donde el avance de línea final es necesario porque GolfScript imprime un avance de línea final de forma predeterminada.
Pero acabo de encontrar una quine de 8 bytes, que funciona exactamente alrededor de esa restricción de salto de línea:
Pruébalo en línea!
Entonces, el problema es que GolfScript no imprime un salto de línea final, sino que imprime el contenido
n
al final del programa. Es solo quen
contiene un salto de línea para empezar. Entonces, la idea es reemplazar eso con la cadena":n`"
, y luego encadenarla, de modo que la copia en la pila se imprima con comillas y la copia almacenada enn
impresiones sin.Como señaló Thomas Kwa, la quine CJam de 7 bytes también se puede adaptar a una solución de 8 bytes:
Nuevamente, necesitamos el avance de línea final.
fuente
Laberinto ,
12411053 bytesGracias a Sp3000 por jugar golf en 9 bytes, lo que me permitió jugar golf en otros 7.
Pruébalo en línea!
Explicación
Laberinto 101:
n*10 + <digit>
. Esto permite la acumulación fácil de grandes números. Para comenzar un nuevo número, use_
, que empuja a cero."
son no-ops.Primero, explicaré una versión un poco más simple que es un byte más larga, pero un poco menos mágica:
Pruébalo en línea!
La idea principal es codificar el cuerpo principal de la fuente en un solo número, utilizando una base grande. Ese número puede imprimirse fácilmente antes de decodificarse para imprimir el resto del código fuente. La decodificación es simplemente la aplicación repetida de
divmod base
, donde imprimemod
y continúa trabajando con eldiv
hasta su cero.Al evitar
{}
, el código de caracteres más alto que necesitaremos es_
(95) de modo que la base 96 sea suficiente (al mantener la base baja, el número al principio es más corto). Entonces, lo que queremos codificar es esto:Al convertir esos caracteres en sus puntos de código y tratar el resultado como un número base 96 (con el dígito menos significativo correspondiente
!
y el más significativo.
, porque ese es el orden en el que desensamblaremos el número), obtenemosAhora el código comienza con un truco bastante bueno (si puedo decirlo) que nos permite imprimir la codificación y conservar otra copia para decodificar con muy poca sobrecarga: colocamos el número en el código al revés. Calculé el resultado con este script de CJam. Pasemos al código real. Aquí está el comienzo:
La IP comienza en la esquina superior izquierda, hacia el este. Mientras corre sobre esos dígitos, simplemente acumula ese número en la parte superior de la pila. El número en sí no tiene ningún sentido, porque es lo contrario de lo que queremos. Cuando la IP llega al
!
, eso saca este número de la pila y lo imprime. Eso es todo lo que hay para reproducir la codificación en la salida.Pero ahora la IP ha llegado a un callejón sin salida. Eso significa que gira y ahora se mueve hacia el oeste (sin ejecutar de
!
nuevo). Esta vez, convenientemente, la IP lee el número de atrás hacia adelante, de modo que ahora el número en la parte superior de la pila hace codificar el resto de la fuente.Cuando la IP ahora golpea la esquina superior izquierda nuevamente, esto no es un callejón sin salida porque la IP puede girar a la izquierda, así que lo hace y ahora se mueve hacia el sur. El
"
es un no-op, que necesitamos aquí para separar el número del bucle principal del código. Hablando de que:Mientras la parte superior de la pila aún no sea cero, la IP se ejecutará a través de este código bastante denso en el siguiente bucle:
O presentado linealmente:
La razón por la que toma esos turnos se debe a la semántica de flujo de control de Labyrinth. Cuando hay al menos tres vecinos a la celda actual, la IP girará a la izquierda con un valor de pila negativo, avanzará a cero y girará a la derecha con un valor de pila positivo. Si la dirección elegida no es posible porque hay un muro, la IP tomará la dirección opuesta (es por eso que hay dos giros a la izquierda en el código, aunque la parte superior de la pila nunca es negativa).
El código de bucle en sí es bastante sencillo (comprimirlo así de apretado no era y es donde está la contribución principal de Sp3000):
Una vez que
N
llega a cero, el flujo de control cambia. Ahora, a la IP le gustaría avanzar directamente después/
(es decir, al oeste), pero hay un muro allí. Entonces, si se da la vuelta (este), se ejecuta de6
nuevo. Eso hace que la parte superior de la pila sea positiva, por lo que la IP gira a la derecha (sur) y ejecuta el9
. La cima de la pila es ahora69
, pero lo único que nos importa es que sea positivo. El IP toma otro giro a la derecha (oeste) y se mueve hacia el@
que termina el código.En general, bastante simple en realidad.
Bien, ahora, ¿cómo podemos eliminar ese byte adicional? Claramente, ese no-op parece un desperdicio, pero necesitamos esa fila adicional: si el bucle fuera adyacente al número, la IP ya se movería allí inmediatamente en lugar de atravesar el número completo. Entonces, ¿podemos hacer algo útil con ese no-op.
Bueno, en principio podemos usar eso para agregar el último dígito a la codificación. La codificación realmente no necesita estar en la primera línea ...
!
solo garantiza que lo que sea que esté allí también se imprima allí.Sin embargo, hay una trampa, no podemos simplemente hacer esto:
El problema es que ahora hemos cambiado el
"
a a3
, que también cambia el número real que queremos tener. Y efectivamente, ese número no termina en3
. Dado que el número está completamente determinado por el código a partir de,!
no podemos hacer mucho al respecto.¿Pero tal vez podamos elegir otro dígito? Realmente no nos importa si hay un
3
punto en ese lugar siempre que terminemos con un número que codifique correctamente la fuente. Bueno, desafortunadamente, ninguno de los 10 dígitos produce una codificación cuyo dígito menos significativo coincide con el elegido. Afortunadamente, hay un margen de maniobra en el resto del código para que podamos probar algunas codificaciones más sin aumentar el recuento de bytes. He encontrado tres opciones:@
a/
. En ese caso, podemos usar cualquier dígito1357
y obtener una codificación coincidente. Sin embargo, esto significaría que el programa termina con un error, que está permitido pero no parece muy limpio._
). 26 opciones ofrecen muchas posibilidades. Por ejemplo, paraA
cualquier dígito impar funciona. Esto es un poco más agradable, pero aún no parece tan elegante, ya que nunca usarías una letra allí en código real.1
, la codificación también termina1
. Esta es la única solución entre las bases 96, 97, 98, 99, por lo que es realmente muy afortunada. Y así es como terminamos con el código en la parte superior de esta respuesta.fuente
Perdido ,
293262249 bytesPruébalo en línea!
Explicación
Todo este proyecto ha sido de arriba abajo. Seguí pensando que era imposible y luego se me ocurrió una idea loca que podría funcionar.
¿Por qué es tan difícil una Quine perdida?
Como ya sabrás, Lost es un lenguaje de programación 2D en el que la ubicación y la dirección de inicio son completamente aleatorias. Esto hace que escribir cualquier programa perdido sea tan difícil como escribir código endurecido por radiación. Debe tener en cuenta todas las ubicaciones y direcciones posibles.
Dicho esto, hay algunas formas estándar de hacer las cosas. Por ejemplo, aquí está la forma estándar de imprimir una cadena.
Esto tiene una secuencia de recopilación en la parte inferior que toma la mayor parte de los ips y los arrastra a la ubicación de inicio. Una vez que alcanzan su ubicación de inicio (arriba a la izquierda), los desinfectamos con un bucle, eliminando todos los valores en la pila, luego activamos la seguridad de empujar la cadena y salir. (la seguridad es un concepto exclusivo de Lost, cada programa debe golpear
%
antes de salir, esto evita la posibilidad de que el programa finalice al inicio). Ahora mi idea sería extender esta forma en una quine completa.Lo primero que había que hacer era volver a trabajar un poco el bucle, el bucle existente era específico del formato de cadena.
Necesitamos agregar una segunda secuencia para evitar la posibilidad de
!
saltar sobre la secuencia y crear un bucle.Ahora queremos mezclar esto con el formato estándar de Quine. Dado que Lost se basa mucho en Klein,
básicamenteherobadoprestado el Klien Quine para Martin Ender .Esto imprime convenientemente la primera línea de la quine. Ahora todo lo que tenemos que hacer es codificar las transmisiones. Bueno, esto es más fácil decirlo que hacerlo. Probé aproximadamente cuatro métodos diferentes para hacer esto. Solo describiré el que funcionó.
La idea aquí es usar puertas para obtener el número deseado de flechas. Una puerta es un tipo especial de espejo que cambia cada vez que se golpea.
[
refleja los ips que vienen de la izquierda y]
de la derecha. Cuando son golpeados por una ip desde cualquiera de estos lados, la orientación del interruptor. Podemos hacer una línea de estas puertas y un reflector estático para realizar una operación repetidamente.Realizará
:
tres veces. De esta manera, si empujamos un<
a la pila de antemano, podemos hacer muchos de ellos con menos bytes. Hacemos 2 de estos, uno para cada línea, y entre ellos establecemos una nueva línea, sin embargo, el segundo solo necesita ir hasta que cubra el!
que lo agregamos, cualquier otra cosa puede dejarse vacía ahorrándonos unos pocos bytes. Ok ahora necesitamos agregar las flechas verticales a nuestras transmisiones. Aquí es donde entra la optimización clave. En lugar de redirigir todos los ips al "inicio" del programa directamente, los redirigiremos al extremo izquierdo, porque ya sabemos que los ips que comienzan en el extremo izquierdo debentrabajo (o al menos funcionará en la versión final) también podemos redirigir los otros ips. Esto no solo lo hace más barato en bytes, creo que esta optimización es lo que hace posible la quine.Sin embargo, todavía hay algunos problemas, el más importante es que los ips comienzan después de que
>
se ha presionado pero antes de comenzar a hacer copias de él. Tales ips entrarán en la copiadora y harán un montón de copias de 0. Esto es malo porque nuestro mecanismo de limpieza de la pila utiliza ceros para determinar la parte inferior de la pila, dejando un montón de ceros en la parte inferior. Necesitamos agregar un método de saneamiento de pila más fuerte. Como no hay una forma real de saber si la pila está vacía, simplemente tendremos que intentar destruir tantos elementos en la pila como sea posible. Aquí usaremos nuevamente el método de puerta descrito anteriormente. Vamos a añadir((((((((((([[[[[[[[[[[[[[
al final de la primera línea justo después de la sanitizor para deshacerse de los ceros.Ahora hay un problema más, ya que redirigimos nuestras transmisiones a los ips superiores izquierdos comenzando en
%
y bajando ya habrá desactivado la seguridad y saldrá prematuramente. Por lo tanto, debemos desactivar la seguridad. Hacemos esto agregando un#
a la secuencia, de esa manera los ips que fluyen a través de la secuencia se desactivarán pero los ips que ya han sido desinfectados no. El#
también debe estar codificado en la primera línea también.Eso es todo, espero que entiendas cómo funciona esto ahora.
fuente
Sí ,
1165879606561540522498 + 7 = 505 bytesRequiere la
-cheat
bandera para permitir la definición de alias.Pruébalo en línea!
Explicación
Hay dos partes en esto (como con la mayoría de las quines). Los datos:
Y el decodificador:
Los datos son simplemente una codificación binaria del decodificador (o más bien su reverso). Cada uno
0
comienza un nuevo carácter y las1
s y2
s son el0
- y1
-bits, respectivamente.Tenga en cuenta que
0
es un comando Yup estándar que empuja un cero, mientras que1
y2
no están definidos en este punto. Sin embargo, asignamos toda la parte de datos al comando%
para que1
y2
pueda permanecer indefinido hasta que%
se use realmente.A continuación, definimos algunos comandos más:
<
disminuye la parte superior de la pila, la>
incrementa.1
(algo poco intuitivo) dobla la parte superior de la pila.2
lo duplica y luego lo incrementa. Gracias a estas definiciones, algo así0221111
dejará un 48 (110000 en binario) en la pila.Los 32 bytes restantes realizan la decodificación real en dos partes. Primero necesitamos reconstruir la cadena de datos.
Y finalmente, empujamos los datos nuevamente e imprimimos cada valor como un carácter:
Para referencia futura, aquí hay un script CJam para codificar los datos.
fuente
Fueue , 423 bytes
Fueue es un esolang basado en cola en el que el programa en ejecución es la cola.
Pruébalo en línea!
Cómo funciona
Esta explicación
puede o no habersesalido de control. Por otro lado, no sé cómo explicarlo mucho más brevemente de una manera que espero que la gente pueda seguir.Fueue hoja de trucos
Consulte el artículo wiki de esolang para obtener detalles, incluidas las pocas funciones que no se utilizan en este programa.
El programa inicial es el estado inicial de la cola, que puede contener los siguientes elementos:
+*/-%
: aritmética de enteros (-
es unario,%
negación lógica). Inerte si no se le dan argumentos numéricos.()<
: coloca el elemento entre paréntesis, elimina los paréntesis del bloque, agrega el elemento final al bloque. Los dos últimos son inertes a menos que estén seguidos de un bloque.~:
: intercambiar, duplicar.$
: copia (toma número + elemento). Inerte antes del no número.H
: detener el programa.Tenga en cuenta que si bien
[]
anida,()
no lo haga; estas últimas son simplemente funciones separadas.Sintaxis de seguimiento de ejecución
El espacio en blanco es opcional en Fueue, excepto entre números. En las siguientes trazas de ejecución se utilizará para sugerir la estructura del programa, en particular:
Las llaves
{}
(no utilizadas en Fueue) se utilizan en las trazas para representar el resultado entero de las expresiones matemáticas. Esto incluye números negativos, ya que Fueue solo tiene literales no negativos:-
es la función de negación.Varios nombres metavariables y
...
se utilizan para denotar valores y abreviaturas.Tácticas dilatorias
Intuitivamente, la ejecución gira alrededor de la cola, modificando parcialmente lo que pasa. Los resultados de una función no se pueden volver a actuar hasta el próximo ciclo. Las diferentes partes del programa evolucionan efectivamente en paralelo siempre que no interactúen.
Como resultado, gran parte del código se dedica a la sincronización, en particular a retrasar la ejecución de partes del programa hasta el momento adecuado. Hay muchas opciones para jugar al golf, que tiende a convertir esas partes en gotas ilegibles que solo se pueden entender al rastrear su ejecución ciclo por ciclo.
Estas tácticas no siempre se mencionarán individualmente en lo siguiente:
)[A]
retrasosA
para un ciclo. (Probablemente el método más fácil y más legible).~ef
intercambia los elementose
yf
eso también retrasa su ejecución. (Probablemente el menos legible, pero a menudo el más corto para retrasos menores).$1e
retrasa un solo elementoe
.-
y%
son útiles para retrasar números (este último para0
y1
.):
o$
puede usarse para crearlos desde uno solo.(n
Envolturasn
entre paréntesis, que luego se pueden quitar a conveniencia. Esto es particularmente vital para los cálculos numéricos, ya que los números son demasiado inestables para ser copiados sin ponerlos primero en un bloque.Estructura general
El resto de la explicación se divide en siete partes, cada una para una sección del programa en ejecución. Los ciclos más grandes después de los cuales la mayoría de ellos se repiten se denominarán "iteraciones" para distinguirlos de los "ciclos" de pasadas individuales en toda la cola.
Así es como se divide el programa inicial entre ellos:
El gran número al final del programa codifica el resto en reversa, dos dígitos por carácter, con 30 restados de cada valor ASCII (por ejemplo,
10
codifica a(
).En un nivel superior, puede pensar que los datos en este programa (comenzando con el bignum) fluyen de derecha a izquierda, pero el control fluye de izquierda a derecha. Sin embargo, en un nivel inferior, Fueue confunde la distinción entre código y datos todo el tiempo.
0
como número entero48
), separando primero los dígitos menos significativos. Produce un dígito cada 15 ciclos.[x[y]]
, también imprime el carácter codificado de cada par.[x[y]]
bloques de tal manera que una vez que contiene todos los dígitos, se puede ejecutar para imprimirlos todos y luego detener todo el programa.Sección a
La Sección A maneja la programación del final del programa. Se requieren 4258 ciclos para reducir a una sola función de intercambio
~
, que luego realiza un ajuste en la sección B que detiene su bucle principal y comienza a ejecutar la sección D en su lugar.$
función crea 4255 copias de lo siguiente%
mientras se(
envuelve~
entre paréntesis.%
se usa para alternar el siguiente número entre0
y1
.%
s están agotados, el$1
crea 1 copia del[~]
(efectivamente un NOP), y en el siguiente ciclo,)
elimina los corchetes.Sección B
La sección B maneja la regeneración de sí mismo, así como una nueva iteración de la sección C cada 30 ciclos.
:
duplica el siguiente bloque grande (una copia abreviada como[BkB]
), luego)
elimina los corchetes de la primera copia.$$24%%0
establece una cuenta regresiva similar a la de la sección A.:<
convierte en<<
y un~
cambia dos de los bloques, colocando el código para una nueva sección C al final.<
funciones empaquetan los dos bloques finales en el primero; esto es redundante en las iteraciones normales, pero permitirá~
sección A haga su trabajo al final.)
elimina los corchetes externos. Luego se~:)
convierte):
y~)
cambia un)
a al comienzo del código de la sección C.)
está a punto de eliminar los corchetes para comenzar a ejecutar una nueva iteración de la sección C.En la iteración final, la
~
sección A aparece en el punto (1) anterior:Los
~
intercambios de)
de todo el bloque y en la sección C, la prevención de la sección B se ejecute de nuevo.Sección C
La Sección C maneja la fusión de nuevos pares de caracteres de dígitos en el bloque de la sección D, y también crea nuevas iteraciones de la sección E.
A continuación se muestra una iteración típica con
x
y quey
representa los códigos ASCII de los dígitos. En la primera iteración, los elementos entrantes "D" y "E" son los iniciales[H]
y-
, en cambio, como ninguna sección anterior E se ha ejecutado para producir ningún par de caracteres de dígitos.~
en una fila, la fila se reducirá a aproximadamente 2/3 cada ciclo (porque uno~
intercambia dos siguientes), pero ocasionalmente con un resto de~
s quecausa estragosmanipula cuidadosamente lo que sigue.$11~
produce tal fila. El siguiente~
intercambia a a<
través del siguiente bloque. Otro<
al final agrega un nuevo bloque de pares de dígitos (dígitos x e y como códigos ASCII) en el bloque de la sección D.~
fila tiene un~~
resto, que intercambia un~
sobre el siguiente)
. El otro<
agrega la sección D a un[)))~]
bloque.~
intercambia el siguiente bloque con el nuevo código de la sección E en el bloque de la sección D. Luego, un nuevo sobrante~
intercambia una)
cruz y, finalmente, la última~~
de la~
fila intercambia una de ellas a la sección E justo cuando)
ha eliminado sus corchetes.En la iteración final, la sección A
~
ha cambiado una)
sección B a la sección C. Sin embargo, la sección C es tan efímera que ya ha desaparecido, y el)
termina al principio de la sección D.Sección D
La sección D se encarga de imprimir el número grande final y detener el programa. Durante la mayor parte de la ejecución del programa, es un bloque inerte que las secciones B – G cooperan en la construcción.
(
envuelve la función de detenciónH
entre paréntesis. UNA-
continuación, se utilizará como un elemento ficticio para la primera iteración en lugar de un par de dígitos.[49[49]]
correspondiente al final11
en el número.[49[48]]
(que corresponde al10
principio del número) no se incorpora realmente al bloque, pero esto no hace ninguna diferencia como)[A[B]]
y)[A][B]
son equivalentes, ambos se convierten enA[B]
.Después de la iteración final,
)
llega el intercambio hacia la derecha desde la sección B y se desbloquea el bloque de la sección D. El)))~
principio de cada subbloque asegura que todas las partes se ejecuten en el orden correcto. Finalmente, el bloque más interno contiene unaH
detención del programa.Sección E
La sección E maneja la combinación de pares de dígitos ASCII producidos por la sección G, y ambos imprimen el carácter codificado correspondiente y envían un bloque con el par combinado hacia la izquierda a las secciones C y D.
Nuevamente, a continuación se muestra una iteración típica con
x
y quey
representa los códigos ASCII de los dígitos.10*x+y-498
el valor ASCII del carácter codificado.498 = 10*48+48-30
,48
s deshace la codificación ASCII dex
yy
mientras30
cambia la codificación de00–99
a30–129
, que incluye todos los ASCII imprimibles.Seccion F
La sección F consta de bloques inertes que contienen códigos ASCII de dígitos. Para la mayor parte de la ejecución del programa, habrá como máximo dos aquí, ya que la sección E los consume a la misma velocidad con la que G los produce. Sin embargo, en la fase de impresión final
0
, aquí se acumularán algunos dígitos redundantes .Seccion G
La Sección G maneja la división del gran número al final del programa, los dígitos menos significativos primero, y el envío de bloques con sus códigos ASCII a la izquierda a las otras secciones.
Como no tiene verificación de detención, en realidad continuará produciendo
0
dígitos cuando el número se haya reducido a 0, hasta que la sección D detenga todo el programa con laH
función.[BkG]
abrevia una copia del gran bloque de código de inicio, que se utiliza para la autorreplicación para iniciar nuevas iteraciones.Inicialización en los primeros ciclos:
Iteración típica,
N
denota el número para dividir:+:5
lugar de--10
retrasar10
dos ciclos. Por desgracia, solo uno de los10
s en el programa fue ayudado por esto.[N]
y[BkG]
se duplican, luego una copia deN
se divide por10
.[{N/10}]
se duplica, luego se utilizan más funciones aritméticas para calcular el código ASCII del último dígito deN
as48+((-10)*(N/10)+N)
. El bloque con este código ASCII se deja para la sección F.[{N/10}]
se intercambia entre los[BkG]
bloques para configurar el inicio de una nueva iteración.Bonus quine (540 bytes)
Pruébalo en línea!
Como no estaba seguro de qué método sería el más corto, primero intenté codificar caracteres como números de dos dígitos separados por
(
s. El código central es un poco más corto, pero la representación de datos un 50% más grande lo compensa. No tan golfizado como el otro, ya que me detuve cuando me di cuenta de que no lo superaría. Tiene una ventaja: no requiere una implementación con soporte bignum.Su estructura general es algo similar a la principal. Falta la sección G ya que la representación de datos completa la sección F directamente. Sin embargo, la sección E debe hacer un cálculo divmod similar para reconstruir los dígitos de los números de dos dígitos.
fuente
)$n[)](
es un byte más corto para el contador de retardo.Jalea, 3 bytes
Pruébalo en línea!
Verificación
Cómo funciona
fuente
LANG=en_US
logra eso. tio.run/nexus/bash#@@/…