Su tarea es escribir un programa de longitud uniforme , que imprima un cuadrado de arte ASCII (descrito a continuación), que aumente su longitud lateral en 1 unidad cada vez que se pegue el código fuente original en el medio del código actual.
Me resulta bastante difícil definir esta tarea muy bien, así que te daré un ejemplo:
Digamos que su código inicial fue
CODE
y que se imprimió:0
Luego, inserte
CODE
en el medio: su código se convierteCOCODEDE
y debería imprimir:00 00
Vuelva a insertar
CODE
en el medio: su código se convierteCOCOCODEDEDE
y debe imprimir:000 000 000
Y así. Teóricamente, su respuesta debería funcionar después de cualquier número de iteraciones, pero entiendo si, debido a las limitaciones de rendimiento del lenguaje, no puede ejecutarse razonablemente por encima de un cierto umbral.
Algunas reglas:
Puedes usar cualquier ASCII imprimible (32-127) como el personaje a usar para tu cuadrado. Su elección debe ser constante (debe usar el mismo carácter para cada iteración).
El cuadrado de salida inicial debe tener una longitud lateral 1 .
Un cuadrado ascii-art se define como una cadena con N líneas (separadas por saltos de línea N-1 / líneas nuevas) y cada línea contiene N copias del carácter elegido.
Su salida no puede contener ningún espacio en blanco extraño, que no sea una nueva línea final.
Puede usar los valores predeterminados para entrada y salida (los programas o funciones están permitidos, pero los fragmentos no lo están).
La mitad de su código se define como el punto donde el código fuente se puede dividir en dos partes, de modo que las dos sean iguales.
Sus respuestas se puntuarán por la duración de su programa original , en bytes. El conteo de bytes más bajo gana. En caso de que haya un empate, la respuesta que se envió anteriormente gana.
Puede usar este programa para aplicar las inserciones sin tener que hacerlo manualmente.
Respuestas:
Pyth , 2 bytes
Pruébalo en línea! También Pruébalo duplicado , triplicado !
¿Cómo funciona?
\n
es el comando que imprime su argumento con una nueva línea final, mientras la devuelve simultáneamente. Por lo tanto, cada vez que realiza una inserción, convierte el entero literal 5 en un número que contiene N copias de 5 concatenados, y las nuevas líneas principales básicamente se aseguran de que se imprima el número apropiado de veces, manteniéndolo así cuadrado.fuente
JavaScript (ES6),
423230 bytesSegunda iteración:
Esto funciona agregando
0
as
cada vez que se ejecuta la primera mitad del código, e imprimiéndoses
cada vez que se ejecuta la segunda mitad. Aprovecha cuatro peculiaridades de JavaScript:this
. Esto nos permite hacerthis.s
en lugar des
.undefined
.[1,2,3] + 4 === "1,2,34"
undefined
se convierte en la cadena vacía, lo que significa que[undefined] + 0 === "0"
.En conjunto, esto significa que podemos expresar la primera mitad (generando una cadena de ceros) en solo 13 bytes. Si se permite el uso en
alert
lugar deconsole.log
, podemos ahorrar 4 bytes más acortando la segunda mitad.fuente
05AB1E , 2 bytes
Pruébalo en línea!
Puerto de mi respuesta Pyth .
fuente
Python 2 ,
423828 bytesPruébalo en línea! . También puedes probar la segunda y tercera iteraciones
fuente
Python 2 , 22 bytes
Pruébalo en línea!
Doblado:
Tenga en cuenta que la segunda mitad comienza con un carácter de nueva línea.
fuente
C (gcc) ,
17016896807270 bytesVersión mucho más corta. Todavía deseo poder encontrar una solución sin el preprocesador.
Pruébalo en línea!
Antigua versión de 168 bytes:
Pruébalo en línea!
fuente
Python 2 , 30 bytes
Pruébalo en línea! , 2da y 3ra iteración
Esto hace uso del hecho de que los bools en Python son básicamente ints y los nombres
False
yTrue
fueron reasignables en Python 2.Python 1 , 32 bytes
Pruébalo en línea! , 2da y 3ra iteración
En Python 1 las cadenas incorporadas
exit
yquit
existido para informar al usuario de la consola interactiva cómo salir de ella. El valor por defecto es"Use Ctrl-D (i.e. EOF) to exit."
.fuente
n=False+=1;print'*'*n;
, pero sigo olvidando que esa no es una característica de Python ...Carbón de leña , 6 bytes
Pruébalo en línea! Explicación:
υ
termina con una longitud del número de repeticiones.fuente
Haskell , 68 bytes
Pruébelo en línea una , dos o tres veces .
Debido a la pereza de Haskell, una expresión como la anterior cuenta como una función que no tiene argumentos, según esta pregunta Meta .
fuente
brainfuck ,
4434 bytestachado 44 sigue siendo regular 44; (
Pruébalo en línea!
Inténtalo doblado , triplicado . Mira, sin relleno!
Imprime cuadrados de
U
. Se divide justo en el medio de los 10+
s.fuente
Ruby, 18 bytes
Pruébalo en línea! Doblado! Triplicado!
fuente
Brain-Flak , 74 bytes
Pruébalo en línea!
Pruébalo doblado y triplicado .
Explicación
El punto de ruptura está en el medio de la
<>
sección "empuje 10". Romper esto dejará un 5 en la tercera pila hasta que lleguemos a la segunda mitad correspondiente, momento en el que presionar 10 se reanudará justo donde lo dejó.Si bien es posible empujar un valor ASCII imprimible (espacio) en 22 bytes, esto haría que la central
<>
se ejecute después de presionar5
. Al agregar dos bytes más, pude mover el<>
para que todo el progreso hacia el empuje10
estuviera en la tercera pila. Como beneficio adicional, esto también hizo que el cuadrado resultante fuera más estéticamente agradable.fuente
tinylisp , 112 bytes
Pruébalo en línea! También duplicado y quíntuple .
El enfoque de "construir una cadena en la primera mitad, imprimirlo en la segunda mitad" que toman muchos idiomas no funcionará en tinylisp, ya que no hay variables mutables. En cambio, hacemos un anidamiento de código serio.
Cuando se inserta una segunda copia del código, se coloca dentro del
(q())
, que lo envuelve en una lista. Luego se(h(t(t(h(t(...))))))
profundiza en esa lista para la parte posterior(d N
.(v(...))
lo evalúa luego lo pasamos a la función sin nombre(q((x)(i x(inc x)1)))
, que incrementa el valor resultante si es un número y devuelve 1 si es la lista vacía. Se asigna el resultado final en la versión anidada más externa del códigoN
. En esencia, hemos establecido un tipo extraño de recursión que cuenta el número de niveles de anidación.La segunda mitad del código crea una cadena de
N
asteriscos, luego una lista deN
tales cadenas, luego se une a la lista en las nuevas líneas. El resultado se muestra con una nueva línea final.fuente
R , 44 bytes
Pruébalo en línea!
Imprime con una nueva línea final. El
T=TRUE*TRUE+12
es solo para rellenar la longitud.Inténtalo doblado e Inténtalo triplicado .
fuente
F=F+1;T=TRUE*TRUE+12#
<nueva línea>write(strrep(1,F),"")
Julia 0.6 , 29 bytes
Todas mis ideas fueron más largas que adaptar la solución inteligente de Python de xnor.
Se convierte
Pruébalo en línea!
fuente
SNOBOL4 (CSNOBOL4) ,
13068 bytesAhora sin comentarios! Consulte el historial de edición para obtener una explicación del antiguo algoritmo.
Pruébalo en línea!
Pruébalo doblado y triplicado
Explicación:
Como
END
se requiere una etiqueta yEND
se ignora cualquier cosa después de la primera etiqueta, obtenemos dos ventajas para este desafío:X
veces para lasX
repeticionesEsto sugiere que usemos la repetición para la primera mitad, y luego podemos usar un enfoque de etiquetado más "convencional" para repetir los
X
tiempos de salida .La primera mitad es
que, cuando se repite, incrementa
X
el número apropiado de veces, y crea unaARRAY
A
con índices de1
aX
y donde cada elemento deA
es la cadena1
repetidaX
veces.Entonces, no importa cuántas veces se repita el programa, el intérprete solo ve:
que es un programa SNOBOL típico que imprime los elementos de
A
uno en uno hasta que el índice se sale de los límites, luego termina el programa.;
es un terminador de línea opcional generalmente reservado para una líneaEVAL
oCODE
declaraciones que lleva el recuento de bytes a 68 y marca el punto medio, permitiendo que el código se agregue allí.fuente
shortC ,
5644 bytes-12 bytes: espera duh estoy usando shortC por qué no usar algunas cosas C acortadas
Hubiera usado el estándar C, pero eso requiere un
}
final que se mete con la replicación. shortC lo inserta en EOF implícitamente.fuente
Perl 5 , 25 bytes
Código de 24 bytes + 1 para
-p
.Agradecemos que no quieras permitir marcas de línea de comandos, avísame si esto no es válido.
Pruébalo en línea!
fuente
Zsh , 10 bytes
¡Pruebe una suite de prueba completa en línea!
... sí, esto es un poco mejor. Agregue a la cadena N veces, luego imprima N veces. Resulta que
<<<foo<<<foo
funciona bien.Zsh , 64 bytes
Carácter utilizado:
(espacio).
¡Pruebe una suite de prueba completa en línea!
El punto medio está entre el segundo
E
y la nueva línea que lo sigue. Un heredoc terminará cuando haya unE
en una línea por sí mismo, lo que ocurre justo en el medio del código.fuente
s+=0;<<<$s