Digamos que você tenha uma string como esta:
abaabbbbbaabba
Conte o número de vezes que um caractere especificado aparece na sequência de entrada, mas apenas se o caractere aparecer apenas uma vez em uma linha . Por exemplo, se o personagem for a
,
abaabbbbbaabba
^ x x ^
O total seria 2 (os aa
não contariam porque o a
aparece duas vezes seguidas).
Como isso está relacionado ao FizzBuzz?
Se o personagem aparecer 3 (ou múltiplos de 3) vezes seguidas ou 5 (ou múltiplos de 5) vezes seguidas, o contador será diminuído . Se for um múltiplo de 3 e 5 vezes, o contador ainda será incrementado. Lembre-se de que o contador também será incrementado se o personagem aparecer apenas uma vez em uma linha e será ignorado se o personagem aparecer outro número de vezes em uma linha (além das situações descritas acima).
Para recapitular, se a sequência a corresponder for a
,
input counter (explanation)
a 1 (single occurence)
aaa -1(multiple of 3)
aaaaa -1(multiple of 5)
aaaaaaaaaaaaaaa 1 (multiple of 15)
aa 0 (none of the above)
aba 2 (two single instances)
aaba 1 (one single occurence(+1) and one double occurence(ignored))
aaaba 0 (one single occurence(+1) and one triple (-1)
aaaaaa -1 (six is a multiple of three)
Implementação de referência (ungolfed) em java:
import java.util.Scanner;
import java.util.regex.*;
public class StrMatcher {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //Scanner to get user input
int total = 0;//Running total of matches
System.out.println("Enter a string: ");
String strBeingSearched = sc.nextLine(); //String that will be searched
System.out.println("Enter string to match with: ");
String strBeingMatched = sc.nextLine(); //Substring used for searching
//Simple regex matcher
Pattern pattern = Pattern.compile("(" + strBeingMatched + ")+");
Matcher matcher = pattern.matcher(strBeingSearched);
while(matcher.find()){ //While there are still matches
int length = matcher.end() - matcher.start();
int numberOfTimes = length/strBeingMatched.length();//Calculate how many times in a row the string is matched
if((numberOfTimes == 1)||((numberOfTimes % 3 == 0) && (numberOfTimes % 5 == 0))){
total++; //Increment counter if single match or divisible by 15
} else if((numberOfTimes % 3 == 0)||(numberOfTimes % 5 == 0)) {
total--; //Decrement counter if divisible by 3 or 5 (but not 15)
}
strBeingSearched = strBeingSearched.substring(matcher.end());
matcher = pattern.matcher(strBeingSearched); //Replace string/matcher and repeat
}
System.out.println(total);
}
}
- A sequência que será pesquisada pode ter qualquer comprimento, mas o padrão será apenas um caractere.
- Nenhuma string terá caracteres especiais de regex.
- Isso é código-golfe ; o programa mais curto em bytes vence.
- Sem brechas padrão.
Respostas:
Função , 1840 bytes
Porra, essa linguagem é inviável.
Este programa espera que o primeiro caractere da entrada seja o caractere a ser pesquisado e o restante da entrada para criar a sequência a ser pesquisada. Isso significa que
aaaba
procuraráa
na entradaaaba
(e, portanto, na saída 1). Você pode separá-los com uma nova linha ou espaço (a aaba
), mas apenas porque a nova linha / espaço extra não faz diferença na saída.Como sempre, você pode obter uma renderização mais agradável (sem o espaçamento entre linhas) se executar
$('pre').css('line-height',1)
no console do navegador.(1840 bytes quando codificado como UTF-16.)
Explicação
¹
retorna o primeiro caractere de uma sequência.²
conta o número de ocorrências de um caractere no início de uma determinada sequência. Por exemplo, dado o caracterea
e a stringaaba
, ele retorna 2. Paraa
ebaa
, ele retorna 0.³
chama²
para obter o número de caracteres no início, examina se o número é divisível por 3 e 5 e se é igual a 1 e determina o incremento / decremento adequado. Ele também remove um caractere extra do início da string (por exemplo, dado queaaabba
ele remove 3 + 1 = 4 caracteres, fornecendoba
). Em seguida, ele se chama recursivamente com a string mais curta e adiciona o resultado.¹
para remover o primeiro caractere da entrada e chama³
com esse caractere e o restante da string como argumentos separados.fonte
CJam,
4036353230 bytesObrigado a @ MartinBüttner por jogar fora um byte!
Graças a @AndreaBiondo por jogar fora 2 bytes e abrir caminho para mais 3!
Experimente on-line no intérprete CJam .
Como funciona
fonte
llcf=e`::*0-{(_!\6563282Zb:(=}%1b
é de 33 bytes.C,
160126125119114109104100 bytesProvavelmente pode ser melhorado ... Isso recebe informações dos argumentos da linha de comando (o primeiro argumento é o padrão, o segundo é a string). Não suporta a pesquisa do padrão de caractere NULL (\ x00).
EDIT **
126125119114109104100 bytes **: Depois de incorporar as sugestões de Dennis e algumas idéias adicionais (cláusula remove else, combinou o tempo em uma única instrução e usou subtração em vez de! =). Também removeu ponto e vírgula extra no loop for (que na verdade fazia parte da sugestão de Dennis). Encurtou ainda mais removendo as variáveis 'i' e 'a'.Removidos os operadores if e negation ('!') Abusando do operador ternário. As verificações de modularidade compactadas usando
esse 'AND' bit a bit enganamum && duplo porque bitwise '&' têm um erro e colocando a comparação (t <2) dentro dos operadores ternários. Substituído !! t * (...) movendo !! t para o operador ternário, permitindo-me remover parênteses.Cara, eu realmente quero colocá-lo abaixo da marca de 100 bytes: S
Soluções TENTATIVAS: Não tenho certeza se elas seriam consideradas válidas, mas posso reduzir para 93 caracteres se usar saída (s) em vez de printf ("% d", s). Mas a saída não seria visível, mas seria um código de retorno. Se a saída for realmente necessária, também posso reduzi-la para 98 bytes, mas seria necessário imprimir todos os valores intermediários de s antes da resposta final ...
fonte
i,t,s,a;main(c,z)char**z;{a=*z[1];while(c){if((c=z[2][i])!=a)s+=(!!t)*((t<2)-!(t%3)-!(t%5)+3*!(t%15)),t=0;else++t;++i;}printf("%d",s);}
deve funcionar tão bem (e é 23 bytes mais curto).main
comfor(a=*z[1];c;i++)
, você não precisa do{}
redor do if ... else.Ruby,
111 10396 bytesEsse desafio foi feito para o Ruby's
Enumerable#chunk
, então eu tive que postar isso. :)Teste on-line: http://ideone.com/pG4mAn
O código é bastante simples. Aqui está uma versão mais legível: http://ideone.com/ub3siA .
fonte
Python 3,
361, 300, 296, 263, 256, 237, 229, 188, 178, 164 bytes.Economizou 15 bytes graças ao vaultah do SOPython.
Economizou 9 bytes graças a Joe Kington do SOPython.
Economizou 11 bytes graças ao DSM do SOPython.
Esta é a minha primeira vez que envia uma resposta, por isso tenho certeza de que isso pode ser muito mais curto. Ele pega a cadeia de teste como a primeira resposta à entrada e o caractere de pesquisa como a segunda.
Versão não destruída:
Descobri que estava falhando em um dos casos de teste.
fonte
Haskell, 120 bytes
f
faz o trabalho.fonte
Java,
146152143138139136 bytes%3&%5
verificações.i<2
Comparação reduzida .%3&%5
verificação não funciona como se pensava).Implementado como
BiFunction<String, String, Integer>
no Java 8, deixe-me saber se isso é necessário para ser um programa completo (ou se eu posso até soltar ojava.util.regex
prefixo do pacote abaixo).A contagem de bytes acima não inclui a nova linha abaixo, que é simplesmente adicionada para fins de formatação neste site.
Explicação aproximada:
b
, ou seja"[^"+b+"]"
."a" -> 1
).-1
,0
e1
.sum()
para obter resposta.fonte
Javascript, 206 bytes
Expandido:
Explicação:
Estou usando regex para contar o total de vezes que um personagem aparece e subtraí-lo todas as vezes que apareceu em grupos. Finalmente, eu passo pelos grupos e faço o incremento / decremento do fizz buzz.
Passa nos casos de teste fornecidos na pergunta:
e assim por diante
fonte
new
, useexec
vez dematch
e aliaslength
, e você deve ser bom.Perl,
82656359 bytes58 bytes + parâmetro de linha de comando de 1 byte
Não é particularmente curto, mas é um começo - continuará diminuindo.
Supondo que
-i
pode ser usado para fornecer à cadeia de entrada um exemplo de uso é o seguinte:fonte
Pitão, 32 bytes
tão perto! Mais 2 bytes para amarrar a excelente entrada de Dennis no CJam
Teste on-line
fonte
gawk, 140
Insira como "string de espaço de char", assim
Ungolfed
fonte
Pitão, 27 bytes
Suíte de teste
Insira o formulário, por exemplo:
Explicação:
fonte