Obter a individualidade de uma palavra!

8

Eu amo /usr/share/dict/words; é tão útil! Eu o uso em todos os meus programas, sempre que posso! Você aproveitará esse arquivo tão útil para testar, testando a individualidade de uma palavra.


Entrada

  • Uma palavra; definido neste desafio como qualquer sequência de caracteres
  • /usr/share/dict/wordsem algum formato; você pode codificá-lo, ler a partir do disco, assumi-lo como um segundo argumento, o que fizer mais sentido em seu desafio

Resultado

  • Palavras individualidade (veja abaixo)

A individualidade de uma palavra é derivada da seguinte equação:

<the number of words for which it is a substring> / <length of the word>

Vamos dar uma olhada em um exemplo: hello. Existem 12 palavras que contêm a substring hello, divididas por 5(comprimento do hello), e a individualidade de hello é 12/5ou2.4


PS Esse é um , então quanto menor a pontuação de individualidade, mais individual

Como individualidade é uma palavra longa, seu programa deve ser o mais curto possível

Boa sorte!


Casos de teste

Você pode usar esse conveniente script Node.js., que se encaixa nos requisitos de desafio para se ajustar ao seu código. Também é como eu geramos os casos de teste:

var fs = require("fs");
var word = process.argv[2];

process.stdout.write("Reading file...")
fs.readFile("/usr/share/dict/words", function(err, contents) {
  console.log("Done")
  if (err) throw err;

  words = contents.toString().split("\n");

  var substrings = words.filter(w => w.indexOf(word) > -1).length;
  var length     = word.length;

  console.log(`${word} => ${substrings} / ${length} = ${substrings / length}`)
})

Casos de teste:

hello => 12 / 5 = 2.4
individuality => 1 / 13 = 0.07692307692307693
redic => 52 / 5 = 10.4
ulous => 200 / 5 = 40
challen => 15 / 7 = 2.142857142857143
ges => 293 / 3 = 97.66666666666667
hidden => 9 / 6 = 1.5
words => 12 / 5 = 2.4
aside => 8 / 5 = 1.6
MayorMonty
fonte
Não deveria ser o contrário? Para torná-lo mais individual, tem uma pontuação de individualidade mais alta?
Gabriel Benamy 23/11
2
Provavelmente, mas fazer alterações significativas para o desafio quando as pessoas podem ter começado golfe seria imprudente
MayorMonty
Podemos usar outras listas de palavras? Eu acho que este é mais fácil de usar (sendo um usuário do Windows). Aparentemente, a lista não é tão longa, então a individualidade será maior, mas isso não altera o desafio da maneira que eu a vejo.
Stewie Griffin
1
Uma palavra é uma subcadeia de si mesma?
FlipTack
1
Presumo uma correspondência que não diferencia maiúsculas de minúsculas?
Zeppelin #

Respostas:

1

05AB1E , 9 bytes

#vy²å}ON/

Experimente online!

#         Separate by newlines or spaces.
 vy       For each entry in the dictionary.
   ²å     1 if the second argument is a substring of the current word, 0 o.w.
     }    End loop.
      O   Sum ones and zeros.
       N  Get list size. 
        / Divide.
Urna de polvo mágico
fonte
Parece que o seu será o mais curto, mas darei uma ou duas semanas
MayorMonty 25/11/16
3

Bater, 41., 39., 34, 33, 26 bytes

EDITAR:

  • Convertido de função em um script
  • Um byte desativado removendo o sinalizador ignorar maiúsculas e minúsculas
  • Wc -l substituído por grep -c , economizando 5 bytes. Obrigado @Riley!

Uma solução bastante trivial no bash + coreutils

Golfe

bc -l<<<`grep -c $1`/${#1}

Teste

>cat /usr/share/dict/words| ./test ulous
7.60000000000000000000

>grep -i ulous /usr/share/dict/words | wc -l
38
zepelim
fonte
1
Iria grep -ic $1trabalhar em vez de grep -i $1|wc -l?
Riley
Verdade ! (sempre pensei que fosse uma extensão GNU, mas acabou sendo uma opção POSIX). Obrigado !
Zeppelin #
2

Python 3, 52 49 bytes

-3 bytes graças a Kade, por assumir wa lista de palavras como lista:

f=lambda s,w:w>[]and(s in w[0])/len(s)+f(s,w[1:])

Solução anterior:

lambda s,w:sum(s in x for x in w.split('\n'))/len(s)

Assume wser a lista de palavras. Eu escolhi o Python 3 porque na minha lista de palavras existem alguns caracteres não-ASCII e o Python 2 não gosta deles.

Karl Napf
fonte
1
Como você tem permissão para pegar a lista de palavras em qualquer formato razoável, isso não poderia funcionar por 50 bytes: #f=lambda s,w:w>[]and (s in w[0])/len(s)+f(s,w[1:])
238 Kade
1
Devo notar que você pode remover o espaço entre ande (torná-lo 49 bytes.
Kade
@Kade awesome! Bom abuso dos requisitos negligentes.
Karl Napf
@Dopapp Não, porque isso não iria substring
Karl Napf
2

Perl 6 ,  45 36 33  32 bytes

lista de palavras como um nome de arquivo f, 45 bytes

->$w,\f{grep({/:i"$w"/},f.IO.words)/$w.chars}

lista de palavras como uma lista l, 36 bytes

->$w,\l{grep({/:i"$w"/},l)/$w.chars}

usando variáveis ​​de espaço reservado e Rmeta-operador reverse ( ), 33 bytes

{$^w.chars R/grep {/:i"$w"/},$^z}

usando .combpara obter uma lista de caracteres, em vez de .charsobter uma contagem, 32 bytes

{$^w.comb R/grep {/:i"$w"/},$^z}

Expandido:

{             # block lambda with placeholder parameters 「$w」 「$z」

  $^w         # declare first parameter ( word to search for )
  .comb       # list of characters ( turns into count in numeric context )

  R[/]        # division operator with parameters reversed

  grep        # list the values that match ( turns into count in numeric context )

    {         # lambda with implicit parameter 「$_」
      /       # match against 「$_」
        :i    # ignorecase
        "$w"  # the word as a simple string
      /
    },

    $^z       # declare the wordlist to search through
              #( using a later letter in the alphabet
              #  so it is the second argument )
}
Brad Gilbert b2gills
fonte
1

awk: 31 bytes

Passando a palavra como wvariável para o awkcomando e o arquivo em <stdin>:

$0~w{N++}END{print N/length(w)}

Saída de amostra:

 $ awk -vw=hello '$0~w{N++}END{print N/length(w)}' /usr/share/dict/words
 2.4
Adão
fonte
1

PHP, 54 bytes

Assume a lista de palavras em $w.

<?=count(preg_grep("/$argv[1]/",$w))/strlen($argv[1]);
Alex Howansky
fonte
0

Clojure, 53 bytes

Não é tão emocionante: /

#(/(count(filter(fn[w](.contains w %))W))(count %)1.)

Isso 1.existe para converter um racional em um flutuador. Eu pré-carreguei as palavras para W:

(def W (map clojure.string/lower-case (clojure.string/split (slurp "/usr/share/dict/words") #"\n")))
NikoNyrh
fonte