Ce défi est similaire à l'ancien , mais avec certaines parties floues de la spécification et des exigences d'E / S moins strictes.
Étant donné l'entrée d'une chaîne composée uniquement d'ASCII imprimables et de sauts de ligne, affichez ses diverses métriques (octet, mot, nombre de lignes).
Les mesures que vous devez générer sont les suivantes:
Nombre d'octets. Étant donné que la chaîne d'entrée reste en ASCII, il s'agit également du nombre de caractères.
Nombre de mots. Il s'agit de
wc
la définition d'un "mot:" n'importe quelle séquence non blanche. Par exemple,abc,def"ghi"
est un «mot».Nombre de lignes. Cela va de soi. L'entrée contiendra toujours une nouvelle ligne de fin, ce qui signifie que le nombre de lignes est synonyme de «nombre de nouvelles lignes». Il n'y aura jamais plus d'un seul saut de ligne.
La sortie doit reproduire exactement la wc
sortie par défaut (à l'exception du nom de fichier):
llama@llama:~$ cat /dev/urandom | tr -cd 'A-Za-z \n' | head -90 > example.txt
llama@llama:~$ wc example.txt
90 165 5501 example.txt
Notez que le nombre de lignes vient en premier, puis le nombre de mots et enfin le nombre d'octets. De plus, chaque comptage doit être rempli à gauche avec des espaces de sorte qu'ils soient tous de la même largeur. Dans l'exemple ci-dessus, 5501
est le nombre "le plus long" à 4 chiffres, il 165
est donc rempli d'un espace et 90
de deux. Enfin, les numéros doivent tous être joints en une seule chaîne avec un espace entre chaque numéro.
Puisqu'il s'agit de code-golf , le code le plus court en octets gagnera.
(Oh, et au fait ... vous ne pouvez pas utiliser la wc
commande dans votre réponse. Au cas où ce n'était pas déjà évident.)
Cas de test ( \n
représente une nouvelle ligne; vous pouvez également avoir éventuellement besoin d'une nouvelle ligne supplémentaire):
"a b c d\n" -> "1 4 8"
"a b c d e f\n" -> " 1 6 12"
" a b c d e f \n" -> " 1 6 16"
"a\nb\nc\nd\n" -> "4 4 8"
"a\n\n\nb\nc\nd\n" -> " 6 4 10"
"abc123{}[]()...\n" -> " 1 1 16
"\n" -> "1 0 1"
" \n" -> "1 0 4"
"\n\n\n\n\n" -> "5 0 5"
"\n\n\na\nb\n" -> "5 2 7"
Réponses:
Perl, 49 octets
+3 ajouté pour
-an0
Entrée sur STDIN ou 1 ou plusieurs noms de fichiers comme arguments. Courir comme
perl -an0 wc.pl
wc.pl
:Explication:
la source
Python 2,
10077 octetsCette solution est une fonction Python qui accepte une chaîne de plusieurs lignes et imprime les nombres requis sur stdout. Notez que j'utilise une chaîne de format pour créer une chaîne de format (qui nécessite un
%%
pour échapper au premier espace réservé de format).Edit: 23 octets enregistrés grâce aux optimisations d'impression de Dennis.
Avant la minifiante, cela ressemble à ceci:
la source
Pyth, 21 octets
Suite de tests
Pyth a de très belles fonctionnalités intégrées ici. Nous commençons par faire une liste (
[
) des sauts de ligne dans la chaîne (@bQ
), les mots dans la chaîne (cQ)
) et la chaîne elle-même (Q
). Ensuite, nous ajoutons (.[
) la longueur de chaque chaîne (ld
) avec des espaces (;
dans ce contexte) à la longueur du nombre de caractères (l`lQ
). Enfin, rejoignez les espaces (jd
).la source
POSIX awk,
79756765 octetsEdit: sauvé 4 octets depuis POSIX permet un nu
length
, sauvé 7 octets en actualisant la partie d'invocation, et sauvé deux octets grâce à l'astuce de Doorknob pour l'ajouterd %
àd
.C'était à l'origine pour GNU awk, mais le mieux que je puisse dire, c'est qu'il utilise uniquement la fonctionnalité POSIX awk.
Mieux formaté:
la source
d
delength(c)"d %"
devrait vous permettre de changer l'printf
à"%"d d"d\n"
, qui permet d' économiser deux octets.Sérieusement , 39 octets
Essayez-le en ligne!
Explication (les nouvelles lignes sont remplacées par
\n
):la source
AppleScript, 253 octets
Cela suppose que les délimiteurs d'éléments de texte d'AppleScript sont définis sur l'espace (si j'ai besoin de compter les éléments pour forcer cette hypothèse, je vais l'ajouter).
la source
CJam,
3126 octetsEssayez-le en ligne!
Comment ça marche
la source
Julia,
11281 octetsIl s'agit d'une fonction qui accepte une chaîne et renvoie une chaîne.
Nous enregistrons les éléments suivants en tant qu'arguments de fonction:
n = endof
, qui obtient le dernier index d'une collection indexable (dans ce cas est la longueur de la chaîne)l = "$(n(s))
, la longueur de l'entrée convertie en chaîne à l'aide d'une interpolationg
qui accepte une expression régulière et renvoie la longueur - 1 de la division d'entrée sur cette expression régulière, remplie à gauche d'espaces correspondant à la longueur del
.Nous obtenons le nombre de lignes en utilisant
g(r"\n")
et le nombre de mots en utilisantg(r"\S+")
, puis nous les joignons ensemble avecl
délimités par des espaces.Enregistré 31 octets grâce à Dennis!
la source
MATL, 38 octets
Vous pouvez l' essayer en ligne! Mais cela ne devrait pas être si long ...
Explication, pour le calcul,
La dernière partie fait le formatage de sortie
la source
!3Z"vX:!
parZ{Zc
(cellstr
suivi parstrjoin
)JavaScript (ES6), 115 octets
Ne nécessite aucune entrée. Le formatage a été douloureux. S'il y avait une limite supérieure sur la quantité de rembourrage, je pourrais réduire
(' '.repeat(99)+n)
à quelque chose de plus court, par exemple` ${n}`
.la source
/[^]/g
par/./g
pour économiser deux octetsPowerShell, 140 octets
(nouvelle ligne laissée pour plus de clarté: D)
La première ligne prend une entrée
$a
, puis la partie suivante est une seule instruction. Nous définissons$c
égal à une chaîne.length
. Cela formera notre rembourrage requis. À l'intérieur de la chaîne se trouve un bloc de code immédiat$(...)
, de sorte que le code sera exécuté avant d'être évalué dans la chaîne.Dans le bloc de code, nous envoyons trois éléments via la
|sort
commande, puis prenons le plus gros(...)[-1]
. C'est là que nous veillons à obtenir les colonnes à la bonne largeur. Les trois éléments sont$l
le nombre de lignes, où nous-split
sur les nouvelles lignes, le$w
nombre de mots, où nous-split
sur les espaces blancs et$b
la longueur.La deuxième ligne est notre sortie en utilisant l'
-f
opérateur (qui est un pseudo-raccourci pourString.Format()
). C'est une autre façon d'insérer des variables développées dans des chaînes. Ici, nous disons que nous voulons que toute la sortie soit complétée vers la gauche afin que chaque colonne soit$c
large. Le rembourrage se fait via des espaces. Le0
,1
et2
correspondent à la$l
,$w
et$b
qui sont des arguments pour l'opérateur de format, de sorte que le nombre de lignes, le nombre de mots, et le nombre d'octets sont rembourrés et de sortie de manière appropriée.Notez que cela nécessite soit que la chaîne ait des sauts de ligne déjà développés (par exemple, en faisant un
Get-Content
sur un fichier texte ou quelque chose, puis en canalisant ou en enregistrant cela dans une variable, puis en appelant ce code sur cette entrée), ou utilisez le PowerShell- caractères d'échappement de style avec des crochets (ce qui signifie`n
au lieu de\n
).Exemple
la source
Gelée , 14 octets
Essayez-le en ligne!
-1 merci à Dennis .
la source
Rubis, 108 octets
la source
Perl,
716261 octetscomprend +1 pour
-n
Commenté:
la source
y///c
comme une longueur plus courte de$_
.split$"
en contexte scalaire donne le nombre de mots en$_
. En utilisant une variable de ponctuation comme$;
au lieu de$W
vous pouvez mettred
juste après l'interpolation dans la chaîne de format. Ensuite , vous pouvez laisser tomber led
dans$W
et déposez la parenthèse. Et-p
ne gagne rien de plus-n
, laissez simplementprintf
faire l'impression (ajoutez une nouvelle ligne au goût)$a=foo;$b=bar$a
peut généralement s'écrire en$b=bar($a=foo)
économisant un octet. Applicable ici à$;
et$b
. Vous ne vous souciez pas si$;
est recalculé à chaque foisLua,
7466 octetsGolfé:
Non golfé:
Reçoit des entrées via des arguments de ligne de commande.
Nous renommons le premier argument (
arg[1]
) pour économiser des octets.string.gsub
renvoie le nombre de remplacements ainsi que la chaîne modifiée, nous utilisons donc cela pour compter d'abord'\n'
(les nouvelles lignes), puis'%S+'
(les instances d'un ou plusieurs caractères non blancs, autant que possible, c'est-à-dire les mots). Nous pouvons utiliser tout ce que nous voulons pour la chaîne de remplacement, nous utilisons donc la chaîne vide (''
) pour enregistrer les octets. Ensuite, nous utilisons simplementstring.len
pour trouver la longueur de la chaîne, c'est-à-dire le nombre d'octets. Enfin, nous imprimons tout.la source
Rétine, 65
Essayez-le en ligne!
La première étape est le programme wc réel, le reste est pour le rembourrage. L'
a
espace réservé n'est probablement pas nécessaire, et certains des groupes peuvent probablement être un peu simplifiés.la source
Haskell, 140 octets
La version non golfée est ci-dessous, avec des noms de variables et de fonctions étendus:
Il s'agit d'une fonction qui accepte une chaîne et renvoie une chaîne. Il utilise simplement les
Prelude
fonctionswords
(resp.lines
) Pour obtenir le nombre de mots (resp. Lignes) étant donné qu'ils semblent utiliser la même définition quewc
, puis obtient la valeur la plus longue (sous forme de chaîne) parmi les décomptes et utilise le format printf en prenant la largeur parmi ses arguments pour le formatage.la source
C,
180178 octetsla source
05AB1E ,
2423 octetsj
est actuellement bogue, donc aurait pu être de 21 octets sans le§
etJ
..Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Pip
-s
, 25 octetsPrend la chaîne multiligne comme argument de ligne de commande. Essayez-le en ligne!
Merci à la réponse CJam de Dennis de m'avoir fait réaliser que le nombre le plus long est toujours le nombre de caractères.
Explication
Voici une solution de 29 octets avec des indicateurs
-rs
qui prend l'entrée de stdin:Essayez-le en ligne!
la source
Powershell,
123115 octetsScript de test:
Sortie:
Explication:
$args|% t*y
divise les chaînes d'argument en caractèresswitch -r($args|% t*y)
évaluer tous les cas correspondants'\s'
cas pour tout espace blanc'\S'
cas pour tout espace non blanc'(?s).'
étui pour tout caractère (nouvelle ligne incluse)'\n'
cas pour newline char (newline se représente)$c="$b".Length
calculer une longueur de nombre d'octets. $ b est toujours max ($ l, $ w, $ b) par conception"{0,$c} {1,$c} $b"-f$l,+$w
formater des nombres de même longueur. La variable $ w est convertie en int. Il a besoin de chaînes sans mots. Les autres variables formatent «telles quelles» car «L'entrée contiendra toujours une nouvelle ligne de fin» et $ l et $ b ne peuvent pas être 0.la source