Edição: Se você estiver usando Lisp, eu dei algumas orientações na parte inferior na contagem de bytes.
Objetivo: criar a função mais curta que divide uma sequência em dígitos que não sejam dígitos e retorna uma matriz que consiste apenas em dígitos em cada sequência, sem o uso de expressões regulares. Os zeros à esquerda devem ser incluídos em cada sequência.
Classificação atual (separada em categorias):
- C / C ++ / C # / Java: 68 (C) ....
- GolfScript / APL / J: 13 (APL)
- Todos os outros: 17 (Bash, usos
tr
), 24 (Ruby)
Regras:
(Peço desculpas pela demora)
- O formato deve ser uma função com um argumento de cadeia única. Até dois argumentos adicionais podem ser adicionados, se necessário, para o retorno adequado da matriz (por exemplo, sh / csh / DOS Batch precisa de uma referência variável extra para retornar, etc.).
- A declaração da função principal não conta e nem importa outras bibliotecas padrão. `# include`s,` import`s e `using`s não contam. Tudo o resto faz. Isso inclui as funções # # define`s e helper. Desculpe pela confusão. Consulte este manual como um guia útil sobre o que conta / não conta (escrito na sintaxe no estilo C)
// não conta para o total, pode ser omitido, a menos // não óbvio, como metade da biblioteca padrão do Java. #include <stdio.h> import some.builtin.Class // não conta, veja acima #define printf p // conta para o total / * Quaisquer outras diretivas de pré-processador, etc. contam. * / int i = 0; // conta someFunction (); // conta char [] [] myMainSplitFunction (char [] [] array) {// não conta // Tudo aqui conta return returnArray; // Até isso conta. } // não conta / * Tudo aqui conta, incluindo a declaração * / char [] [] someHelperFunction (char [] string) { // coisa } // mesmo isso conta
- A saída deve ser uma matriz de cadeias ou semelhante (listas de matrizes em Java e similares são aceitáveis). Exemplos de saída aceite:
String[]
,char[][]
,Array
,List
, eArray
(objecto). - A matriz deve conter apenas primitivas de seqüência de caracteres de comprimento variável ou objetos de seqüência de caracteres. Nenhuma string vazia deve estar presente no retorno, com a exceção abaixo. Nota: as sequências devem conter uma sequência de correspondências consecutivas, como o exemplo de entrada e saída abaixo.
- Se não houver correspondências, o corpo da função deve retornar
null
, uma matriz / lista vazia ou uma matriz / lista contendo uma sequência vazia. - Nenhuma biblioteca externa permitida.
- As terminações de linha do DOS contam como um byte, não dois (já abordado na meta, mas precisa ser enfatizado)
- E a maior regra aqui: não são permitidas expressões regulares.
Esta é uma questão de código-golfe , então o menor tamanho vence. Boa sorte!
E aqui estão alguns exemplos de entradas e saídas (com escapamentos no estilo C):
Entrada: "abc123def456" Saída: ["123", "456"] Entrada: "aitew034snk582: 3c" Saída: ["034", "582", "3"] Entrada: "as5493tax54 \\ [email protected]" Saída: ["5493", "54", "430", "52", "9"] Entrada: "sasprs] rasgou \" re \\ forz " Saída: nulo, [], [""] ou similar
Por favor, coloque quantos bytes usados por suas respostas e, como sempre, golfe feliz!
Diretrizes para Lisp
Aqui está o que conta e o que não conta nos dialetos Lisp:
;;; Opção 1 (desafinar extract-strings (ab); Não conta (coisa) ;;; Tudo aqui conta ); Não conta ;;; opção 2 (extrair strings de extração (string & aux (início 0) (final 0)); Não conta (coisa) ;;; Tudo aqui conta ); Não conta.Todas as outras lambdas contam totalmente para a contagem de bytes.
Respostas:
APL, 13 caracteres
(ou 28/30 bytes, leia abaixo)
Vejo que você baniu o GolfScript da sua pergunta. Entendo sua opinião, mas espero que essa comunidade não bana o APL, porque é uma linguagem de programação verdadeiramente notável, com uma longa história, sem mencionar muita diversão em codificar. Talvez possa ter uma pontuação diferente, se as pessoas sinto que está competindo injustamente. Vou postar meus pensamentos sobre esse assunto no tópico que você vinculou.
Nesse mesmo token, sempre adicionei uma nota de rodapé às minhas postagens de APL, alegando que o APL poderia ser pontuado como 1 char = 1 byte. Minha afirmação se baseia no fato de que algumas implementações de APL (principalmente comerciais) ainda suportam sua própria codificação herdada de byte único, com os símbolos da APL mapeados para os valores superiores de 128 bytes. Mas talvez isso seja um exagero; nesse caso, convém marcar essa entrada como 28 bytes em UTF-16 ou 30 bytes em UTF-8.
Explicação
Exemplos
O formato de saída padrão para uma matriz de seqüências de caracteres não deixa claro quantas seqüências existem na matriz, nem quantos espaços em branco. Mas uma manipulação rápida para adicionar aspas deve deixar bem claro:
fonte
∊⍕¨⍳10
, você não poderia simplesmente usar⎕D
? Essa deve ser a constante'0123456789'
. O Dyalog APL, no mínimo, o suporta, e o NARS2000 também.Python 47
Implementação
Demo
Algoritmo
Converta cada caractere que não seja dígito em espaço e depois divida a sequência resultante. Uma abordagem simples e clara.
E uma solução divertida com itertools (71 caracteres)
fonte
Ruby, 70
Versão online para teste
Como converter qualquer caractere que não seja um dígito para um int retorna 0 em Ruby (com to_i), a conversão de todos os caracteres em int e de volta em char é a maneira não-regular de verificar um dígito ...
fonte
bash, 26 (conteúdo da função: 22 + sobrecarga de atribuição de matriz 4)
Isso não vai superar a outra
bash
resposta , mas é interessante porque pode fazer você pensar duas vezes:O uso é:
À primeira vista,
//+([!0-9])/
parece muito com uma substituição de regexp, mas não é. É uma expansão de parâmetro bash , que segue regras de correspondência de padrões , em vez de regras de expressão regular.Retornar tipos de array bash verdadeiros a partir de funções bash é uma tarefa difícil, então eu escolhi retornar uma lista delimitada por espaço e depois converter para um array em uma atribuição de array fora da chamada de função. Portanto, no interesse da justiça, acho que a
(` `)
chamada de função ao redor deve ser incluída na minha pontuação.fonte
Mathematica 32
Uso
O equivalente a usar expressões regulares é muito mais longo !:
fonte
Bash,
21 bytes17/21 bytes (aprimorado pelo DigitalTrauma )Construindo uma lista separada por espaços com
tr
substitui qualquer dígito por um espaço
Uso
Editar
conforme apontado pelos comentários abaixo, o código pode ser reduzido para 17 bytes:
e como o resultado não está falando estritamente uma matriz Bash, o uso deve ser
e o extra
(``)
deve ser contadofonte
(blah)
em vez de{blah;}
:split()(tr -c 0-9 \ <<<$1)
. Dessa forma, seu corpo funcional tem apenas 17 caracteres.a=($(split "12 3a bc123")); echo ${a[@]}
. Pode-se argumentar que "($ ())" seja contado em sua pontuaçãotr
abordagem, tentei fazer isso com uma expansão de parâmetros .tr
é definitivamente a melhor abordagem para fins de golfe.tr
com o operador de expansão? Seria algo como($(tr...))
, e onde a declaração da função não conta, os parênteses externos não contam contra você. Seria apenas a parte de substituição de comando.(``)
construção é 1 caractere melhor do que a que($())
será preferida.Smalltalk (Smalltalk / X), 81
valor f: 'abc123def456' -> OrderedCollection ('123' '456')
valor f: 'aitew034snk582: 3c' -> OrderedCollection ('034' '582' '3')
f value: 'as5493tax54 \ [email protected]' -> OrderedCollection ('5493' '54' '430' '52' '9')
f valor: 'sasprs] rasgou \ "re \ forz' -> OrderedCollection ()
sigh - O Smalltalk tem uma tendência a usar nomes de funções muito longos ...
fonte
asCollectionOfSubCollectionsSeparatedByAnyForWhich
ಠ_ಠ Este nome é muito longoR, 81
A função aceita uma string e retorna uma lista de strings.
Exemplos:
-
-
-
Nota:
$x
é o nome do elemento da lista.fonte
Perl, 53
Editar: em nenhuma correspondência, sub agora retorna a lista com uma string vazia (em vez da lista vazia) conforme necessário.
Também evita a divisão em caracteres de espaço único, pois desencadeia o comportamento de 'divisão em qualquer espaço em branco' , o que provavelmente viola as regras. Eu poderia usar o
/ /
delimitador, que seria dividido em espaço único, mas paradoxalmente pareceria usar o padrão regexp. Eu poderia usarunpack
o custo de alguns caracteres extras e assim me livrar dasplit
controvérsia, mas acho que, com o que termino, dividir um caractere literal (que não seja o espaço) é bom.E não, o operador de transliteração do Perl não faz expressões regulares. Eu posso desenrolar o intervalo de 0 a 9 para
0123456789
se esse for o problema.fonte
C, 68 bytes (apenas o corpo da função)
O primeiro argumento é a sequência de entrada, o segundo é a matriz de saída, que é uma matriz de sequências terminada em NULL. É necessário reservar memória suficiente
a
antes de chamar a função (no pior caso:sizeof(char*)*((strlen(s)+1)/2)
.A sequência de entrada é modificada pela função (todo caractere que não seja dígito é substituído por
'\0'
)Exemplo de uso
Resultado
Versão sem golfe:
fonte
VBScript, 190 (164 sem declaração de função)
Embora não seja nada competitivo, estou surpreso que o VBScript seja tão curto quanto ao fato de ser detalhado (13 bytes apenas para os CRs). Ele percorre a cadeia de caracteres, substituindo caracteres não numéricos por espaços, reduz todo o espaço em branco a espaços únicos e, em seguida, usa um delimitador de espaço para dividi-lo.
Casos de teste
fonte
Lisp comum (1 de acordo com a letra; 3173 de acordo com o espírito)
Aqui está uma versão legível. A contagem de bytes é bastante alta devido aos nomes longos em coisas como
digit-char-p
eposition-if
evector-push-extend
.O conceito de "declaração de função" é meio vago. Aqui está uma versão que possui apenas um byte (o caractere
x
no corpo da função); tudo o mais é agrupado nas variáveis auxiliares da lista de lamba da função (parte da declaração da função):A contagem real de bytes dependerá de quantas declarações auxiliares precisarão ser movidas para o corpo para que isso seja considerado aceitável. Alguma renomeação de função local também ajudaria (por exemplo, diminua,
position-if
pois aparece duas vezes, use variáveis de letra única etc.).Esta renderização do programa possui 220 caracteres:
Se nada mais, isso deve promover variáveis auxiliares e comuns do Lisp .
Isso pode ser escrito de forma mais concisa
loop
, é claro:O
loop
formulário, com espaço extra removido, possui 173 caracteres:fonte
(result
parêntese final para ser o corpo. A parte que define o nome e os parâmetros é a declaração.result
é declarada como parâmetro aqui; apenas possui uma forma de inicialização não trivial. É a mesma coisa, em princípio, como um argumento opcional com um valor padrão calculado por alguma expressão complexa. (Em casos mais simples, é fácil imaginar algo comochar* substring( char *str, int begin, int end(0) )
em alguma linguagem com uma sintaxe do tipo C para especificar queend
é opcional e que, se não for fornecido, seu valor será0
. Estou apenas destacando o fato de que alguns desses termos(defun fn (string &aux (start 0) (end 0)
, não contaria, mas tudo o que restaria no lambda contaria).JavaScript, 240 bytes
E para aqueles que estão curiosos, aqui está o meu provavelmente enorme golfe:
Acima em estampa bonita:
Acima no código descritivo normal
fonte
PHP 134
fonte
array_filter
. Isso removerá automaticamente todas as entradas que foremfalse
convertidas para booleanos.C, 158
Como C não possui funções de impressão em matriz incorporadas, eu tive que fazer esse trabalho sozinho, então peço desculpas por haver uma vírgula final em cada saída. Essencialmente, o que esse código faz é ler a sequência de caracteres, se não for um dígito, substitui-a por '\ 0' e, em seguida, apenas percorro o código e imprimo todas as cadeias de dígitos. (EOF = 0)
fonte
#define
s, declarações de variáveis, etc. contarão, mas a declaração de função não.char[][]
legal. Se você voltar assim (ouchar**
), ficará bem.C #, 98
Primeiro, isso usa o
.Select()
método de extensão LINQ para transformar todos os não dígitos em vírgulas.string.Replace()
seria preferível, pois retorna um emstring
vez de umIEnumerable<char>
, masstring.Replace()
pode usar apenas um único caractere ou string e não pode usar um predicado comochar.IsDigit()
or47<c&c<58
.Como mencionado,
.Select()
aplicado a uma string retorna umIEnumerable<char>
, então precisamos transformá-la novamente em uma string, transformando-a em uma matriz e passando a matriz para ostring
construtor.Finalmente, dividimos a string em vírgulas usando
string.Split()
.(StringSplitOptions)1
é uma maneira mais curta de dizerStringSplitOptions.RemoveEmptyEntries
, que cuida automaticamente de várias vírgulas e vírgulas consecutivas no início / fim da sequência.fonte
char.IsDigit(c)
, você pode usar'/'<c&&c<':'
47<c&&c<58
. (Francamente, estou surpreso que funcione com números, mas aparentemente funciona).,
, em seguida, remover manualmente os itens vaziosreturn new string(s.Select(c=>47<c&c<58?c:' ').ToArray()).Split().Where(a=>a!="").ToArray();
JS / Nó:
168162147138 caracteresVersão embelezada:
fonte
console.log(r)
e algumas outras coisasRuby, 24
Define dígitos usando espaço negativo dentro do intervalo ascii imprimível.
fonte
php , 204
Código descritivo:
Este é um código bastante longo e tenho certeza de que haverá uma versão php muito mais curta para esse código de golfe. Isso é o que eu poderia criar no php.
fonte
array()
por[]
,array_push($output[$count], $arr[$i]);
por$output[$count][]=$arr[$i];
e asord()
verificações poris_numeric()
. e você nem precisa dividir a string para iterar sobre seus caracteres. Além disso, apenas o código interno da função conta, portanto, como você é, a contagem de caracteres é 204.Pitão
fonte
Python
10483Resposta @Abhijit é muito inteligente, esta é apenas uma versão "minificada" do que eu tinha em mente.
Como não gera saída, o código está funcionando, se executado um a um, pois algumas variáveis são definidas na declaração.
fonte
PHP
9889Como na resposta bash do DigitalTrauma, isso não usa um regex.
Casos de teste:
fonte
Haskell 31
Divide a cadeia em todos os caracteres não numéricos e remove as cadeias vazias geradas por delimitadores consecutivos.
fonte
VBA 210, 181 sem declaração de função
fonte
Rebol (66 caracteres)
Ungolfed e wrapped na declaração de função:
Exemplo de código no console Rebol:
fonte
JavaScript,
1049789Golfe:
Edit: Quando os loops saem do final da matriz,
c
éundefined
, o que é falso e finaliza o loop.27/2: Usar
?:
salva o wordiness deif/else
.O retorno de carro no corpo é para facilitar a leitura e não faz parte da solução.
Ungolfed:
A idéia é anexar cada caractere à última entrada da matriz, se for um dígito, e garantir que a última entrada da matriz seja uma sequência.
fonte
Javascript, 72
Ungolfed
Entrada / saída de amostra
JSFiddle
fonte
if(+a[i]+1)b+=a[i];else if(b)c.push(b),b=""
porb=+a[i]+1?b+a[i]:b?(c.push(b),""):b
.(c.push(b),"")
parecia inteligente, nunca vi isso.R 52
Esta função divide seqüências de caracteres por classe de caractere (isto não é regex! :)) classe é N - caracteres numéricos e P {N} significa negação dessa classe. o = T significa omitir substrings vazios.
fonte
PHP 99
Resultado
fonte
JavaScript 88
88 caracteres quando não está contando a função n (x) {}
fonte