Seu desafio: Escrever uma função que leva uma corda s
, um personagem c
, e encontra o comprimento da corrida mais longa de c
no s
. A duração da corrida será l
.
Regras :
- Se o
s
comprimento for 0 ouc
vazio,l
deve ser 0. - Se não houver instâncias de
c
ins
,l
deve ser 0. - As brechas padrão e as Regras de E / S padrão se aplicam.
- Não importa onde
s
a sequência dec
s esteja localizada,l
deve ser a mesma. - Quaisquer caracteres ASCII imprimíveis podem aparecer em
s
ec
.
Casos de teste :
s,c --> l
"Hello, World!",'l' --> 2
"Foobar",'o' --> 2
"abcdef",'e' --> 1
"three spaces",' ' --> 3
"xxx xxxx xx",'x' --> 4
"xxxx xx xxx",'x' --> 4
"",'a' --> 0
"anything",'' --> 0
Vencedor :
Como no código-golfe, a resposta mais curta em cada idioma vence.
s
e umc
que não está contido em um não vazios
em seus casos de teste?s
/c
?c
pode estar vazio? Em muitos idiomas, um caractere é apenas um número inteiro com semântica especial, e você também não pode ter um número inteiro vazio.Respostas:
05AB1E , 5 bytes
Código:
Usa a codificação 05AB1E . Experimente online!
Explicação:
fonte
γ¢M
não está funcionando como eu pensei que seria, pensei que seria de 3 bytes.Mathematica, 35 bytes
Função pura pegando uma lista de caracteres e outro caractere como entrada e retornando um número inteiro não negativo. Aprimorado no meu primeiro esforço, usando a observação de Adnan (vá para votação!), Que se deve testar a igualdade do caractere especial antes de dividir a matriz.
Thread[#==#2]
verifica se cada caractere de entrada no primeiro argumento é igual ao caractere fornecido como o segundo argumento.Boole
converte osTrue
s e s resultantesFalse
em1
s e0
s.Split
divide a lista em execuções de elementos consecutivos;Tr/@
soma cada sub-lista eMax
encontra o vencedor. (Por causa de comoMax
funciona, se o primeiro argumento for a lista vazia, essa função retornará-∞
. Então, você sabe, não faça isso.)primeira submissão (51 bytes)
Split@#
divide a entrada em execuções de caracteres consecutivos, como{{"t"}, {"h"}, {"r"}, {"e", "e"}, {" ", " ", " "}, {"s"}, {"p"}, {"a"}, {"c"}, {"e"}, {"s"}}
no quarto caso de teste./.a:{c_String..}:>
substitui cada subexpressãoa
que é uma lista de um caractere repetidoc
porLength@a
multiplicado porBoole[c==#2]
, que é1
se éc
igual ao caractere de entrada e0
não. Em seguida,Max
extrai a resposta.fonte
Japonês ,
20 1815 bytesExperimente online!
Economizou 5 bytes graças ao obarakon e ETHproductions
fonte
fV+Vî+)
... Eu vou deixar você descobrir o resto para fora :-)"If s is of length 0 or c is empty, l should be 0"
, eu poderia estar levando isso também literalmente emboras
que não contém nenhuma instância dec
.Python , 38 bytes
Experimente online!
Dennis salvou 3 bytes atualizando
c
para uma sequência de caracteres duplicados em vez de atualizar recursivamente um número para multiplicarc
.fonte
f=lambda s,c:c in s and-~f(s,c+c[0])
salva 6 bytes (3 se False não for permitido).05AB1E ,
116 bytes-5 bytes graças à carusocomputação
Experimente online!
fonte
γvy²¢M
para 6 bytes, mesma ideia.Haskell,
4339 bytesExperimente online!
Execute a sequência e substitua o caractere atual por um contador que seja aumentado sempre que for igual
c
ou redefinido para o0
caso contrário. Leve o máximo da lista.Obrigado a @xnor por 4 bytes.
fonte
sum[n+1|c==k]
.*fromEnum(c==k)
, pointfree e lambda, mas sempre foram 2 ou 3 bytes mais.C #
116115 bytesMeu primeiro código de golfe
Editado porque o envio inicial era um snippet e faltava o namespace necessário para a regex
Edite # 2 reescrita completa para suportar caracteres com significados especiais de regex
using System.Linq; s => c => System.Text.RegularExpressions.Regex.Replace (s, "[^" + c + "]", ++ c + ""). Divisão (c) .Max (x => x.Length);fonte
c
es
seja predefinido. Chamamos isso de "snippet de código" e não é permitido. Você provavelmente poderia reestruturar seu código como uma função anônima ou definir essas variáveis para entrada. Ambos são permitidos.(s,c)=>
. Você precisa usarSystem.Text.RegularExpressions.Regex
ou adicionar uma instrução using antes de sua função.JavaScript (ES6),
545351 bytes-2 bytes graças a @ Neil
-1 byte graças a @apsillers
Toma de entrada na sintaxe currying:
f("foobar")("o")
.Snippet de teste
Outra opção usando
eval
efor
(54 bytes)Resposta antiga usando Regex (85 bytes)
fonte
x==c?i++:i=0
pode ser apenasi=x==c&&i+1
porque umfalse
resultado nax==c
comparação será tratado como0
comparações e incrementos numéricos (e nunca será o valor de retorno, já que qualquer número, incluindo0
, inj
sempre terá prioridade sobre o zero-likefalse
ini
)false
(uma vez que o desafio sempre exige que ele retorne um número)s=>c=>[...s].map(x=>j=(x!=c?i=0:++i)>j?i:j,i=j=0)&&j
parece economizar alguns bytes.f=s=>c=>[...s].map(x=>j=(i=x==c&&i+1)>j?i:j,i=j=0)&&j
, que é um byte mais curto.JavaScript (Firefox 30-57),
7572 bytesFragmento compatível com ES6:
split
retorna um monte de cadeias vazias e caracteres únicos, além das execuções, mas isso não afeta o resultado.fonte
Micro , 112 bytes
fonte
C (gcc) , 63 bytes
Experimente online!
fonte
Perl 6 ,
45 4342 bytesTeste-o
Teste-o
Teste-o
Expandido:
fonte
JavaScript, ES6, 52
Solução recursiva que trata a entrada de sequência como uma matriz (nota: a entrada inicial ainda é uma sequência) e consome o caractere da esquerda para a direita
C
:Rastreia a execução atual
t
e a melhor global emT
.Explicação:
Definir
t
comofalse
não correspondências funciona porque sempre quet
é incrementado,false
é tratado como0
(ou seja,false + 1
é1
) efalse
nunca será comparado a um valor maior que qualquer valor no global-maxT
.fonte
[C,...s]
sintaxe. Deve me ajudarslice()
com os bytes de minhas próprias postagens.Gelatina , 5 bytes
Este é um link / função diádica que recebe uma string e um caractere. Observe que ele não pode funcionar como um programa completo, pois a entrada dos argumentos da linha de comando usa a sintaxe do Python, e o Python - ao contrário do Jelly - não distingue as strings singleton dos caracteres.
Experimente online!
Como funciona
fonte
Retina , 25 bytes
Experimente online!
O primeiro caractere é o caractere a ser verificado.
fonte
APL (Dyalog) ,
1811 bytesRequer trocando
⊂
com⊆
a versão 16.0 ou ter⎕ML←3
(default em muitos sistemas).Experimente online!
⎕=⎕
Booleano para igualdade entre duas entradas⊂⍨
partição automática (iniciar partições em que um elemento diferente de zero é maior que seu predecessor)≢¨
registro cada0,
preceder um zero (para os casos de entrada vazia)⌈/
max daquelesSolução antiga
Solicita primeiro s , depois c
Experimente online!
⎕
prompt para s⊢
por isso(
...)⎕S 1
PCRE S Earch para os comprimentos de ocorrências de'+'
um símbolo de adição (significando um ou mais),¨
anexado a cada um dos elementos de⎕
o c solicitado0,
preceder um zero (para os casos de entrada vazia)⌈/
max daquelesc deve ser fornecido como um vetor de 1 elemento de uma cadeia fechada, se precisar escapar.
fonte
PHP,
7067 bytestrês versões:
recebe entrada de argumentos de linha de comando; executar
-r
ou testá-los online .fonte
PHP , 70 bytes
Experimente online!
PHP , 75 bytes
Experimente online!
PHP , 83 bytes
Experimente online!
+8 bytes a evitar
@
fonte
#
claro).~
pode falharchr(207)
.++$n
! Você quis dizer ascii imprimível. ;)echo$r?max($r):0;
salva um byteJavaScript (ES6),
474038 bytes(Economizou 7 bytes graças a @Neil e 2 bytes graças a @HermanLauenstein.)
Explicação:
Procura recursivamente por uma execução mais longa até que nenhuma seja encontrada.
Snippet:
Mostrar snippet de código
fonte
f=(s,c)=>c&&s.includes(c)&&1+f(s,c+c[0])
?s=>g=c=>c&&s.includes(c)&&1+g(c+c[0])
.||0
, ainda mais curto que a minha solução.f=
parte não faz parte da versão com curry, porque apenas a função interna é recursiva.Geléia,
109 bytesExplicação:
Experimente online!
fonte
Œgf€L€Ṁ
.Python 3 , 71 bytes
Experimente online!
fonte
Haskell , 66 bytes
Experimente online!
Uma versão um pouco mais fácil de ler - não sem sentido:
Agrupa a sequência por letra, depois filtra os grupos que contêm o caractere correto, localiza os comprimentos, anexa 0 à lista de comprimentos, caso não apareça, e finalmente encontra o valor máximo.
fonte
Mathematica, 109 bytes
entrada
fonte
Python 2 , 69 bytes
Experimente online!
fonte
CJam ,
20191816 bytesExperimente online!
Explicação
fonte
Excel, 56 bytes
s
deve ser inserido emA1
.c
deve ser inserido emA2
.A fórmula deve ser uma fórmula de matriz ( Ctrl+ Shift+ Enter) que adicione colchetes
{ }
.Tecnicamente, isso só pode manipular onde a execução mais longa é menor que 1.048.576 (que é 2 ^ 20) porque é assim que as linhas do Excel atual permitem que você tenha uma planilha. Como ele carrega os milhões de valores na memória sempre que recalcula, essa não é uma fórmula rápida .
fonte
MATL , 15 bytes
Experimente online!
O algoritmo básico é muito simples (sem uso de divisão!), Mas eu tive que incluir
0i0v
e0h
permitir os casos extremos. Ainda assim, achei que a abordagem era boa e talvez ainda encontre outra técnica para lidar com os casos extremos: o algoritmo encontra a execução mais longa no meio de uma string, mas não para caracteres únicos ou strings vazios; Ainda estou testando se posso 'preencher' as variáveis em lugares melhores para obter melhores resultados.Não funciona em vazio
c
. Então, novamente, suponho que cada string contenha uma execução infinita de strings vazias entre cada caractere :)fonte
R ,
6658 bytes-8 bytes graças a BLT e MickyT
retorna uma função anônima. O TIO tem uma diferença de 1 byte porque
el
não funciona lá por razões inexplicáveis.Experimente online!
fonte
r=rle(el(strsplit(s,'')))
function(s,c)max((r=rle(el(strsplit(s,''))))$l*(r$v==c),0)
el
não funciona no TIO (não faço ideia do porquê) e eu apenas o copiei e colei do código de trabalho lá, então terei que lembrar de colocar isso de volta no @MickyT muito inteligente! Obrigado!Java 8,
6765 bytes-2 bytes graças a @ OlivierGrégoire
Recebe a entrada
s
como achar[]
ec
comochar
Explicação:
Experimente aqui.
fonte
m=m>(t=x==c?t+1:0)?m:t;
é mais curto que{t=x==c?t+1:0;m=m>t?m:t;}
.s->c->java.util.Arrays.stream(s.split("[^"+c+"]")).mapToInt(z->z.length()).max().orElse(0)
;)Ruby, 40 bytes
->s,c{s.split(%r{[^#{c}]}).max&.size||0}
Experimente online!
fonte