Holen Sie sich die Individualität eines Wortes!

8

Ich liebe /usr/share/dict/words; es ist so praktisch! Ich benutze es für alle meine Programme, wann immer ich kann! Sie werden diese nützliche Datei nutzen, indem Sie die Individualität eines Wortes testen.


Eingang

  • Ein Wort; In dieser Herausforderung als eine beliebige Zeichenfolge definiert
  • /usr/share/dict/wordsin irgendeinem Format; Sie können es hart codieren, von der Festplatte lesen und als zweites Argument annehmen, was auch immer für Ihre Herausforderung am sinnvollsten ist

Ausgabe

  • Ein Wort Individualität (siehe unten)

Die Individualität eines Wortes ergibt sich aus der folgenden Gleichung:

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

Schauen wir uns ein Beispiel an : hello. Es gibt 12 Wörter, die den Teilstring enthalten hello, geteilt durch 5(Hallo Länge), und Hallo Individualität ist 12/5oder2.4


PS Dies ist niedriger der Individualitätswert, desto individueller

Da Individualität ein langes Wort ist, muss Ihr Programm so kurz wie möglich sein

Viel Glück!


Testfälle

Sie können dieses praktische Node.js-Skript verwenden, das den Anforderungen der Herausforderung entspricht und Ihrem Code entspricht. So habe ich auch die Testfälle generiert:

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}`)
})

Testfälle:

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
BürgermeisterMonty
quelle
Sollte es nicht umgekehrt sein? Haben Sie eine höhere Individualitätsbewertung, um es individueller zu gestalten?
Gabriel Benamy
2
Wahrscheinlich, aber es wäre unklug, Änderungen an der Herausforderung vorzunehmen, wenn die Leute mit dem Golfen begonnen haben könnten
MayorMonty,
Können wir stattdessen andere Wortlisten verwenden? Ich denke, dass dies einfacher zu bedienen ist (als Windows-Benutzer). Die Liste ist anscheinend nicht so lang, daher wird die Individualität höher sein, aber dies ändert nichts an der Herausforderung, wie ich sie sehe.
Stewie Griffin
1
Ist ein Wort ein Teilstring von sich selbst?
FlipTack
1
Ich gehe von einer Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung aus.
Zeppelin

Antworten:

1

05AB1E , 9 Bytes

#vy²å}ON/

Probieren Sie es online aus!

#         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.
Magische Krakenurne
quelle
Sieht so aus, als ob Ihre die kürzeste sein wird, aber ich werde es ein oder zwei Wochen geben
MayorMonty
3

Bash, 41, 39, 34, 3326 Bytes

BEARBEITEN:

  • Von der Funktion in ein Skript konvertiert
  • Ein Byte weniger durch Entfernen des Flags zum Ignorieren von Groß- und Kleinschreibung
  • Ersetzte wc -l durch grep -c und sparte 5 Bytes. Danke @Riley!

Eine eher triviale Lösung für Bash + Coreutils

Golf gespielt

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

Prüfung

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

>grep -i ulous /usr/share/dict/words | wc -l
38
Zeppelin
quelle
1
Würde grep -ic $1arbeiten statt grep -i $1|wc -l?
Riley
Wahr ! (Ich habe immer gedacht, dass dies eine GNU-Erweiterung ist, aber es stellt sich tatsächlich als POSIX-Option heraus). Vielen Dank !
Zeppelin
2

Python 3, 52 49 Bytes

-3 Bytes danke an Kade für die Annahme w, dass es sich um die Wortliste als Liste handelt:

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

Vorherige Lösung:

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

Nimmt wan, die Wortliste zu sein. Ich wähle Python 3, weil meine Wortliste einige Nicht-ASCII-Zeichen enthält und Python 2 sie nicht mag.

Karl Napf
quelle
1
Da Sie die Wortliste in einem vernünftigen Format verwenden dürfen, konnte dies nicht für 50 Bytes funktionieren:f=lambda s,w:w>[]and (s in w[0])/len(s)+f(s,w[1:])
Kade
1
Ich sollte beachten, dass Sie den Abstand zwischen andund entfernen können, (um es 49 Bytes zu machen.
Kade
@ Kade super! Netter Missbrauch der laxen Anforderungen.
Karl Napf
@ Dopapp Nein, weil dies keine Teilzeichenfolge wäre
Karl Napf
2

Perl 6 ,  45 36 33  32 Bytes

Wortliste als Dateiname f, 45 Bytes

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

Wortliste als Liste l, 36 Bytes

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

unter Verwendung von Platzhaltervariablen und des Metaoperators reverse ( R) 33 Bytes

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

Verwenden Sie .comb, um eine Liste von Zeichen zu erhalten, anstatt .charseine Anzahl von 32 Bytes zu erhalten

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

Erweitert:

{             # 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
quelle
1

awk: 31 Bytes

Übergabe des Wortes als wVariable an den awkBefehl und der Datei in <stdin>:

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

Beispielausgabe:

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

PHP, 54 Bytes

Nimmt die Wortliste in an $w.

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

Clojure, 53 Bytes

Nicht so aufregend: /

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

Das 1.ist da, um ein Rationales in ein Float umzuwandeln. Ich habe Wörter Wals solche vorinstalliert :

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