EDITAR: si está utilizando Lisp, he dado algunas pautas en la parte inferior en el conteo de bytes.
Objetivo: realizar la función más corta que divide una cadena en no dígitos y devuelve una matriz que consta de solo dígitos en cada cadena, sin el uso de ninguna expresión regular. Los ceros iniciales se incluirán en cada cadena.
Posiciones actuales (separadas en categorías):
- C / C ++ / C # / Java: 68 (C) ....
- GolfScript / APL / J: 13 (APL)
- Todos los demás: 17 (Bash, usos
tr
), 24 (Ruby)
Reglas:
(Pido disculpas por la tardanza)
- El formato debe ser una función con un solo argumento de cadena. Se pueden agregar hasta dos argumentos adicionales si es necesario para el retorno adecuado de la matriz (por ejemplo, sh / csh / DOS Batch necesita una referencia de variable adicional para devolver, etc.).
- La declaración de función principal no cuenta, y tampoco importa otras bibliotecas estándar. `# include`s,` import`s y `using`s no cuentan. Todo lo demás lo hace. Esto incluye `# define`s y funciones de ayuda. Perdón por la confusion. Consulte esto como una guía útil sobre lo que cuenta / no cuenta (escrito en sintaxis de estilo C)
// no cuenta para el total, puede omitirse a menos que // no obvio, como la mitad de la biblioteca estándar de Java. #include <stdio.h> importar some.builtin.Class // no cuenta, ver arriba #define printf p // cuenta para el total / * Cualquier otra directiva de preprocesador, etc. cuenta. * / int i = 0; // cuenta someFunction (); // cuenta char [] [] myMainSplitFunction (char [] [] array) {// no cuenta // Todo aquí cuenta return returnArray; // Incluso esto cuenta. } // no cuenta / * Todo aquí cuenta, incluida la declaración * / char [] [] someHelperFunction (cadena char []) { // cosas } // incluso esto cuenta
- La salida debe ser una matriz de cadenas o similar (se aceptan listas de matrices en Java y similares). Ejemplos de salida aceptada:
String[]
,char[][]
,Array
,List
, yArray
(objeto). - La matriz debe contener solo primitivas de cadena de longitud variable u objetos de cadena. No deben aparecer cadenas vacías en la devolución, con la excepción a continuación. Nota: las cadenas deben contener una cadena de coincidencias consecutivas, como la entrada y salida de ejemplo a continuación.
- Si no hay coincidencias, el cuerpo de la función debería devolver
null
, una matriz / lista vacía, o una matriz / lista que contiene una cadena vacía. - No se permiten bibliotecas externas.
- Las terminaciones de línea de DOS cuentan como un byte, no dos (ya cubiertas en meta, pero deben enfatizarse)
- Y la regla más importante aquí: no se permiten expresiones regulares.
Esta es una pregunta de código de golf , por lo que gana el tamaño más pequeño. ¡Buena suerte!
Y aquí hay algunos ejemplos de entradas y salidas (con escapes de estilo C):
Entrada: "abc123def456" Salida: ["123", "456"] Entrada: "aitew034snk582: 3c" Salida: ["034", "582", "3"] Entrada: "as5493tax54 \\ [email protected]" Salida: ["5493", "54", "430", "52", "9"] Entrada: "sasprs] tore \" re \\ forz " Salida: nulo, [], [""] o similar
Indique cuántos bytes utilizan sus respuestas y, como siempre, ¡feliz golf!
Pautas para Lisp
Esto es lo que cuenta y no cuenta en los dialectos de Lisp:
;;; Opción 1 (Defun extract-strings (ab); no cuenta (cosas) ;;; Todo aquí cuenta ); No cuenta ;;; opcion 2 (defun extracto-cadenas (cadena y aux (inicio 0) (final 0)); no cuenta (cosas) ;;; Todo aquí cuenta ); No cuentaTodas las otras lambdas cuentan totalmente para el conteo de bytes.
Respuestas:
APL, 13 caracteres
(o 28/30 bytes, lea a continuación)
Veo que has prohibido GolfScript a tu pregunta. Entiendo su opinión, pero espero que esta comunidad no prohíba eventualmente APL, porque es un lenguaje de programación verdaderamente notable con una larga historia, sin mencionar que es muy divertido codificarlo. Tal vez podría calificarse de manera diferente, si las personas Siento que está compitiendo injustamente. Publicaré mis pensamientos sobre este asunto en ese hilo que has vinculado.
En ese mismo token, siempre agregué una nota al pie de página en mis publicaciones APL, alegando que APL podría puntuarse como 1 char = 1 byte. Mi afirmación se basa en el hecho de que algunas implementaciones APL (en su mayoría comerciales) todavía admiten su propia codificación de un solo byte heredado, con los símbolos APL asignados a los valores superiores de 128 bytes. Pero tal vez esto sea demasiado, en cuyo caso es posible que desee calificar esta entrada como 28 bytes en UTF-16 o 30 bytes en UTF-8.
Explicación
Ejemplos
El formato de salida predeterminado para una matriz de cadenas no deja en claro cuántas cadenas hay en la matriz ni cuántos espacios en blanco. Pero una manipulación rápida para agregar citas debería dejarlo lo suficientemente claro:
fuente
∊⍕¨⍳10
, ¿no podrías simplemente usar⎕D
? Esa debería ser la constante'0123456789'
. Dyalog APL por lo menos lo admite, y también lo hace NARS2000.Python 47
Implementación
Manifestación
Algoritmo
Convierta cada carácter que no sea un dígito en espacio y luego divida la cadena resultante. Un enfoque simple y claro.
Y una solución divertida con itertools (71 caracteres)
fuente
Rubí, 70
Versión en línea para probar
Dado que la conversión de cualquier carácter que no sea un dígito a un int devuelve 0 en Ruby (con to_i), la conversión de cada carácter a int y de nuevo a carácter es la forma sin expresión regular de verificar un dígito ...
fuente
bash, 26 (contenido de la función: 22 + asignación de matriz sobrecarga 4)
Esto no va a superar la otra
bash
respuesta , pero es interesante porque podría hacerte tomar dos veces:El uso es:
A primera vista rápida, se
//+([!0-9])/
parece mucho a una sustitución de expresiones regulares, pero no lo es. Es una expansión de parámetros bash , que sigue las reglas de coincidencia de patrones , en lugar de las reglas de expresión regular.Devolver tipos de matriz de bash verdaderos de las funciones de bash es una molestia, por lo que elegí devolver una lista delimitada por espacios en su lugar, luego convertirla en una matriz en una asignación de matriz fuera de la llamada a la función. Entonces, en aras de la equidad, creo que la
(` `)
llamada a la función debería incluirse en mi puntaje.fuente
Mathematica 32
Uso
¡El equivalente usando expresiones regulares es mucho más largo !:
fuente
Bash,
21 bytes17/21 bytes (mejorado por DigitalTrauma )Construyendo una lista separada por espacios con
tr
reemplaza cualquier no dígito por un espacio
Uso
Editar
Como señalan los comentarios a continuación, el código se puede reducir a 17 bytes:
y como el resultado no es estrictamente hablando una matriz Bash, el uso debe ser
y el extra
(``)
debe contarsefuente
(blah)
instead of{blah;}
:split()(tr -c 0-9 \ <<<$1)
. That way your function body is only 17 chars.a=($(split "12 3a bc123")); echo ${a[@]}
. It could be argued that "($())" be counted in your scoretr
approach, I tried doing this with a parameter expansion.tr
is definitely the better approach for golfing purposes.tr
with the expansion operator? It would come out to something like($(tr...))
, and where the function declaration doesn't count, the outer parentheses wouldn't count against you. It would only be the command substitution part.(``)
construct is 1-char better than the($())
one and shall be prefered.Smalltalk (Smalltalk/X), 81
f value:'abc123def456' -> OrderedCollection('123' '456')
f value:'aitew034snk582:3c' -> OrderedCollection('034' '582' '3')
f value:'as5493tax54\[email protected]' -> OrderedCollection('5493' '54' '430' '52' '9')
f value:'sasprs]tore\"re\forz' -> OrderedCollection()
sigh - Smalltalk has a tendency to use veeeery long function names...
fuente
asCollectionOfSubCollectionsSeparatedByAnyForWhich
ಠ_ಠ This name is too longR, 81
The function accepts a string and returns a list of strings.
Examples:
-
-
-
Note:
$x
is the name of the list element.fuente
Perl, 53
Edit: on no matches, sub now returns list with empty string (instead of empty list) as required.
It also avoids splitting on single space character, as it triggers 'split on any white-space' behavior, which probably violates the rules. I could use
/ /
delimiter, which would split on single space, but paradoxically it would look like using regexp pattern. I could useunpack
at the cost of some extra characters and so get rid ofsplit
controversy altogether, but I think that, what I finish with, splitting on a literal character (other than space) is OK.And, no, Perl's transliteration operator doesn't do regular expressions. I can unroll 0-9 range to
0123456789
if that's the problem.fuente
C, 68 bytes (only the function's body)
The first argument is the input string, the second one is the output array, which is a NULL-terminated string array. Sufficient memory must be reserved for
a
before calling the function (worst case:sizeof(char*)*((strlen(s)+1)/2)
).The input string is modified by the function (every non-digit character is replaced by
'\0'
)Usage example
Output
Un-golfed version:
fuente
VBScript, 190 (164 without function declaration)
While not competitive at all, I'm surprised that VBScript comes out this short on this given how verbose it is (13 bytes for the CRs alone). It loops through the string, replacing any non-numeric characters with spaces, then reduces all the whitespace to single spaces, and then uses a space delimiter to divide it.
Test cases
fuente
Common Lisp (1 according to the letter; ≈173 according to the spirit)
Here's a readable version. The byte count is fairly high because of the long names in things like
digit-char-p
andposition-if
andvector-push-extend
.The concept of "function declaration" is sort of vague. Here's a version that only has one byte (the character
x
in the function body); everything else is bundled in to the auxiliary variables of the function's lamba list (part of the function's declaration):The actual byte count will depend on how many of auxiliary declarations would have to be moved into the body for this to be deemed acceptable. Some local function renaming would help, too (e.g., shorten
position-if
since it appears twice, use single letter variables, etc.).This rendering of the program has 220 characters:
If nothing else, this should promote Common Lisp's &aux variables.
This can be written more concisely with
loop
, of course:The
loop
form, with extra space removed, has 173 characters:fuente
(result
on to the final parenthesis to be the body. The part that defines the name and parameters are the declaration.result
is declared as a parameter here; it just has a very non-trivial initialization form. It's the same thing, in principle, as an optional argument with a default value that's computed by some complex expression. (In simpler cases, it's easy to imagine something likechar* substring( char *str, int begin, int end(0) )
in some language with a C-like syntax to specify thatend
is optional and that if it's not provided, then its value is0
. I'm just highlighting the fact that some of these terms(defun fn (string &aux (start 0) (end 0)
wouldn't count, but everything remaining in the lambda would).JavaScript, 240 bytes
And for those of you who are curious, here's my probably huge golf:
Above in pretty print:
Above in normal descriptive code
fuente
PHP 134
fuente
array_filter
. This will automatically remove all entries which arefalse
when they're casted to booleans.C, 158
Since C doesnt have array print functions built-in I had to do that work on my own so I apologive that there is a final comma in every output. Essentially what that code does is it reads the string if it is not a digit it replaces it with '\0' and then I just loop through the code and print out all of the chains of digits.(EOF=0)
fuente
#define
s, variable declarations, etc. will count, but the function declaration will not.char[][]
which is legal. If you return as that (orchar**
), you will be fine.C#, 98
First, this uses the LINQ
.Select()
extension method to turn all non-digits into commas.string.Replace()
would be preferable, since it returns astring
rather than aIEnumerable<char>
, butstring.Replace()
can only take a single char or string and can't make use of a predicate likechar.IsDigit()
or47<c&c<58
.As mentioned,
.Select()
applied to a string returns anIEnumerable<char>
, so we need to turn it back into a string by turning it into an array and passing the array into thestring
constructor.Finally, we split the string at commas using
string.Split()
.(StringSplitOptions)1
is a shorter way of sayingStringSplitOptions.RemoveEmptyEntries
, which will automatically takes care of multiple consecutive commas and commas at the start/end of the string.fuente
char.IsDigit(c)
, you can use'/'<c&&c<':'
47<c&&c<58
. (Frankly, I'm surprised it works with numbers, but apparently it does).,
, and then manually remove the empty itemsreturn new string(s.Select(c=>47<c&c<58?c:' ').ToArray()).Split().Where(a=>a!="").ToArray();
JS/Node :
168162147138 CharsBeautified version:
fuente
console.log(r)
and some other thingsRuby, 24
Defines digits using negative space within the printable ascii range.
fuente
php, 204
Descriptive Code:
This is pretty long code and I'm sure there will be a much shorter php version for this code golf. This is what I could come up with in php.
fuente
array()
with[]
,array_push($output[$count], $arr[$i]);
with$output[$count][]=$arr[$i];
, and theord()
checks withis_numeric()
. and you don't even need to split the string to iterate over its characters. also, only the inner code of the function counts, so as it is you char count is 204.Python
fuente
Python
10483@Abhijit answer is far clever, this is just a "minified" version of what i had in mind.
This yields no output, so the code is working, if ran one by one, as some variables are defined at the declaration.
fuente
PHP
9889As in DigitalTrauma's bash answer, this doesn't use a regex.
Test cases:
fuente
Haskell 31
It splits the string on all non-numeric characters and removes the empty strings generated by consecutive delimiters.
fuente
VBA 210, 181 without function declaration
fuente
Rebol (66 chars)
Ungolfed and wrapped in function declaration:
Example code in Rebol console:
fuente
JavaScript,
1049789Golfed:
Edit: When the loops walks off the end of the array,
c
isundefined
, which is falsy and terminates the loop.2/27: Using
?:
saves the wordiness ofif/else
.The carriage return in the body is for readability and is not part of the solution.
Ungolfed:
The idea is to append each character to the last entry in the array if it is a digit and to ensure the last array entry is a string otherwise.
fuente
Javascript, 72
Ungolfed
Sample input/output
JSFiddle
fuente
if(+a[i]+1)b+=a[i];else if(b)c.push(b),b=""
withb=+a[i]+1?b+a[i]:b?(c.push(b),""):b
.(c.push(b),"")
seemed clever, never seen that.R 52
This function splits strings by character class (this is not regex! :)) class is N - numeric characters and P{N} means negation of this class. o=T means omit empty substrings.
fuente
PHP 99
Output
fuente
JavaScript 88
88 chars when not counting function n(x){}
fuente