Lors du codage en Python, parfois vous voulez une chaîne multiligne dans une fonction, par exemple
def f():
s = """\
Line 1
Line 2
Line 3"""
(La barre oblique inverse consiste à supprimer une nouvelle ligne principale)
s
Cependant, si vous essayez d'imprimer , vous obtiendrez
Line 1
Line 2
Line 3
Ce n'est pas du tout ce que nous voulons! Il y a trop d'espace blanc de premier plan!
Le défi
Étant donné une chaîne multiligne composée uniquement de caractères alphanumériques, d'espaces et de retours à la ligne, supprimez tous les espaces communs au début de chaque ligne. Chaque ligne est garantie d'avoir au moins un caractère non-espace et n'aura aucun espace de fin. La sortie peut ne pas avoir d'espace blanc superflu, que ce soit avant ou après la sortie entière ou une ligne individuelle (à l'exception d'une seule nouvelle ligne de fin facultative).
L'entrée peut être via STDIN ou un argument de fonction, et la sortie peut être via STDOUT ou une valeur de retour de fonction. Vous ne pouvez pas utiliser de commandes intégrées conçues pour déduire des chaînes multilignes ou effectuer cette tâche exacte, par exemple Python textwrap.dedent
.
Il s'agit de code-golf , donc la solution dans le moins d'octets est gagnante. Des échappatoires standard s'appliquent.
Cas de test
"a" -> "a"
" abc" -> "abc"
" abc\n def\n ghi" -> " abc\ndef\n ghi"
" a\n b\n c" -> "a\nb\nc"
" a\n b\n c\nd" -> " a\n b\n c\nd"
" a b\n c d\n e f" -> "a b\n c d\n e f"
Par exemple, le dernier cas de test est
a b
c d
e f
et devrait ressembler à ceci après avoir supprimé les espaces de tête:
a b
c d
e f
la source
Réponses:
CJam,
2014 octetsAlgorithme :
qN/_
)z{S-}#
)f>
)N*
)Expansion du code
Essayez-le en ligne ici
la source
Pyth,
19181714 octetsL'implémentation est plutôt cool.
u .z
saisit toutes les lignes de stdin dans un tableau, le placeG
. Ensuite, il évalue le corps intérieur, met le résultatG
et continue de le faire jusqu'à ce qu'il ne change plus (point fixe).!rhCG6
transposeG
, obtient le premier élément du tableau transposé (la première colonne), le supprime de tout espace blanc et vérifie s'il reste des caractères non blancs.La valeur de 2 est un booléen, qui peut être vu comme un entier 0 ou 1.
>R G
saisit ce nombre et tranche ce nombre de caractères à gauche de chaque ligneG
. Les étapes 1, 2 et 3 combinées signifient essentiellement qu'il continuera à supprimer les colonnes d'espaces blancs jusqu'à ce qu'il ne reste plus de colonne d'espaces purs.jb
joint le tableau de lignes par des retours à la ligne et l'imprime.la source
sed - 26 octets
courir avec
-rz
Assez simple:
-r
l'option active les expressions régulières étendues,-z
lit l'entrée entière comme une seule chaîne (utilise en fait l'octet NUL comme délimiteur de ligne)la source
:;N;$!b
ou similaire pour commencer, pour rassembler les lignes d'entrée dans un espace de motif unique? Edit: non, vous ne le faites pas; c'est à ça que-z
sert le drapeau.:;/^\S/M!s/^ //mg;t
-r
SWI-Prolog,
233223217 octetsEdit : complètement changé ma réponse. Il utilise désormais des codes de caractères au lieu de chaînes.
Un exemple d'appeler cela serait
a(` a b\n c d\n e f`).
, avec des guillemets. Vous devrez peut-être utiliser des guillemets doubles à la"
place si vous avez une ancienne distribution SWI-Prolog.la source
Julia,
939281 octets10 octets enregistrés grâce à Glen O.
Cela crée une fonction sans nom qui accepte une chaîne et s'imprime sur stdout.
Non golfé + explication:
la source
minimum([length(search(j, r"^ +")) for j in p])+1
utiliserminimum([search(j,r"[^ ]")[1]for j=p])
. Étant donné que le défi indique que toutes les lignes auront du texte non-espace, il est sûr et vous économise 9 octets (dont 3 enregistrés en utilisant=
au lieu de `dans). Still looking to see if more can be saved. (I wish I could drop the
[1]`, mais la recherche produit un tableau d'énumérateur de type Any, tandis que le minimum requiert un type Int)s->for i=(p=split(s,"\n")) println(i[minimum([search(j,r"[^ ]")[1]for j=p]):end])end
minimum(x)
quandx
un tableau, utilisezmin(x...)
-le pour un octet supplémentaire enregistré (je vais ajouter celui-ci à ma liste de conseils de golf Julia).\S
plutôt que[^ ]
, ce qui économise un octet.\S
est également utile pour ma solution.Java, 159
Parce qu'il y a un manque flagrant de Java ...
C'est juste des boucles comparant la longueur à la longueur coupée, puis crachant des sous-chaînes. Rien d'extraordinaire. Pour les personnes déficientes avec la barre de défilement:
la source
Perl,
4733Merci @ThisSuitIsBlackNot pour la suggestion d'utiliser la boucle implicite de Perl
Ce qui précède est marqué comme 30 octets pour la ligne de code + 3 pour les
00p
drapeaux.Version originale, en fonction:
Cela place l'argument dans
$_
, puis tente de faire correspondre avec avidité les espaces blancs présents sur toutes les lignes avec/^( +).*(\n\1.*)*$/
- en cas de succès,$1
contient maintenant le préfixe commun le plus long, et nous exécutons le remplacements/^$1//mgr
pour le supprimer du début de chaque ligne et renvoyer la chaîne résultante.Tester
la source
perl -00pe '/^( +).*(\n\1.*)*$/&&s/^$1//mg'
(30 octets + 3 pour00p
)./me
se dirige vers le haut-00p
; merci @ThisSuitPython 2,
867975 octetsCela peut presque certainement être raccourci un peu plus, mais pour l'instant ce n'est pas mauvais.
Merci à xnor pour avoir économisé 4 octets!
la source
x.find(x.strip())
.input()
en Python 2 s'étoufferait avec ces données.):
Ruby:
7773706665585740 caractèresExemple d'exécution:
la source
f=->t{t.gsub /^#{t.scan(/^ */).min}/,""}
?C #, 18 + 145 = 163 octets
Requiert (18 octets):
Méthode (145 octets):
La méthode calcule le plus petit nombre d'espaces de tête sur les lignes et crée une nouvelle chaîne construite à partir de toutes les lignes, avec N caractères ignorés (où N est le nombre calculé précédemment).
la source
C #, 149 octets au total
Pratiquement la même solution que celle de ProgramFOX, bien que le nombre de caractères à découper soit calculé manuellement.
Et la fonction elle-même:
la source
Python 3, 100
la source
JavaScript, ES6,
8986 octetsCelui-ci utilise totalement la correspondance et les substitutions RegEx.
Comme toujours, Firefox uniquement, depuis ES6. Ajoutera la version ES5 plus tard.
la source
K, 31 octets
Prend en entrée une liste de chaînes et imprime le résultat sur stdout.
la source
Haskell, 52 octets
Exemple d'utilisation:
unlines.until(any(/=' ').map head)(map tail).lines $ " abc\n def\n ghi"
->" abc\ndef\n ghi\n"
Comment ça fonctionne:
la source
Python, 94/95
lambda (94 octets):
déf (95 octets)
la source
bash + sed + coreutils,
74,56, 55Données de test
Répondre
Production
la source
cut -c$[`grep -o '^ *'<<<"$s"|sort|sed q|wc -c`]-<<<"$s"
$[]
arithmétique. L'utilisationcut
de la sélection de colonnes est bien meilleure. Je n'ai jamais vused q
d'alternative àhead -n1
, c'est un bon truc de golf. Merci!head -n1
vssed q
, il y a unline
outil dans le paquet util-linux.R,
118111 octetsUtilisation des merveilleuses fonctions de chaîne de R :) Ceci est similaire / identique aux autres solutions déjà publiées. L'entrée se fait via STDIN et les chats vers STDOUT.
Test et explication
la source
Julia,
726261575449 octetsNon golfé:
Ancienne solution (57 octets):
Solution d'origine (72 octets):
la source
k (24 octets)
Prend une chaîne comme argument et renvoie une chaîne (avec une nouvelle ligne de fin).
Exemple:
la source
05AB1E , 10 octets
Essayez-le en ligne!
la source
*
répète la chaîne b un certain nombre de fois? .. Ne connaissait pas cette fonctionnalité de*
. Je fais d'habitudes∍
(permuter et allonger) quand je veux répéter un certain caractère.и
produit une liste de caractères.Gawk,
101100Par exemple...
Production...
la source
/^( +)/
→/^ +/
(vous aurez alors la valeur nécessaire à lat[0]
place det[1]
); changers==""
→!s
; supprimer le{
et}
autour du code aprèsif
; supprimer l';
avant}
; en utilisant la fonction spécifique à Gawk pour pouvoir supprimer le{
et}
autour du code aprèsfor
:{sub(s,"",z[r]);print z[r]}
→print gensub(s,"",1,z[r])
.C GCC, 74 octets
Supprime uniquement tous les espaces, sans rapport avec les lignes précédentes, demandant de l'aide pour terminer. ÉGALEMENT, en termes d'espaces communs, le PO signifie-t-il que la ligne a le moins d'espaces de tête, c'est-à-dire le nombre d'espaces à supprimer de chaque ligne?
la source
Empilé , non concurrentiel, 43 octets
Essayez-le en ligne!
Cela fonctionne en trouvant la quantité d'espaces au début de chaque ligne (
'^ +'match$#'"!
), en obtenant le minimum, en répétant un espace autant de fois et en le remplaçant par rien sur chaque ligne.la source
Vim,
33, 31 octetsEssayez-le en ligne!
Ancienne version:
la source
Stax , 9 octets
Exécuter et déboguer
la source
CoffeeScript, 112 octets
la source
JavaScript (ES6),
10698 octetsLes sauts de ligne sont nécessaires et comptent pour 1 octet chacun:
Démo
Comme pour les autres réponses ES6, elles ne fonctionnent que dans Firefox pour le moment.
la source
JavaScript ES6, 85 octets
Les nouvelles lignes sont significatives
Démo ES5:
la source
JavaScript ( ES6 ) 56
Récursif, essayant de supprimer un espace à la fois de chaque ligne jusqu'à ce qu'un non-espace soit trouvé.
Testez l'exécution de l'extrait ci-dessous - étant ES6, Firefox uniquement
la source