Dada una cadena que contiene números decimales:
teststring134this 123test string54 100
incremente cada número en esta cadena por uno para dar la nueva cadena
teststring135this 124test string55 101
.
La cadena se puede proporcionar como:
- un argumento de línea de comando
- STDIN
- una variable codificada o argumento de función
Cubra todas las posiciones posibles para un número:
- como prefijo de una palabra;
123test
►124test
- como sufijo de una palabra;
test123
►test124
- dentro de una palabra;
te123st
►te124st
- solo
test 123 test
►test 124 test
Aquí hay una solución sin golf 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'))
Esta es una code-golf
pregunta, el código más corto gana.
Respuestas:
Perl, 14 bytes
Requiere el
-p
interruptor, que he contado como un byte.Ejecución de ejemplo
fuente
Ruby,
3024 bytesEspera que la entrada se almacene en
s
.fuente
$1.next
usar en el bloque?next
que era tan sofisticado.Vim - 13 pulsaciones de teclas
Espera que la entrada sea la línea actual.
O para un número finito de números (por ejemplo, 999) en 8 + ceil (log (n)) pulsaciones de teclas:
fuente
JavaScript (ES6) - 28
Ejecutar usando
H("test 123 234t")
.fuente
H=
y simplemente hacer que sea una función anónima.Perl, 23
Asume que la cadena de entrada está asignada a
$_
fuente
Python 2 - 59
Suministrar la cadena como variable
n
fuente
C99 - 86 (GCC 4.9.0 y Visual C ++ 2013)
Editar: Tanto GCC 4.9.0 (con -std = c99) como Visual C ++ 2013 compilan con éxito (con advertencias) el mismo código sin las inclusiones. ¡No sabía que podías hacer eso! Gracias por la pista.
Editar: Ni siquiera se me ocurrió que debería escribirlo en la pantalla sobre la marcha en lugar de crear la cadena y luego imprimirla. Eso hace una gran diferencia. Gracias Dennis!
Esto está usando una cadena codificada pero el contenido de la cadena no se cuenta hacia el total (se cuenta el = "").
Básicamente se ejecuta a través de la cadena un carácter a la vez comprobando cada uno para ver si es un número entero. Si es así, incrementa el número entero y lo escribe en la salida; de lo contrario, copia el carácter actual en la salida.
Esto filtra la cadena codificada porque incrementa s.
fuente
include
s y aún se compilará bien con gcc.99
?J (20)
Espera que la entrada se almacene en la variable
a
.Prueba:
fuente
(f?) lex (39)
Archivo
inc.l
:Compilar:
Correr:
No probé esto con el original
lex
. Comentarios son bienvenidosfuente
%%
ya que este no es un código de usuario: flex.sourceforge.net/manual/…Emacs - 20 caracteres
Requiere que se procese el texto para estar presente en el búfer actual. Conté CM-% como un carácter aquí, ya que se puede ingresar con una pulsación de tecla al mantener presionados tres modificadores.
fuente
GNU sed, 304 (incluido 1 para el indicador -r)
Voté esta pregunta como un posible duplicado, pero quizás esto sea contrario a eso porque esta respuesta no se puede cambiar trivialmente para que funcione allí. Sin embargo, con mucho, la respuesta más larga.
Inspirado en este ejemplo de la documentación de sed , aunque necesitaba algo de trabajo para manejar múltiples números en una cadena:
Salida:
Tenga en cuenta esta inserta temporalmente
_
caracteres, por lo que podría dar lugar a resultados incorrectos si hay_
en el flujo de entrada. Como mitigación de esto, podemos reemplazar el_
script en el sed con algún carácter no imprimible (por ejemplo, ASCII 0x07 BEL), y asumir que la secuencia de entrada contiene solo ASCII imprimible. Esto parece funcionar bien cuando lo pruebo.fuente
Raqueta 74
fuente
Lua - 68 caracteres
Espera que la entrada se almacene en s.
fuente
CJam,
67 58 534831 caracteresEsta pregunta es como la peor pregunta para CJam. Sin expresiones regulares, sin coincidencia de patrones, sin captura de excepciones. Pero aquí vamos (#YOLO)
Éste divide la cadena en un grupo de solo alfabetos y solo dígitos. Incrementa cada dígito y une las dos matrices tomando un elemento de cada una a la vez.
Solución previa:
Pruébalo en línea aquí
Cómo funciona:
La idea básica es seguir almacenando el carácter por separado en una cadena si es un dígito y volcar el valor incrementado en la cadena final una vez que obtengamos un carácter que no sea un dígito.
fuente
Cobra - 88
fuente
C # -
178169157 caracteresEsto supone que los números como 999 pueden desbordarse a 000 y que - + ,. E no son parte de un número.
Mejor forma legible:
Soy nuevo aquí, nunca probé el código golf antes, solo lo intenté :)
Me pregunto si alguien tiene ideas para hacerlo aún más corto ...
Para participar con C #, sería bueno si pudiéramos omitir todo el marco necesario alrededor del código real, entonces esto solo tendría 82 caracteres, y eso sin llamar a ninguna función de sistema potente.
Lo mismo con los punteros (182 caracteres):
Ahora sin desbordarse, esto maneja correctamente el caso 999 (223 caracteres):
Otro más antiguo, se lee desde la entrada estándar y usa la recursividad:
Nota:
Console.ReadKey();
y la cadena en sí no debe contarse.Ya mejoré esto varias veces, ver comentarios. Todavía hay espacio para más mejoras, diría :) Y perdón por la duración, pero creo que las diferentes versiones son lo suficientemente interesantes como para mantenerlas ...
fuente
if(c==57)
que podría escribir enc--;
lugar dec=48;
, ¿qué pasa con el operador ternario también? De hecho, hay muchos trucos de golf. tal vez deberías visitar codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c... ? ... : c++*b--
Groovy, 38 bytes
Uggghhh ... Odio absolutamente las palabras
replace
yall
arruinan todos los campos de golf regex para mí.fuente
(it as int)+1
→it.next()
PHP - 91 bytes
No quería usar expresiones regulares. PHP no es capaz de incrementar directamente un desplazamiento de cadena, por lo tanto, necesitaba agregar algunos bytes en el paso de incremento. Este script de una línea me recuerda una época muy oscura de los scripts PHP ...
fuente
K, 56
fuente
sed y bash - 40 (incluyendo invocación y tuberías)
Salidas:
fuente
42;rm -rf /
funcionó la primera vez.\0
a&
(-1 caracteres),$((…))
a$[…]
(-2 caracteres),s/^/echo /
aiecho \\
(-2 caracteres) para acortar su código actual . Sin embargo, corrige mejor el error mencionado por @Dennis primero. (Él escribió “Se trabajó la primera vez” para la diversión y como pista sobre el tema En realidad el código de falla en la información que contiene.;
,#
,`…`
,$(…)
Y tal vez otros caracteres especiales también.)eval echo `sed 's/[0-9]\+/$[&+1]/g'`
embargo, todavía tiene el problema de inyección de código, según mi respuesta a otra pregunta similar codegolf.stackexchange.com/a/37145/11259Java 7, 119 bytes
Si el requisito es un programa en lugar de solo una función, entonces son 149 bytes:
Ungolfed y código de prueba:
Pruébalo aquí.
Salida:
fuente
Gema, 14 personajes
Ejecución de muestra:
fuente
DASH , 16 bytes (sin competencia)
Esto devuelve una función / aplicación parcial.
Uso:
Explicación
fuente
CJam, 18 bytes
Pruébalo aquí.
Explicación
fuente
R, 83 bytes
Tarde a la fiesta. Asume que la entrada se almacena en variable
x
. Probablemente no sea necesario usarloregmatches
para resolver esto, pero no pude encontrar reemplazos vectorizados sin ningún paquete externo.Desengañado y explicado
Salida de ejemplo
fuente
C # (compilador interactivo de Visual C #) con opción de línea de comandos
/u:System.Text.RegularExpressions.Regex;System.Int32
, 40 bytesEspera que la entrada esté en una variable llamada n.
Pruébalo en línea!
fuente