Considere uma sequência de comprimento N, como Peanut Butter
N = 13. Observe que há N-1 pares de caracteres vizinhos na sequência. Pois Peanut Butter
, o primeiro dos 12 pares é Pe
, o segundo é ea
, o último é er
.
Quando os pares são principalmente caracteres diferentes, a corda tem uma qualidade robusta, por exemplo chUnky
.
Quando esses pares são basicamente o mesmo caractere, a corda tem uma qualidade suave, por exemplo sssmmsss
.
Defina a fragilidade de uma sequência como a proporção do número de pares com dois caracteres diferentes para o número total de pares (N-1).
Defina a suavidade de uma sequência de caracteres para ser a proporção do número de pares com dois caracteres idênticos ao número total de pares (N-1).
Por exemplo, Peanut Butter
possui apenas um par com caracteres idênticos ( tt
), portanto, sua suavidade é 1/12 ou 0,0833 e sua robustez é 11/12 ou 0,9167.
Seqüências de caracteres vazias e com apenas um caractere são definidas como 100% suaves e 0% robustas.
Desafio
Escreva um programa que tenha uma sequência arbitrária de comprimento e produza sua proporção de fragilidade ou suavidade como um valor de ponto flutuante.
- Tome entrada via stdin ou pela linha de comando, ou você pode escrever uma função que aceita uma string.
- Você pode assumir que a sequência de entrada contém apenas caracteres ASCII imprimíveis (e, portanto, é uma linha).
- Imprima o float para stdout com 4 ou mais casas decimais, ou você pode optar por devolvê-lo se tiver escrito uma função. Casas decimais que não transmitem informações não são necessárias, por exemplo,
0
é bom em vez de0.0000
. - Escolha robustez ou suavidade como preferir. Apenas certifique-se de dizer qual o seu programa gera.
O código mais curto em bytes vence.
Exemplos
Peanut Butter
→ chunkiness: 0.91666666666
, Lisura: 0.08333333333
chUnky
→ chunkiness: 1.0
, Lisura: 0.0
sssmmsss
→ chunkiness: 0.28571428571
, Lisura: 0.71428571428
999
→ chunkiness: 0.0
, Lisura: 1.0
AA
→ chunkiness: 0.0
, Lisura: 1.0
Aa
→ chunkiness: 1.0
, Lisura: 0.0
!
→ chunkiness: 0.0
, Lisura: 1.0
[cadeia vazia] → chunkiness: 0.0
, Suavidade:1.0
Pergunta bônus: Qual você prefere , cordas grossas ou suaves ?
fonte
Respostas:
APL, 10 bytes
Isso lê a entrada de stdin e imprime a fragilidade em stdout. O algoritmo é o mesmo usado para a solução J.
fonte
CJam, 19 bytes
Código fonte 100% robusto que calcula a robustez .
Experimente esta bondade robusta online.
Como funciona
Obviamente, o NaN arredondado para 4 casas decimais é 0.
fonte
2ew
abordagem que tentei. Os casos especiais da carta 0/1 estavam me matando._
se moveu. Não tenho certeza se isso importa.Pitão,
1312 bytesCódigo totalmente robusto calculando robustez.
Demonstração. Equipamento de teste.
fonte
z
causa um erro na entrada vazia online. Eu vou consertar esse bug. Este código é bom, no entanto.TI-BASIC, 46 bytes
sub(x1,x2,x3
fornece a substring da stringx1
iniciando (com base) em númerox2
e terminando em número ex3
, em seguida,seq(
cria uma sequência.Dá o valor de suavidade. A
Ans
variável é0
por padrão, portanto, não precisamos de umElse
naIf
instrução ou armazenamos qualquer coisaAns
antes.fonte
Matlab (
3736 bytes)Isso pode ser feito com a seguinte função anônima, que retorna fragilidade:
Comentários:
Nas versões antigas do Matlab (como o R2010b), você precisa
+
converter o array charx
em um array duplo:Mas esse não é o caso nas versões recentes (testadas no R2014b), que economizam um byte. Obrigado a Jonas por seu comentário.
max
manipula os casos de um e zero caracteres (para robustez)Exemplo:
fonte
diff('abc')
não produzirá um aviso.> <> ,
4036 bytesEste programa retorna a fragilidade de uma sequência.
Explicação
Submissão anterior (37 + 3 = 40 bytes)
Este programa retorna a suavidade de uma string. A entrada é feita através da
-s
bandeira, por exemplofonte
C #,
9489 bytesSub 100 bytes, então eu acho que é alguma forma de vitória em si?
Esta é uma definição de função (permitida conforme a especificação) que retorna a suavidade da sequência de entrada:
Bem direto, se o comprimento for 0 ou 1, ele retornará 1; caso contrário, ele comparará a sequência menos o primeiro caractere e retornará o número de pares idênticos dividido pelo número de pares.
Editar - substituiu Substring por Ignorar. Erro de novato!
fonte
J,
1413 bytesCalcula a fragilidade. Parabéns a J por definir
0 % 0
como igual a 0.Experimente online
Aqui está uma explicação:
fonte
(]+/%#)2~:/\]
salva 1 byte.CJam, 23 bytes
Explicação:
Isso gera a taxa de suavidade.
fonte
CJam, 16 bytes
Código fonte Cheaty que calcula a suavidade .
Para entradas de comprimento 0 ou 1, isso imprime o resultado correto antes de sair com um erro. Com o interpretador Java, a saída de erro vai para STDERR ( como deveria ).
Se você tentar o código online , ignore tudo, menos a última linha de saída.
Como funciona
fonte
Julia, 52 bytes
Suavidade!
Isso cria uma função sem nome que aceita uma string e retorna um valor numérico.
Se o comprimento da entrada for menor que 2, a suavidade será 1; caso contrário, calcularemos a proporção de caracteres adjacentes idênticos, calculando a média de uma matriz de lógica.
fonte
Nim,
1059691 bytesTentando aprender Nim. Isso calcula a fragilidade de uma sequência.
(
Se eu tentar ler isso como Python, o recuo ficará todo bagunçado ...Agora parece mais com Ruby ...)fonte
Python 3, 63 bytes
Esta é uma função lambda anônima que recebe uma string como argumento e retorna sua fragilidade.
Para usá-lo, dê um nome e chame-o.
fonte
def f(n):
que possui exatamente o mesmo número de caracteres quelambda n:
. Isso elimina a necessidade de nomear sua função.def f(n):
também precisa de umreturn
Python 3, 52 bytes
Isso calcula a fragilidade e gera
-0.0
a sequência vazia. Se não gostar de zeros negativos, você sempre pode corrigir isso com um byte extra:fonte
Haskell, 64 bytes
Produz suavidade. por exemplo
f "Peanut Butter"
->8.333333333333333e-2
.Como funciona:
sum(x>>[1])
é o comprimento de x, mas como o sistema de tipo forte de Haskell exige alimentar fracionários/
, não posso usar olength
que retorna números inteiros. A conversão de números inteiros em fracionáriosfromInteger$length x
é muito longa.fonte
import Data.Ratio
é muito caro.JavaScript (ES6), 55 bytes
Suavidade, 56 bytes
Robustez, 55 bytes
Demo
Calcula suavidade, como é o que eu prefiro. Por enquanto, só funciona no Firefox, pois é o ES6.
fonte
KDB (Q), 30
Retorna suavidade.
Explicação
Teste
fonte
Ruby ,
6966 bytesExperimente online!
Raspado de alguns bytes com comentários do IMP. Além disso, com a próxima versão 2.7.0 do Ruby, é possível salvar alguns bytes substituindo
|x,y|x!=y
por@1!=@2
fonte
.to_f/~-s.size
para a atribuição de c, poderá cortar um byte com a operação ternária:f=->s{(c=s.chars.each_cons(2).count{|x,y|x!=y}.to_f/~-s.size)>0?c:0}
f=
? Eu não sou 100% nas regras sobre isso. O desafio diz que você pode retornar uma função que aceita uma string, que é uma lambda stabby.Python 3, 69 bytes
Ninguém postou uma solução Python ainda, então aqui está uma implementação bastante direta de uma função de "fragilidade". Faz um curto-circuito em uma sequência de comprimento
1
e imprime0
(que é um número inteiro ao invés de um flutuador, mas parece ser permitido de acordo com as regras).Em uma sequência vazia, ela gera, em
-0.0
vez de0.0
. Indiscutivelmente isso pode ser considerado aceitável, como-0.0 == 0 == 0.0
retornosTrue
.Exemplos:
(Python 3 é usado para sua divisão de flutuação padrão.)
fonte
C, 83 bytes
Uma função retornando robustez .
Explicação
Aceite uma string C e retorne um float (double funcionaria, mas é mais chars).
Contadores -
a
para pares totais,b
para pares não correspondentes. O usoint
limita o "comprimento arbitrário" da string, mas isso é apenas uma violação menor dos requisitos e não vou corrigi-lo.Caso especial da string vazia - deixe os dois contadores zero.
Cadeia não vazia - itere-a com pré-incremento (então a primeira vez no loop,
s[a]
será o segundo caractere. Se a string tiver apenas um caractere, o corpo do loop não será inserido ea
será 1.Se o caractere atual for diferente do anterior, aumente
b
.Após o loop, existem três possibilidades: 'a == 0, b == 0' para uma entrada vazia, 'a == 1, b == 0' para uma entrada de caractere único ou 'a> 1, b> = 0 'para entrada de vários caracteres. Subtraímos 1 de
a
(o?
operador é um ponto de sequência, então estamos seguros) e, se for zero, temos o segundo caso, portanto, retornamos zero. Caso contrário,b/a
é o que queremos, mas devemos primeiro promoverb
um tipo de ponto flutuante ou obteremos uma divisão inteira. Para uma string vazia, acabaremos com um zero negativo, mas as regras não o permitem.Testes:
Que dá:
como requerido.
fonte
a,b;float f(char*s){if(*s)for(a=b=0;s[++a];)b+=s[a]!=s[a-1];return--a?1.*b/a:b;}
Perl, 69
Função retornando suavidade :
Explicação
Testes
fonte
Mathematica,
7372 bytesIsso não ganha nada pelo tamanho, mas é direto:
Suavidade
fonte
Length[#]
->Length@#
salva um acidente vascular cerebral. O mesmo acontece com a eliminaçãoN@
e a alteração1
para1.
GeL:
7673 caracteresSuavidade.
Exemplo de execução:
(Ligações GeL = Gema + Lua. Muito melhor, mas ainda longe de vencer.)
Gema:
123120 caracteresSuavidade.
Exemplo de execução:
(Foi mais um exercício para mim ver quais são as chances de resolvê-lo em um idioma sem suporte de número de ponto flutuante e suporte aritmético geralmente doloroso. A segunda linha, especialmente a
\P
sequência, é pura magia, a última linha é verdadeira tortura.)fonte
Java 8,
8482 bytesSaída de suavidade.
Experimente online.
Explicação:
fonte
Coco , 38 bytes
Experimente online!
Uma porta Python 3 teria 50 bytes .
fonte
PowerShell, 55 bytes
Suavidade
Parece um pouco tolo obter uma variável no stdin e fornecer um identificador, mas é mais rápido do que ter uma função.
fonte
Python 3, 61 bytes
calcular robustez:
fonte
K (22)
ajustou a solução Q do WooiKent:
fonte
Ruby, 63 bytes
Produz robustez.
f=->s{s.chars.each_cons(2).count{|x,y|x!=y}/[s.size-1.0,1].max}
Semelhante à solução de @ daniero, mas ligeiramente reduzida ao dividir diretamente pelo comprimento da string - 1 e, em seguida, contar com .count como zero com o comprimento 0 e 1 (o .max garante que não dividirei por 0 ou -1).
fonte
Mathematica, 107 bytes
Calcula a irregularidade, tomando metade da distância de Levenshtein entre cada dígrafo e seu reverso.
Se você preferir uma resposta racional exata, exclua
.5
e coloque um/2
antes do último,&
sem penalidade. O programa em si tem fragilidade 103/106, ou cerca de 0,972.fonte