Le défi:
Construisez un graphique ASCII des mots les plus couramment utilisés dans un texte donné.
Les règles:
- N'acceptez
a-z
etA-Z
(caractères alphabétiques) que dans le cadre d'un mot. - Ignorez le boîtier (
She
==she
pour notre propos). - Ignorez les mots suivants (assez arbitraires, je sais):
the, and, of, to, a, i, it, in, or, is
Clarification: considérant
don't
: cela serait considéré comme 2 «mots» différents dans les plagesa-z
etA-Z
: (don
ett
).Facultativement (il est trop tard pour modifier formellement les spécifications maintenant), vous pouvez choisir de supprimer tous les «mots» à une seule lettre (cela pourrait également réduire la liste des ignorés).
Analysez un donné text
(lisez un fichier spécifié via des arguments de ligne de commande ou insérez-le; présume us-ascii
) et construisez-nous un word frequency chart
avec les caractéristiques suivantes:
- Affichez le graphique (voir également l'exemple ci-dessous) pour les 22 mots les plus courants (classés par fréquence décroissante).
- La barre
width
représente le nombre d'occurrences (fréquence) du mot (proportionnellement). Ajoutez un espace et imprimez le mot. - Assurez-vous que ces barres (plus espace-mot-espace) correspondent toujours :
bar
+[space]
+word
+[space]
doit toujours être <=80
caractères (assurez-vous de prendre en compte les différentes longueurs de barre et de mot possibles: par exemple: le deuxième mot le plus courant pourrait être beaucoup plus long alors le premier tout en ne différant pas tellement en fréquence). Maximisez la largeur de la barre dans ces contraintes et mettez à l'échelle les barres de manière appropriée (en fonction des fréquences qu'elles représentent).
Un exemple:
Le texte de l'exemple peut être trouvé ici ( Alice's Adventures in Wonderland, par Lewis Carroll ).
Ce texte spécifique donnerait le graphique suivant:
_________________________________________________________________________ | _________________________________________________________________________ | elle | _______________________________________________________________ | tu | ____________________________________________________________ | m'a dit | ____________________________________________________ | Alice | ______________________________________________ | était | __________________________________________ | cette | ___________________________________ | comme | _______________________________ | sa | ____________________________ | avec | ____________________________ | à | ___________________________ | s | ___________________________ | t | _________________________ | sur | _________________________ | tout | ______________________ | ce | ______________________ | pour | ______________________ | eu | _____________________ | mais | ____________________ | être | ____________________ | ne pas | ___________________ | ils | __________________ | alors
Pour votre information: voici les fréquences sur lesquelles le tableau ci-dessus est construit:
[('elle', 553), ('vous', 481), ('a dit', 462), ('alice', 403), ('était', 358), ('que ', 330), (' as ', 274), (' her ', 248), (' with ', 227), (' at ', 227), (' s ', 219), (' t ' , 218), ('on', 204), ('all', 200), ('this', 181), ('for', 179), ('had', 178), (' mais ', 175), (' être ', 167), (' pas ', 166), (' ils ', 155), (' so ', 152)]
Un deuxième exemple (pour vérifier si vous avez implémenté la spécification complète):
remplacez chaque occurrence de you
dans le fichier Alice in Wonderland lié par superlongstringstring
:
________________________________________________________________ | ________________________________________________________________ | elle | _______________________________________________________ | superlongstringstring | _____________________________________________________ | m'a dit | ______________________________________________ | Alice | ________________________________________ | était | _____________________________________ | cette | ______________________________ | comme | ___________________________ | sa | _________________________ | avec | _________________________ | à | ________________________ | s | ________________________ | t | ______________________ | sur | _____________________ | tout | ___________________ | ce | ___________________ | pour | ___________________ | eu | __________________ | mais | _________________ | être | _________________ | ne pas | ________________ | ils | ________________ | alors
Le gagnant:
Solution la plus courte (par nombre de caractères, par langue). S'amuser!
Edit : Tableau résumant les résultats à ce jour (15/02/2012) (initialement ajouté par l'utilisateur Nas Banov):
Langue Relaxed Strict ========= ======= ====== GolfScript 130 143 Perl 185 Windows PowerShell 148 199 Mathematica 199 Rubis 185205 Chaîne d'outils Unix 194228 Python 183 243 Clojure 282 Scala 311 Haskell 333 Awk 336 R 298 Javascript 304 354 Groovy 321 Matlab 404 C # 422 Smalltalk 386 450 PHP F # 452 TSQL 483 507
Les nombres représentent la longueur de la solution la plus courte dans une langue spécifique. «Strict» fait référence à une solution qui implémente complètement la spécification (dessine des |____|
barres, ferme la première barre en haut avec une ____
ligne, tient compte de la possibilité de mots longs avec une fréquence élevée, etc.). «Relaxed» signifie que certaines libertés ont été prises pour se raccourcir en solution.
Seules les solutions plus courtes que 500 caractères sont incluses. La liste des langues est triée par la longueur de la solution «stricte». «Unix Toolchain» est utilisé pour désigner diverses solutions qui utilisent le shell * nix traditionnel plus un mélange d'outils (comme grep, tr, sort, uniq, head, perl, awk).
la source
s
ett
sont représentés.Réponses:
LabVIEW 51 nœuds, 5 structures, 10 diagrammes
Apprendre à l'éléphant à claquettes n'est jamais joli. Je vais, ah, sauter le nombre de caractères.
Le programme se déroule de gauche à droite:
la source
Ruby 1.9, 185 caractères
(fortement basé sur les autres solutions Ruby)
Au lieu d'utiliser des commutateurs de ligne de commande comme les autres solutions, vous pouvez simplement passer le nom de fichier comme argument. (ie
ruby1.9 wordfrequency.rb Alice.txt
)Puisque j'utilise des caractères littéraux ici, cette solution ne fonctionne que dans Ruby 1.9.
Edit: Remplacement des points-virgules par des sauts de ligne pour «lisibilité». : P
Edit 2: Shtééf a fait remarquer que j'avais oublié l'espace de fin - corrigé ça.
Edit 3: Suppression de l'espace de fin à nouveau;)
la source
GolfScript,
177175173167164163144131130 caractèresLent - 3 minutes pour l'exemple de texte (130)
Explication:
"Correct" (espérons-le). (143)
Moins lent - une demi-minute. (162)
Sortie visible dans les journaux de révision.
la source
206
shell, grep, tr, grep, tri, uniq, tri, tête, perl
hm, juste vu ci-dessus:sort -nr
->sort -n
puishead
->tail
=> 208 :)update2: euh, bien sûr, ce qui précède est idiot, car il sera alors inversé. Donc, 209.
update3: optimisation de l'expression rationnelle d'exclusion -> 206
pour le plaisir, voici une version uniquement perl (beaucoup plus rapide):
la source
Transact SQL set solution basée sur (SQL Server 2005)
1063892873853827820783683647644630 caractèresMerci à Gabe pour quelques suggestions utiles pour réduire le nombre de caractères.
NB: Les sauts de ligne ajoutés pour éviter les barres de défilement, seul le dernier saut de ligne est requis.
Version lisible
Production
Et avec la longue corde
la source
0.000
à juste0
, puis d’utiliser-C
au lieu de1.0/C
. Et faireFLOAT
enREAL
sauvera aussi un coup. Le plus important, cependant, est qu'il semble que vous ayez beaucoup d'AS
instances qui devraient être facultatives.SELECT [ ] FROM (SELECT $0 O, ' '+REPLICATE('_', MAX(C)*@F)+' ' [ ] FROM # UNION SELECT $1/C, '|'+REPLICATE('_',C*@F)+'| '+W FROM #)X ORDER BY O
?Ruby
207213211210207203201200 caractèresUne amélioration sur Anurag, incorporant la suggestion de rfusca. Supprime également l'argument à trier et quelques autres golfs mineurs.
Exécuter en tant que:
Edit: remettre 'met', doit être là pour éviter d'avoir des guillemets en sortie.
Edit2: Changed File-> IO
Edit3: supprimé / i
Edit4: Suppression des parenthèses autour de (f * 1.0), racontée
Edit5: Utilisez l'ajout de chaîne pour la première ligne; se développer
s
sur place.Edit6: Made m float, supprimé 1.0. EDIT: ne fonctionne pas, change de longueur. EDIT: pas pire qu'avant
Edit7: utiliser
STDIN.read
.la source
Mathematica (
297284248244242199) caractères pur fonctionnelet Test de la loi de Zipf
Regarde maman ... pas de vars, pas de mains, pas de tête
Edit 1> quelques raccourcis définis (284 caractères)
Quelques explications
Production
texte alternatif http://i49.tinypic.com/2n8mrer.jpg
Mathematica n'est pas bien adapté pour le golf, et c'est simplement à cause des noms de fonctions longs et descriptifs. Des fonctions comme "RegularExpression []" ou "StringSplit []" me font juste sangloter :(.
Test de la loi de Zipf
La loi de Zipf prédit que pour un texte en langage naturel, le tracé Log (Rang) vs Log (occurrences) suit une relation linéaire .
La loi est utilisée dans le développement d'algorithmes pour la criptographie et la compression de données. (Mais ce n'est PAS le "Z" dans l'algorithme LZW).
Dans notre texte, nous pouvons le tester avec ce qui suit
Le résultat est (plutôt bien linéaire)
texte alternatif http://i46.tinypic.com/33fcmdk.jpg
Modifier 6> (242 caractères)
Refactorisation de l'expression régulière (plus de fonction Select)
Suppression de mots de 1 caractère
Définition plus efficace de la fonction "f"
Modifier 7 → 199 caractères
f
par les argumentsTranspose
etSlot
(#1
/#2
).f@x
plutôt quef[x]
si possible)la source
|i|
est redondant dans votre regex car vous l'avez déjà.|
.C # -
510451436446434426422 caractères (minified)Pas si court, mais maintenant probablement correct! Notez que la version précédente n'affichait pas la première ligne des barres, ne mettait pas à l'échelle les barres correctement, téléchargeait le fichier au lieu de l'obtenir à partir de stdin et n'incluait pas toute la verbosité C # requise. Vous pourriez facilement raser de nombreux traits si C # n'avait pas besoin de tant de merde supplémentaire. Peut-être que Powershell pourrait faire mieux.
422 caractères avec lentiviseur en ligne (ce qui le rend 22 fois plus lent) sous la forme ci-dessous (retours à la ligne utilisés pour certains espaces):
la source
Perl,
237229209 caractères(Mis à jour à nouveau pour battre la version Ruby avec des tours de golf plus sales, en remplaçant
split/[^a-z/,lc
aveclc=~/[a-z]+/g
, et en éliminant un chèque de chaîne vide dans un autre endroit. Ceux - ci ont été inspirés par la version Ruby, donc le crédit où le crédit est dû.)Mise à jour: maintenant avec Perl 5.10! Remplacez
print
parsay
et utilisez~~
pour éviter unmap
. Cela doit être appelé sur la ligne de commande en tant queperl -E '<one-liner>' alice.txt
. Puisque le script entier est sur une seule ligne, l'écrire en une seule ligne ne devrait pas présenter de difficulté :).Notez que cette version se normalise pour le cas. Cela ne raccourcit pas la solution, car la suppression
,lc
(pour le cas inférieur) vous oblige à ajouterA-Z
à l'expression régulière fractionnée, donc c'est un lavage.Si vous êtes sur un système où une nouvelle ligne est un caractère et non deux, vous pouvez la raccourcir de deux autres caractères en utilisant une nouvelle ligne littérale à la place de
\n
. Cependant, je n'ai pas écrit l'exemple ci-dessus de cette façon, car c'est "plus clair" (ha!) De cette façon.Voici une solution perl généralement correcte, mais pas assez courte:
Ce qui suit est à peu près aussi court que possible tout en restant relativement lisible. (392 caractères).
la source
foreach
s peuvent être écrits comme l'for
art. C'est 8 caractères plus bas. Ensuite, vous avez legrep{!($_~~@s)}map{lc=~/[a-z]+/g}<>
, qui, je crois, pourrait être écrit de manièregrep{!(/$_/i~~@s)}<>=~/[a-z]+/g
à 4 descendre davantage. Remplacez le" "
par$"
et vous êtes en baisse 1 de plus ...sort{$c{$b}-$c{$a}}...
pour en sauver deux de plus. Vous pouvez également passer juste au%c
lieu dekeys %c
lasort
fonction et sauver quatre autres.Windows PowerShell, 199 caractères
(Le dernier saut de ligne n'est pas nécessaire, mais inclus ici pour plus de lisibilité.)
(Code actuel et mes fichiers de test disponibles dans mon référentiel SVN . J'espère que mes cas de test détectent les erreurs les plus courantes (longueur de la barre, problèmes de correspondance regex et quelques autres))
Hypothèses:
L'histoire
Version détendue (137), puisque cela est compté séparément maintenant, apparemment:
Les variations des longueurs de barre d'un caractère par rapport à d'autres solutions sont dues au fait que PowerShell utilise l'arrondi au lieu de la troncature lors de la conversion des nombres à virgule flottante en nombres entiers. Étant donné que la tâche ne nécessitait qu'une longueur de barre proportionnelle, cela devrait être bien, cependant.
Par rapport à d'autres solutions, j'ai adopté une approche légèrement différente pour déterminer la longueur de barre la plus longue en essayant simplement et en prenant la longueur la plus élevée où aucune ligne ne dépasse 80 caractères.
Une version plus ancienne expliquée peut être trouvée ici .
la source
-split("\b(?:the|and|of|to|a|i[tns]?|or)\b|[^a-z]")
? Ça marche pour moi."|$('_'*($w*$_.count/$x[0].count))| $($_.name) "
(ou d'éliminer le dernier espace, car c'est en quelque sorte automatique). Et vous pouvez utiliser-split("(?:\b(?:the|and|of|to|a|i[tns]?|or)\b|[^a-z])+")
pour en enregistrer quelques autres en n'incluant pas les blancs (ou l'utilisation[-2..-23]
).Rubis, 215,
216,218,221,224,236,237caractèresmise à jour 1: Hourra ! C'est un lien avec la solution de JS Bangs . Je ne peux plus penser à un moyen de réduire plus :)
mise à jour 2: joué un sale tour de golf. Changé
each
pourmap
enregistrer 1 caractère :)mise à jour 3: changé
File.read
enIO.read
+2.Array.group_by
n'était pas très fructueux, changé enreduce
+6. La vérification insensible à la casse n'est pas nécessaire après la casse inférieure avecdowncase
dans regex +1. Le tri par ordre décroissant se fait facilement en annulant la valeur +6. Économies totales +15mise à jour 4:
[0]
plutôt que.first
, +3. (@ Shtééf)mise à jour 5: Développer la variable
l
sur place, +1. Développer la variables
sur place, +2. (@ Shtééf)mise à jour 6: utilisez l'addition de chaîne plutôt que l'interpolation pour la première ligne, +2. (@ Shtééf)
mise à jour 7: J'ai traversé un tas de battages pour détecter la première itération à l' intérieur de la boucle, en utilisant des variables d'instance. Tout ce que j'ai, c'est +1, bien qu'il y ait peut-être du potentiel. Préserver la version précédente, car je crois que celle-ci est de la magie noire. (@ Shtééf)
Version lisible
Utiliser:
Production:
la source
scan
, cependant, m'a donné une meilleure idée, alors j'ai pris de l'avance :).Python 2.x, approche latitudinaire =
227183caractèresPermettant la liberté dans l'implémentation, j'ai construit une concaténation de chaînes qui contient tous les mots demandés pour l'exclusion (
the, and, of, to, a, i, it, in, or, is
) - plus elle exclut également les deux infâmes "mots"s
ett
de l'exemple - et j'ai ajouté gratuitement l'exclusion pouran, for, he
. J'ai essayé toutes les concaténations de ces mots contre le corpus des mots d'Alice, de la Bible du roi Jacques et du fichier Jargon pour voir s'il y a des mots qui seront mal exclus par la chaîne. Et c'est ainsi que j'ai terminé avec deux chaînes d'exclusion:itheandtoforinis
etandithetoforinis
.PS. emprunté à d'autres solutions pour raccourcir le code.
Rant
Concernant les mots à ignorer, on pourrait penser que ceux-ci seraient tirés de la liste des mots les plus utilisés en anglais. Cette liste dépend du corpus de texte utilisé. Selon l'une des listes les plus populaires ( http://en.wikipedia.org/wiki/Most_common_words_in_English , http://www.english-for-students.com/Frequent-Used-Words.html , http: // www. sporcle.com/games/common_english_words.php ), les 10 principaux mots sont:
the be(am/are/is/was/were) to of and a in that have I
Les 10 premiers mots du texte d'Alice au pays des merveilles sont
the and to a of it she i you said
Les 10 premiers mots du fichier Jargon (v4.4.7) sont
the a of to and in is that or for
La question est donc de savoir pourquoi a
or
été inclus dans la liste des ignorés du problème, où sa popularité est ~ 30e alors que le motthat
(8e le plus utilisé) ne l'est pas. etc, etc. Par conséquent, je crois que la liste des ignorés devrait être fournie dynamiquement (ou pourrait être omise).Une autre idée serait simplement de sauter les 10 premiers mots du résultat - ce qui raccourcirait en fait la solution (élémentaire - n'afficher que les 11e à 32e entrées).
Python 2.x, approche pointilleuse =
277243caractèresLe graphique dessiné dans le code ci-dessus est simplifié (en utilisant un seul caractère pour les barres). Si l'on veut reproduire exactement le graphique à partir de la description du problème (ce qui n'était pas obligatoire), ce code le fera:
Je pose un problème avec le choix quelque peu aléatoire des 10 mots à exclure
the, and, of, to, a, i, it, in, or, is
afin qu'ils soient passés en tant que paramètres de ligne de commande, comme ceci:python WordFrequencyChart.py the and of to a i it in or is <"Alice's Adventures in Wonderland.txt"
C'est 213 caractères + 30 si l'on tient compte de la liste des ignorés "d'origine" passée sur la ligne de commande = 243
PS. Le deuxième code fait également un «ajustement» pour les longueurs de tous les premiers mots, de sorte qu'aucun d'entre eux ne débordera en cas de dégénération.
la source
\W
ou l'utilisation\b
dans une expression régulière, car celles-ci ne sont probablement pas conformes aux spécifications, ce qui signifie qu'elles ne seront pas divisées en chiffres ou_
qu'elles pourraient également ne pas supprimer les mots vides des chaînes. commethe_foo_or123bar
. Ils peuvent ne pas apparaître dans le texte du test, mais la spécification est assez claire dans ce cas.sys.argv
hack et en utilisant:re.findall(r'\b(?!(?:the|and|.|of|to|i[tns]|or)\b)\w+',sys.stdin.read().lower())
Haskell -
366351344337333 caractères(Un saut de ligne
main
ajouté pour plus de lisibilité, et aucun saut de ligne nécessaire à la fin de la dernière ligne.)Comment cela fonctionne est mieux vu en lisant l'argument à l'
interact
envers:map f
l'alphabet en minuscules, remplace tout le reste par des espaces.words
produit une liste de mots, en supprimant l'espace blanc de séparation.filter (
notElemwords "the and of to a i it in or is")
rejette toutes les entrées contenant des mots interdits.group . sort
trie les mots et regroupe les mots identiques en listes.map h
mappe chaque liste de mots identiques à un tuple du formulaire(-frequency, word)
.take 22 . sort
trie les tuples par fréquence décroissante (la première entrée de tuples) et ne conserve que les 22 premiers tuples.b
mappe les tuples en barres (voir ci-dessous).a
ajoute la première ligne de traits de soulignement pour compléter la barre supérieure.unlines
joint toutes ces lignes avec des nouvelles lignes.Le plus délicat est d'obtenir la bonne longueur de barre. J'ai supposé que seuls les traits de soulignement comptaient dans la longueur de la barre, ce
||
serait donc une barre de longueur nulle. La fonctionb
mappec x
surx
, où sex
trouve la liste des histogrammes. La liste entière est transmise àc
, afin que chaque appel dec
puisse calculer le facteur d'échelle pour lui-même en appelantu
. De cette façon, j'évite d'utiliser des mathématiques en virgule flottante ou des rationnels, dont les fonctions de conversion et les importations mangent beaucoup de caractères.Notez l'astuce d'utilisation
-frequency
. Cela supprime le besoin dereverse
lasort
car le tri (croissant)-frequency
place les mots avec la plus grande fréquence en premier. Plus tard, dans la fonctionu
, deux-frequency
valeurs sont multipliées, ce qui annulera la négation.la source
div
, en fait! Essayez-le - la sortie est incorrecte. La raison en est que faire lediv
avant*
perd de la précision.JavaScript 1.8 (SpiderMonkey) - 354
Malheureusement, la
for([k,v]in z)
version de Rhino ne semble pas vouloir fonctionner dans SpiderMonkey, etreadFile()
est un peu plus facile que de l'utiliser,readline()
mais passer à la version 1.8 nous permet d'utiliser des fermetures de fonctions pour couper quelques lignes de plus ...Ajout d'espaces blancs pour la lisibilité:
Usage:
js golf.js < input.txt
Production:
(version de base - ne gère pas correctement les largeurs de barres)
JavaScript (Rhino) -
405395387377368343304 caractèresJe pense que ma logique de tri est éteinte, mais .. je duno.Brainfart corrigé.Minified (abuser
\n
interprété comme;
parfois):la source
i[tns]?
peu. Très sournois..replace(/[^\w ]/g, e).split(/\s+/).map(
peut être remplacée par.replace(/\w+/g,
et utiliser la même fonction que vous avez.map
fait ... Je ne sais pas non plus si Rhino prend en charge à lafunction(a,b)b.c-a.c
place de votre fonction de tri (spidermonkey le fait), mais ce sera rasage{return }
...b.c-a.c
est un meilleur tri quea.c<b.c
btw ... Modification d'une version de Spidermonkey en bas avec ces changements?:
excellent point de départ pour travailler!Version PHP CLI (450 caractères)
Cette solution prend en compte la dernière exigence que la plupart des puristes ont choisi d'ignorer. Cela a coûté 170 caractères!
Usage:
php.exe <this.php> <file.txt>
Minifié:
Lisible par l'homme:
Production:
Lorsqu'il y a un mot long, les barres sont correctement ajustées:
la source
Python 3.1 -
245229 caractèresJe suppose qu'en utilisant Counter est une sorte de triche :) Je viens de lire à ce sujet il y a environ une semaine, donc c'était l'occasion parfaite de voir comment cela fonctionne.
Imprime:
Une partie du code a été "empruntée" à la solution d'AKX.
la source
open('!')
lit à partir de stdin - quelle version / OS est-ce sur? ou devez-vous nommer le fichier «!»?perl,
205191189 205 caractères / caractères (entièrement mis en œuvre)Certaines parties ont été inspirées par les précédentes soumissions perl / ruby, quelques idées similaires ont été élaborées indépendamment, les autres sont originales. La version plus courte intègre également certaines choses que j'ai vues / apprises d'autres soumissions.
Original:
Dernière version jusqu'à191 caractères:Dernière version jusqu'à 189 caractères:
Cette version (205 caractères) tient compte des lignes avec des mots plus longs que ce qui serait trouvé plus tard.
la source
Perl:
203202201198195208203/231 caractèresAutre implémentation complète incluant le comportement indiqué (global bar-squishing) pour le cas pathologique dans lequel le mot secondaire est à la fois populaire et assez long pour se combiner à plus de 80 caractères ( cette implémentation est de 231 caractères ):
La spécification n'indiquait nulle part que cela devait aller à STDOUT, j'ai donc utilisé warn () de perl au lieu de print - quatre caractères enregistrés ici. Carte utilisée au lieu de foreach, mais j'ai l'impression qu'il pourrait encore y avoir plus d'économies dans le fractionnement (join ()). Pourtant, je l'ai ramené à 203 - pourrait dormir dessus. Au moins Perl est maintenant sous le "shell, grep, tr, grep, sort, uniq, sort, head, perl" char count pour l'instant;)
PS: Reddit dit "Salut";)
Mise à jour: join () supprimée en faveur de l'affectation et de la jointure de conversion scalaire implicite. Jusqu'à 202. Veuillez également noter que j'ai profité de la règle facultative «ignorer les mots d'une lettre» pour supprimer 2 caractères, alors gardez à l'esprit que le nombre de fréquences reflètera cela.
Mise à jour 2: affectation permutée et jointure implicite pour tuer $ / pour obtenir le fichier en une seule prise en utilisant <> en premier lieu. Même taille, mais plus méchant. Remplacé if (! $ Y) {} contre $ y || {} &&, sauvé 1 autre char => 201.
Mise à jour 3: Prise de contrôle précoce des minuscules (lc <>) en déplaçant lc hors du bloc de carte - Échange les deux expressions régulières pour ne plus utiliser l'option / i, car elle n'est plus nécessaire. Construction conditionnelle explicite x? Y: z permutée pour perlgolf traditionnel || construction conditionnelle implicite - /^...$/i?1:$x{$ } ++ pour /^...$/||$x{$ } ++ Trois caractères enregistrés! => 198, a franchi la barrière des 200. Pourrait dormir bientôt ... peut-être.
Mise à jour 4: La privation de sommeil m'a rendu fou. Bien. Plus fou. Figurant que cela n'a qu'à analyser les fichiers texte heureux normaux, je l'ai fait abandonner s'il atteint un null. Sauvé deux caractères. Remplacement de "longueur" par le 1-caractère plus court (et beaucoup plus golfique) y /// c - vous m'entendez, GolfScript ?? Je viens pour toi!!! sanglot
Mise à jour 5: Sleep Dep m'a fait oublier la limite de 22 rangées et la limite de ligne suivante. Sauvegardez jusqu'à 208 avec ceux traités. Pas trop mal, 13 personnages à gérer ce n'est pas la fin du monde. J'ai joué avec l'évaluation en ligne de regex de perl, mais j'ai du mal à le faire fonctionner et enregistrer les caractères ... lol. Mise à jour de l'exemple pour correspondre à la sortie actuelle.
Mise à jour 6: Suppression des accolades inutiles protégeant (...) pour, puisque le bonbon syntaxique ++ permet de le pousser contre le pour heureusement. Merci à la contribution de Chas. Owens (rappelant mon cerveau fatigué), a obtenu la solution de classe de personnage i [tns] là-dedans. Revenons à 203.
Mise à jour 7: Ajout d'un deuxième travail, mise en œuvre complète des spécifications (y compris le comportement d'écrasement de la barre complet pour les mots longs secondaires, au lieu de la troncature que la plupart des gens font, basée sur la spécification d'origine sans le cas d'exemple pathologique)
Exemples:
Mise en œuvre alternative dans l'exemple de cas pathologique:
la source
is|in|it|i
en vous réduisant ài[snt]?
- et il n'y a plus de différence avec la règle facultative. (Hm, je n'aurais jamais pensé à dire à un gars de Perl comment faire Regex: D) - seul problème maintenant: je dois regarder comment je peux raser trois octets de ma propre solution pour être à nouveau meilleur que Perl: - |F #, 452 caractères
Strightforward: obtenez une séquence
a
de paires de nombre de mots, trouvez le meilleur multiplicateur de nombre de mots par colonnek
, puis imprimez les résultats.Exemple (j'ai des nombres de fréquences différents de vous, je ne sais pas pourquoi):
la source
float
s.|>
?Python 2.6, 347 caractères
Production:
la source
bm=(76.-len(W[0][0]))/W[0][1]
puisque vous n'utilisez bm qu'une seule fois (faites la ligne suivanteU=lambda n:"_"*int(n*(76.-len(W[0][0]))/W[0][1])
, rase 5 caractères. Aussi: pourquoi utiliseriez-vous un nom de variable à 2 caractères dans le code de golf? ;-)* sh (+ curl), solution partielle
Ceci est incomplet, mais pour le plaisir, voici la fréquence des mots comptant la moitié du problème dans 192 octets:
la source
Gawk - 336 (à l'origine 507) personnages
(après avoir corrigé le formatage de sortie; réparer le problème des contractions; peaufiner; peaufiner à nouveau; supprimer une étape de tri totalement inutile; peaufiner encore une fois; et encore (oups celui-ci a cassé le formatage); peaufiner un peu plus; relever le défi de Matt je peaufine désespérément tellement plus; trouvé un autre endroit pour en sauvegarder quelques-uns, mais en a rendu deux pour corriger le bogue de longueur de la barre)
Heh heh! Je suis momentanément en avance sur le défi du compteur de solutions [JavaScript de Matt] [1] ! ;) et [le python d'AKX] [2].
Le problème semble appeler un langage qui implémente des tableaux associatifs natifs, alors bien sûr, j'en ai choisi un avec un ensemble horriblement déficient d'opérateurs. En particulier, vous ne pouvez pas contrôler l'ordre dans lequel awk propose les éléments d'une carte de hachage, donc je scanne à plusieurs reprises toute la carte pour trouver l'élément actuellement le plus nombreux, l'imprimer et le supprimer du tableau.
Tout cela est terriblement inefficace, avec toutes les golfifcations que j'ai faites, cela est devenu assez horrible aussi.
Minifié:
les sauts de ligne pour plus de clarté uniquement: ils ne sont pas nécessaires et ne doivent pas être comptés.
Production:
Lisible; 633 caractères (à l'origine 949):
la source
LISP commun, 670 caractères
Je suis un débutant LISP, et c'est une tentative d'utilisation d'une table de hachage pour le comptage (donc probablement pas la méthode la plus compacte).
peut être exécuté par exemple avec
cat alice.txt | clisp -C golf.lisp
.Sous une forme lisible est
la source
C (828)
Il ressemble beaucoup à du code obscurci et utilise glib pour la chaîne, la liste et le hachage. Nombre de caractères avec
wc -m
dit 828 . Il ne considère pas les mots à caractère unique. Pour calculer la longueur maximale de la barre, il faut considérer le mot le plus long possible parmi tous, pas seulement le premier 22. Est-ce un écart par rapport à la spécification?Il ne gère pas les échecs et ne libère pas la mémoire utilisée.
la source
*v=*v*(77-lw)/m
donnera 929. .. mais je pense que ça peut aller à moins que je trouve un moyen de le faire beaucoup plus court)int c
dans lamain
déclaration etmain
est implicitementint
(tout comme les arguments non typées, autant que je sache):main(c){...}
. Vous pourriez probablement aussi simplement écrire à la0
place deNULL
.-Wall
ou avec le-std=c99
drapeau sur ... mais je suppose que c'est inutile pour un code-golf, non?Without freeing memory stuff, it reaches 866 (removed some other unuseful space)
à autre chose pour ne pas laisser penser aux gens que la différence avec la version à mémoire libre réside dans cela: maintenant, la version sans mémoire libre a beaucoup de plus "d'améliorations".Perl, 185 caractères
200 (légèrement cassé)199197195193187185 caractères. Les deux dernières nouvelles lignes sont importantes. Conforme à la spécification.La première ligne charge le nombre de mots valides dans
%X
.La deuxième ligne calcule le facteur de mise à l'échelle minimum pour que toutes les lignes de sortie soient <= 80 caractères.
La troisième ligne (contient deux caractères de nouvelle ligne) produit la sortie.
la source
Java -
886865756744742744752742714680 caractèresMises à jour avant le premier 742 : regex amélioré, suppression des types paramétrés superflus, suppression des espaces blancs superflus.
Mise à jour 742> 744 caractères : correction du hack de longueur fixe. Cela ne dépend que du premier mot, pas d'autres mots (encore). J'ai trouvé plusieurs endroits pour raccourcir le code (
et
\\s
dans regex remplacé parArrayList
remplacé parVector
). Je cherche maintenant un moyen court de supprimer la dépendance Commons IO et la lecture de stdin.Mise à jour 744> 752 caractères : j'ai supprimé la dépendance commune. Il lit maintenant depuis stdin. Collez le texte dans stdin et appuyez sur
Ctrl+Z
pour obtenir le résultat.Mise à jour 752> 742 caractères : J'ai supprimé
public
et un espace, fait de nom de classe 1 caractère au lieu de 2 et il ignore maintenant les mots d'une lettre.Mise à jour 742> 714 caractères : mise à jour selon les commentaires de Carl: suppression de l'affectation redondante (742> 730), remplacée
m.containsKey(k)
parm.get(k)!=null
(730> 728), introduction de la sous-chaîne de la ligne (728> 714).Mise à jour 714> 680 caractères : mise à jour selon les commentaires de Rotsor: amélioration du calcul de la taille de la barre pour supprimer les castes inutiles et amélioration
split()
pour supprimer les inutilesreplaceAll()
.Version plus lisible:
Production:
C'est assez nul que Java n'ait pas
String#join()
et se ferme (encore).Édité par Rotsor:
J'ai apporté plusieurs modifications à votre solution:
Le code condensé contient
688711684 caractères:La version rapide (
720693 caractères)Version plus lisible:
La version sans améliorations de comportement est de 615 caractères:
la source
IOUtils
lieu de l'importer? Pour autant que je sache, vous ne l'utilisez qu'une seule fois de toute façon.b
un String au lieu d'un StringBuffer. Cependant, je ne veux pas penser à ce que serait la performance (d'autant plus que vous ajoutez un personnage à la fois).Scala 2.8, 311
314320330332336341375caractèresy compris l'ajustement des mots longs. Idées empruntées aux autres solutions.
Maintenant sous forme de script (
a.scala
):Courir avec
BTW, l'édition de 314 à 311 caractères ne supprime en fait qu'un seul caractère. Quelqu'un s'est trompé de comptage avant (Windows CR?).
la source
Clojure 282 strict
Un peu plus lisiblement:
la source
Scala, 368 caractères
Tout d'abord, une version lisible en 592 caractères:
La sortie de la console ressemble à ceci:
Nous pouvons faire une minification agressive et la réduire à 415 caractères:
La session de console ressemble à ceci:
Je suis sûr qu'un expert Scala pourrait faire encore mieux.
Mise à jour: Dans les commentaires, Thomas a donné une version encore plus courte, à 368 caractères:
Lisiblement, à 375 caractères:
la source
object A{def main(a:Array[String]){val t=(Map[String, Int]()/:(for(x<-io.Source.fromFile(a(0)).getLines;y<-"(?i)\\w+\\b(?<!\\bthe|and|of|to|a|i|it|in|or|is)".r findAllIn x) yield y.toLowerCase).toList)((c,x)=>c+(x->(c.getOrElse(x,0)+1))).toList.sortBy(_._2).reverse.take(22);val w=76-t.head._1.length;print(" "+"_"*w);t map (s=>"\n|"+"_"*(s._2*w/t.head._2)+"| "+s._1) foreach print}}
Java - 896 caractères
931 caractères1233 caractères rendus illisibles1977 caractères "non compressés"Mise à jour: j'ai considérablement réduit le nombre de personnages. Omet les mots à une seule lettre selon la spécification mise à jour.
J'envie tellement C # et LINQ.
"Lisible":
Sortie d'Alice:
Sortie de Don Quichotte (également de Gutenberg):
la source