En los años brumosos de antaño, cuando las terminales repletas de fanáticos caminaban por la tierra, vivía una criatura extraña. Curiosamente lisiado y, sin embargo, extrañamente poderoso, el editor de línea rebosaba el panorama de la programación en innumerables números; cubriendo la tierra hasta donde alcanzaba la vista.
Ahora ha caído en tiempos difíciles. Esa vasta población cazaba, perseguía y conducía al borde de la extinción. Solo quedan unos pocos especímenes, la mayoría en jaulas estrechas y sin adornos en el zoológico menos iluminado, aunque se pueden ver algunos ejemplos rellenos y montados en museos atrasados. Ah, y lo hay ed
.
¡Como Frankenstein, resucitaremos a la noble bestia!
Comandos
Nuestro editor es bastante mínimo y admitirá los siguientes comandos
Enfocar comandos de movimiento
<number>[,<number>]
- mueve el foco a la línea indicada y si el segundo argumento se da a la columna de estado. El número de línea excesivo obtiene la última línea. El número de columna excesivo obtiene el final de la línea.,<number>
- mover al número de columna en la línea actuale
- mueva el foco al final del archivo pero no comience una nueva línea.b
- mueve el foco al comienzo del archivo.
Comandos informativos
L
- Echo el contexto actual. Se imprimen las cinco líneas centradas en la línea actual. Las cinco líneas están sangradas por un carácter; la línea actual está marcada con un ">", las otras con un "". Debajo de estas líneas, se imprime otra línea que consta completamente de espacios, excepto un "^" en la columna actual (se imprime un total de seis líneas).l
- echo la línea actualp [[<start>],[<end>]]
- Imprima el archivo desde la dirección inicial hasta la final. Este valor predeterminado es 1 y 0 (el final del archivo).
Comandos de alteración de archivos
A [<text>]
- Muévase a la línea más allá del final del archivo (es decir, comience una nueva línea) y (posiblemente) agregue texto.<return>
(solo): inserte una nueva línea. Por lo tanto,a <return> <return>
inserta una nueva línea después de la actual.r <text>
- reemplaza todo desde el foco hasta el final de la línea con texto.i [<text>]
- inserta texto seguido de nueva línea en el foco actual. Cualquier parte de esta línea más allá del foco termina en la siguiente línea.I <text>
- inserta texto en el foco actual, conservando el resto de la línea. El foco permanece en esta línea.d
- Elimine el contenido de la línea actual o si la línea actual ya está vacía, elimine la línea.j
- une esta línea a la siguiente
De este último grupo, los primeros cuatro terminan con el foco moviéndose a la siguiente línea, mientras que I
conserva el foco al final del texto agregado. Al eliminar o unir foco, permanece en la misma línea y número de columna .
La interpretación de números de línea en comandos
Los números que comienzan con '+' o '-' se interpretan como compensaciones del número de línea actual. Los números sin signo se interpretan como números de línea absolutos, excepto que '0' significa la última línea del archivo.
Aviso e interacción
El editor funciona como un shell, y la solicitud tiene la forma <line>','<column>'>'
donde línea es el número de línea, excepto que "final" se usa cuando el foco está en el último carácter del archivo.
Cada comando se acepta solo cuando el usuario presiona nueva línea. Y toma efecto.
El soporte de Readline está permitido pero no es obligatorio.
No se proporcionan comentarios, excepto los valores cambiantes de y en la solicitud, a menos que se indique explícitamente en la descripción de los comandos.
Puntuación
Este es el código de golf , por lo que gana la respuesta más corta en cada idioma.
Respuestas:
C (gcc),
12881212118811711146 bytesManifestación
La primera vez que trato de hacer algo como esto, entonces probablemente haya algunas oportunidades perdidas para hacerlo más pequeño. (Gracias Jerry Jeremiah por señalar algunos)
Aquí hay una versión (ligeramente) más legible:
Este desafío deja bastantes casos de esquina para explorar: supongo que ya solucioné todos los errores, pero si alguien encuentra uno más, por favor comente. Con respecto a las revisiones, eliminé el recuento de bytes para versiones anteriores que contenían errores sutiles.
fuente
D
después del bucle, creo que se puede ahorrar bytes mediante la sustitución de las referencias ao-1
yo
cono
,--o
,o
,o
,++o
. Además, puede hacer cosas similaresx
en la misma área.--o
para el primeroo-1
aquí sería UB porque no está secuenciado con otro acceso deo
:(AWK ,
747 807 829807 bytesPruébalo en línea!
Eliminar la
else
s hace que las líneas sean un poco más cortas / legibles, pero la asignación del cursor es un poco más complicada.Solo por risas, creé una versión para agregar un poco más de "funcionalidad":
q
abandona el programaw <outfile[defaults to input file]>
escribe los cambios.Pruébalo en línea!
fuente
L
comando aquí ...end>
en la posición EOF, el suyo se muestraend,[col]>
en la última línea. ambos no son exactamente lo que se especifica, supongo ...Conjunto 6502 (C64, cargador BASIC),
57615352 bytesManifestación
Esta entrada es solo por diversión y probablemente nunca alcanzará un conteo de bytes decente. Es solo porque el desafío es sobre alguna herramienta "antigua", ¿por qué no implementarla para una máquina antigua?)
En el curso de la creación de esta cosa, una vez más me recordó que el sistema C64 no proporciona ninguna forma sensata de conversión entre cadenas y enteros: solo las cadenas y los flotadores están cubiertos y esto es ridículo, por lo que este código contiene Rutinas de conversión. De hecho, las únicas rutinas del sistema operativo llamadas son
GETIN
(leer un solo carácter desde el teclado) yCHROUT
(escribir un solo carácter en la pantalla).Ahora, el ensamblaje es probablemente el lenguaje "menos golfista" de la historia. Para saber cómo "jugar al golf" esto, mi idea, como se ve aquí, es un cargador BÁSICO, escribir los bytes del binario final en alguna ubicación de memoria y saltar allí. Es un programa BÁSICO que funciona de esta manera;) Si alguien tiene una mejor idea de cómo jugar golf, ¡por favor deje un comentario!
El búfer de texto es bastante limitado, utiliza el espacio entre
$6000
y$BFFF
(la ROM BÁSICA está desactivada ya que no es necesaria) y el programa en sí reside$C000
. Con todo, hay espacio para 255 líneas con 95 caracteres cada una, y el programa no hace ninguna comprobación de límites, así que jugar con él, asegúrese de que sus líneas no crecen demasiado grande;)Finalmente, busque aquí la fuente legible , incluida mi "herramienta de golf".
Como esto es algo bastante limitado, y el C64 puede hacerlo mejor, aquí viene la "edición de lujo" con pantalla de 80 columnas. Para hacer esto, Kernal debe estar desactivado, por lo que se deben incluir cosas básicas como un controlador de teclado, una fuente, lógica de manipulación de mapa de bits para la salida, manejo de interrupciones, etc., por lo tanto, es todo un desafío encajar todo esto en el área 4K
$C000-$CFFF
(y esto es necesario para cargar el programa desde un programa BÁSICO para que funcione).Algunos hechos al azar sobre esta versión:
pero por poco ... tengo 6 bytes "de repuesto" ahora36863841 bytes;)137431338513963 bytes (utilizó los bytes guardados para la nueva función de "edición de línea")$D000-$DFFF
$E000-$FF3F
, de libre acceso porque el núcleo está apagadoq
sale del editorRIGHT
yLEFT
, Pos1 (HOME
), Fin (SHIFT + HOME
) y retroceso (DEL
)Manifestación
Programa para escribir en ti mismo, si quieres una sensación de computadora de los 80:
Código fuente legible .
fuente