Mettre fin aux onglets contre la guerre spatiale
Ainsi, il y a eu beaucoup de débats sur l'opportunité d'utiliser des tabulations ou des espaces pour indenter / formater le code. Pouvez-vous aider l'université à régler le différend en adoptant une méthode de mise en forme unique et incroyablement folle ?
Votre travail consiste à écrire un programme ou une fonction complète qui étend tous les onglets en quatre espaces. Et puis remplace une série de n espaces de tête par "/ (n - deux étoiles ici) /". Vous recevrez une entrée sur plusieurs lignes dans n'importe quel format raisonnable (un seul tableau de chaînes de chaînes pour chaque nouvelle ligne. Tableau en colonnes, etc.)
Exemple d'entrée volée sans vergogne . Notez que puisque les tabulations sont étendues automatiquement à quatre espaces sur SE, je le représente comme le caractère "^", mais vous devez également gérer les tabulations (codepoint 0x09). Tous les caractères "^" représentent une tabulation.
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
Not zero so multiply by 256 again to get 65536
[>++++<-]>[<++++++++>-]<[>++++++++<-]
+>[>
# Print "32"
++++++++++[>+++++<-]>+.-.[-]<
<[-]<->] <[>>
# Print "16"
+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
# Print "8"
++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
^this is preceded by a tab
^^two tabs
^^^three tabs etcetera!
Exemple de sortie
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
/**/Not zero so multiply by 256 again to get 65536
/**/[>++++<-]>[<++++++++>-]<[>++++++++<-]
/**/+>[>
/******/# Print "32"
/******/++++++++++[>+++++<-]>+.-.[-]<
/**/<[-]<->] <[>>
/******/# Print "16"
/******/+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
/**/# Print "8"
/**/++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
/**/this is preceded by a tab
/******/two tabs
/**********/three tabs etcetera!
Parce que l'université a besoin d'espace pour télécharger à la fois Vim et Emacs, vous avez très peu de stockage pour votre code. C'est donc le code-golf et le code le plus court l'emporte. Vous pouvez supposer que l'entrée est bien formée et que les lignes avec moins de quatre espaces (après le remplacement des tabulations) peuvent entraîner un comportement non défini.
Avertissement
Cette "excellente" stratégie de formatage est une gracieuseté de Geobits et est reproduite avec sa permission. Aucun programmeur n'a été blessé lors de la production de ce défi.
la source
/*
, ou peut-on supposer que ce n'est pas une «entrée bien formée»? Un fichier source C ++ aurait été un meilleur test, car son commentaire multiligne/* */
pourrait éventuellement casser certaines réponses qui remplacent le premier et le dernier des espaces de tête par un/
, puis continuer à remplir les espaces avec*
./* */
code C ++, mais cette fois au début de la ligne. Selon vos spécifications, il doit être laissé tel quel. Ici, le piège est, et a déjà repéré de mauvaises réponses, qu'un regex comme disons/\** /
utilisé pour remplir ces espaces entre // avec des astérisques transformerait la ligne en/***/
. J'ai également vu cette conversion/*//*/
. Je suppose que les deux sont incorrects.Réponses:
V ,
21, 20 octetsEssayez-le en ligne!
C'est littéralement juste un port direct de ma réponse vim. Les différences notables:
La
Í
commande (substitut global) remplit automatiquement l'/g
indicateur, ce qui économise deux octetsô
est identique à\t
Î
Est un mnémonique pour:%norm
, et il remplit également l'espace nécessaire entre:%norm
et l'ensemble des frappes.Le retour chariot fin à la fin est implicitement ajouté.
la source
Vim,
37, 34, 33,32 octetsEssayez-le en ligne!
Notez que cela nécessite un retour chariot fin (entrée) dans vim, mais pas dans l'interpréteur en ligne.
Cela utilise l'interpréteur V car il est rétrocompatible. Une solution très simple.
Voici un gif qui vous permet de voir la solution se produire en temps réel. Cela utilise une version légèrement plus ancienne, et j'ai ajouté quelques touches supplémentaires pour le ralentir afin que vous puissiez voir ce qui se passe:
Et voici l'explication de son fonctionnement:
la source
g
mais vous avez modifié pour ne pas utiliser g: / +1 de toute façon: D:g
car elle abuse d'une fonctionnalité moins connue: lanorm
commande est annulée en cas d'^F<space>
échec. C'est donc:%norm ^F<space>foo
essentiellement la même chose que:g/^ /norm foo
les hacks amusants de Vim. : Dnorm
?^F
pas la<C-f>
notation de clé Silly Vim. Dans ce cas, il s'agit de^
passer au premier caractère non blanc et deF<space>
trouver le premier espace derrière le curseur.Perl, 41 octets
Courez avec le
-p
drapeau, comme ceci:Remplacez
␉
par un onglet (dans Bash, essayez de taper Control-V Tab.)la source
perl
remplacé cette référence sur place, je souhaitesed
que cela aussi.Cheddar ,
605756 octetsEnregistré 3 octets grâce à @Conor O'Brien
Je souhaite que Cheddar ait un meilleur formatage des chaînes.
Essayez-le en ligne!
Explication
Ceci est une fonction.
@
est une propriété représentée (par exemple ruby&:
) vous permettant de faire des choses comme: `ar.map (@. head (-1))Si vous n'êtes pas familier avec l'expression régulière:
cela correspondait essentiellement à un ou plusieurs (
+
) espaces () au début (
^
) de chaque (g
) ligne (m
).la source
/^ +/
suffit comme expression régulière, car nous pouvons supposer que les espaces de tête auront au moins 4 longueurs.Mathematica, 97 octets
Fonction anonyme. Prend une chaîne en entrée et renvoie une chaîne en sortie.
la source
Python 3, 124 octets
Utilise un bon vieux regex.
Ideone it!
la source
Java
210207 octetsC'est la solution de référence qui la met en œuvre naïvement.
la source
for(int j=0;++j<i-1;)
. En outre, vous pouvez supprimer l'int
avantj
et le mettre après l'int. Déjà présent:int i=s.length()-(x=s.replaceAll("^\\s+", "")).length(),j;
JavaScript ES6, 75 octets
Remplacez
\t
par un onglet littéral dans votre code.la source
Java,
185184167152 octetsÉtant donné la définition très vague du tableau de chaînes donnée dans le post initial, j'ai utilisé
Stream<String>
ce qui permet des économies d'octets conséquentes.J'ai utilisé des techniques différentes de celles du RI pour atteindre le même objectif. L'algorithme lui-même est plutôt le même.
Test et non golfé :
la source
Rétine , 25 octets
Le
\t
doit être remplacé par un caractère de tabulation réel (0x09).Essayez-le en ligne!
Explication
Remplacez chaque onglet par quatre espaces.
Transformez chaque ligne séparément (
%
) en faisant correspondre les2+N
espaces au début de la ligne et en la remplaçant par/.../
où...
se trouvent desN
copies de*
.la source
Python,
125111 octetshttps://repl.it/DGyh/2
la source
SED (56 + 1 pour -r) 57
Où se
⇥
trouve un onglet1. remplace les onglets par des espaces.
2. remplace le premier et le dernier espace de début par
/
.3. remplace le premier espace après
/
et 0+*
par un*
jusqu'à ce qu'il n'y ait pas de correspondance.la source
-f
. Tous les drapeaux supplémentaires utilisés comme n ou r doivent être comptés comme un octet chacun. Ainsi ici, vous économisez 2 octets.;
après la commande t n'est pas non plus nécessaire. Quant au code lui-même, vous avez besoin d'un ^ au début de la troisièmes
commande, sinon une entrée comme celle-ci "3/5" est transformée en "3 / * 5". Dans la premières
commande, vous avez en fait un onglet, mais il n'est pas correctement affiché et trompeur, alors utilisez \ t ou spécifiez après, que char était un onglet.L'université devrait envisager d'accorder un peu plus d'espace aux programmes dans Emacs Lisp (ou par défaut à
tabify
etuntabify
seul), car ils sont encore plus verbeux que Java. Il devrait également prêter une attention particulière aux élèves (ou enseignants) dont la taille d'identification est inférieure à quatre ou qui se trouvent coder dans un langage non similaire à C.La solution suivante a 206 octets
En supposant que cela
tab-width
ne doive pas être défini explicitement, nous pouvons en enregistrer 20.Et la version non golfée ressemblerait à ceci
Nous avons d'abord
untabify
la région avant de sauter à son début. Ensuite, pendant que nous voyons un espace au début d'une ligne, nous le remplaçons par un commentaire qui est aussi long que ledit espace. Pour être exact, le commentaire à insérer est construit parqui lui-même prend 97 octets. Une solution plus courte pour copier certaines chaînes n fois est très appréciée.
la source
Rubis,
5247 + 1 (indicateur p) = 48 octetsEdit : 5 octets entiers enregistrés, grâce à Value Ink
la source
p
drapeau pour profiter du fait que (g) sub modifie$_
et change ainsi la valeur imprimée?ruby -pe 'gsub ?\t," "*4;sub(/^ +/){?/+?**($&.size-2)+?/}'
(g)sub
sans bang peut modifier$_
ici.GNU sed,
6664 + 1 (drapeau r) = 65 octetsEdit: 1 octet de moins grâce à la suggestion de Riley .
Exécutez: sed -rf formatter.sed input_file
La raison de la séparation avec un
\n
des espaces de tête du reste du texte sur cette ligne, est parce que sinon une ligne C ++ commençant par un commentaire comme celui-/* */
ci serait transformée en/*****/
une ligne plus simple 4 commes,^(/\**) ,\1*,
ou mêmes,^(/\**) ( */),\1*\2,
. Puisque sed exécute le script pour chaque ligne d'entrée, no\n
est introduit dans l'espace modèle lors de la lecture.la source
/
avant d'avoir remplacé le\n
. Cela vous évite d'avoir à le faire correspondre dans la ligne 4.\t
par un caractère de tabulation.