Étant donné une chaîne contenant des nombres décimaux:
teststring134this 123test string54 100
incrémenter chaque numéro de cette chaîne de un pour donner la nouvelle chaîne
teststring135this 124test string55 101
.
La chaîne peut être fournie sous la forme:
- un argument de ligne de commande
- STDIN
- une variable codée en dur ou un argument de fonction
Couvrir toutes les positions possibles pour un certain nombre:
- comme préfixe pour un mot;
123test
►124test
- comme suffixe pour un mot;
test123
►test124
- à l'intérieur d'un mot;
te123st
►te124st
- seul
test 123 test
►test 124 test
Voici une solution non golfée en Python:
NUMBERS = '0123456789'
def increment(s):
out = ''
number = ''
for c in s:
if c in NUMBERS:
number += c
else:
if number != '':
out += str(int(number) + 1)
number = ''
out += c
if number != '':
out += str(int(number) + 1)
number = ''
return out
print "\"%s\"" % (increment('teststring134this 123test string54 100'))
C'est une code-golf
question, le code le plus court gagne.
Réponses:
Perl, 14 octets
Nécessite le
-p
commutateur, que j'ai compté comme un octet.Exemple d'exécution
la source
Rubis,
3024 octetsS'attend à ce que l'entrée soit stockée
s
.la source
$1.next
utiliser dans le bloc?next
c'était sophistiqué.Vim - 13 frappes
Attend que l'entrée soit la ligne actuelle.
Ou pour un nombre fini de nombres (par exemple 999) dans 8 + ceil (log (n)) touches:
la source
JavaScript (ES6) - 28
Exécutez en utilisant
H("test 123 234t")
.la source
H=
et le faire simplement être une fonction anonyme.Perl, 23
Suppose que la chaîne d'entrée est affectée à
$_
la source
Python 2 - 59
Fournissez la chaîne comme variable
n
la source
C99 - 86 (GCC 4.9.0 et Visual C ++ 2013)
Modifier: GCC 4.9.0 (avec -std = c99) et Visual C ++ 2013 ont réussi à générer (avec des avertissements) le même code sans les inclusions. Je ne savais pas que tu pouvais faire ça! Merci pour l'astuce.
Edit: Il ne m'est même pas venu à l'esprit que je devrais l'écrire à l'écran à la volée au lieu de créer la chaîne et de l'imprimer. Cela fait une énorme différence. Merci Dennis!
Cela utilise une chaîne codée en dur mais le contenu de la chaîne n'est pas compté dans le total (le = "" est compté).
Fondamentalement, il parcourt la chaîne un caractère à la fois en vérifiant chacun pour voir s'il s'agit d'un entier. Si c'est le cas, il incrémente l'entier et l'écrit dans la sortie, sinon il copie le caractère actuel dans la sortie.
Cela fuit la chaîne codée en dur car elle incrémente s.
la source
include
s et il compilera toujours très bien avec gcc.99
?J (20)
Attend que l'entrée soit stockée dans la variable
a
.Tester:
la source
(f?) lex (39)
Fichier
inc.l
:Compiler:
Courir:
Je n'ai pas testé cela avec l'original
lex
. Les commentaires sont les bienvenus.la source
%%
car il ne s'agit pas d'un code utilisateur: flex.sourceforge.net/manual/…Emacs - 20 caractères
Nécessite que le texte à traiter soit présent dans le tampon actuel. J'ai compté CM-% comme un caractère ici car il peut être entré en appuyant sur une touche lorsque vous maintenez trois modificateurs enfoncés.
la source
GNU sed, 304 (dont 1 pour le drapeau -r)
J'ai voté de près sur cette question en tant que doublon possible, mais c'est peut-être contraire à cela car cette réponse ne peut pas être trivialement modifiée pour y fonctionner. De loin la réponse la plus longue.
Inspiré par cet exemple de la documentation sed , bien qu'il ait fallu du travail pour gérer plusieurs nombres dans une chaîne:
Production:
Notez que cela insère temporairement des
_
caractères, ce qui pourrait entraîner des résultats incorrects s'il y en a_
dans le flux d'entrée. Pour atténuer cela, nous pouvons remplacer le_
dans le script sed par un caractère non imprimable (par exemple ASCII 0x07 BEL), et supposer que le flux d'entrée contient uniquement de l'ASCII imprimable. Cela semble bien fonctionner quand je le teste.la source
Raquette 74
la source
Lua - 68 caractères
S'attend à ce que l'entrée soit stockée dans l'art.
la source
CJam,
67 58 534831 caractèresCette question est comme la pire question pour CJam. Aucune expression régulière, aucune correspondance de modèle, aucune capture d'exception. Mais c'est parti (#YOLO)
Celui-ci divise la chaîne en groupe d'alphabets et de chiffres uniquement. Les incréments de chaque chiffre et recoud les deux tableaux en prenant un élément de chacun à la fois.
Solution précédente:
Essayez-le en ligne ici
Comment ça fonctionne:
L'idée de base est de continuer à stocker le caractère séparément dans une chaîne s'il s'agit d'un chiffre et de vider la valeur incrémentée dans la chaîne finale une fois que nous obtenons un caractère non numérique.
la source
Cobra - 88
la source
C # -
178169157 157 caractèresCela suppose que des nombres comme 999 peuvent déborder à 000 et que - + ,. E ne font pas partie d'un nombre.
Forme mieux lisible:
Je suis nouveau ici, je n'ai jamais essayé le golf de code auparavant, j'ai juste essayé :)
Je me demande si quelqu'un a des idées pour le raccourcir encore ...
Pour participer avec C #, ce serait bien si nous pouvions omettre tout le framework nécessaire autour du code réel - alors cela n'aurait que 82 caractères, et cela sans appeler de fonctions système puissantes.
La même chose avec les pointeurs (182 caractères):
Maintenant, sans débordement, cela gère correctement le cas 999 (223 caractères):
Un autre plus ancien, il lit à partir de l'entrée standard et utilise la récursivité:
Remarque:
Console.ReadKey();
et la chaîne elle-même ne doit pas être comptée.J'ai déjà amélioré cela plusieurs fois, voir les commentaires. Il y a encore de la place pour plus d'améliorations, je dirais :) Et désolé pour la longueur, mais je pense que les différentes versions sont assez intéressantes pour les garder ...
la source
if(c==57)
pu écrirec--;
au lieu dec=48;
, qu'en est-il de l'opérateur ternaire aussi. il y a beaucoup de tours de golf. vous devriez peut-être visiter codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c... ? ... : c++*b--
Groovy, 38 octets
Uggghhh ... Je déteste absolument les mots
replace
etall
ils ruinent tous les golfs regex pour moi.la source
(it as int)+1
→it.next()
PHP - 91 octets
Je ne voulais pas utiliser d'expressions régulières. PHP n'est pas capable d'incrémenter directement un décalage de chaîne, j'ai donc dû ajouter quelques octets à l'étape d'incrémentation. Ce script d'une ligne me rappelle un âge très sombre du script PHP ...
la source
K, 56
la source
sed et bash - 40 (y compris invocation et tuyaux)
Les sorties:
la source
42;rm -rf /
cela a fonctionné la première fois.\0
à&
(-1 caractère),$((…))
à$[…]
(-2 caractères),s/^/echo /
àiecho \\
(-2 caractères) pour raccourcir votre code actuel . Cependant, mieux vaut d'abord corriger le bogue mentionné par @Dennis. (Il a écrit « Il a travaillé pour la première fois » pour le plaisir et comme indice sur la question En fait , votre code échoue sur l' entrée contenant.;
,#
,`…`
,$(…)
Et peut - être d' autres caractères spéciaux aussi.)eval echo `sed 's/[0-9]\+/$[&+1]/g'`
- a toujours le problème d'injection de code cependant, selon ma réponse à une autre question similaire codegolf.stackexchange.com/a/37145/11259Java 7, 119 octets
Si l'exigence est un programme au lieu d'une simple fonction, alors c'est 149 octets:
Code non testé et testé:
Essayez-le ici.
Production:
la source
Gema, 14 personnages
Exemple d'exécution:
la source
DASH , 16 octets (sans concurrence)
Cela renvoie une fonction / application partielle.
Usage:
Explication
la source
CJam, 18 octets
Essayez-le ici.
Explication
la source
R, 83 octets
Tard à la fête. Suppose que l'entrée est stockée dans une variable
x
. Il n'est probablement pas nécessaire de l'utiliserregmatches
pour résoudre ce problème, mais je n'ai pas pu comprendre les remplacements vectorisés sans packages externes.Non golfé et expliqué
Exemple de sortie
la source
C # (Visual C # Interactive Compiler) avec option de ligne de commande
/u:System.Text.RegularExpressions.Regex;System.Int32
, 40 octetsAttend que l'entrée soit dans une variable nommée n.
Essayez-le en ligne!
la source