Utilisateurs d'indentation spatiale, unissez - vous ! Nous devons lutter contre tous les utilisateurs modestes de l'onglet !
Votre mission (si vous choisissez de l'accepter) est d'écrire un programme ou une fonction qui accepte deux arguments:
- Une chaîne: c'est l'entrée.
- Un entier positif: il s'agit du nombre d'espaces par tabulation.
Vous devez parcourir chaque ligne de la chaîne et remplacer chaque onglet utilisé pour l'indentation par le nombre d'espaces donné, et chaque onglet non utilisé pour l'indentation (par exemple au milieu d'une ligne) par un espace.
Notez que les lignes telles que \t \tabc
sont un comportement indéfini; ils ont été insérés par les utilisateurs maléfiques de l'onglet pour compliquer vos programmes.
Selon la Tabs Must Die Society, votre programme doit être aussi court que possible pour éviter d'être détecté par les mauvais utilisateurs d'onglets.
Exemple
\t
est utilisé pour représenter les onglets ici.
Chaîne d'entrée:
a
\t\tb\tc
d
Numéro d'entrée:
4
Sortie:
a
b c
d
La ligne médiane était en retrait de 8 espaces, 4 par tabulation (puisque le nombre donné était 4).
Chaîne d'entrée:
\ta\t\tb
Numéro d'entrée:
4
Sortie:
a b
REMARQUE: ce n'est pas un doublon du défi d'extension d'onglet ; il nécessite un format d'entrée très différent et des exigences légèrement différentes.
la source
\ta\t\tb
,4
(ma version précédente échouait celui - là)Réponses:
CJam,
302423 octetsJe refuse généralement de publier du code malveillant sur Internet…
Il s'agit d'un programme complet qui lit la chaîne de STDIN et le nombre comme argument de ligne de commande.
Essayez-le en ligne dans l' interpréteur CJam .
Comment ça marche
Qu'est
NA=
- ce que:Pour le premier caractère,
N
contiendra sa valeur par défaut, c'est-à-dire la chaîne"\n"
.Pour tous les caractères suivants,
N
contiendra le résultat de la dernière itération, c'est-à-dire le dernier caractère de l'entrée, un caractère d'espace ou une chaîne d'un ou plusieurs espaces.Si
N
est une chaîne,NA=
sélectionne l'élément à l'index 10 de N (enroulement). Le résultat sera un espace ou un caractère de saut de ligne. Les deux sont véridiques.Si N est un caractère,
NA=
pousse 1 pour un saut de ligne et 0 sinon.En raison de ce qui précède,
NA=
poussera une valeur véridique pour le premier caractère, un caractère précédé d'un saut de ligne ou un caractère précédé d'une chaîne d'espaces (retrait qui a déjà été remplacé).Dans tous les autres cas (y compris une tabulatrice qui a été remplacé par un espace caractère ),
NA=
poussera une valeur falsy.la source
K5,
5345 octetsEn action:
Je veux juste que le compte rendu montre que cette question est moralement répréhensible.
la source
... this question is morally reprehensible.
`0:
et "" \ n "\`.Perl, 23 octets
Code de 22 octets + ligne de commande de 1 octet
Si tout va bien pas trop effronté pour supposer que l'entrée numérique peut être donnée via le paramètre -i! Assurez-vous de remplacer \ t dans le code ci-dessous par le caractère de tabulation réel.
Exemple d'utilisation:
Ou pour plus de commodité:
Explication:
L'utilisation de l'
-p
argument exécutera le programme pour chaque ligne de l'entrée, puis affichera le résultat à la fin.Dans l'exemple ci-dessus, la substitution d'expression régulière remplace
\G\t
par" "x4
(un espace répété quatre fois).\G
est une construction regex peu connue qui correspond soit à la position de la première correspondance si la première itération, soit à partir de la position de la correspondance précédente sinon la première itération, ce qui signifie qu'elle ne remplacera que tous les onglets au début de la chaîne, et faites-le un par un. Ley/\t/ /
remplace simplement tous les onglets restants par des espaces.la source
Julia,
6959 octetsNon golfé:
Enregistrement de 10 octets et correction d'un problème grâce à Glen O!
la source
"hello\t\t1"
?"\t \t"
situations), vous pouvez le faire:,f(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")
qui utilise une fonction de remplacement et interceptera tous les onglets d'indentation en une seule fois.Haskell, 82 octets
Alors
g 3 "a\n\t\tb\tc\nd"
fait la chose.la source
Mathematica,
4237 octetsMerci à @ LegionMammal978 pour plusieurs suggestions de sauvegarde de code. Le premier paramètre,
#
est pour le texte d'entrée, le deuxième paramètre,,#2
pour le nombre d'espaces par tabulation.la source
Table[" ",{#2}]
pour" "~Table~{#2}
enregistrer un octet. Pourquoi y insérez-vousStringJoin
la chaîne vide?Ruby 49 octets
la source
JavaScript (ES6), 70
En utilisant des chaînes de modèle, la nouvelle ligne est significative et comptée
Testez l'exécution de l'extrait ci-dessous dans Firefox.
la source
CoffeeScript, 72 octets
(Essayer de jouer au golf au moins 2 bouchées supplémentaires, donc il battra la solution ES6 ... Aide appréciée: D)
Usage:
la source
Rétine, 42 octets
Toutes les occurrences de
.
sont des espaces, toutes\t
sont des tabulations littérales (1 octet) et<empty>
représentent un fichier vierge. C'est juste pour la lisibilité. Je ne suis pas non plus entièrement sûr de faire correctement la boucle, mais je pense que oui. Chaque ligne doit être placée dans son propre fichier. J'ai ajouté 1 octet pour chaque fichier supplémentaire.L'entrée est supposée être en Unary sur sa propre ligne à la fin de l'entrée.
Explication
J'ajoute un
_
avant l'entrée Unary pour le délimiter lors du remplacement, de sorte que je ne supprime pas les derniers de la chaîne d'entrée. Ensuite, je remplace tous les onglets qui ne se trouvent pas au début d'une ligne par un seul espace. Ensuite, je boucle, en supprimant un seul1
et en ajoutant un seul espace après chaque onglet, jusqu'à ce que je manque de saisie. Enfin, je nettoie en supprimant les onglets et le trait de soulignement.la source
Python,
7268 octetsLes tabulations sont des tabulations littérales (1 octet), elles
r'...'
ne sont donc pas nécessaires. Malheureusement, Python nécessite des analyses / anticipations "à largeur fixe", donc je ne peux pas l'utiliser(?<!^|\t)
. Utilise à peu près la même méthode que ma solution Retina.la source
Stax , 20 octets
Exécuter et déboguer
Ce programme lit la première ligne comme largeur de retrait et le reste de l'entrée comme programme.
la source
Japt v2.0a0, 17 octets
Essayez-le
la source
Haskell , 75 octets
Essayez-le en ligne! Cela suppose que l'entrée ne contient que des caractères imprimables ainsi que des tabulations et des sauts de ligne, comme le permet OP dans les commentaires.
Explication:
La
#
fonction externe prend une chaînes
et un nombrem
et appelle la fonction interne définie localement#
avec les mêmes arguments. Ceci est fait pour garder une trace de lam
valeur d' origine , car la#
fonction interne change le nombre:('\t':r)#n=(' '<$[1..n])++r#n
Si vous rencontrez un onglet, remplacez-le par desn
espaces et laissezn
inchangé.(x:r)#n=x:r#(m^sum[1|x<' '])
Si une partiex
qui n'est pas un onglet est rencontrée, conservez-la telle quelle, mais définissez-lan
sur le numéro d'originem
s'ilx
s'agit d'une nouvelle ligne et dans le1
cas contraire. Cela se fait parm^sum[1|x<' ']
:m
est porté à la puissancesum[1|x<' ']
dont évalue1
quandx
est plus petit qu'un espace (c'est-à-dire une nouvelle ligne), donc nous obtenonsm^1 = m
. Sinon c'est0
et nous avonsm^0 = 1
.la source
Java 11, 134 octets
Essayez-le en ligne.
REMARQUE: Java 11 n'est pas encore sur TIO, il
" ".repeat(n)
a donc été émulé comme à larepeat(" ",n)
place (avec le même nombre d'octets).Explication:
la source