Nous définissons les espaces comme étant l'un des trois caractères, tabulation (0x09), nouvelle ligne (0x0A) ou espace (0x20).
Pour ce défi, vous devez écrire deux programmes ou fonctions dans le même langage de programmation, qui effectuent les tâches suivantes:
Comptez les caractères d'espacement dans une chaîne donnée. Par exemple, l'entrée
123 -_- abc def
retournerait 7 (à condition qu'il n'y ait pas de nouvelle ligne).
Fractionner une chaîne donnée lors de passages consécutifs d'espaces. Si la chaîne commence ou se termine par un espace, aucune chaîne vide ne doit être renvoyée à la fin. Par exemple, la même entrée
123 -_- abc def
reviendrait
["123", "-_-", "abc", "def"]
.
Dans les deux cas, vous pouvez prendre une entrée via STDIN, un argument de ligne de commande ou une fonction, renvoyer le résultat ou l’afficher STDOUT. Pour le second programme, si vous choisissez d’imprimer sur STDOUT, veuillez imprimer chaque chaîne sur sa propre ligne, sans les guillemets.
Pour les deux programmes, vous pouvez supposer que l’entrée ne contient que des fichiers ASCII imprimables (0x20 à 0x7E) et des espaces.
Maintenant voici le piège:
- Si tous les espaces sont supprimés des deux programmes / fonctions, les chaînes résultantes doivent être identiques. En d'autres termes, vos deux soumissions peuvent uniquement différer par le nombre et l'emplacement des caractères d'espacement.
- Aucun programme / fonction ne peut contenir de chaîne ou de littéral de regex (les littéraux de caractères conviennent, à condition que votre langue ait un type de caractère désigné).
- Aucun programme / fonction ne peut contenir de commentaires.
- Vous ne devez pas lire le code source du programme, directement ou indirectement.
C'est du code golf. Votre score est la somme des tailles des deux solutions (en octets). Le score le plus bas gagne.
Classements
L'extrait de pile ci-dessous génère à la fois un classement régulier et un aperçu des gagnants par langue. Donc, même si votre langue de choix ne vous permet pas de remporter l’ensemble du défi, pourquoi ne pas tenter de vous tailler une place sur la deuxième liste? Je serais très intéressé de voir comment les gens abordent ce défi dans diverses langues!
Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille totale de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Vous pouvez également inclure les comptes individuels avant le compte total, par exemple:
# Python 2, 35 + 41 = 76 bytes
Le dernier numéro qui n'est pas rayé sera utilisé par l'extrait de code.
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 42253;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
la source
Réponses:
Pyth, 16 + 15 = 31 octets
Essayez ici .
Compteur:
Splitter:
Ceux-ci définissent chacun une fonction,
y
qui prend une entrée de chaîne pour résoudre la tâche souhaitée.Merci à @FryAmTheEggman pour l'idée d'utiliser la fonctionnalité d'indexation modulaire de Pyth dans des listes pour raser un caractère.
Cas de test:
Explication:
la source
Python, 54 + 56 = 110 octets
Compteur:
Splitter:
Pour le compteur, nous utilisons le fait que Python accepte simplement d'avoir une expression sur une ligne. Il est nécessaire de se séparer
+1
et0<9or x.split()
d'empêcher touteNameError
projection, car il0<9
estTrue
impossiblex.split()
de l'évaluer en raison d'un court-circuit.Pour le séparateur, étant donné que le nombre d'espaces est toujours non négatif, il en
sum(y.isspace()for y in x)+10<9
est toujours ainsiFalse
et la fonction de fractionnement entre en jeu.Alternative 1, 59 + 60 = 119 octets
Compteur:
Splitter:
Les résultats du comptage et du fractionnement sont stockés dans une liste à deux éléments. La liste est indexée par l' une
min([1])
, renvoyant le minimum de la liste d' un élément contenant1
, oum in([1])
qui renvoieFalse
(équivalent à0
) commem
ne figure pas dans[1]
.Alternative 2, 67 + 69 = 136 octets
Compteur:
Splitter:
Comme ci-dessus, les résultats du comptage et du fractionnement sont stockés dans une liste à deux éléments.
sorted
est une fonction intégrée qui est une valeur de vérité, doncnot sorted
renvoieFalse
(équivalent à0
). Carnot s or ted
, puisques
est une fonction et aussi la vérité,not s
estFalse
etted = 1
est retourné.Alternative 3, 59 + 60 = 119 octets
Compteur:
Splitter:
Il s'agit d'une fonction dans laquelle le résultat du séparateur est stocké dans la variable
a
et le résultat du compteur dans la variablea1
. Comme avant, Python est bien d’avoir juste une expression sur une ligne, dans ce cas1
. La scissiona1
détermine ce qu’il faut renvoyer de la fonction.la source
not sorted
.+1
et est-elle0<9or x.split()
nécessaire?m=lambda x:sum(y.isspace()for y in x)+00and x.split()
etm=lambda x:sum(y.isspace()for y in x)+0;0and x.split()
(faire de ce point-virgule une nouvelle ligne bien sûr)Java 8, 239 + 240 = 479
Compter les espaces (retourne Integer)
Fractionner sur les espaces (renvoie Stream <String>)
Explication:
la source
Espaces blancs, 75 + 153 = 228
Les espaces, les onglets et les nouvelles lignes sont remplacés par STL, respectivement, et sont repliés pour plus de lisibilité. Convertir dans un fichier Whitespace approprié avec
tr -d \\n | sed 'y/STL/ \t\n/'
.Compteur
Splitter
la source
Marbelous, 103 + 92 = 195
Compteur:
Splitter:
Testez ces programmes ici. Les panneaux cylindriques, les bibliothèques d'inclusion et les espaces pour les cellules vides doivent tous être cochés.
Les entrées et sorties se font via STDIN / STDOUT.
Explication
Compteur:
Le chemin bleu reçoit une entrée. Si le caractère est un caractère d'espacement (valeur ascii inférieure à 0x21), le chemin d'accès noir est pris, ce qui se synchronise avec le chemin d'accès violet.
Le chemin violet incrémente simplement une bille stockée dans le
&1
synchroniseur à chaque fois que le chemin noir est emprunté.Une fois qu'il n'y a plus d'entrée, le chemin rouge est pris, en imprimant le nombre de caractères d'espacement et en sortant.
Splitter:
Le programme commence par le chemin bleu, qui boucle jusqu'à ce qu'un caractère non-blanc soit trouvé.
Une fois qu'un caractère non-blanc est récupéré, le chemin noir est pris, lequel imprime ce caractère et déplace l'exécution vers le chemin vert, qui boucle et imprime jusqu'à la réception d'un caractère blanc. L'exécution continue ensuite vers le chemin violet, qui contient
3W
ou un séparateur à trois voies.La branche de gauche déplace l'exécution vers le chemin bleu (et les espaces blancs sont supprimés jusqu'à ce qu'un caractère non blanc soit trouvé).
La branche du milieu définit la copie de l'entrée sur 0 avec
?0
(générer un nombre aléatoire entre0
et0
) et ajoute 10 (0x0A
= nouvelle ligne), qui est ensuite sortie.Le bon chemin est jeté.
la source
CJam, 26 + 27 = 53
59 61 73 77octetsCompteur
Splitter
Comment ça fonctionne
L’idée est simple: calculez le nombre d’espaces blancs et divisez la chaîne sur des exécutions consécutives d’espaces blancs. Choisissez ensuite l' un d'entre eux repose sur le fait suivant celui des
' !
moyensnot of space character
qui est falsy, tout'!
est le!
caractère, qui est truthy.Code développé:
L'entrée est de STDIN et la sortie est de STDOUT
Essayez-le en ligne ici
la source
Mathematica, 44 + 43 = 87
97octetsJe pensais ajouter une autre langue au mélange.
Compteur:
Splitter:
Ceci utilise la fonctionnalité de Mathematica selon laquelle la séparation de l’espace est identique à la multiplication. Et que multiplier quelque chose avec 0 soit toujours 0, et ajouter 0 à quelque chose est toujours idempotent.
Pour le compteur, nous comptons d’abord les espaces et nous les ajoutons
0*1*StringSpli*t@#
.StringSpli
ett
ne sont pas définis, mais Mathematica utilise le calcul symbolique et traite donc ceux-ci comme une variable et une fonction inconnues. Le1*
est idempotent (juste comme0+
), le le0*
transforme en un zéro. Il est nécessaire de séparer lesStringSplit
variables en deux variables, car0
une liste est parfois traitée comme une multiplication scalaire-vecteur qui donne un vecteur (liste) de zéros.Pour le séparateur, j'utilise le fait qu'il
Count
existe aussi mais ne cherche pas dans les chaînes. Il essaie de compter toutes les sous- expressions correspondant au modèle, maisWhitespace
est un modèle qui s'applique uniquement au contenu de la chaîne. AinsiCount
reviendra toujours0
, ce qui faitString
disparaître. La multiplication du tableau divisé par01 = 1
est à nouveau idempotente.la source
Ruby,
10791 octetsSplitter (46 bytes)
Compteur (45 octets)
p
est une méthode prédéfinie qui, sans arguments, renvoie simplementnil
. Nous l'utilisons de plusieurs manières. Dans le séparateur, l'initialep
ne fait rien.gets(p)
lit tout depuis l'entrée standard, puisque le délimiteur est nul. Nous appelons la méthode split intégrée et affectons le résultat à celui-cip
. Ainsi, lorsqu'il ne reçoit pas d'arguments, il est analysé comme une variable.puts p||...
court-circuite et affiche chaque élément de lap
variable sur sa propre ligne.Dans le compteur, nous supprimons la première nouvelle ligne afin que le tableau fractionné soit affecté à la
pp
place. Comme nous n’avons pas assigné àp
, c’est toujours la méthode sans renvoi, donc la deuxième partie||
est évaluée et transmiseputs
.$_
est une variable magique contenant le résultat degets
, de sorte que la quantité totale d’espaces blancs est la taille de celle-ci moins les caractères non-blancs, qui sont ce quipp
contient. Je pense qu’il devrait y avoir un moyen plus rapide de compter, mais je ne parviens pas à en trouver un, et de toute façon, l’utilisation du tableau divisé dans le compteur est amusante.la source
Python, 169
C'est presque trop facile de faire cela en Python!
Compteur:
Splitter:
Ils diffèrent par un seul espace, et je ne fais pas de ruse comme diviser un nombre ou un nom de variable en deux :)
la source
C, 138 + 136 = 274
Dans chaque cas, le code est un programme qui accepte exactement un argument de ligne de commande et affiche le résultat sur stdout.
\t
devrait être remplacé par un caractère de tabulation. Si vous voulez passer un argument contenant des onglets et des nouvelles lignes, il vous appartient de déterminer comment;).Compte
Scission
la source
JavaScript, 95 + 96 = 191 octets
Compteur:
Splitter:
Ungolfed:
La
RegExp(String.fromCharCode(92,115)
ligne crée la regex correspondant à un espace,/\s/
sans regex ni littéraux de chaîne.Dans chaque programme, nous utilisons la variable
v
ouvv
. Nous stockons le tableau divisé dans cette variable (v
ouvv
), puis nous modifions notre comportement sur la valeur dev
(en attendant, ellevv
est ignorée). Dans le comptoir,v
a une valeur de vérité; dans le séparateur, il a une valeur falsy (parcevv
que la valeur est obtenue à la place).Autre: JavaScript, 250 octets
J'ai une autre solution qui ne gagne aucun prix pour la brièveté, mais j'ai pensé que c'était un défi intéressant d'abuser du comportement d'insertion automatique du point-virgule de JavaScript.
Compteur:
Splitter:
Compteur non-golfé:
Le séparateur est exactement le même, à l'exception de la ligne:
est maintenant
L'insertion automatique de points-virgules par JavaScript ne termine normalement pas les instructions multilignes si elles peuvent être comprises sans saut de ligne, mais elle ne tolère pas les sauts de ligne après
return
,continue
oubreak
. Par conséquent, la ligne est simplement lue commebreak
ce qui sépare uniquement la boucle interne au lieu de sortir de la boucle externe. Le comportement "second-pass"o = a.filter(j=>j)
est ensuite exécuté (par opposition à ignoré dans le compteur), car la boucle externe reçoit un second passage.la source
!!x
différent de laBool
conversion automatique ?filter
son retour de rappel est auto-boolé par les mêmes règles que!!
. Merci!Python,
228198182166 166146145 octetsCompteur ( 72 octets ):
Splitter ( 73 octets ):
ior1
est une variable de Falsey, maisi or 1
est la vérité. C'est le truc principal.la source
i
la chaîne est vide pour le séparateur? Pourrait être corrigé en passantiorb
àior1
, ce qui vous permet également de sauvegarder le caractère entre1
etelse
.Befunge 98, 61 + 59 = 120
Compteur:
Splitter:
la source
Bash, 75 + 79 = 154 octets
Cela dépend de la capacité de bash à poursuivre l'exécution même si certaines lignes ou parties de ligne du script sont mal formées (dans certaines circonstances). Les espaces sont utilisés pour désactiver les échappements pour certains crochets rapprochés et pour casser un tuyau en le plaçant sur une nouvelle ligne.
Splitter:
Compteur:
L'entrée se fait via un argument en ligne de commande, la sortie se fait via stdout.
Comme cela repose sur le comportement d'erreur bash, l'utilisateur est censé ignorer stderr.
Exemple d'exécution (montrant une entrée avec une nouvelle ligne et plusieurs espaces contigus):
la source
Ruby,
114 + 116107 + 109 = 216 octetsCela ne peut pas rivaliser avec la solution ruby d'Histocrat, mais je pensais que cela valait la peine d'être présenté de toute façon.
J'ai utilisé
$z
pournil
etnil.to_s
pourString.new
Le caractère d'espacement supplémentaire que j'ajoute à la fin de l'entrée consiste à forcer le dernier mot à être ajouté à array (
r
) - un mot n'est ajouté à la fin du tableau que lorsqu'un caractère d'espacement suit un caractère autre qu'un espace. L'alternative consistait à en ajouter une autrer<<w if w
après leeach_byte
bloc.Compte
Scission
la source
Haskell ,
53 + 55 = 10836 + 38 = 74 octetsCompteur
Splitter
Cette solution tire parti du fait que, dans Haskell, les fonctions sont une instance de la classe de type Monad et peuvent donc être utilisées comme actions monadiques dans la notation do.
Dans le premier cas, la fonction résultante du bloc do est le premier argument de
pure
(qui concerne essentiellementconst
le type de fonction), ce qui fait du compteur le résultat final et du séparateur en cours d'élimination.Dans le second cas, il
pure
s’applique uniquement à un seul argument, ce qui en fait une fonction qui renvoie une autre fonction (le compteur). Cependant, le résultat n'est jamais utilisé et donc jeté. Le résultat final est la deuxième ligne du bloc do, le séparateur.la source
[' ','\t','\n']
peut être raccourci à" \t\n"
.(<'!')
pour tester les espaces.Java 8, 187 + 188 = 375
Tout d'abord, je voudrais dire que cette réponse est fortement basée sur celle de @ Ypnypn. J'ai essentiellement remplacé certaines parties par des parties plus courtes (y compris la partie dépendant des espaces, dont l'OMI est la plus importante dans ce défi), mais le code fonctionnel est essentiellement le même.
Comptez les espaces , 187 (renvoie
int
):Fractionner sur les espaces , 188 (retourne
Stream<String>
):la source
J, 48 + 49 = 97 caractères
Deux fonctions prenant et retournant un seul argument. J'ai utilisé la méthode la plus dégoûtante que je puisse imaginer pour battre la règle des espaces identiques, mais les espaces sont donc préservés. Il faut donc probablement sauvegarder des personnages en trouvant un itinéraire plus astucieux pour contourner cela.
Nous définissons le verbe
a
comme ayant deux actions différentes, selon qu'il soit utilisé avec un argument ou avec deux. Avec un argument, il(e.u:)&9 10 32
vérifie si chaque caractère est un espace ou non. Avec deux arguments, c’esta:-.~(<;._1~1,}.)
, qui prend un vecteur booléen à droite et coupe l’argument de gauche à ces positions, en éliminant les coupes vides aveca:-.~
.Ensuite, nous définissons
aa
le nombre de valeurs True dans le résultat dea
, ce qui n'a de sens qu'avec un seul argument. Enfin, nous utilisonsaa
oua a
selon que nous voulions compter ou fractionner les espaces de la chaîne.aa
fonctionne comme prévu.La raison
a a
fonctionne parce que quand J voit(f g)y
, il considère(f g)
un crochet et l'évalue commey f (g y)
. Dans ce cas,f
est le dyadiquea
au-dessus duquel se fait la coupe, etg
esta[aa
, qui calcule la somme deaa
, la jette, et calcule (monadique) àa
nouveau.Au REPL:
la source
Bash, 54 + 50 = 104 octets
Compteur
Splitter
la source
Perl, 37 + 38 = 75
Compteur :
Splitter :
la source
Perl 6, 31 + 32 = 63 octets
Compteur
Essayez-le en ligne!
?^1
est analysé comme?^ 1
ce qui applique l'opérateur de négation booléenne à 1, résultant enFalse
.Splitter
Essayez-le en ligne!
? ^1
convertit la plage 0..0 en Bool, résultant enTrue
.la source
Python 2, 98
Fractionnement (49)
Renvoie les jetons dans une liste.
Comptage (49)
Retourne une liste de longueur un contenant le nombre de caractères d'espace. Cela entraînera probablement une erreur d'exécution, mais la fonction
f
peut être utilisée après avoir exécuté le code.la source
C (gcc) , 88 + 89 = 177 octets
Splitter
Splitter
Compteur
Compteur
Fatigué
Prend l'entrée comme argument de fonction. La fonction de comptage renvoie le nombre d'espaces. La fonction de division utilise STDOUT pour sa sortie (mais elle renvoie également le nombre d'espaces moins un).
la source
Zsh , 35 + 35 = 70 octets
Je ne suis pas sûr qu'il soit
[^$IFS]
qualifié, car il est utilisé dans la recherche de motifs. Voici une solution 45 + 45 en cas d’interdiction.Divisé:
Compter:
L'
:
intégré est équivalent àtrue
, nous l'utilisons comme un élément entre un commentaire et / dev / null (car les commentaires ne sont pas autorisés) en lui envoyant l'extension non souhaitée.Zsh a une fonction intégrée pour la division sur les espaces blancs, cet être
${=var}
. Cela rend difficile toute combinaison logique autre que l'exécution et la suppression de celle que nous ne voulons pas.Essayez-le en ligne!
la source