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

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.

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

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.


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

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

1

PHP, 54 Bytes

Nimmt die Wortliste in an $w.

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

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")))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.