Tapez les œufs verts et le jambon dans vim

18

Le livre Green Eggs and Ham du Dr Seuss est célèbre pour n'avoir que 50 mots différents dans toute l'histoire du livre.

Votre tâche consiste à créer une séquence de touches qui se traduira par le texte entier de Green Eggs and Ham lorsqu'il est appliqué à un fichier vide dans l' éditeur de texte vim , en commençant en mode normal avec tous les paramètres par défaut. Vos frappes ne doivent pas charger d'autres fichiers dans le cadre de leur fonctionnement - tout le texte doit être généré dans l'éditeur lui-même.

Votre tampon final doit ressembler exactement à ce fichier , bien qu'il puisse rester dans le mode dans lequel il finit par être (vous n'avez pas besoin d'avoir un final <Esc>pour le remettre en mode normal).

Les séquences de touches comme <C-o>ou en utilisant Maj pour taper une majuscule comptent comme une seule touche.

La séquence du moins de touches pour atteindre cet objectif gagne.

Joe Z.
la source
Si quelqu'un veut créer l'équivalent Emacs de cette question, il le peut. Je ne connais pas assez Emacs pour savoir si cela pourrait poser une question intéressante.
Joe Z.
En outre, «avec tous les paramètres par défaut» signifie que vous n'êtes pas autorisé à charger les paramètres à partir d'un .vimrcfichier.
Joe Z.
Sur la base de votre réponse "canonique" d'insertion de fichier entier, je considère que le mode dans lequel vous quittez l'éditeur après l'insertion n'a pas d'importance. Peut-être que cela devrait être explicitement spécifié pour clarifier (c'est-à-dire que vous n'avez pas à <Esc> sortir du mode insertion).
FireFly
Oui, vous n'avez pas besoin de <Esc>quitter le mode d'insertion, mais vous devez commencer en mode normal.
Joe Z.
À mon avis, cette question est sur le point d'être hors sujet. Ce n'est pas un codegolf, c'est un vimgolf (il y a une page pour ça, une bonne. Toute personne intéressée devrait y jeter un œil). Je trouve également que le texte est trop long, ce qui prend beaucoup de temps au golf.
shiona

Réponses:

9

1864 frappes

Quelqu'un pourrait probablement écrire du code qui produit une solution plus optimale, mais cela bat le cas de référence pour l'instant. C'est un sacré bordel, et j'ai honte de l'avoir fait à la main.

Tout d'abord, nous entrons en mode insertion.

i

Alors tout ça

That ]! That ]!
IDNlike that ]!

Do Y like$?

|;].
IDNlike$.

WPY LTB or tB?

IZ LTB or tB.
IZ LTanywB.
IDNlike$.
|;].

WPY LTin a h@?
WPY LT=a m@?

|in a h@.
|=a m@.
|B or tB.
|.
IDNlike$.
|;].

WPY ETin a box?
WPY ET=a fox?

Not_a box. Not =a fox.
Not_a h@. Not =a m@.
IZ ETB or tB.
IZ ETanywB.
IZ eat$.
|;].

WPY? CPY? In a car?
Eat them! Eat them! B they are.

IZ,X,_a car.

You may LT. You will see.
You may LTin a tree!

IZ,X_a tree.
Not_a car! You let me be.

|in a box.
|=a fox.
|in a h@.
|=a m@.
|B or tB.
|.
IDNlike$.
|;].

AQ! AQ! AQ! AQ!
CPY;wPY;on aQ?

Not_aQ! Not_a tree!
Not_a car! Sam! Let me be!

IZ,X,_a box.
IX,Z;=a fox.
:=a m@.
:in a h@.
:B or tB.
:anywB.
IDNlike$.
|;].

Say! In +? B_+!
WPY;cPY,_+?

IZ,X,_+.

WPY;cPY,_the rain?


IZ,X,_the rain.
Not_+. Not on aQ.
Not_a car. Not_a tree.
|;Sam;Y see.
Not_a h@. Not_a box.
Not =a m@. Not =a fox.
:B or tB.
|!

You do not like$?
|;].

CPY;wPY;=a g^?

IZ,X;=a g^!

WPY;cPY;on a b^?

IX,Z;on a b^.
IWN,WN;=a g^.

:in the rain.
:on aQ.
Not_+! Not_a tree!
Not_a car! You let me be!
|in a box.
|=a fox.
:in a h@.
|=a m@.
|B or tB.
|!

IDNlike$!
|;].

You do not LT. So Y say.
Try them! Try them! & Y may.
Try them and Y may;I say.

Sam! If Y will let me be,
I will try them. You will see.

Say! I like$!
I do! I LT;]!
& I wPETin a b^.
& I wPET=a g^.

!ETin the rain.
&_+. & on aQ.
&_a car. &_a tree.
They are so good;so good;Y see!

So I will ETin a box.
!ET=a fox.
!ETin a h@.
!ET=a m@.
!ETB and tB.
Say! I will ETanywB!

I do so like$!

Thank Y! Thank Y;]!

Appuyez sur Échap pour entrer en mode commande. Et démêlez les trucs compressés. L'ordre est important, car j'ai compressé du texte compressé.

<Esc>
%s/|/|anywB/g
%s/:/IWNET/g
%s/|/IDNLT/g
%s/Z/ wPnot/g
%s/X/ cPnot/g
%s/&/And/g
%s/+/the dark/g
%s/@/ouse/g
%s/^/oat/g
%s/Y/you/g
%s/IDN/I do not /g
%s/LT/like them /g
%s/]/Sam-I-am/g
%s/ET/eat them /g
%s/WN/ will not/g
%s/$/ green eggs and ham/g
%s/P/ould /g
%s/!/And I will /g
%s/Q/ train/g
%s/B/here/g
%s/_/ in /g
%s/=/with /g
%s/;/, /g

la source
vous avez la mauvaise substitution pour les manger, c'est à l'envers. et vous pouvez couper les deux-points en utilisant le mode ed qui reste en mode commande après les commandes.
hildred
@hildred J'ai en fait commencé avec le texte intégral, j'ai fait un remplacement global et ajouté le texte intégral au texte compressé dans un autre fichier. Doit avoir oublié d'inverser celui-ci :(
Si vous remplacez so good;so good;par <Esc>2aso good;<Esc>a, vous pouvez enregistrer trois frappes. Remplacez également iThat ]! That]!<Enter>au début par 2iThat ]! <Esc>xotrois autres.
Joe Z.
De plus, comme il DNn'apparaît pas ailleurs, vous pouvez supprimer les instructions Ifrom IDNet I do not in de l'instruction replace avec ces deux expressions.
Joe Z.
Et, remplacez toutes les instances de IDNlike$!<Enter>|;].with 1et input %s/1/IDNlike$!\n|;]./gpour enregistrer environ 20 frappes.
Joe Z.
6

3470 frappes

i<entire text of file>

Le fichier texte contient 3 469 caractères, donc taper "i" pour le mettre en mode insertion et taper chaque caractère individuellement nécessitera 3 470 frappes.

Joe Z.
la source
Lol @ pure brute force
Cruncher
Ceci est principalement conçu comme une solution de référence de dernière place plus que tout.
Joe Z.
pourtant c'est aussi le meilleur candidat actuellement :-) (non, je ne vais pas participer; désolé)
John Dvorak
Vous êtes plus une personne Emacs? :-)
Joe Z.