W mglistych latach, kiedy terminale z wachlarzem kroczyły po ziemi, żyło tam dziwne stworzenie. Dziwnie okaleczony, a jednocześnie dziwnie potężny, edytor liniowy obfitował w krajobraz programowania w niezliczonych ilościach; zakrywający ziemię tak daleko, jak okiem sięgnąć.
Teraz jest ciężko. Ta ogromna populacja tropiła, ścigała i doprowadzała na skraj wyginięcia. Pozostało tylko kilka okazów, większość w ciasnych i niedoskonałych klatkach w mniej oświeconym rodzaju zoo, choć kilka wypchanych i zamontowanych przykładów można zobaczyć w muzeach na tyłach. Och, i jest ed
.
Jak Frankenstein, wskrzesimy szlachetną bestię!
Polecenia
Nasz edytor jest dość minimalny i obsługuje następujące polecenia
Skoncentruj ruchome polecenia
<number>[,<number>]
- przenieś fokus do wskazanej linii i jeśli drugi argument zostanie podany w kolumnie stanu. Nadmierny numer linii dostaje ostatnią linię. Nadmierny numer kolumny dostaje koniec linii.,<number>
- przejdź do numeru kolumny w bieżącym wierszue
- przenieś fokus na koniec pliku, ale nie zaczynaj nowej linii.b
- przenieś fokus na początek pliku.
Komendy informacyjne
L
- Echo bieżącego kontekstu. Zostanie wydrukowanych pięć linii wyśrodkowanych na bieżącej linii. Wszystkie pięć wierszy jest wciętych przez jedną postać; bieżący wiersz jest oznaczony „>”, a pozostałe „”. Pod tymi liniami drukowana jest kolejna linia składająca się całkowicie ze spacji, z wyjątkiem „^” w bieżącej kolumnie (w sumie drukowanych jest sześć linii).l
- powtórz bieżącą linięp [[<start>],[<end>]]
- Wydrukuj plik od adresu początkowego do końcowego. Wartości te wynoszą domyślnie 1 i 0 (koniec pliku).
Polecenia zmiany plików
A [<text>]
- Przejdź do wiersza poza końcem pliku (czyli rozpocząć nowy wiersz) i (ewentualnie) dodaj tekst.<return>
(sam) - Wstaw nowy wiersz. W ten sposóba <return> <return>
wstawia nowy wiersz po bieżącym.r <text>
- zamienia wszystko od fokusa do końca linii tekstem.i [<text>]
- wstawia tekst i znak nowej linii w bieżącym fokusie. Każda część tej linii poza punktem skupienia kończy się na następnej linii.I <text>
- wstawia tekst w bieżącym fokusie, zachowując resztę linii. Skupienie pozostaje na tej linii.d
- Usuń zawartość bieżącego wiersza lub jeśli bieżący wiersz jest już pusty, usuń ten wiersz.j
- dołącz do tej linii do następnej
Z tej ostatniej grupy pierwsze cztery kończą się, a fokus przechodzi do następnej linii, I
zachowując fokus na końcu dodanego tekstu. Podczas usuwania lub dołączania fokus pozostaje w tym samym wierszu i numerze kolumny .
Interpretacja numerów linii w poleceniach
Liczby zaczynające się od „+” lub „-” są interpretowane jako przesunięcia względem bieżącego numeru linii. Liczby bez znaku są interpretowane jako bezwzględne liczby wierszy, z tym wyjątkiem, że „0” oznacza ostatni wiersz pliku.
Monit i interakcja
Edytor działa jako powłoka, a <line>','<column>'>'
wiersz zachęty ma postać, w której wiersz jest numerem wiersza, z wyjątkiem tego, że „koniec” jest używany, gdy fokus znajduje się na ostatnim znaku pliku.
Każde polecenie jest akceptowane tylko wtedy, gdy użytkownik naciśnie znak nowej linii. I ma wpływ.
Obsługa readline jest dozwolona, ale nie wymagana.
Informacje zwrotne nie są przekazywane, z wyjątkiem zmieniających się wartości w wierszu polecenia, chyba że jest to wyraźnie określone w opisie poleceń.
Punktacja
To jest golf-golf, więc wygrywa najkrótsza odpowiedź w każdym języku.
Odpowiedzi:
C (gcc),
12881212118811711146 bajtówPróbny
Po raz pierwszy próbuję zrobić coś takiego, więc prawdopodobnie brakuje okazji, aby ją zmniejszyć. (Dzięki Jerry Jeremiah za zwrócenie uwagi)
Oto (nieco) bardziej czytelna wersja:
Wyzwanie to pozostawia wiele do zrobienia w rogach - chyba naprawiłem już wszystkie błędy, ale jeśli ktoś znajdzie jeszcze jeden, proszę o komentarz. Jeśli chodzi o wersje, usunąłem liczbę bajtów dla wcześniejszych wersji, które zawierały subtelne błędy.
źródło
D
po pętli, myślę, że można zaoszczędzić bajtów poprzez zastąpienie odniesień doo-1
io
zo
,--o
,o
,o
,++o
. Możesz także robić podobne rzeczyx
w tym samym obszarze.--o
pierwszymo-1
tutaj byłby UB, ponieważ nie ma na nim kolejnego dostępuo
:(AWK ,
747 807 829807 bajtówWypróbuj online!
Usunięcie
else
s sprawia, że linie są nieco krótsze / czytelne, ale przypisanie kursora jest nieco bardziej skomplikowane.Dla chichotów stworzyłem wersję, aby dodać nieco więcej „funkcjonalności”:
q
wychodzi z programuw <outfile[defaults to input file]>
zapisuje zmiany.Wypróbuj online!
źródło
L
dowództwem ...end>
w pozycji EOF, twój pokazujeend,[col]>
w ostatniej linii. Oba nie są dokładnie takie, jak się wydaje.Zestaw 6502 (C64, moduł ładujący BASIC),
57615352 bajtówPróbny
Ten wpis jest po prostu dla zabawy i prawdopodobnie nigdy nie osiągnie przyzwoitej liczby bajtów. Po prostu dlatego, że wyzwanie dotyczy jakiegoś „starożytnego” narzędzia, dlaczego nie zaimplementować go dla starożytnej maszyny;)
Podczas tworzenia tej rzeczy ponownie przypomniano mi, że system C64 nie zapewnia żadnego sensownego sposobu konwersji między ciągami znaków i liczbami całkowitymi - tylko łańcuchy i zmiennoprzecinkowe są objęte i jest to śmieszne, więc ten fragment kodu zawiera własny procedury konwersji. W rzeczywistości jedynymi wywoływanymi procedurami systemu operacyjnego są
GETIN
(odczytywanie jednego znaku z klawiatury) iCHROUT
(zapisywanie jednego znaku na ekranie).Asembler jest prawdopodobnie językiem „najmniej golfowym” w historii. Aby dowiedzieć się, jak to „golfować”, moim pomysłem, jak widać tutaj, jest moduł ładujący BASIC, zapisujący bajty końcowego pliku binarnego do jakiegoś miejsca w pamięci i tam skaczący. W ten sposób działa działający program BASIC;) Jeśli ktoś ma lepszy pomysł na grę w golfa, zostaw komentarz!
Bufor tekstowy jest dość ograniczony, zużywa przestrzeń pomiędzy
$6000
i$BFFF
(BASIC ROM jest wyłączony, ponieważ nie jest potrzebny), a sam program znajduje się w$C000
. W sumie, nie ma miejsca dla 255 linii z 95 znaków każdy, a program nie robi żadnych granic kontrolnych, więc grając z nim, upewnij się, że linie nie rosną zbyt duże;)Na koniec poszukaj tutaj czytelnego źródła , w tym mojego „narzędzia do gry w golfa”.
Ponieważ jest to dość ograniczone rzeczy, a C64 może działać lepiej, oto „edycja Deluxe” z wyświetlaniem 80 kolumn. Aby to zrobić, Kernal musi być wyłączony, dlatego należy uwzględnić podstawowe rzeczy, takie jak sterownik klawiatury, czcionka, logika manipulacji bitmapą dla wyjścia, obsługa przerwań itp., Dlatego zmieszczenie tego wszystkiego w obszarze 4K jest dużym wyzwaniem
$C000-$CFFF
(i to jest potrzebny do załadowania programu z programu BASIC do działania).Kilka przypadkowych faktów na temat tej wersji:
ale wąsko ... mam teraz 6 „zapasowych” bajtów36863841 bajtów;)1374313385 13963bajtów (wykorzystał zapisane bajty do nowej funkcji „edycji linii”)$D000-$DFFF
$E000-$FF3F
, który jest swobodnie dostępny, ponieważ jądro jest wyłączoneq
wychodzi z edytoraRIGHT
iLEFT
, Pos1 (HOME
), End (SHIFT + HOME
) i backspace (DEL
)Próbny
Program do pisania w sobie, jeśli chcesz poczuć magię komputerową lat 80 .:
Czytelny kod źródłowy .
źródło