Dans les années brumeuses d'autrefois, lorsque des terminaux en accordéon parcouraient la terre, une étrange créature vivait. Curieusement paralysé et pourtant étrangement puissant, l'éditeur de ligne grouillait à travers le paysage de la programmation en nombres incalculables; couvrant la terre à perte de vue.
Maintenant, il est tombé sur des moments difficiles. Cette vaste population a chassé, traqué et conduit au bord de l'extinction. Il ne reste que quelques spécimens, la plupart dans des cages exiguës et non embellies dans le type de zoo le moins éclairé, bien que quelques exemples rembourrés et montés puissent être vus dans les musées de remous. Oh, et il y en a ed
.
Comme Frankenstein, nous ressusciterons la noble bête!
Commandes
Notre éditeur est assez minimal et prendra en charge les commandes suivantes
Concentrez les commandes de déplacement
<number>[,<number>]
- déplacez le focus sur la ligne indiquée et si le deuxième argument est donné à la colonne d'état. Un numéro de ligne excessif obtient la dernière ligne. Un nombre excessif de colonnes obtient la fin de la ligne.,<number>
- passer au numéro de colonne sur la ligne courantee
- déplacez le focus à la fin du fichier mais ne commencez pas une nouvelle ligne.b
- déplacer le focus au début du fichier.
Commandes informationnelles
L
- Faire écho au contexte actuel. Les cinq lignes centrées sur la ligne actuelle sont imprimées. Les cinq lignes sont mises en retrait par un seul caractère; la ligne actuelle est marquée d'un ">", les autres d'un "". Sous ces lignes, une autre ligne est entièrement composée d'espaces, à l'exception d'un "^" dans la colonne actuelle (six lignes au total sont imprimées).l
- faire écho à la ligne actuellep [[<start>],[<end>]]
- Imprimez le fichier du début à la fin. Ces valeurs par défaut sont 1 et 0 (la fin du fichier).
Commandes de modification de fichier
A [<text>]
- Déplacer vers la ligne au-delà de la fin du fichier (c'est-à-dire commencer une nouvelle ligne) et (éventuellement) ajouter du texte.<return>
(seul) - Insérez une nouvelle ligne.a <return> <return>
Insère ainsi une nouvelle ligne après la ligne courante.r <text>
- remplace tout du focus à la fin de la ligne par du texte.i [<text>]
- insère le texte suivi de la nouvelle ligne au foyer actuel. Toute partie de cette ligne au-delà du focus se retrouve sur la ligne suivante.I <text>
- insère du texte au foyer actuel, en préservant le reste de la ligne. L'accent reste sur cette ligne.d
- Supprimez le contenu de la ligne actuelle ou si la ligne actuelle est déjà vide, supprimez la ligne.j
- joindre cette ligne à la suivante
De ce dernier groupe, les quatre premiers se terminent avec le focus passant à la ligne suivante, tout en I
conservant le focus à la fin du texte ajouté. Lors de la suppression ou de la jonction, le focus reste sur le même numéro de ligne et de colonne .
L'interprétation des numéros de ligne dans les commandes
Les nombres commençant par '+' ou '-' sont interprétés comme des décalages par rapport au numéro de ligne actuel. Les nombres sans signe sont interprétés comme des numéros de ligne absolus, sauf que «0» signifie la dernière ligne du fichier.
Invite et interaction
L'éditeur fonctionne comme un shell et l'invite a la forme <line>','<column>'>'
où ligne est le numéro de ligne, sauf que "fin" est utilisé lorsque le focus se trouve sur le dernier caractère du fichier.
Chaque commande n'est acceptée que lorsque l'utilisateur appuie sur la nouvelle ligne. Et prend effet.
Le support en ligne est autorisé mais pas obligatoire.
Aucun retour n'est fourni sauf les valeurs changeantes de et dans l'invite, sauf indication explicite dans la description des commandes.
Notation
C'est le golf de code , donc la réponse la plus courte dans chaque langue l'emporte.
Réponses:
C (gcc),
12881212118811711146 octetsDémo
La première fois que vous essayez de faire quelque chose comme ça, il y a probablement des occasions manquées de le réduire. (Merci Jerry Jeremiah pour avoir souligné certains)
Voici une version (légèrement) plus lisible:
Ce défi laisse beaucoup de cas de coin à explorer - je suppose que j'ai corrigé tous les bugs maintenant, mais si quelqu'un en trouve un de plus, veuillez commenter. Concernant les révisions, j'ai supprimé le nombre d'octets pour les versions antérieures qui contenaient des bogues subtils.
la source
D
après la boucle, je pense que vous pouvez économiser des octets en remplaçant les références ào-1
eto
aveco
,--o
,o
,o
,++o
. Vous pouvez également faire des choses similairesx
dans la même zone.--o
pour le premiero-1
ici serait UB car il n'est pas séquencé avec un autre accès deo
:(AWK ,
747 807 829807 octetsEssayez-le en ligne!
La suppression du
else
s rend les lignes un peu plus courtes / lisibles mais l'affectation du curseur est un peu plus compliquée.Juste pour rire, j'ai créé une version pour ajouter un peu plus de "fonctionnalités":
q
quitte le programmew <outfile[defaults to input file]>
écrit les modifications.Essayez-le en ligne!
la source
L
commande ici ...end>
la position EOF, la vôtre apparaîtend,[col]>
à la dernière ligne. les deux ne sont pas exactement ce qui est spécifié, je suppose ...6502 Assembly (C64, chargeur BASIC),
57615352 octetsDémo
Cette entrée est juste pour le plaisir et n'atteindra probablement jamais un nombre d'octets décent. C'est juste parce que le défi concerne un outil "ancien", pourquoi ne pas l'implémenter pour une machine ancienne;)
Au cours de la création de cette chose, on m'a rappelé une fois de plus que le système C64 ne fournit aucun moyen sensé de convertir entre chaînes et entiers - seules les chaînes et les flottants sont couverts et c'est ridicule, donc ce morceau de code contient propre routines de conversion. En fait, les seules routines OS appelées sont
GETIN
(lire un seul caractère à partir du clavier) etCHROUT
(écrire un seul caractère à l'écran).Maintenant, l'assemblage est probablement la langue la moins «golfique» de tous les temps. Pour savoir comment "jouer au golf", mon idée, comme on le voit ici, est un chargeur BASIC, écrivant les octets du binaire final dans un emplacement mémoire et y sautant. C'est un programme BASIC qui fonctionne de cette façon;) Si quelqu'un a une meilleure idée de comment jouer au golf, veuillez laisser un commentaire!
Le tampon de texte est assez limité, utilisant l'espace entre
$6000
et$BFFF
(BASIC ROM est désactivé car il n'est pas nécessaire) et le programme lui-même réside à$C000
. Dans l'ensemble, il y a de la place pour 255 lignes avec 95 caractères chacune, et le programme ne vérifie pas les limites, donc en jouant avec, assurez-vous que vos lignes ne deviennent pas trop grandes;)Enfin, recherchez ici la source lisible , y compris mon "outil de golf".
Comme il s'agit de choses assez limitées et que le C64 peut faire mieux, voici «l'édition de luxe» utilisant un affichage de 80 colonnes. Pour ce faire, le Kernal doit être désactivé, donc des éléments de base comme un pilote de clavier, une police, une logique de manipulation bitmap pour la sortie, la gestion des interruptions, etc. doivent être inclus, donc c'est tout un défi d'adapter tout cela dans la zone 4K
$C000-$CFFF
(et cela est nécessaire pour charger le programme à partir d'un programme BASIC).Quelques faits aléatoires sur cette version:
mais de justesse ... a obtenu 6 octets "de rechange" maintenant36863841 octets;)137431338513963 octets (utilisé les octets enregistrés pour la nouvelle fonction "édition de ligne")$D000-$DFFF
$E000-$FF3F
, librement accessible car le kernal est éteintq
quitte l'éditeurRIGHT
etLEFT
, Pos1 (HOME
), End (SHIFT + HOME
) et backspace (DEL
)Démo
Programme pour taper vous-même, si vous voulez une sensation de mag informatique des années 80:
Code source lisible .
la source