Nos anos enevoados de antigamente, quando terminais dobrados pelos fãs percorriam a terra, vivia uma criatura estranha. Estranhamente aleijado e, no entanto, estranhamente poderoso, o editor de linha fervilhava pelo cenário da programação em números incontáveis; cobrindo a terra até onde os olhos podiam ver.
Agora caiu em tempos difíceis. Essa vasta população caçava, perseguia e levava à beira da extinção. Apenas alguns espécimes permanecem, a maioria em gaiolas apertadas e sem mobília, no tipo menos iluminado de zoológico, embora alguns exemplos empalhados e montados possam ser vistos em museus de remanso. Ah, e existe ed
.
Como Frankenstein, ressuscitaremos o animal nobre!
Comandos
Nosso editor é bastante mínimo e suportará os seguintes comandos
Comandos de movimento em foco
<number>[,<number>]
- mova o foco para a linha declarada e se o segundo argumento for fornecido na coluna de estado. O número excessivo de linha obtém a última linha. O número excessivo de colunas obtém o final da linha.,<number>
- move para o número da coluna na linha atuale
- mova o foco para o final do arquivo, mas não inicie uma nova linha.b
- mova o foco para o início do arquivo.
Comandos informativos
L
- Ecoar o contexto atual. As cinco linhas centralizadas na linha atual são impressas. Todas as cinco linhas são recuadas por um caractere; a linha atual é marcada com um ">", as outras com um "". Sob essas linhas, outra linha é impressa, consistindo inteiramente de espaços, exceto um "^" na coluna atual (um total de seis linhas são impressas).l
- ecoar a linha atualp [[<start>],[<end>]]
- Imprima o arquivo do início ao endereço final. Esses valores são padronizados como 1 e 0 (o final do arquivo).
Comandos de alteração de arquivo
A [<text>]
- Mova para a linha além do final do arquivo (ou seja, inicie uma nova linha) e (possivelmente) inclua texto.<return>
(sozinho) - insira uma nova linha. Assim,a <return> <return>
insere uma nova linha após a atual.r <text>
- substitui tudo, do foco ao final da linha pelo texto.i [<text>]
- insere texto seguido por nova linha no foco atual. Qualquer parte dessa linha além do foco termina na próxima linha.I <text>
- insere texto no foco atual, preservando o restante da linha. O foco permanece nesta linha.d
- Exclua o conteúdo da linha atual ou, se a linha atual já estiver vazia, remova a linha.j
- junte-se a esta linha para a próxima
Nesse último grupo, os quatro primeiros terminam com o foco passando para a próxima linha, enquanto I
preservam o foco no final do texto adicionado. Ao excluir ou unir o foco, permanece o mesmo número de linha e coluna .
A interpretação dos números de linha nos comandos
Os números que começam com '+' ou '-' são interpretados como deslocamentos do número da linha atual. Os números sem sinal são interpretados como números de linha absolutos, exceto que '0' significa a última linha do arquivo.
Prompt e interação
O editor funciona como um shell, e o prompt tem o formato <line>','<column>'>'
onde line é o número da linha, exceto que "end" é usado quando o foco está no último caractere do arquivo.
Cada comando é aceito apenas quando o usuário pressiona nova linha. E tem efeito.
O suporte ao Readline é permitido, mas não obrigatório.
Nenhum feedback é fornecido, exceto os valores alterados de e no prompt, a menos que declarado explicitamente na descrição dos comandos.
Pontuação
Isso é código-golfe , então a resposta mais curta em cada idioma vence.
Respostas:
C (gcc),
12881212118811711146 bytesDemo
Primeira tentativa de fazer algo assim, provavelmente há algumas oportunidades perdidas para diminuí-lo. (Obrigado Jerry Jeremiah por apontar alguns)
Aqui está uma versão (um pouco) mais legível:
Esse desafio deixa muitos casos de esquina a explorar - acho que já corrigi todos os bugs até agora, mas se alguém encontrar mais um, comente. Em relação às revisões, removi a contagem de bytes de versões anteriores que continham erros sutis.
fonte
D
após o loop, eu acho que você pode salvar bytes, substituindo as referências parao-1
eo
como
,--o
,o
,o
,++o
. Além disso, você pode fazer coisas semelhantesx
na mesma área.--o
para o primeiroo-1
aqui seria UB porque é unsequenced com outro acesso deo
:(AWK ,
747 807 829807 bytesExperimente online!
A remoção de
else
s torna as linhas um pouco mais curtas / legíveis, mas a atribuição do cursor é um pouco mais complicada.Apenas para rir, criei uma versão para adicionar um pouco mais de "funcionalidade":
q
sai do programaw <outfile[defaults to input file]>
escreve as alterações.Experimente online!
fonte
L
comando aqui ...end>
na posição EOF, o seu é exibidoend,[col]>
na última linha. ambos não são exatamente o que está especificado eu acho ...6502 Assembly (C64, carregador BASIC),
57615352 bytesDemo
Essa entrada é apenas uma brincadeira e provavelmente nunca alcançará uma contagem decente de bytes. É apenas porque o desafio é sobre alguma ferramenta "antiga", por que não implementá-la em uma máquina antiga;)
Durante a criação dessa coisa, lembrei-me mais uma vez que o sistema C64 não fornece nenhuma maneira sensata de conversão entre seqüências de caracteres e números inteiros - apenas strings e flutuadores são cobertos e isso é ridículo, portanto esse código contém rotinas de conversão. De fato, as únicas rotinas de SO chamadas são
GETIN
(leia um único caractere do teclado) eCHROUT
(escreva um único caractere na tela).Agora, a montagem é provavelmente a linguagem "menos golfista" de todos os tempos. Para saber como "jogar golfe" isso, minha ideia, como vista aqui, é um carregador BASIC, escrevendo os bytes do binário final em algum local da memória e pulando para lá. É um programa BASIC funcionando dessa maneira;) Se alguém tiver uma idéia melhor de como jogar isso, deixe um comentário!
O buffer de texto é bastante limitado, consumindo o espaço entre
$6000
e$BFFF
(BASIC ROM é desativado porque não é necessário) e o próprio programa reside em$C000
. No geral, há espaço para 255 linhas com 95 caracteres cada, e o programa não faz nenhuma verificação de limites; portanto, brinque com ele, verifique se suas linhas não aumentam muito;)Por fim, procure aqui a fonte legível , incluindo minha "ferramenta de golfe".
Como esse é um material bastante limitado, e o C64 pode fazer melhor, aqui vem a "edição de luxo", com exibição de 80 colunas. Para fazer isso, o Kernal deve ser desativado, portanto, coisas básicas como um driver de teclado, uma fonte, lógica de manipulação de bitmap para saída, manipulação de interrupções etc. devem ser incluídas, portanto, é um grande desafio encaixar tudo isso na área 4K
$C000-$CFFF
(e isso é necessário para carregar o programa de um programa BASIC para funcionar).Alguns fatos aleatórios sobre esta versão:
mas por pouco ... obteve 6 bytes "sobressalentes" agora36863841 bytes;)137431338513963 bytes (usou os bytes salvos para o novo recurso "edição de linha")$D000-$DFFF
$E000-$FF3F
, acessível livremente porque o kernal está desligadoq
sai do editorRIGHT
eLEFT
Pos1 (HOME
), End (SHIFT + HOME
) e backspace (DEL
)Demo
Programe para digitar a si mesmo, se você quiser a sensação dos computadores 80s:
Código fonte legível .
fonte