Tomar una posición contra las largas líneas de quine


28

o: construir una quine vertical

Inspirado por tomar una posición contra las largas colas .

Su tarea es construir una línea vertical con una longitud de línea tan corta como sea posible.

Tanteo

La longitud de línea más corta (excluidas las nuevas líneas) gana, con criterios de como desempate.

La longitud de línea se determina como la línea más larga en su programa, excluyendo el carácter de salto de línea.

Por ejemplo:

$_=
Q.
P

tiene una longitud de línea de 3 y un número de bytes de 8, mientras que:

Q
$
_
P

Tiene una longitud de línea de 1 y un recuento de bytes de 7 (suponiendo que no haya una nueva línea final).

Reglas

Las quines deben cumplir con la definición comunitaria de quine .

Las lagunas estándar están prohibidas.


¿La regla del desafío en la que se inspira esto también se aplica aquí? (" Todos los saltos de línea deben ser significativos. Los saltos de línea que se pueden eliminar y las líneas adyacentes se concatenan directamente sin afectar la salida, se deben eliminar ")
Kevin Cruijssen

66
@KevinCruijssen No, ¡quería que este desafío tuviera un poco más de libertad para alentar longitudes de línea más cortas! ¡Era lo único que quería cambiar en el otro desafío!
Dom Hastings

Respuestas:


31

Lenguaje , longitud de línea 0, ≈ 1.01 × 10805 bytes

El código fuente consta de

10124204951141713202533972929121310016060433092338061822344361345785088607872212687519180665846846689047959498775873817205954910072327976407177053174071436371843670134990737172675632938993247496933911137703773908536875512359091727633452506044935740750830240213878294804481182083555147915724921824921475110508228264569693355158523956426011218344830576542194309867719995259333487662608933990607888012376767799159279952780093033761421596267435996052643805835600325453580090964941176722519904997142820547696122795384058768166716813179490118821654787005844786013890425692181280317909786461426684986082270532414940905922244777135016193088362341771414388821075092853157152933099269703875111747946164773211049512395358715902962437487134522781505709420586981997748912591875626029183292826655753251235587052422561943

avances de línea, que codifica el programa brainfuck que sigue.

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

El código fuente es en su mayoría idéntico al quine de Lenguage suavizado por radiación de @ jimmy23013 , menos el .al final, con ++++++++++.[-]reemplazo .para imprimir saltos de línea en lugar de bytes nulos, y los cambios correspondientes a la sección de datos en la línea 1.


¡Sabía que era inevitable! Sin embargo, quería una pregunta inclusiva. Me pregunto si alguien puede vencer esto ...
Dom Hastings

Señor, este lenguaje es la definición de por qué el juego de bolos con código no es bien recibido, eso es genial ... No puedo creer que "Hello World" requiriera"about 1.75*10**76 yottabytes in ASCII"
Urna de pulpo mágico


Puede jugar al golf más del 99% del código utilizando]++++++++ ++.-->
jimmy23013

28

JavaScript, longitud de línea 1, 960 956 928 bytes


[
t
,
r
,
u
,
e
,
f
,
a
,
l
,
s
]
=
!
0
+
[
!
1
]
;
[
,
n
,
d
,
,
q
,
i
]
=
t
.
a
+
t
V
=
[
]
[
f
+
i
+
n
+
d
]
;
[
,
,
,
c
,
,
,
o
,
,
_
,
,
,
,
,
y
,
z
]
=
V
+
0
F
=
V
[
E
=
c
+
o
+
n
+
s
+
t
+
r
+
u
+
c
+
t
+
o
+
r
]
P
=
(
1
+
e
+
2
+
3
-
4
+
t
)
[
2
]
f
=
F
(
r
+
e
+
t
+
u
+
r
+
n
+
_
+
a
+
t
+
o
+
(
0
+
{
}
)
[
3
]
)
(
)
(
3
*
4
+
[
]
[
E
]
[
n
+
a
+
(
0
[
E
]
+
0
)
[
9
+
2
]
+
e
]
)
[
1
]
F
(
a
,
a
+
l
+
e
+
r
+
t
+
y
+
a
+
P
+
q
+
P
+
a
+
P
+
q
+
z
)
`
[
t
,
r
,
u
,
e
,
f
,
a
,
l
,
s
]
=
!
0
+
[
!
1
]
;
[
,
n
,
d
,
,
q
,
i
]
=
t
.
a
+
t
V
=
[
]
[
f
+
i
+
n
+
d
]
;
[
,
,
,
c
,
,
,
o
,
,
_
,
,
,
,
,
y
,
z
]
=
V
+
0
F
=
V
[
E
=
c
+
o
+
n
+
s
+
t
+
r
+
u
+
c
+
t
+
o
+
r
]
P
=
(
1
+
e
+
2
+
3
-
4
+
t
)
[
2
]
f
=
F
(
r
+
e
+
t
+
u
+
r
+
n
+
_
+
a
+
t
+
o
+
(
0
+
{
}
)
[
3
]
)
(
)
(
3
*
4
+
[
]
[
E
]
[
n
+
a
+
(
0
[
E
]
+
0
)
[
9
+
2
]
+
e
]
)
[
1
]
F
(
a
,
a
+
l
+
e
+
r
+
t
+
y
+
a
+
P
+
q
+
P
+
a
+
P
+
q
+
z
)
`

Versión más legible que también resulta ser una quine (se eliminan nuevas líneas extrañas):


[t,r,u,e,f,a,l,s]=!0+[!1];[,n,d,,q,i]=t.a+t
V=[][f+i+n+d];[,,,c,,,o,,_,,,,,y,z]=V+0
F=V[E=c+o+n+s+t+r+u+c+t+o+r]
P=(1+e+2+3-4+t)[2]
f=F(r+e+t+u+r+n+_+a+t+o+(0+{})[3])()(3*4+[][E][n+a+(0[E]+0)[9+2]+e])[1]
F(a,a+l+e+r+t+y+a+P+q+P+a+P+q+z)`
[t,r,u,e,f,a,l,s]=!0+[!1];[,n,d,,q,i]=t.a+t
V=[][f+i+n+d];[,,,c,,,o,,_,,,,,y,z]=V+0
F=V[E=c+o+n+s+t+r+u+c+t+o+r]
P=(1+e+2+3-4+t)[2]
f=F(r+e+t+u+r+n+_+a+t+o+(0+{})[3])()(3*4+[][E][n+a+(0[E]+0)[9+2]+e])[1]
F(a,a+l+e+r+t+y+a+P+q+P+a+P+q+z)`

Explicación

Uf. Acomódate para dar un paseo aquí, porque este será un viaje traicionero ...

Pasé mucho tiempo tratando de descubrir cómo resolver este desafío con la longitud 1, sin funciones integradas (directamente, de todos modos), palabras clave o incluso funciones de flecha, antes de darme cuenta de que es posible fácilmente con JSF *** , que puede evalúe cualquier código JavaScript mientras evita los tokens de varios bytes. Pero una solución JSF fácilmente tendría una longitud de miles de bytes, si no decenas o cientos de miles. Afortunadamente, no estamos limitados a solo: ¡ ()[]+!tenemos todo ASCII a nuestra disposición!

Decidí comenzar jugando al golf los bloques de construcción esenciales de JSF, los personajes que se pueden construir en cadenas para "desbloquear más funciones", por así decirlo. No podemos usar cadenas directamente para obtener caracteres, ya que eso requeriría líneas de longitud 3. Entonces, en su lugar, robamos un truco de JSF, obteniendo algunos caracteres de literales que se pueden construir con tokens de un solo byte:

JSF***   Used here   Value        Chars unlocked
!![]     !0          true         true
![]      !1          false        fals
[][[]]   t.a         undefined    ndi

De estos podemos expandirnos hacia afuera, comenzando con [].find, que es un objeto Function. Convirtiendo esta en una cadena function find() { ...nos da acceso a c, o, espacio ( _), y entre paréntesis ( yy z). Quizás lo más importante, ahora tenemos acceso a su constructor, la Functionfunción -que, inceptional que pueda parecer, nos da la capacidad de ejecutar código mediante la construcción de una cadena, pasándolo a Function(), y luego llamar a la función generada.

Probablemente debería mencionar el método general utilizado por el programa en sí. A partir de 2015, JavaScript tiene esta característica realmente genial llamada " plantillas etiquetadas " , que no solo permite nuevas líneas sin escapes en las cadenas, sino que también nos permite llamar a una función con un literal de cadena directamente (de alguna manera; myFunc`abc`;es más o menos equivalente a myFunc(["abc"])). Si ponemos la llamada a la función como la última cosa en el programa, la estructura general se verá así:

code;func`code;func`

Todo lo que functiene que hacer es generar su argumento, seguido de un retroceso, luego su argumento nuevamente y un segundo retroceso. Suponiendo que tenemos el argumento ay un backtick almacenado f, podemos lograr esto con el código alert(a+f+a+f). Sin embargo, por el momento, nos falta +y el backtick en sí. +(almacenado en P) no es difícil; Robamos otro truco de JSF, construimos la cadena 1e23, la convertimos en un número, luego volvemos a una cadena y damos "1e+23".

Obtener un backtick es un poco más complicado. Al principio, intenté obtenerlo String.fromCharCode, pero encontrar uno Cresultó ser casi tan difícil. Afortunadamente, atobes bastante fácil de obtener ( Function("return atob")(); bse genera a partir 0+{}, lo que da [object Object]) y puede dar cualquier carbón ASCII, si se encuentra una cadena mágica adecuada. Una breve secuencia de comandos me dio 12Acomo una de las opciones, que se puede encontrar convenientemente en 12Array(un poco más corto para generar, gracias a [].constructor[n+a+m+e]; mse encuentra en 0 .constructor+0:) "function Number() { ...".

Finalmente, unimos todo. Asignamos el backtick a variable f, pero como no podemos usarlo directamente en la cadena de función, en su lugar establecemos variable qen la letra fy usamos eso en su lugar. Esto hace nuestra cadena final a+l+e+r+t+y+a+P+q+P+a+P+q+z, o "alert(a+f+a+f)". Luego alimentamos esto Function(), enviamos nuestro código terminado al resultado, y listo, ¡tenemos una quine de JavaScript con no más de un carácter por línea!


Mi cabeza se siente terrible en este momento, así que por favor pregunte sobre cualquier error que haya cometido o sobre cosas que me haya perdido en esta explicación, y me pondré en contacto con usted después de descansar un poco ...


¡Agradable! Aunque realmente no soy un programador de JS, puedo adivinar la esencia de esto por lo que he leído sobre JSFuck, pero me gustaría una explicación especialmente de esa f=línea.
Ørjan Johansen

1
@ ØrjanJohansen Lo siento, he estado tratando de escribir una explicación para todo el asunto, pero no me está yendo muy bien, así que responderé su pregunta rápidamente: es una forma complicada de configurar fun solo backtick. La línea en sí es equivalente a f=atob("12Array")[1]. El otro truco es que en qrealidad se establece en la letra fen la primera línea, por lo que en la F(...)línea, puedo usarlo para poner la letra fen la cadena evaluada, ya que la variable fya no se establece en esa letra. El a+l+e+r+t+y+a+P+q+P+a+P+q+zes equivalente a "alert(a+f+a+f)".
ETHproductions

Genial, ahora lo entiendo! Puede mencionar qué 0+{}y 0[E]stringify para obtener by m.
Ørjan Johansen

¡Ciertamente agradable! Mucho más pequeño que mi intento , ¡aunque utilizamos un enfoque similar!
Dom Hastings

@DomHastings Tanto tiempo que el enlace ni siquiera funciona ;-)
ETHproductions

15

Haskell , longitud de la línea 6, 400 343 336 bytes

{main=
putStr
$s++(s
>>=(++
":\n")
.show)
++
"[]}";
s='{':
'm':
'a':
'i':
'n':
'=':
'\n':
'p':
'u':
't':
'S':
't':
'r':
'\n':
'$':
's':
'+':
'+':
'(':
's':
'\n':
'>':
'>':
'=':
'(':
'+':
'+':
'\n':
'"':
':':
'\\':
'n':
'"':
')':
'\n':
'.':
's':
'h':
'o':
'w':
')':
'\n':
'+':
'+':
'\n':
'"':
'[':
']':
'}':
'"':
';':
'\n':
's':
'=':
[]}

Pruébalo en línea! No conozco una forma putStrde evitarlo, por lo tanto, la longitud de la línea de 6. Las llaves exteriores permiten deshacerse de la sangría requerida de otra manera después de una nueva línea dentro de una sola declaración.



12

CJam , longitud de línea 1, 16 13 bytes

"
_
p
"

_
p

Pruébalo en línea!

Es un pequeño milagro que la inserción de nuevas líneas en la línea estándar{"_~"}_~ aún más corta sea "_p"␊_plo correcto. (¡Gracias, Martin!) La nueva línea final es necesaria.

Explicación (con • como nueva línea)

"•_•p•"        Push that string.
       ••      Do nothing.
         _     Duplicate the string.
          •    Do nothing.
           p   Pop it and print it with quotes and a newline: "•_•p•"•
            •  Do nothing.

Al finalizar, lo que queda en la pila se imprime ( •_•p•), produciendo un resultado total "•_•p•"••_•p•.


2
Todo lo que tengo que decir es ... • _ •
corsiKa

6

Haskell + CPP, longitud de línea 2, 705 237 bytes

m\
a\
i\
n\
=\
p\
u\
t\
S\
t\
r\
$\
(\
:\
"\
\\
\\
\\
n\
"\
)\
=\
<\
<\
s\
+\
+\
s\
h\
o\
w\
 \
s\
;\
s\
=\
"\
m\
a\
i\
n\
=\
p\
u\
t\
S\
t\
r\
$\
(\
:\
\\
"\
\\
\\
\\
\\
\\
\\
n\
\\
"\
)\
=\
<\
<\
s\
+\
+\
s\
h\
o\
w\
 \
s\
;\
s\
=\
"\

Pruébalo en línea! El uso del indicador -CPPque habilita el preprocesador C nos permite usar una barra diagonal inversa al final de una línea para continuar en la línea siguiente.

El código actual es main=putStr$(:"\\\n")=<<s++show s;s="<data>".

Editar: Un informal -468 bytes gracias a Ørjan Johansen !


1
Ahorra mucho escapar para cambiar eso main=putStr$(:"\\\n")=<<s++show s;s="<data>". Pruébalo en línea!
Ørjan Johansen

5

Óxido, longitud de línea: 5, bytes: 301 299

Pruébalo en línea

A pesar de cómo se ve, este no es un lenguaje de programación esotérico, solo hay mucho ruido de línea de formato.

Se eligió una longitud vertical de 5 para poder usar print. No creo que haya una forma de imprimir que tenga una longitud vertical más corta, declarando que las funciones de C usan externpalabras clave, stdouttiene 6 bytes de longitud, writetiene 5 bytes de longitud, no_maintiene 7 bytes de longitud (main es generalmente una función;)).

fn
main
(){
let
t=(
r#"fn
main
(){
let
t=("#
,r#")
;
print
!(
r#"{}
r#"{
}"{}
,r#"{
}"{},
r#"{
}"{}
{}{}{
}{
}""#,
r#"
,t.0,
t.0,
'#',
t.1,
'#',
t.2,
'#',
t.1,
'#',
t.2,
'}'
)"#
)
;
print
!(
r#"{}
r#"{
}"{}
,r#"{
}"{},
r#"{
}"{}
{}{}{
}{
}"#
,t.0,
t.0,
'#',
t.1,
'#',
t.2,
'#',
t.1,
'#',
t.2,
'}'
)}

¿No es longitud horizontal ?
anatolyg

@anatolyg solucionado
Konrad Borowski

La anidación de cadenas sin formato sin resaltar la sintaxis hace que esto sea imposible de interpretar. Creo que ni cargo fmtsiquiera ayudaría aquí ...
CAD97

@ CAD97 Si lo que desea es resaltar la sintaxis, play.rust-lang.org resalta esto correctamente, por eso lo usé en lugar de TIO para el enlace "Pruébelo en línea".
Konrad Borowski el



2

JavaScript (ES6), longitud de línea 3, 17 bytes

f=
_=>
`f=
${f
}`

2

Rojo , longitud de línea: 10, 49 bytes

s: [prin [
    "s:"
    mold s
    "do s"
]] do s

Pruébalo en línea!

Esto de hecho es un Rebol quine

Explicación: Red / Rebol's moldsigue el estilo de codificación de poner 4 espacios de desplazamiento.

s: [prin [     ; s is a block; print the following: 
    "s:"       ; literal "s:"
    mold s     ; the representation of the block itself - all between []
    "do s"     ; literal "do s"
]] do s        ; evaluate the block


2

RProgN 2 , L = 1, B = 15 bytes

«
Ø
.
`
-
S
`
.

Esto es equivalente al programa:

«Ø.`
-S`
.

Descompostura

«primero empuja una función que representa implícitamente el resto del programa a la pila, y luego continúa la ejecución. Ø.agrega una cadena vacía a la función, que la stringifica. Esto siempre se convertirá en cadena como el programa equitativo, debido a que las nuevas líneas no funcionan. `\n-Elimina todas las nuevas líneas de la cadena, ahora se ve como «Ø.`=S`.. Sluego lo convierte en una pila de caracteres individuales y se `\n.une a la pila mediante nuevas líneas, devolviendo el programa esperado.

Pruébalo en línea!


2

Baja carga , longitud de línea 1, 20 bytes

(
:
a
S
S
)
:
a
S
S

Pruébalo en línea!

Esta es solo la línea estándar de Subcarga con nuevas líneas agregadas. Requiere una implementación como la TIO que ignora los caracteres de comando desconocidos.

La parte en ()es un literal de cadena colocado en la pila, lo :duplica, aenvuelve la entrada de la pila superior entre paréntesis e Simprime.


2

Perl 5 , 259 bytes


$
_
=
p
.
r
.
i
.
n
.
t
.
q
{

'
$
_
=
p
.
r
.
i
.
n
.
t
.
q
{
'
,
&
{
I
.
"
X
0
y
h
~
"
^
"
E
O
0

y
"
.
x
}
(
$
_
,
6
,
-
1
)
,
'
}
;
&
{
I
.
"
X
0
o
k
h
~
"
.
(
Y
|
p
)
^
"
E
O
0
|
f
s
o
"
}
'
}
;
&
{
I
.
"
X
0
o
k
h
~
"
.
(
Y
|
p
)
^
"
E
O
0
|
f
s
o
"
}

Pruébalo en línea!

Verificación .


1

Javascript (ES6 REPL), programa completo, longitud de línea: 3, número de bytes: 31

(
f=
_=>
`(
f=
${f
}
)
()`
)
()

Este es un puerto de la respuesta de @ kamoroso94 a un programa completo autónomo.

Si alguien encuentra una manera de quitar algunos bytes sin agregar más a la longitud de la línea, siéntase libre de comentar :)


Tenga en cuenta que esto aún no genera nada, a menos que lo ejecute en un REPL. Yo lo llamaría JavaScript (ES6 REPL)
ETHproductions

oh, dispara, acostumbrado a la consola de Chrome ...
Brian H.

1

Pip , longitud de línea 1, 35 bytes


V
Y
"
[
`
V
Y
`
y
]
.
C
:
3
.
4
"

Pruébalo en línea!

Con base en el menor conocido quine Pip V Y"`V Y`.RPy". La principal dificultad para aplastarlo hasta la longitud de la línea 1 es RPque no se puede dividir en dos líneas. Pero en este caso, todo lo que RP(repr) hace es envolver la cadena entre comillas dobles, lo que podemos hacer directamente.

Aquí hay una explicación basada en una versión horizontal:

V Y"[`V Y`y].C:3. 4"
  Y"               "  Yank this string into the variable y
V                     and eval it
                      The code that is eval'd:
    [      ]           Build a list containing:
     `V Y`              this Pattern object (used for regex, but here useful as a
                          string-like object that doesn't need double quotes)
          y             y, the whole string
               3. 4    Concatenate 3 and 4 to make 34 (since the 2-digit number won't work
                         in the vertical version)
             C:        Convert to ASCII character (: forces the precedence lower than .)
            .          Concatenate the " to the end of each list element
                      The resulting list is printed, concatenated together, with a
                        trailing newline

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.