Definimos espaço em branco como qualquer um dos três caracteres, tab (0x09), nova linha (0x0A) ou espaço (0x20).
Para esse desafio, você deve escrever dois programas ou funções na mesma linguagem de programação, que executam as seguintes tarefas:
Conte os caracteres de espaço em branco em uma determinada sequência. Por exemplo, a entrada
123 -_- abc def
retornaria 7 (desde que não haja uma nova linha à direita).
Divida uma determinada sequência em execuções consecutivas de espaço em branco. Se a sequência começar ou terminar com espaço em branco, nenhuma sequência vazia deverá ser retornada nas extremidades. Por exemplo, a mesma entrada
123 -_- abc def
voltaria
["123", "-_-", "abc", "def"]
.
Em qualquer um dos casos, você pode receber informações via STDIN, argumento de linha de comando ou argumento de função para retornar o resultado ou imprimi-lo STDOUT. Para o segundo programa, se você optar por imprimir em STDOUT, imprima cada sequência em sua própria linha, sem aspas.
Nos dois programas, você pode assumir que a entrada contém apenas ASCII imprimível (0x20 a 0x7E) e espaço em branco.
Agora, aqui está o problema:
- Se todo o espaço em branco for removido dos dois programas / funções, as seqüências resultantes deverão ser idênticas. Ou seja, seus dois envios podem diferir apenas no número e no posicionamento dos caracteres de espaço em branco.
- Nenhum programa / função pode conter literais de sequência ou regex (literais de caracteres são bons, desde que seu idioma tenha um tipo de caractere designado).
- Nenhum programa / função pode conter comentários.
- Você não deve ler o código fonte do programa, direta ou indiretamente.
Isso é código de golfe. Sua pontuação é a soma dos tamanhos de ambas as soluções (em bytes). Menor pontuação ganha.
Classificação
O seguinte snippet de pilha gera uma tabela de classificação regular e uma visão geral dos vencedores por idioma. Portanto, mesmo que seu idioma de escolha não permita que você vença todo o desafio, por que não tentar conquistar um lugar na segunda lista? Eu ficaria muito interessado em ver como as pessoas enfrentam esse desafio em vários idiomas!
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
é o tamanho total do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Você também pode incluir as contagens individuais antes da contagem total, por exemplo
# Python 2, 35 + 41 = 76 bytes
O último número que não for atingido será usado pelo snippet.
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 42253;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
fonte
Respostas:
Pitão, 16 + 15 = 31 bytes
Experimente aqui .
Contador:
Divisor:
Cada um deles define uma função,
y
que recebe uma entrada de sequência para resolver a tarefa desejada.Obrigado a @FryAmTheEggman pela idéia de usar o recurso de indexação modular de Pyth em listas para fazer a barba de um personagem.
Casos de teste:
Explicação:
fonte
Python, 54 + 56 = 110 bytes
Contador:
Divisor:
Para o contador, usamos o fato de que Python não tem problema em ter apenas uma expressão em uma linha. É necessário dividir-se
+1
e0<9or x.split()
parar umNameError
de ser lançada, como0<9
sendoTrue
impedex.split()
de ser avaliada devido a curtos-circuitos.Para o divisor, como o número de espaços em branco é sempre não-negativo,
sum(y.isspace()for y in x)+10<9
é sempreFalse
e a função de divisão entra em ação.Alternativa 1, 59 + 60 = 119 bytes
Contador:
Divisor:
Os resultados da contagem e da divisão são armazenados em uma lista de dois elementos. A lista é indexada
min([1])
, retornando o mínimo da lista de um elemento que contém1
, oum in([1])
, que retornaFalse
(equivalente a0
) comom
não está contido[1]
.Alternativa 2, 67 + 69 = 136 bytes
Contador:
Divisor:
Como acima, os resultados da contagem e divisão são armazenados em uma lista de dois elementos.
sorted
é uma função interna que é um valor verdadeiro; portanto,not sorted
retornaFalse
(equivalente a0
). Poisnot s or ted
, uma vez ques
é uma função e também verdade,not s
éFalse
eted = 1
é retornado.Alternativa 3, 59 + 60 = 119 bytes
Contador:
Divisor:
Esta é uma função em que o resultado do divisor é armazenado na variável
a
e o resultado do contador é armazenado na variávela1
. Como antes, Python está bem em ter apenas uma expressão em uma linha, neste caso1
. A divisãoa1
determina o que retornar da função.fonte
not sorted
.+1
e entre0<9or x.split()
?m=lambda x:sum(y.isspace()for y in x)+00and x.split()
em=lambda x:sum(y.isspace()for y in x)+0;0and x.split()
(fazer esse ponto e vírgula uma nova linha é claro)Java 8, 239 + 240 = 479
Conte o espaço em branco (retorna Inteiro)
Dividir no espaço em branco (retorna Stream <>)
Explicação:
fonte
Espaço em branco, 75 + 153 = 228
Espaços, tabulações e novas linhas substituídas por STL, respectivamente, e dobradas por legibilidade. Converta em um arquivo Whitespace adequado com
tr -d \\n | sed 'y/STL/ \t\n/'
.Contador
Splitter
fonte
Marbelous, 103 + 92 = 195
Contador:
Divisor:
Teste estes programas aqui. Placas cilíndricas, bibliotecas de inclusão e espaços para células em branco devem ser todos verificados.
Entrada e Saída são através de STDIN / STDOUT.
Explicação
Contador:
O caminho azul recebe entrada. Se o caractere for um espaço em branco (valor ASCII menor que 0x21), o caminho preto será usado, que será sincronizado com o caminho roxo.
O caminho roxo simplesmente incrementa um mármore armazenado no
&1
sincronizador cada vez que o caminho preto é percorrido.Quando não houver mais entrada, o caminho vermelho será percorrido, imprimindo o número de caracteres de espaço em branco e saindo.
Divisor:
O programa começa com o caminho azul, que faz um loop até encontrar um caractere que não seja um espaço em branco.
Depois que um caractere que não é de espaço em branco é recuperado, o caminho preto é escolhido, que imprime esse caractere e move a execução para o caminho verde, que faz um loop e imprime até que um caractere de espaço em branco seja recebido. A execução continua para o caminho púrpura, que contém
3W
ou um divisor de três vias.O ramo esquerdo move a execução para o caminho azul (e o espaço em branco é descartado até que um caractere que não seja em espaço em branco seja encontrado).
O ramo do meio define a cópia da entrada como 0 com
?0
(gera um número aleatório entre0
e0
) e adiciona 10 (0x0A
= nova linha), que é então emitida.O caminho certo é descartado.
fonte
CJam, 26 + 27 = 53
59 61 73 77bytesContador
Splitter
Como funciona
A idéia é simples, calcule o número de espaços em branco e divida a string em execuções consecutivas de espaços em branco. Em seguida, escolha um deles com base no fato a seguir que
' !
significanot of space character
que é falso, enquanto'!
é o!
personagem que é verdadeiro.Código expandido:
A entrada é de STDIN e a saída é para STDOUT
Experimente online aqui
fonte
Mathematica, 44 + 43 = 87
97bytesEu pensei em adicionar outro idioma à mistura.
Contador:
Divisor:
Isso faz uso do recurso do Mathematica de que a separação do espaço é igual à multiplicação. E que multiplicar algo por 0 é sempre 0, e adicionar 0 a algo é sempre idempotente.
Para o contador, contamos primeiro o espaço em branco e adicionamos
0*1*StringSpli*t@#
.StringSpli
et
não estão definidos, mas o Mathematica usa computação simbólica, portanto, trata-os apenas como uma variável e função desconhecidas. O1*
idempotente (assim como0+
), o0*
transforma em zero. É necessário separar asStringSplit
duas variáveis, porque o0
tempo em que uma lista é tratada como uma multiplicação escalar-vetor que resulta em um vetor (lista) de zeros.Para o divisor, estou usando o fato de que
Count
também existe, mas não examina as strings. Ele tenta contar todas as subexpressões correspondentes ao padrão, masWhitespace
é um padrão que se aplica apenas ao conteúdo da sequência. EntãoCount
sempre retornará0
, o que faz oString
desaparecer. A multiplicação da matriz dividida por01 = 1
é novamente idempotente.fonte
Ruby,
10791 bytesDivisor (46 bytes)
Contador (45 bytes)
p
é um método predefinido que, sem argumentos, apenas retornanil
. Usamos isso de várias maneiras. No divisor, a inicialp
não faz nada.gets(p)
lê tudo da entrada padrão, já que o delimitador é nulo. Nós chamamos o método de divisão embutido nisso e atribuímos o resultado ap
, então agora, quando não houver argumentos, ele será analisado como uma variável.puts p||...
curto-circuito e imprime cada elemento dap
variável em sua própria linha.No contador, excluímos a primeira nova linha para que a matriz dividida seja atribuída
pp
. Como não atribuímos ap
ele, ainda é o método de retorno nulo; portanto, a segunda parte do||
é avaliada e passada paraputs
.$_
é uma variável mágica que contém o resultado degets
, portanto, a quantidade total de espaço em branco é o tamanho desse menos os caracteres que não são em branco, que são o quepp
contém. Eu sinto que deveria haver uma maneira mais curta de fazer a contagem, mas não consigo encontrar uma, e de qualquer forma é divertido usar o array dividido no contador.fonte
Python, 169
É quase fácil demais fazer isso em Python!
Contador:
Divisor:
Eles diferem em apenas um espaço, e eu não estou fazendo nenhum truque como dividir um número ou nome de variável ao meio :)
fonte
C, 138 + 136 = 274
Em cada caso, o código é um programa que aceita exatamente um argumento da linha de comando e imprime o resultado em stdout.
\t
deve ser substituído por um caractere de tabulação. Se você deseja passar um argumento contendo guias e novas linhas, é seu trabalho descobrir como;).Contando
Divisão
fonte
JavaScript, 95 + 96 = 191 bytes
Contador:
Divisor:
Ungolfed:
A
RegExp(String.fromCharCode(92,115)
linha cria a regex de correspondência de espaço em branco/\s/
sem literais de regex ou string.Em cada programa, usamos a variável
v
orvv
. Armazenamos a matriz dividida nessa variável (v
ouvv
) e, em seguida, ramificamos nosso comportamento no valor dev
(enquanto isso,vv
é ignorado). No balcão,v
tem um valor verdadeiro; no divisor, ele tem um valor falso (porquevv
obteve o valor).Alternativo: JavaScript, 250 bytes
Tenho outra solução que não está ganhando nenhum prêmio por brevidade, mas achei que era um desafio interessante abusar do comportamento automático de inserção de ponto e vírgula do JavaScript.
Contador:
Divisor:
Contador ungolfed:
O divisor é exatamente o mesmo, exceto pela linha:
é agora
Inserção vírgula automática de JavaScript normalmente não terminar declarações de várias linhas cedo se eles podem ser compreendidas sem uma quebra de linha, mas não tolera quebras de linha depois
return
,continue
oubreak
. Portanto, a linha é lida simplesmente comobreak
, que interrompe apenas o loop interno, em vez de interromper o loop externo. O comportamento da "segunda passagem"o = a.filter(j=>j)
é então executado (contra ser ignorado no contador), porque o loop externo recebe uma segunda passagem.fonte
!!x
diferente daBool
conversão automática ?filter
auto-bools retorna seu retorno de chamada pelas mesmas regras que!!
. Obrigado!Pitão,
228198182166146145 bytesContador ( 72 bytes ):
Divisor ( 73 bytes ):
ior1
é uma variável falsey, masi or 1
é verdadeira. Esse é o truque principal.fonte
i
for a string vazia para o divisor? Pode ser corrigido alterandoiorb
paraior1
, o que também permite salvar o caractere entre1
eelse
.Befunge 98, 61 + 59 = 120
Contador:
Divisor:
fonte
Bash, 75 + 79 = 154 bytes
Isso depende do bash poder continuar a execução, mesmo que algumas linhas ou partes de uma linha do script estejam malformadas (em algumas circunstâncias). O espaço em branco é usado para desativar escapes para alguns colchetes próximos e para quebrar um tubo, colocando-o em uma nova linha.
Divisor:
Contador:
A entrada é via argumento da linha de comando, a saída é via stdout.
Como isso depende do comportamento do erro do bash, espera-se que o usuário ignore o stderr.
Exemplo de execução (mostrando a entrada com uma nova linha e vários espaços contíguos):
fonte
Ruby,
114 + 116107 + 109 = 216 bytesIsso não pode competir com a solução ruby pelo histocrat, mas achei que valeria a pena colocar de qualquer maneira.
Eu usei
$z
paranil
enil.to_s
paraString.new
O caractere de espaço em branco extra que adiciono ao final da entrada é forçar a última palavra a ser adicionada à matriz (
r
) - uma palavra é adicionada apenas ao final da matriz quando um caractere de espaço em branco segue um caractere que não é de espaço em branco. A alternativa foi adicionar outrar<<w if w
após oeach_byte
bloco.Contando
Divisão
fonte
Haskell ,
53 + 55 = 10836 + 38 = 74 bytesContador
Splitter
Essa solução utiliza o fato de que nas funções Haskell são uma instância da classe do tipo Monad e, portanto, pode ser usada como ações monádicas na notação de doação.
No primeiro caso, a função resultante do do-block é o primeiro argumento de
pure
(que é essencialmenteconst
para o tipo de função), tornando o contador o resultado final e o divisor sendo descartado.No segundo caso,
pure
é aplicado apenas a um único argumento, tornando-o uma função que retorna outra função (o contador). No entanto, o resultado nunca é usado e, portanto, descartado. O resultado final é a segunda linha do do-block, o divisor.fonte
[' ','\t','\n']
pode ser reduzido para" \t\n"
.(<'!')
para testar o espaço em branco.Java 8, 187 + 188 = 375
Antes de mais, gostaria de dizer que esta resposta é fortemente baseada no @ Ypnypn's. Substituí basicamente algumas partes por outras mais curtas (incluindo a parte dependente de espaço em branco, que a IMO é a mais importante nesse desafio), mas o código funcional é basicamente o mesmo.
Conte o espaço em branco , 187 (retorna
int
):Dividido no espaço em branco , 188 (retorna
Stream<String>
):fonte
J, 48 + 49 = 97 caracteres
Duas funções pegando e retornando um único argumento. Usei a maneira mais crapp que eu poderia pensar para vencer a regra do mesmo espaço em branco, então provavelmente há caracteres a serem salvos ao encontrar uma rota mais inteligente em torno disso.
Definimos o verbo
a
como tendo duas ações diferentes, dependendo se ele é usado com um argumento ou com dois. Com um argumento, é(e.u:)&9 10 32
, que verifica se cada caractere está em espaço em branco ou não. Com dois argumentos, éa:-.~(<;._1~1,}.)
, que pega um vetor booleano à direita e corta o argumento esquerdo nessas posições, jogando fora quaisquer cortes vazios coma:-.~
.Em seguida, definimos o
aa
número de valores True no resultado dea
, o que só faz sentido com um argumento. Por fim, usamosaa
oua a
dependendo se queremos contar ou dividir o espaço em branco da string.aa
funciona como esperado.O motivo
a a
funciona é porque, quando J vê(f g)y
, considera(f g)
um gancho e avalia comoy f (g y)
. Nesse caso,f
é o diádicoa
acima do qual faz o corte, eg
éa[aa
, o qual calcula a soma deaa
, joga fora e calcula (monádico)a
novamente.No REPL:
fonte
Bash, 54 + 50 = 104 bytes
Contador
Splitter
fonte
Perl, 37 + 38 = 75
Contador :
Divisor :
fonte
Perl 6, 31 + 32 = 63 bytes
Contador
Experimente online!
?^1
é analisado como o?^ 1
que aplica o operador de negação booleano a 1, resultando emFalse
.Splitter
Experimente online!
? ^1
converte o intervalo 0..0 em Bool, resultando emTrue
.fonte
Python 2, 98
Divisão (49)
Retorna os tokens em uma lista.
Contando (49)
Retorna uma lista de comprimento um contendo o número de caracteres de espaço. Provavelmente causará um erro de tempo de execução, mas a função
f
pode ser usada após a execução do código.fonte
C (gcc) , 88 + 89 = 177 bytes
Splitter
Splitter
Contador
Contador
Atropelar
Recebe entrada como argumento de função. A função de contagem retorna o número de espaços em branco. A função de divisão usa STDOUT para sua saída (mas, aliás, retorna o número de espaços em branco menos um).
fonte
Zsh , 35 + 35 = 70 bytes
Não tenho certeza se
[^$IFS]
qualifica, pois é usado na correspondência de padrões. Aqui está uma solução 45 + 45 no caso de ser banida.Dividido:
Contagem:
O
:
builtin é equivalente atrue
, nós o usamos como algo entre um comentário e / dev / null (já que os comentários são proibidos) canalizando a expansão indesejada para ele.O Zsh tem um builtin para dividir em espaço em branco, sendo esse
${=var}
. Isso torna difícil fazer qualquer tipo de combinação lógica, além de apenas executar as duas e descartar a que não queremos.Experimente online!
fonte