EDIT: Si vous utilisez Lisp, j'ai donné quelques lignes directrices en bas pour compter les octets.
Objectif: créer la fonction la plus courte qui divise une chaîne en non-chiffres et renvoie un tableau composé uniquement de chiffres dans chaque chaîne, sans utiliser d'expressions régulières. Les zéros de tête doivent être inclus dans chaque chaîne.
Classement actuel (séparé en catégories):
- C / C ++ / C # / Java: 68 (C) ....
- GolfScript / APL / J: 13 (APL)
- Tous les autres: 17 (Bash, utilisations
tr
), 24 (Ruby)
Règles:
(Je m'excuse pour la lenteur)
- Le format doit être une fonction avec un seul argument de chaîne. Jusqu'à deux arguments supplémentaires peuvent être ajoutés si nécessaire pour le bon retour du tableau (par exemple sh / csh / DOS Batch a besoin d'une référence de variable supplémentaire pour retourner, etc.).
- La déclaration de fonction principale ne compte pas, pas plus que l'importation d'autres bibliothèques standard. `# include`s,` import`s et `using`s ne comptent pas. Tout le reste fait. Cela inclut les fonctions `# define`s et helper. Désolé pour la confusion. Référez-vous à cela comme un guide utile sur ce qui compte / ne compte pas (écrit en syntaxe de style C)
// ne compte pas dans le total, peut être omis sauf si // non évident, comme la moitié de la bibliothèque standard de Java. #include <stdio.h> importez some.builtin.Class // ne compte pas, voir ci-dessus #define printf p // compte pour le total / * Toute autre directive de préprocesseur, etc. compte. * / int i = 0; // compte someFunction (); // compte char [] [] myMainSplitFunction (char [] [] array) {// ne compte pas // Tout ici compte return returnArray; // Même cela compte. } // ne compte pas / * Tout ici compte, y compris la déclaration * / char [] [] someHelperFunction (char [] chaîne) { // des trucs } // même cela compte
- La sortie doit être un tableau de chaînes ou similaire (les listes de tableaux en Java et similaires sont acceptables). Des exemples de sortie acceptées:
String[]
,char[][]
,Array
,List
, etArray
(objet). - Le tableau doit contenir uniquement des primitives de chaîne de longueur variable ou des objets chaîne. Aucune chaîne vide ne doit être présente dans le retour, à l'exception ci-dessous. Remarque: les chaînes doivent contenir une chaîne de correspondances consécutives, comme l'exemple d'entrée et de sortie ci-dessous.
- S'il n'y a pas de correspondance, le corps de la fonction doit renvoyer
null
un tableau / liste vide ou un tableau / liste contenant une chaîne vide. - Aucune bibliothèque externe autorisée.
- Les terminaisons de ligne DOS comptent comme un octet, pas deux (déjà couvertes en méta, mais les besoins sont soulignés)
- Et la plus grande règle ici: aucune expression régulière n'est autorisée.
C'est une question de code-golf , donc la plus petite taille gagne. Bonne chance!
Et voici quelques exemples d'entrées et de sorties (avec des échappements de style C):
Entrée: "abc123def456" Sortie: ["123", "456"] Entrée: "aitew034snk582: 3c" Sortie: ["034", "582", "3"] Entrée: "as5493tax54 \\ [email protected]" Sortie: ["5493", "54", "430", "52", "9"] Entrée: "sasprs] tore \" re \\ forz " Sortie: null, [], [""] ou similaire
Veuillez mettre combien d'octets utilisés par vos réponses, et comme toujours, bon golf!
Lignes directrices pour Lisp
Voici ce qui compte et ne compte pas dans les dialectes lisp:
;;; Option 1 (defun extract-strings (ab); ne compte pas (des trucs) ;;; Tout ici compte ); Ne compte pas ;;; Option 2 (defun extract-strings (string & aux (start 0) (end 0)); ne compte pas (des trucs) ;;; Tout ici compte ); Ne compte pas.Tous les autres lambdas comptent entièrement pour le nombre d'octets.
Réponses:
APL, 13 caractères
(ou 28/30 octets, lire ci-dessous)
Je vois que vous avez banni GolfScript de votre question. Je comprends votre sentiment, mais j'espère que cette communauté n'interdira pas finalement APL, car c'est un langage de programmation vraiment remarquable avec une longue histoire, sans parler de beaucoup de plaisir à coder. Peut-être qu'il pourrait simplement être évalué différemment, si les gens estiment que la concurrence est injuste. Je publierai mes réflexions sur cette question dans le fil que vous avez lié.
Sur ce même jeton, j'ai toujours ajouté une note de bas de page à mes messages APL, affirmant que l'APL pouvait être marqué comme 1 char = 1 octet. Ma revendication repose sur le fait que quelques implémentations APL (principalement commerciales) prennent toujours en charge leur propre codage hérité sur un octet, avec les symboles APL mappés sur les valeurs supérieures de 128 octets. Mais c'est peut-être trop étiré, auquel cas vous voudrez peut-être marquer cette entrée comme 28 octets en UTF-16 ou 30 octets en UTF-8.
Explication
Exemples
Le format de sortie par défaut d'un tableau de chaînes ne précise pas le nombre de chaînes présentes dans le tableau, ni le nombre de blancs. Mais une manipulation rapide pour ajouter des guillemets devrait être assez claire:
la source
∊⍕¨⍳10
, ne pourriez-vous pas simplement utiliser⎕D
? Cela devrait être la constante'0123456789'
. Dyalog APL le supporte à tout le moins, tout comme le NARS2000.Python 47
la mise en oeuvre
Démo
Algorithme
Convertissez chaque caractère non numérique en espace, puis divisez la chaîne résultante. Une approche simple et claire.
Et une solution amusante avec itertools (71 caractères)
la source
Rubis, 70
Version en ligne pour les tests
Étant donné que la conversion de tout caractère non numérique en un entier renvoie 0 en Ruby (avec to_i), la conversion de chaque caractère en entier et de retour en caractère est la façon non rationnelle de rechercher un chiffre ...
la source
bash, 26 (contenu de la fonction: 22 + surcharge d'affectation de tableau 4)
Cela ne va pas battre l'autre
bash
réponse , mais c'est intéressant car cela pourrait vous faire double-prendre:L'utilisation est:
Au premier coup d'œil, cela
//+([!0-9])/
ressemble beaucoup à une substitution d'expression rationnelle, mais ce n'est pas le cas. Il s'agit d'une expansion de paramètre bash , qui suit des règles de correspondance de modèles , au lieu de règles d'expression régulière.Le retour des vrais types de tableaux bash à partir des fonctions bash est une douleur, j'ai donc choisi de renvoyer une liste délimitée par des espaces à la place, puis de convertir en tableau dans une affectation de tableau en dehors de l'appel de fonction. Donc, par souci d'équité, je pense que l'
(` `)
appel autour de la fonction devrait être inclus dans mon score.la source
Mathematica 32
Usage
L'équivalent utilisant des expressions régulières est beaucoup plus long!:
la source
Bash,
21 octets17/21 octets (amélioré par DigitalTrauma )Création d'une liste séparée par des espaces avec
tr
remplace tout non numérique par un espace
Usage
Éditer
comme indiqué par les commentaires ci-dessous, le code peut être réduit à 17 octets:
et comme le résultat n'est pas à proprement parler un tableau Bash, l'utilisation doit être
et le supplément
(``)
doit être comptéla source
(blah)
lieu de{blah;}
:split()(tr -c 0-9 \ <<<$1)
. De cette façon, votre corps de fonction ne comporte que 17 caractères.a=($(split "12 3a bc123")); echo ${a[@]}
. On pourrait faire valoir que "($ ())" doit être compté dans votre scoretr
approche, j'ai essayé de le faire avec une expansion des paramètres .tr
est certainement la meilleure approche pour le golf.tr
avec l'opérateur d'extension? Cela aboutirait à quelque chose comme($(tr...))
, et là où la déclaration de fonction ne compte pas, les parenthèses externes ne compteraient pas contre vous. Ce ne serait que la partie de substitution de commande.(``)
construction est de 1 caractère meilleure que($())
celle et doit être préférée.Smalltalk (Smalltalk / X), 81
valeur f: 'abc123def456' -> OrderedCollection ('123' '456')
Valeur f: 'aitew034snk582: 3c' -> OrderedCollection ('034' '582' '3')
valeur f: 'as5493tax54 \ [email protected]' -> OrderedCollection ('5493' '54' '430' '52' '9')
valeur f: 'sasprs] tore \ "re \ forz' -> OrderedCollection ()
soupir - Smalltalk a tendance à utiliser des noms de fonction longs veeeery ...
la source
asCollectionOfSubCollectionsSeparatedByAnyForWhich
ಠ_ಠ Ce nom est trop longR, 81
La fonction accepte une chaîne et renvoie une liste de chaînes.
Exemples:
-
-
-
Remarque:
$x
est le nom de l'élément de liste.la source
Perl, 53
Edit: sur aucune correspondance, sub retourne maintenant la liste avec une chaîne vide (au lieu de la liste vide) comme requis.
Il évite également le fractionnement sur un seul caractère d'espace, car il déclenche le fractionnement sur tout comportement d' espace blanc , ce qui viole probablement les règles. Je pourrais utiliser un
/ /
délimiteur, qui se diviserait sur un seul espace, mais paradoxalement, cela ressemblerait à l'utilisation d'un modèle d'expression régulière. Je pourrais utiliserunpack
au prix de quelques caractères supplémentaires et ainsi me débarrassersplit
complètement de la controverse, mais je pense que, ce que je termine avec, se diviser sur un caractère littéral (autre que l'espace) est OK.Et, non, l'opérateur de translittération de Perl ne fait pas d'expressions régulières. Je peux dérouler la plage 0-9
0123456789
si c'est le problème.la source
C, 68 octets (uniquement le corps de la fonction)
Le premier argument est la chaîne d'entrée, le second est le tableau de sortie, qui est un tableau de chaînes terminé par NULL. Une mémoire suffisante doit être réservée
a
avant d'appeler la fonction (pire cas:sizeof(char*)*((strlen(s)+1)/2)
.La chaîne d'entrée est modifiée par la fonction (chaque caractère non numérique est remplacé par
'\0'
)Exemple d'utilisation
Production
Version sans golf:
la source
VBScript, 190 (164 sans déclaration de fonction)
Bien qu'il ne soit pas du tout compétitif, je suis surpris que VBScript soit aussi court sur ce sujet étant donné sa verbosité (13 octets pour les CR uniquement). Il parcourt la chaîne en remplaçant tous les caractères non numériques par des espaces, puis réduit tous les espaces en espaces simples, puis utilise un délimiteur d'espace pour le diviser.
Cas de test
la source
Lisp commun (1 selon la lettre; ≈173 selon l'esprit)
Voici une version lisible. Le nombre d'octets est assez élevé en raison des noms longs dans des choses comme
digit-char-p
etposition-if
etvector-push-extend
.Le concept de "déclaration de fonction" est en quelque sorte vague. Voici une version qui n'a qu'un octet (le caractère
x
dans le corps de la fonction); tout le reste est regroupé dans les variables auxiliaires de la liste lamba de la fonction (partie de la déclaration de la fonction):Le nombre d'octets réel dépendra du nombre de déclarations auxiliaires qui devront être déplacées dans le corps pour que cela soit jugé acceptable. Un changement de nom de fonction locale serait également utile (par exemple, raccourcir
position-if
car il apparaît deux fois, utiliser des variables à lettre unique, etc.)Ce rendu du programme comporte 220 caractères:
Si rien d'autre, cela devrait promouvoir les variables Common Lisp & aux .
Cela peut être écrit de manière plus concise avec
loop
, bien sûr:Le
loop
formulaire, sans espace supplémentaire, contient 173 caractères:la source
(result
de la parenthèse finale pour être le corps. La partie qui définit le nom et les paramètres est la déclaration.result
est déclarée comme paramètre ici; il a juste une forme d'initialisation très simple. C'est la même chose, en principe, qu'un argument facultatif avec une valeur par défaut calculée par une expression complexe. (Dans des cas plus simples, il est facile d'imaginer quelque chose commechar* substring( char *str, int begin, int end(0) )
dans un langage avec une syntaxe de type C pour spécifier quiend
est facultatif et que s'il n'est pas fourni, alors sa valeur est0
. Je souligne simplement le fait que certains de ces termes(defun fn (string &aux (start 0) (end 0)
, ne compterait pas, mais tout ce qui reste dans le lambda le ferait).JavaScript, 240 octets
Et pour ceux d'entre vous qui sont curieux, voici mon golf probablement énorme:
Ci-dessus en joli imprimé:
Ci-dessus dans le code descriptif normal
la source
PHP 134
la source
array_filter
. Cela supprimera automatiquement toutes les entrées qui sontfalse
lorsqu'elles sont castées en booléens.C, 158
Étant donné que C n'a pas de fonctions d'impression de tableau intégrées, j'ai dû faire ce travail par moi-même, donc je m'excuse qu'il y ait une virgule finale dans chaque sortie. Essentiellement, ce code fait qu'il lit la chaîne s'il ne s'agit pas d'un chiffre, il le remplace par '\ 0', puis je passe en revue le code et j'imprime toutes les chaînes de chiffres. (EOF = 0)
la source
#define
s, les déclarations de variables, etc. compteront, mais la déclaration de fonction ne le sera pas.char[][]
légal. Si vous revenez comme ça (ouchar**
), tout ira bien.C #, 98
Tout d'abord, cela utilise la
.Select()
méthode d'extension LINQ pour transformer tous les non-chiffres en virgules.string.Replace()
serait préférable, car il renvoie unstring
plutôt qu'unIEnumerable<char>
, maisstring.Replace()
ne peut prendre qu'un seul caractère ou chaîne et ne peut pas utiliser un prédicat commechar.IsDigit()
ou47<c&c<58
.Comme mentionné,
.Select()
appliqué à une chaîne renvoie unIEnumerable<char>
, nous devons donc le reconvertir en chaîne en le transformant en tableau et en passant le tableau dans lestring
constructeur.Enfin, nous avons divisé la chaîne à l'aide de virgules
string.Split()
.(StringSplitOptions)1
est une façon plus courte de direStringSplitOptions.RemoveEmptyEntries
, qui prendra automatiquement en charge plusieurs virgules consécutives et virgules au début / fin de la chaîne.la source
char.IsDigit(c)
, vous pouvez utiliser'/'<c&&c<':'
47<c&&c<58
. (Franchement, je suis surpris que cela fonctionne avec des chiffres, mais apparemment c'est le cas).,
, puis à supprimer manuellement les éléments videsreturn new string(s.Select(c=>47<c&c<58?c:' ').ToArray()).Split().Where(a=>a!="").ToArray();
JS / Noeud:
168162147138 CharsVersion embellie:
la source
console.log(r)
et d'autres chosesRubis, 24
Définit les chiffres en utilisant un espace négatif dans la plage ascii imprimable.
la source
php , 204
Code descriptif:
C'est un code assez long et je suis sûr qu'il y aura une version php beaucoup plus courte pour ce code golf. C'est ce que je pourrais trouver en php.
la source
array()
par[]
,array_push($output[$count], $arr[$i]);
avec$output[$count][]=$arr[$i];
et lesord()
chèques avecis_numeric()
. et vous n'avez même pas besoin de diviser la chaîne pour parcourir ses caractères. aussi, seul le code interne de la fonction compte, donc comme c'est votre nombre de caractères est 204.Python
la source
Python
10483La réponse @Abhijit est beaucoup plus intelligente, ce n'est qu'une version "minifiée" de ce que j'avais en tête.
Cela ne produit aucune sortie, donc le code fonctionne, s'il est exécuté un par un, car certaines variables sont définies lors de la déclaration.
la source
PHP
9889Comme dans la réponse bash de DigitalTrauma, cela n'utilise pas d'expression régulière.
Cas de test:
la source
Haskell 31
Il fractionne la chaîne sur tous les caractères non numériques et supprime les chaînes vides générées par des délimiteurs consécutifs.
la source
VBA 210, 181 sans déclaration de fonction
la source
Rebol (66 caractères)
Non golfé et enveloppé dans la déclaration de fonction:
Exemple de code dans la console Rebol:
la source
JavaScript,
1049789Golfé:
Edit: Lorsque les boucles sortent de la fin du tableau,
c
estundefined
, qui est faux et termine la boucle.2/27: L' utilisation
?:
sauve la verbosité deif/else
.Le retour chariot dans le corps est pour la lisibilité et ne fait pas partie de la solution.
Non golfé:
L'idée est d'ajouter chaque caractère à la dernière entrée du tableau s'il s'agit d'un chiffre et de s'assurer que la dernière entrée du tableau est une chaîne dans le cas contraire.
la source
Javascript, 72
Non golfé
Exemple d'entrée / sortie
JSFiddle
la source
if(+a[i]+1)b+=a[i];else if(b)c.push(b),b=""
parb=+a[i]+1?b+a[i]:b?(c.push(b),""):b
.(c.push(b),"")
semblait intelligent, jamais vu ça.R 52
Cette fonction divise les chaînes par classe de caractères (ce n'est pas regex! :)) la classe est N - caractères numériques et P {N} signifie la négation de cette classe. o = T signifie omettre les sous-chaînes vides.
la source
PHP 99
Production
la source
JavaScript 88
88 caractères sans compter la fonction n (x) {}
la source