Ist es ein Substantiv oder nicht?


22

Bestimmen Sie anhand einer Zeichenfolge als Eingabe, ob es sich um ein Substantiv handelt oder nicht.

Sie werden anhand der 1000 häufigsten englischen Wörter bewertet, je nachdem, wie viele Sie als Substantiv richtig bezeichnen oder nicht.

Das Programm oder die Funktion, die die meisten dieser Wörter in 50 Bytes oder weniger richtig klassifiziert, gewinnt.

Substantive

Ein Substantiv ist ein Wort, das typisch für eine Sache ist. Es wird komplexer, aber das ist die Grundidee.

In Fällen, in denen ein Wort entweder ein Substantiv oder ein anderer Teil der Sprache sein könnte, habe ich es als Substantiv klassifiziert, auch wenn dies eine seltene Verwendung ist. Oder ich überlasse es dieser Site, dies für mich zu tun.

Bei den Wörtern, für die Sie eine Punktzahl erhalten, handelt es sich um die 1000 gebräuchlichen Wörter aus der einfachen Wikipedia , denen "zwei" und "einmal" hinzugefügt wurden. Dies sind die 586 Substantive und die 414 Nicht-Substantive . Alle drei Listen finden Sie hier . Beachten Sie, dass alle diese Eingaben in Kleinbuchstaben erfolgen. Diese Listen sind endgültig - versuchen Sie nicht, über Grammatik zu streiten.

Ihr Programm wird als korrekt betrachtet, wenn es ein wahres Ergebnis für eine Eingabe ausgibt, die ein Substantiv ist, und ein falsches Ergebnis für eine Eingabe, die kein Substantiv ist.

Feinheiten:

Programme müssen eine deterministische Ausgabe haben. Wenn Sie Zufälligkeit verwenden möchten, setzen Sie sie ein. Programme dürfen keine eingebauten Nomenlisten oder andere eingebaute Sprachfunktionen verwenden.

Beispiele:

a: noun
act: noun
active: noun
about: non-noun
above: non-noun
across: non-noun

Bitte geben Sie in Ihrer Antwort an, wie hoch die Erfolgsquote Ihres Programms ist. Das Programm oder die Funktion von höchstens 50 Bytes mit der höchsten Erfolgsrate gewinnt. Im Falle eines Unentschieden entscheidet die niedrigste Byteanzahl über einen Gewinner. Viel Glück!

Antworten:


13

JavaScript (ES6), 43 Byte, 622 630 633

Nur um den Ball ins Rollen zu bringen. Gibt 1für Substantive, 0für Nicht-Substantive zurück.

s=>2552>>s.length&/^[bcdf-mp-tvwy]/.test(s)

Wie?

Wir setzen auf Nomen, wenn beide folgenden Bedingungen erfüllt sind:

  1. Die Wortlänge beträgt 3, 4, 5, 6, 7, 8 oder 11. Dies erfolgt durch Verschieben der Binärzahl 100111111000 nach rechts (2552 als Dezimalzahl).
  2. Das Wort beginnt mit einem dieser Buchstaben: bcdfghijklmpqrstvwy

Gerade als ich mit Blick auf JS kommentieren wollte, dass die Bytegrenze viel zu restriktiv war, posten Sie dies! Ich dachte, ohne auf die Liste geschaut zu haben, dass eine bessere Punktzahl als 586 nur durch Testen des ersten Buchstabens oder der 2 in jedem Wort möglich sein könnte. Schön gemacht :)
Shaggy

Eine Erklärung wäre schön für Leute, die mit Javascript weniger vertraut sind. Soweit ich das beurteilen kann, wird überprüft, ob die Wortlänge 3, 4, 5, 6, 7, 8 oder 11 beträgt und das Wort auch mit einem Buchstaben aus einer Reihe von Buchstaben beginnt.
isaacg

@isaacg Das stimmt. Erklärung hinzugefügt.
Arnauld

4
Beachten Sie, dass die Zeichenklasse der Klasse [bcdf-mp-tvwy]entspricht [^aenouxz]. Eine Änderung würde 4 Bytes einsparen, von denen ein Großbuchstabe verwendet werden könnte.
Fireflame241

@ fireflame241 Sehr wahr. Und das lässt sich sogar verkürzen, [^aenouz]weil wir kein Wort haben, das mit a beginnt x.
Arnauld

11

Jelly , 48 Bytes, 731 Punkte

Dies ist meine allererste Antwort in Jelly und ich habe mir große Mühe gegeben, diese zusammenzustellen. Na ja ... das hat Spaß gemacht. :-)

O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ

Dank @JonathanAllan wurde 1 Byte gespeichert

Probieren Sie es online!

Aufschlüsselung und Testsuiten

  • Nicht-Nomen korrekt als Nicht-Nomen identifiziert: 265/414 (64%)
  • Nomen korrekt als Nomen identifiziert: 466/586 (79,5%)

Wie?

Wir berechnen zuerst einen Hash der Eingabezeichenfolge durch:

  • Konvertieren in eine Ganzzahl durch Interpretieren jedes Codepunkts als 256-stellige Basis
  • Anwendung von Modulo 4080 (gewählt als der effizienteste Wert mit nicht mehr als 12 Bits)
  • Beibehaltung der 8 höchstwertigen Bits des Ergebnisses

Dies lässt uns einen Index in [0 ... 255] und unterteilt somit alle Wörter in 256 Gruppen.

Für jede Gruppe von Wörtern wird ein binäres Flag vorberechnet, 1wenn die Gruppe mehr Substantive als Nicht-Substantive enthält, und 0ansonsten. Dies führt zu einer 256-Bit-Zahl N , die wir als Nachschlagetabelle verwenden werden. Wir speichern es als Base-250-codierte Zeichenfolge.

Unten ist die binäre Darstellung von N .

1000011000001011000101111011111001001101110010101101110010001101
0000010001101010010111110001110010010101110110110010111111010000
0001111010011110000110101011111000011110111011010011011110101100
1010010110101111000010101000101100000001110110100011111000101010

Welches kann als “Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’in Gelee gespeichert werden .

Daher der Code:

O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ    main link

O                                                   convert the input string to a list of
                                                    code points
 ‘                                                  increment each of them
  ḅ⁹                                                convert from base 256 to an integer
    %⁽€O                                            modulo 4080
        æ»4                                         drop the 4 least significant bits
           “Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»     right shift N by this amount
                                               Ḃ    test the least significant bit

Gute Arbeit! Speichern Sie ein Byte, um mit zu booten O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ(beachten Sie auch, dass Sie die Fußzeile auf TIO verwenden können, ich würde mit Ç€¬S,Lund Ç€S,Lfür Ihre zwei Testsuiten gehen.
Jonathan Allan

@ JonathanAllan Danke für die Tipps!
Arnauld

10

JavaScript (ES6), 50 Bytes, 693 Punkte

s=>!/^([aouz]|th|..$)|e.+[ey]|[flo].r|a.p/.test(s)

Nur nach möglichen Mustern suchen, die Nicht-Nomen haben, die Nomen aber nicht haben.

Nicht-Nomen enthalten häufiger:

  1. a, o, u oder z als erster Buchstabe.
  2. th wie die ersten beiden Buchstaben.
  3. Nur zwei Buchstaben. [Denken Sie an Pronomen (ich, wir, wir, er, es) und Präpositionen (von, zu, in, auf, von, auf, ...).]
  4. e , gefolgt von einem oder mehreren Buchstaben, gefolgt von e oder y .
  5. f, l oder o , gefolgt von einem Buchstaben, gefolgt von r .
  6. a , gefolgt von einem Buchstaben, gefolgt von p .

Snippet:


Ich glaube, Sie können ein Byte speichern, indem Sie den ersten regulären Ausdruck in /h|n/(oder durch Ausführen von /^.[hn]/.test(s)) und einen anderen s[2]>''in entweder !!s[2]oder ändern 2 in s.
ETHproductions

Vielen Dank, @ETHproductions. Ich kann Ihre Vorschläge verwenden und die beiden Tests kombinieren, um eine Reihe von Bytes zu speichern, mit denen ich Code hinzufügen kann, um meine Punktzahl zu verbessern.
Rick Hitchcock

Ist das nicht a.püberflüssig, da du es schon hast [aouz]?
AdmBorkBork

@AdmBorkBork, das a in [aouz]wird nur am Anfang der Zeichenfolge abgeglichen. Aus welchem ​​Grund auch immer, das Testen auf eine a.p beliebige Stelle in der Zeichenfolge verbessert die Punktzahl.
Rick Hitchcock

10

Jelly , 50 Bytes , 763 Punkte

Verwende jetzt einen Hash (ähnlich wie Arnauld's Jelly-Antwort )

OP%⁽Wpị“!ḋGẠ⁻Ṭȥʋt|Ḥ\⁾°½İ@G2ḂƑ½ịʂ¶ɦḲ⁷³Hz~⁵p9)⁹ƙ¿’B¤

Probieren Sie es online!

250/414 für Nicht-Substantive
513/586 für Substantive
Gesamt = 250 + 513 = 763.

Wie?

Erstellt eine Tabelle mit 308 Einträgen, entweder 1 (Identifizieren eines Substantivs) oder 0 (Identifizieren eines Nicht-Substantivs), und indiziert sie mithilfe eines Schlüssels, der von einer Hash-Funktion bereitgestellt wird, die das Produkt der Ordinalzahlen des Eingabeworts verwendet:

OP%⁽Wpị“!ḋGẠ⁻Ṭȥʋt|Ḥ\⁾°½İ@G2ḂƑ½ịʂ¶ɦḲ⁷³Hz~⁵p9)⁹ƙ¿’B¤ - Link: list of characters, word
O                                                  - convert to ordinals
 P                                                 - product
   ⁽Wp                                             - base 250 number = 22863
  %                                                - modulo (by 22863)
                                                 ¤ - nilad plus link(s) as a nilad:
       “!ḋGẠ⁻Ṭȥʋt|Ḥ\⁾°½İ@G2ḂƑ½ịʂ¶ɦḲ⁷³Hz~⁵p9)⁹ƙ¿’   -   base 250 number
                                                B  -   as a binary list (308 bits)
      ị                                            - index into (1-indexed and modular,
                                                  -   so adds another modulo by 308)

Zurück:  50  47 Bytes , Ergebnis 684

ḣ3Ẇf“QṘ°ḂżÐŒ#ḍæ09»s2¤Ȧ¬ȧØY⁾niyṖf⁽ż2ị$
0,-2ịE¬ȧÇ

Eine monadische Verknüpfung, die ein Wort aufnimmt und eine Liste mit einem Zeichen (wahr) zurückgibt, wenn das Wort als Substantiv identifiziert wird, oder eine leere Liste oder eine Null (beide falsch), wenn dies nicht der Fall ist.

Probieren Sie es online! (Die Fußzeile führt ein if else aus, um das Ergebnis auszudruckenNounoderNon-Noun)
... oder sehen Sie sich das Bewertungsprogramm an (zählt wahrheitsgemäße Indizes über die beiden Listen und berechnet dann die Punktzahl).

Aufschlüsselung der Punkte: 462/586 Substantive korrekt identifiziert (124 inkorrekt), 222/414 Nicht-Substantive korrekt identifiziert (192 inkorrekt) - total korrekt = 684/1000.

Wie?

Ich denke, es ist kein Substantiv, wenn ...

  • das letzte Zeichen und das vorstehende Zeichen sind gleich (mit modularer und 1-basierter Indizierung)
  • entweder die ersten zwei Länge 2 Teil ist in:
    'be', 'th', 'le', 'he', 'm ', 'ev', 'et', 's ', 'fl', 'ax', 'en', 'fo', 'am', 'az' (Anmerkung: 'm 'und 's 'ist hier nur Kompression zu erleichtern, aber sie scheinen sowieso nie)
  • Der -299 ten Index (mit modularen und 1-basierten Indizierung) ist eine von:
    aenouyz(obwohl dies umgekehrt implementiert ist und mit einem Überschuss an Großbuchstaben)
    ... da die Worte alle Länge zwischen 1 und 11 der -299 - ten Index entspricht Verwenden der Zuordnung der Länge zum Index:{7:2; 8:5; 9:7; 11:9; else 1}

ḣ3Ẇf“QṘ°ḂżÐŒ#ḍæ09»s2¤Ȧ¬ȧØY⁾niyṖf⁽ż2ị$ - Link 1: list of characters, word
ḣ3                                    - head to index 3 (1st 3 characters, like 'abc')
  Ẇ                                   - all sublists (['a','b','c','ab','bc','abc']
                    ¤                 - nilad followed by link(s) as a nilad:
    “QṘ°ḂżÐŒ#ḍæ09»                    - compression of "bethlehem evets flaxenfoamaz"
                  s2                  - split into chunks of 2:
                                      -   be,th,le,he,m ,ev,et,s ,fl,ax,en,fo,am,az
   f                                  - filter keep (can only match 'ab' or 'bc')
                     Ȧ                - any and all (0 if empty, 1 if not)
                      ¬               - logical not
                        ØY            - consonant -y yield = "BCD...WXZbcd...wxz"
                          ⁾ni         - character pair = "ni" (no shrubbery for you!)
                             y        - translate (exchange the n for an i)
                              Ṗ       - pop (remove the z)
                       ȧ              - logical and
                                    $ - last two links as a monad:
                                ⁽ż2   -   base 250 literal = -299
                                   ị  -   index into the word
                               f      - filter keep

0,-2ịE¬ȧÇ - Main link: list of characters, word
0,-2      - pair zero with -2 = [0,-2]
    ị     - index into the word (last character and the one before the one before that)
     E    - all (both) equal?
      ¬   - logical not
        Ç - call the last link (1) as a monad
       ȧ  - logical and

13 Bytes, Score: 638

Ein erster kurzer Schlag (oben erweitert)

ØY⁾niyṖf⁽ż2ị$

0,-2bedeutet nicht, dass pair zero with -2es bedeutetliteral [0, -2]
Erik der Outgolfer

Aber es ist genau der gleiche Effekt: p
Jonathan Allan

nein, es ist kein 0,-2Nilad, nicht getrennt (0)(,)(-2)... natürlich ist es in diesem Fall der gleiche Effekt, aber nicht immer. Ich habe das auf die harte Tour gelernt ... und auf jeden Fall würde ich lieber erklären, was tatsächlich passiert, als etwas mit dem gleichen Effekt oder so.
Erik der Outgolfer

Wenn ich "join" anstatt "pair" geschrieben hätte, hätten Sie kommentiert "no join is j"?
Jonathan Allan

Ich könnte ein wenig pedantisch sein, aber pairoder joinsind offensichtlich falsche Wege Begriff es, da 0,-2,-6zum Beispiel bedeutet nicht , pair 0 with -2 and then pair that with -6 = [[0, -2], -6]sondern es eher Mittel literal [0, -2, -6]. Ich verstehe , das , Atom und das ...,...(,...(...)) Literal sind verwirrend ... aber es 0,-2,-6ist nicht ganz dasselbe, 0,-2;-6da das erstere 1 Link und das letztere 3 Links ist.
Erik der Outgolfer

2

Julia 34bytes, 609

f(w)=hash(w)&0x0800000000004808>0

Ich wollte mit dem eingebauten Hash Zeichen sparen. Ich habe das Gefühl, dass es einen Weg geben muss, dies besser zu machen. Julia ist einfach nicht freundlich genug mit den Bit-Banging-Operationen, mit denen ich das verbessern möchte, denke ich.

Das Finden geeigneter Bitmasken für den Hash, um sie zu trennen, ist ein interessantes Spiel.


Beste Lösung;)
Tamasgal

2

Python 2 , 50 Bytes, Genauigkeit: 596

lambda x:2<len(x)<7 or x[0]in"abcgmprs"or"st" in x

Probieren Sie es online!

Überprüft einfach den ersten Buchstaben, die Länge und ob "st" im Wort enthalten ist. Code geht davon aus, dass das Wort als x definiert ist. (Bearbeiten: Dank an issacg für das Korrigieren des Codes vom Snippet zur Funktion.)


Hallo, willkommen auf der Seite. Obwohl dies interessant ist, müssen die Einsendungen entweder Funktionen oder vollständige Programme sein. Dies ist ein Ausschnitt, der nicht erlaubt ist. Siehe dies Online ausprobieren! Link für eine Möglichkeit, dieses Snippet in eine Funktion zu konvertieren, während derselbe Code ausgeführt wird.
isaacg

2

Haskell, 36 Bytes, 626 631

f x=length x>2&&x!!0`notElem`"aenou"

643 wenn jemand eine kürzere Sprache hat:length x>2&&(x!!0`notElem`"aenou"||x!!1`elem`"acqrsty")
BlackCap

2

2-Level-Logikgatter-Implementierung, nicht 50 Bytes, Punktzahl 1000

  1. Verbinden Sie einfach die Binärdarstellung des angegebenen Wortes mit den 88 Eingängen

    1. Vervollständigen Sie das eingegebene Wort durch Leerzeichen auf der rechten Seite, wenn das Wort kürzer als 11 ist
    2. 8-Bit-ASCII-Code für jeden Buchstaben des Eingabeworts
  2. Die Schaltung gibt 1 zurück, wenn das Wort ein Substantiv ist, und 0, wenn nicht

  3. Die blauen gestrichelten Linien stehen für nie verwendete Eingaben

Diese Implementierung benötigt

  1. 48 Transistoren zum Codieren aller Inverter-Gates
  2. 1100 Transistoren zum Codieren aller UND-Gatter
  3. 154 Transistoren zum Codieren des ODER-Gatters
  4. Insgesamt 1302 Transistoren, was weniger als 28 Bytes entspricht.

Einige Messungen

  1. Ein Inverter- Gate benötigt 1 Transistor
  2. Ein einfaches ODER- Gatter mit 2 Eingängen benötigt 2 Transistoren
  3. Ein einfaches UND- Gatter mit 2 Eingängen benötigt 2 Transistoren
  4. Ein Bit benötigt 6 Transistoren

Bildbeschreibung hier eingeben

Volle Auflösung Circuit.pdf hier

Volle Auflösung Circuit.png hier


2
Könnten Sie bitte genau erläutern, wie Ihr System für die Codierung dieser Schaltung in Bytes aussieht? Ich bin sehr verwirrt, wie Sie behaupten, 28 * 8/1302 = 0,17 Bits pro Transistor zu verwenden.
isaacg

Da es sich bei meiner Lösung um eine sehr einfache Computerlösung handelt (Hardware statt Software), habe ich die Byte-Zählung auf Transistoren basiert. Aus Hardware-Sicht wird ein BIT von 6 Transistoren codiert, sodass davon ausgegangen werden kann, dass ein Transistor 1/6 Bit (ungefähr 0,17) darstellt.
mdahmoune

1
Ich verstehe Ihre Sichtweise, aber die 50-Byte-Code-Quelle muss irgendwo auf einer konkreten Hardware (Transistoren im Allgemeinen) existieren
mdahmoune

1
Es ist nicht nur eine Sichtweise - es ist eine Anforderung an die Herausforderung. Bitte kennzeichnen Sie Ihre Antwort als nicht konkurrierend, da sie nicht den Anforderungen entspricht, um an dieser Herausforderung teilzunehmen.
Isaacg

2
Eine einfache, unkomprimierte binäre Codierung der Informationen, die zum Wiederherstellen dieser Lösung erforderlich sind, könnte 2 Bits für den Typ jedes Logikgatters (3 verschiedene Gatter) und 10 Bits für jede Adresse der Eingänge und Ausgänge jedes Logikgatters (plus 675 Gatter) verwenden Ein- und Ausgänge). 2 * (48 + 550 + 77) + 10 * (2 * 48 + 3 * (550 + 77)) = 21120 Bits = 2640 Bytes.
Nnnes

1

Python 3, 50 Bytes, 602 Punkte

Python ist nicht die ausführlichste Sprache, aber 50 Bytes sind schwierig.

lambda x:all(x.count(y)<1for y in["ful","y","er"])
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.