¡Obtén la individualidad de una palabra!


8

Me encanta /usr/share/dict/words; es muy útil! ¡Lo uso para todos mis programas, siempre que puedo! Aprovecharás este archivo tan útil para usar, probando la individualidad de una palabra.


Entrada

  • Una palabra; definido en este desafío como cualquier cadena de caracteres
  • /usr/share/dict/wordsen algun formato; puede codificarlo, leerlo desde el disco, asumirlo como un segundo argumento, lo que tenga más sentido en su desafío

Salida

  • Una palabra individualidad (ver abajo)

La individualidad de una palabra se deriva de la siguiente ecuación:

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

Vamos a echar un vistazo a un ejemplo: hello. Hay 12 palabras que tienen la subcadena helloen ellas, divididas por 5(longitud de hola), y la individualidad de hola es 12/5o2.4


PD: Esto es , por lo que cuanto menor sea el puntaje de individualidad, más individual

Como individualidad es una palabra larga, su programa debe ser lo más breve posible

¡Buena suerte!


Casos de prueba

Puede usar este conveniente script Node.js, que se ajusta a los requisitos de desafío para adaptarse a su código. También es cómo generé los casos de prueba:

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 prueba:

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

¿No debería ser al revés? Para hacerlo más individual, ¿tiene un puntaje de individualidad más alto?
Gabriel Benamy

2
Probablemente, pero hacer cambios importantes en el desafío cuando las personas pueden haber comenzado a jugar al golf sería imprudente
MayorMonty

¿Podemos usar otras listas de palabras en su lugar? Creo que este es más fácil de usar (ser un usuario de Windows). Aparentemente, la lista no es tan larga, por lo que la individualidad será mayor, pero esto no altera el desafío como yo lo veo.
Stewie Griffin

1
¿Es una palabra una subcadena de sí misma?
FlipTack el

1
¿Asumo una coincidencia entre mayúsculas y minúsculas?
zeppelin el

Respuestas:


1

05AB1E , 9 bytes

#vy²å}ON/

Pruébalo en línea!

#         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.

Parece que el tuyo será el más corto, pero lo daré una o dos
semanas

3

Golpetazo, 41, 39, 34, 3326 bytes

EDITAR:

  • Convertido de función a script
  • Un byte desactivado al eliminar el indicador de ignorar caso
  • Se reemplazó wc -l con grep -c , ahorrando 5 bytes. Gracias @Riley!

Una solución bastante trivial en bash + coreutils

Golfed

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

Prueba

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

>grep -i ulous /usr/share/dict/words | wc -l
38

1
¿ grep -ic $1Funcionaría en lugar de grep -i $1|wc -l?
Riley

Cierto ! (siempre pensé que se trataba de una extensión GNU, pero resulta ser una opción POSIX). Gracias !
zepelín

2

Python 3, 52 49 bytes

-3 bytes gracias a Kade, por asumir wque es la lista de palabras como lista:

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

Solución previa:

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

Se supone wque es la lista de palabras. Elijo Python 3 porque en mi lista de palabras hay algunos caracteres que no son ASCII y Python 2 no le gustan.


1
Como se le permite tomar la lista de palabras en cualquier formato razonable, esto no podría funcionar por 50 bytes:f=lambda s,w:w>[]and (s in w[0])/len(s)+f(s,w[1:])
Kade

1
Debo señalar que puede eliminar el espacio entre andy (para que sea de 49 bytes.
Kade

@Kade increíble! Agradable abuso de los requisitos laxos.
Karl Napf

@Dopapp No, porque esto no se restaría
Karl Napf

2

Perl 6 ,  45 36 33  32 bytes

lista de palabras como nombre de archivo f, 45 bytes

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

lista de palabras como una lista l, 36 bytes

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

usando variables de marcador de posición y Rmeta-operador reverse ( ), 33 bytes

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

utilizando .combpara obtener una lista de caracteres, en lugar de .charsobtener un recuento, 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 )
}

1

awk: 31 bytes

Pasando la palabra como la wvariable al awkcomando, y el archivo en <stdin>:

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

Salida de muestra:

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

1

PHP, 54 bytes

Asume la lista de palabras en $w.

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

0

Clojure, 53 bytes

No es tan emocionante: /

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

Eso 1.está ahí para convertir un racional en un flotador. Precargué palabras Wcomo tales:

(def W (map clojure.string/lower-case (clojure.string/split (slurp "/usr/share/dict/words") #"\n")))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.