Vous n'aimez pas ces schémas à vues éclatées dans lesquels une machine ou un objet est démonté en ses plus petites pièces?
Faisons cela à une chaîne!
Le défi
Écrivez un programme ou une fonction qui
- saisit une chaîne contenant uniquement des caractères ASCII imprimables ;
- dissèque la chaîne en groupes de caractères égaux sans espace (les "morceaux" de la chaîne);
- affiche ces groupes dans un format pratique, avec un séparateur entre les groupes .
Par exemple, étant donné la chaîne
Ah, abracadabra!
le résultat serait les groupes suivants:
! , UNE aaaaa bb c ré h rr
Chaque groupe de la sortie contient des caractères égaux, avec des espaces supprimés. Une nouvelle ligne a été utilisée comme séparateur entre les groupes. Plus d'informations sur les formats autorisés ci-dessous.
Règles
L' entrée doit être une chaîne ou un tableau de caractères. Il ne contiendra que des caractères ASCII imprimables (la plage comprise de l'espace au tilde). Si votre langue ne le supporte pas, vous pouvez saisir les données sous forme de nombres représentant des codes ASCII.
Vous pouvez supposer que l'entrée contient au moins un caractère autre que l'espace .
La sortie doit être composée de caractères (même si l'entrée est au moyen de codes ASCII). Il doit exister un séparateur non ambigu entre les groupes , différent de tout caractère non-espace pouvant apparaître dans l'entrée.
Si la sortie est renvoyée via la fonction return, il peut également s'agir d'un tableau ou de chaînes, ou d'un tableau de tableaux de caractères, ou d'une structure similaire. Dans ce cas, la structure fournit la séparation nécessaire.
Un séparateur entre les caractères de chaque groupe est facultatif . S'il en existe un, la même règle s'applique: il ne peut s'agir d'un caractère non espace qui puisse apparaître dans l'entrée. En outre, il ne peut pas s'agir du même séparateur que celui utilisé entre les groupes.
Autre que cela, le format est flexible. Voici quelques exemples:
Les groupes peuvent être des chaînes séparées par des lignes, comme indiqué ci-dessus.
Les groupes peuvent être séparés par tout caractère non-ASCII, tel que
¬
. La sortie pour l'entrée ci-dessus serait la chaîne:!¬,¬A¬aaaaa¬bb¬c¬d¬h¬rr
Les groupes peuvent être séparés par n > 1 espaces (même si n est variable), avec des caractères entre chaque groupe séparés par un seul espace:
! , A a a a a a b b c d h r r
La sortie peut également être un tableau ou une liste de chaînes renvoyées par une fonction:
['!', 'A', 'aaaaa', 'bb', 'c', 'd', 'h', 'rr']
Ou un tableau de tableaux de caractères:
[['!'], ['A'], ['a', 'a', 'a', 'a', 'a'], ['b', 'b'], ['c'], ['d'], ['h'], ['r', 'r']]
Exemples de formats non autorisés selon les règles:
- Une virgule ne peut pas être utilisée comme séparateur (
!,,,A,a,a,a,a,a,b,b,c,d,h,r,r
), car l'entrée peut contenir des virgules. - Il n'est pas accepté de supprimer le séparateur entre groupes (
!,Aaaaaabbcdhrr
) ou d'utiliser le même séparateur entre groupes et au sein de groupes (! , A a a a a a b b c d h r r
).
Les groupes peuvent apparaître dans n'importe quel ordre dans la sortie. Par exemple: ordre alphabétique (comme dans les exemples ci-dessus), ordre de première apparition dans la chaîne, ... L'ordre n'a pas besoin d'être cohérent ni même déterministe.
Notez que l'entrée ne doit pas contenir de caractères de nouvelle ligne, et A
il a
s'agit de caractères différents (le groupement est sensible à la casse ).
Le code le plus court en octets gagne.
Cas de test
Dans chaque cas de test, la première ligne est entrée et les lignes restantes sont la sortie, chaque groupe se trouvant sur une ligne différente.
Cas de test 1:
Ah, abracadabra! ! , UNE aaaaa bb c ré h rr
Cas de test 2:
\ o / \ o / \ o / /// \\\ ooo
Cas de test 3:
Un homme, un plan, un canal: Panama! ! ,, : UNE P aaaaaaaaa c ll mm nnnn p
Cas de test 4:
"Montre-moi comment tu fais ce tour, celui qui me fait crier" dit-elle "" , S aaaaa cc jj eeeeeee hhhhhh ii kk mmmm n ooooo rr ssss tttttt vous ww y
Réponses:
Gelée , 5 octets
Essayez-le en ligne!
Il renvoie un tableau, mais le séparateur a disparu lorsqu'il est imprimé sur STDOUT.
C'est en effet une fonction qui peut être appelée en tant que telle (dans Jelly, chaque ligne est une fonction).
la source
Python 3.5+,
77464441 octetsAssez simple. Parcourt les caractères uniques de la chaîne en les convertissant en un ensemble (à l'aide de la décompression itérative étendue de Python 3.5), puis utilise une liste de compréhension pour construire les diagrammes éclatés en comptant le nombre d'occurrences de chaque caractère dans la chaîne avec
str.count
. Nous filtrons les espaces en les supprimant de l'ensemble.L'ordre des sorties peut varier d'une exécution à l'autre. les ensembles ne sont pas ordonnés. L'ordre dans lequel leurs éléments sont traités, et donc cette réponse, ne peut pas être garanti.
Ceci est une expression lambda; l'utiliser, préfixe
lambda
avecf=
.Essayez-le sur Ideone!Ideone utilise Python 3.4, ce qui n’est pas suffisant.Exemple d'utilisation:
3 octets sauvés grâce à @shooqie!
la source
{*s}
pourset(s)
.Retina, 13 octets
Le tri est très facile (c'est une commande intégrée), c'est une séparation des lettres qui prend 9 octets. Essayez-le en ligne!
La première ligne
O
affiche toutes les correspondances de la regex.
(ce qui représente chaque caractère)!,Aaaaaabbcdhrr
.Match est l'étape par défaut pour la dernière ligne d'un programme et lui
!
permet d'imprimer une liste de correspondances de l'expression régulière séparées par des sauts de ligne. L'expression rationnelle recherche une ou plusieurs occurrences d'un caractère autre que l'espace dans une ligne.la source
Perl 6 , 28 octets
Notez que Sac, comme un hachage ou un jeu, n'est pas ordonné. L'ordre des résultats n'est donc pas garanti.
Explication:
la source
Vim,
50, 46 octetsExplication / gif viendra plus tard.
la source
Pyth, 6
Essayez-le ici ou lancez une suite de tests .
Assez simple,
-zd
supprime les espaces de l'entrée et.gk
regroupe chaque élément restant en fonction de sa valeur. Malheureusement, je n'ai pas trouvé le moyen d'utiliser des variables à remplissage automatique. Notez que la sortie est affichée sous forme de chaînes Python, de sorte que certains caractères (lecture: barres obliques inverses) sont échappés. Si vous voulez qu'il soit plus lisible, ajoutez aj
au début du code.la source
Haskell, 38 octets
Fondamentalement, la solution de nimi , mais en vérifiant explicitement uniquement les lettres apparaissant dans la chaîne.
la source
2sable , 7 bytes
Code:
Explication:
Utilise le codage CP-1252 . Essayez-le en ligne!
la source
JavaScript (ES6), 41 octets
la source
" "
dans le tableau retourné? Pas sûr que ce soit permisjoin()
s'appelle-t-on avec ces doubles backkticks?.join([''])
.join
convertit ensuite cela en chaîne (vide) et l’utilise pour joindre les éléments du tableau. Toutes les méthodes ne convertissent pas leur paramètre en chaîne, mais cette technique est pratique pour celles qui le font.Brachylog ,
14 à7 octets7 octets grâce à Fatalize.
Essayez-le en ligne!
la source
x
pour supprimer@S
(espace). Je crois que ce format de sortie (liste de chaînes) est valideHaskell, 40 octets
Exemple d'utilisation:
f "Ah, abracadabra!"
->["!",",","A","aaaaa","bb","c","d","h","rr"]
.Le modèle
v:w
correspond uniquement à la liste avec au moins un élément, de sorte que tous les caractères ne figurant pas dans l'entrée sont ignorés.Aussi 40 octets:
la source
group
vientData.List
aussi. Quoi qu'il en soit, je pense que cette syntaxe estghci
seulement et nécessite le REPL, donc c'est un langage qui lui est propre . Je veux rester avec Haskell standard.Ruby, 41 + 1 = 42 octets
+1 octet pour le
-n
drapeau.Prend une entrée sur stdin, par exemple:
la source
C #
12598 octetsExplication
ToArray
appel et de renvoyer implicitement un IEnumerable qui enregistre 27 octets collectivement.la source
Func<string, string[]>
ies=>s.GroupBy....
R,
1981899695 octetsUngolfed:
Cette solution ne fonctionne pas entièrement à l'heure actuelle\
.C'est maintenant !
Merci beaucoup à @JDL pour avoir joué 102 octets!
la source
for(i in unique(a=strsplit(gsub(" ","",readline()),"")[[1]]))cat(rep(i,sum(a==i)),"\n",sep="")
- enregistre 2 octets.<-
économisera 1 octet!Rapide,
105 à91 octetsMerci à @NobodyNada pour 14 octets :)
Oui, je suis assez nouveau pour Swift ...
Les caractères d'un groupe sont séparés par une nouvelle ligne. Les groupes sont séparés par deux nouvelles lignes.
la source
[Character]
lieu d'unString
, puisque les règles disent "L'entrée doit être une chaîne ou un tableau de caractères." En outre,print("")
peut être remplacé par justeprint()
.print
sans arguments n'a pas fonctionné pour une raison quelconque, mais la[Character]
suggestion était solide. Merci!Octave , 61 octets
C'est une fonction anormale qui prend une chaîne en tant qu'entrée et génère un tableau de cellules de chaînes.
Essayez chez Ideone .
Comment ça marche
sort
trie la chaîne d'entrée. En particulier, les espaces seront au début.strtrim
supprime les espaces de début.diff(+y)
calcule les différences consécutives entre les caractères (pour détecter les limites du groupe) ...diff(find([1 diff(+y) 1])
donne un vecteur de taille de groupe.mat2cell
divise ensuite la chaîne triée en morceaux avec ces tailles.la source
Mathematica, 36 octets
Fonctions intégrées
Gather
etCharacters
faire la plupart du travail ici.la source
> <> , 49 octets
Très volumineux gaspillage dans la sortie, mais je suppose est toujours autorisé étant donné la clémence des règles
Explication:
adapter certaines choses dans serré, même en utilisant des sauts pour contourner certaines fonctions afin que je puisse exécuter le pointeur verticalement.
Fondamentalement, cela met chaque caractère ASCII sur sa propre nouvelle ligne, et si aucun de ce caractère n'existe, la ligne sera vide
Essayez-le en ligne
Edit: je me suis trompé, il y avait une erreur dans le code qui le ferait ne jamais se terminer s'il y avait un espace dans l'entrée
la source
Pyth, 5 octets
Essayez-le ici!
Prend l'entrée en tant que chaîne Python (c'est-à-dire entourée de guillemets, de guillemets et de barres obliques si nécessaire).
Explication:
Si vous garantissez au moins un espace dans l'entrée, il existe une solution à 4 octets:
Essayez-le ici!
Explication:
la source
PowerShell v2 +, 44 octets
Prend l'entrée en
$args[0]
tant que chaîne littérale d'argument de ligne de commande. Transmet cela comme unchar
tableau, et utilise l' opérateur-n
ote
qual pour extraire des espaces (ASCII32
). Cela fonctionne parce que la conversion a une priorité supérieure et que, lorsqu'un tableau est utilisé comme opérateur de gauche avec un scalaire de droite, il agit comme un filtre.Nous passons ce tableau de caractères à
Group-Object
, qui fait exactement ce qu'il dit. Notez que puisque nous passons des personnages et non des chaînes, cela regroupe correctement les caractères en respectant la casse.Maintenant, nous avons un ou plusieurs objets personnalisés qui ont des noms de groupe, des comptes, etc. Si nous imprimons simplement, nous aurions une foule de sorties superflues. Donc, nous devons canaliser ceux-ci dans une boucle
|%{...}
et chaque itération-join
l'.Group
ensemble en une seule chaîne. Ces chaînes résultantes sont laissées sur le pipeline et la sortie est implicite à l'achèvement du programme.Exemple
la source
Dyalog APL , 11 octets
Fonction renvoyant la liste des chaînes.
(⊂∩¨∪)
l'intersection de l'ensemble et ses personnages uniques~∘' '
sauf les espacesTryAPL en ligne!
la source
Traitement, 109 octets
C'est l'approche de la force brute, trier le tableau, puis le parcourir en boucle. S'il ne correspond pas au dernier caractère imprimé, imprimez d'abord une nouvelle ligne. S'il s'agit d'un espace, ignorez l'étape d'impression.
la source
Javascript (en utilisant une bibliothèque externe - Enumerable) (
7867 octets)Lien vers lib: https://github.com/mvegh1/Enumerable
Explication de code: C’est ce qu’Enumerable a été fait de faire! Chargez la chaîne dans la bibliothèque, qui la convertit en tableau de caractères. Filtrer les entrées d'espace blanc. Groupe par caractère. Ecrivez chaque groupe sur une ligne, en fonction du prédicat spécifié. Ce prédicat dit de joindre tous les éléments du groupe actuel dans une chaîne, sans délimiteur.
la source
MATL, 7 octets
Démo en ligne MATL
la source
Perl6,
484745Merci à manatwork pour les améliorations.
la source
$a.trim
semble le faire pour la condition.$^a.trim&&say $a x$^b
marche. (Désolé d'avoir ajouté les astuces octet par octet, mais c'est mon premier essai sur Perl6.){
.Ruby, 46 octets
Essayez-le en ligne!
Ma version complète du programme d'origine, 48 octets après l'ajout de l'
n
indicateur:la source
.count(c)
par.count c
?*
opérateur est présent à proximité et l'analyseur se plaindra.map
besoin de pars supplémentaires et((s.chars-[' '])|[]).map
aura le même nombre de caractères que(s.chars-[' ']).uniq.map
. Et l'autre moyen plus rapide de vérifier les caractères uniques (via regex) est déjà couvert par @Jordan dans une autre réponsePython, 107
Peut être raccourci par lambda, mais plus tard
la source
CJam, 10 octets
Un bloc sans nom qui attend la chaîne au-dessus de la pile et la remplace par une liste de chaînes.
Essayez-le en ligne!
Explication
la source
Common Lisp, 123
Ungolfed:
Pas la langue la plus amicale au golf. Cela pourrait probablement être modifié pour renvoyer une liste de listes plutôt que d'imprimer une chaîne.
la source
Emacs, 36 frappes au clavier
C-SPACE C-EM-x
sort-r
TABRETURN.RETURN.RETURNC-AC-M-S-%\(\(.\)\2*\)
RETURN\1
C-QC-JRETURN!Résultat
A man, a plan, a canal: Panama!
->Explication
sort-r
TAB RETURN .RETURN .RETURN\(\(.\)\2*\)
RETURN\1
C-Q C-JRETURN !sort-regexp-fields
avec arguments.
et.
;\(\(.\)\2*\)
->\1\n
sur tous les matches.la source