Wörter, die Ziffern enthalten

20

Ein Ziffernwort ist ein Wort, bei dem nach dem Entfernen einiger Buchstaben möglicherweise eine der einzelnen Ziffern übrig bleibt: EINE, ZWEI, DREI, VIER, FÜNF, SECHS, SIEBEN, ACHT oder NEUN (nicht NULL).

Zum Beispiel sind BOUNCE und ANNOUNCE Ziffernwörter, da sie die Ziffer Eins enthalten.

ENCODE ist kein Ziffernwort, obwohl es ein O, N und E enthält, da diese nicht in Ordnung sind.

Schreiben Sie ein Programm / eine Funktion, die ein einzelnes Wort (in Groß- oder Kleinbuchstaben) als Eingabe oder einen Parameter verwendet und festlegt, ob es sich um ein Ziffernwort handelt. Machen Sie den Code so kurz wie möglich.

Wenn es sich bei dem Wort nicht um ein Ziffernwort handelt, sollten Sie "NEIN", "0" oder einen beliebigen "Falsch" -Wert zurückgeben (dies kann je nach Sprache variieren). Wenn das Wort ein Ziffernwort ist, sollten Sie die darin enthaltene Ziffer als Zahl ausgeben.

Sie können davon ausgehen, dass kein Wort mehr als eine Ziffer enthält, sodass Sie nichts wie ONFIVE haben.

Testfälle

BOUNCE
1

ENCODE
NO

EIGHT
8

BLACKJACK
NO

FABULOUS
NO

EXERCISE
NO

DRIFTWOOD
2

SERVICEMAN
7

INSIGNIFICANCE
9

THROWDOWN
2

ZERO
NO

OZNERO
1

Diese Herausforderung stammt aus Frage 1 von BIO 2009 (und ist eine sehr geringfügige Änderung von Frage 1) . Die meisten Testfälle stammen aus dem Notenschema .

0WJYxW9FMN
quelle
3
Ist es wirklich wichtig, dass wir nur Wörter in Großbuchstaben akzeptieren, oder können wir stattdessen Wörter in Kleinbuchstaben akzeptieren?
Greg Martin
6
NOFELINEVETenthält sowohl 5 als auch 9 ... was soll ich zurückgeben?
Titus
3
Können wir 0in dem Fall ohne gefundene Ziffern zurückkehren, auch wenn es in der Sprache der Wahl nicht falsch ist?
Nimi
@Titus: Aus den Regeln: "Sie können annehmen, dass keine Wörter mehr als eine Ziffer enthalten"
nimi
@ GregMartin Nun, ich denke, es fügt der Herausforderung nichts hinzu, also ist Kleinbuchstaben erlaubt. Ich habe es geändert.
0WJYxW9FMN

Antworten:

9

Javascript (ES6), 101 bis 99 Byte

f=
s=>-~'ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split` `.findIndex(x=>s.match([...x].join`.*`))
<!-- snippet demo: -->
<input list=l oninput=console.log(f(this.value))>
<datalist id=l><option value=BOUNCE>
<option value=ENCODE>
<option value=EIGHT>
<option value=BLACKJACK>
<option value=FABULOUS>
<option value=EXERCISE>
<option value=DRIFTWOOD>
<option value=SERVICEMAN>
<option value=INSIGNIFICANCE>
<option value=THROWDOWN>
<option value=ZERO>
<option value=OZNERO>

nderscore
quelle
7

PHP> = 7,0, 87 Bytes

<?for(;$i++<9;)levenshtein(IntlChar::charName("$i"),"DIGIT $argn",0,1,1)?:die("$i")?>NO

Wenn nur Zeichen von einer Ziffer als Wort zur Eingabe eingegeben werden, wird das Programm mit der Ziffer beendet. Oder ändern Sie die Reihenfolge, levenshtein("DIGIT $argn",IntlChar::charName("$i"),1,1,0)um die Löschungen von Zeichen nicht zu zählen

levenshtein

IntlChar :: charName

PHP> = 7,0, 112 Bytes

for(;$i<9;)$r+=++$i*preg_match("#".chunk_split(substr(IntlChar::charName("$i"),6),1,".*")."#",$argn);echo$r?:NO;

IntlChar :: charName

PHP, 128 Bytes

foreach([ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE]as$v)$r+=++$k*preg_match("#".chunk_split($v,1,".*")."#",$argn);echo$r?:NO;

Probieren Sie es online!

143 Bytes für mehr als 1 Ziffer

foreach([ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE]as$v)$r.=++$k*preg_match("#".chunk_split($v,1,".*")."#",$argn);echo+$r?strtr($r,[""]):NO;

Probieren Sie es online!

Jörg Hülsermann
quelle
1
foreach(...)$r+=++$k*preg_match(...);echo$r?:NO;(-1 Byte). chunk_split($v,1,".*")anstelle von join(...)(-2 Bytes).
Titus
@Titus sehr schöne idee mit dem ersatz mit dem chunk_splitich es noch nie gesehen habe. Sie sollten einen Eintrag in der Rubrik Tipps machen
Jörg Hülsermann
böse Idee! Um deine Frage zu beantworten: Ich schaue mir IntlChar::enumCharNames... morgen an.
Titus
2
levenshtein()scheint zu funktionieren: <?for(;$i++<9;)levenshtein(IntlChar::charName("$i"),"DIGIT $argn",0,1,1)?:die("$i")?>NO.
user63956
@ user63956 Tolle Idee Danke. Sie sollten es in den Abschnitt mit den Tipps aufnehmen, um
Untersequenzen
5

Python 3, 150 Bytes

from itertools import*;lambda x:([i for i in range(10)if(*' OTTFFSSENNWHOIIEIIEORUVXVGN  ERE EHE  E   NT '[i::9],)in[*combinations(x+'  ',5)]]+[0])[0]

combinationsGibt alle Kombinationen der Dinge in der richtigen Reihenfolge zurück. Es wäre einfacher, eine festgelegte Zahl für den zweiten Parameter von zu haben combinations, daher werden Leerzeichen an das Ende der ursprünglichen Zeichenfolge angehängt, die ein Parameter meines Lambdas ist. Das ist eine einfache Beschreibung, wie mein Eintrag funktioniert. Fragen Sie, ob Sie weitere Erläuterungen wünschen.

0WJYxW9FMN
quelle
5

Mathematica, 83 Byte (WindowsANSI-Codierung)

±w_:=Rest@Position[Subsets@w~Cases~#&/@Characters@*IntegerName~Array~9,Except@{},1]

Definiert eine unäre Funktion ±, die eine Liste von Kleinbuchstaben als Eingabe verwendet und entweder eine Ziffer in einer Form wie {{7}}oder eine leere Liste zurückgibt {}. Ich habe nicht das Gefühl, dass ich hier eine Menge Golf-Dinge gemacht habe, außer dass Characters@*IntegerName~Array~9die Nummernnamen -Übereinstimmungen generiert werden, nach denen gesucht werden muss, ohne sie hart zu codieren.

Anwendungsbeispiel:

±{"i", "n", "s", "i", "g", "n", "i", "f", "i", "c", "a", "n", "c", "e"}

Ausbeuten {{9}}.

Greg Martin
quelle
1
Bearbeitet, um die Verwendung zu klären
Greg Martin
4

Jelly , 31 28 Bytes

-2 Bytes jetzt, da die Eingabe in Kleinbuchstaben akzeptabel ist

“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»Ḳe€ŒPT

Ein vollständiges Programm, das die Eingabe von Kleinbuchstaben erwartet und das Ergebnis 0für die Groß- und Kleinschreibung ausgibt.

Als monadischer Link, der eine Liste von Zeichen 0aufnimmt, gibt er tatsächlich eine Liste von Ganzzahlen zurück, die eine einzelne Zahl im Falsey-Fall, eine einzelne Ganzzahl zwischen 1und 9einschließlich in den erwarteten Anwendungsfällen und mehrere solche Einträge in Fällen enthält, in denen mehr als eine Zahl in der existiert Wort.

Probieren Sie es online!

Wie?

“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»Ḳe€ŒPT - Main link: list of characters, s
“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»       - dictionary lookup of "one two three four five six seven eight nine"
                      Ḳ      - split on spaces
                         ŒP  - partitions of s
                       e€    - exists in? for €ach
                           T - truthy indexes
Jonathan Allan
quelle
Wie benutzt man komprimierte Strings ??? > _> Der Kompressor von Lynn funktioniert bei mir nicht, irgendwelche Tipps?
HyperNeutrino
Gehe in den Jelly Chatroom und poste den Fehler / das Problem.
Jonathan Allan
1
Großbuchstaben sind nicht erforderlich.
Erik der Outgolfer
3

Ruby + to_words : 49 48 + 12 = 61 60 Bytes

Verwendet die Fahnen -rto_words -n. Nimmt Kleinbuchstaben. Gibt zurück, nilwenn keine "Ziffer" gefunden wurde.

-1 Byte jetzt, da die Eingabe in Kleinbuchstaben zulässig ist, wodurch das iFlag auf der Regex entfernt werden kann.

p (1..9).find{|i|$_=~/#{i.to_words.chars*".*"}/}

Für eine reinere Ruby-Antwort ohne externe Edelsteine ​​sind 91 + 1 = 92 Bytes:

p (1..9).find{|i|$_=~/#{%w"0 ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE"[i].chars*".*"}/}
Wert Tinte
quelle
2

05AB1E , 26 Bytes

Der falsche Wert ist hier 0 .

æ‘€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘#å1k>

Erläuterung:

æ                           # Compute the powerset of the input
 ‘€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘       # Push "ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE"
                     #      # Break on spaces
                      å     # Check each for membership
                       1k   # Get the index of 1 in the array (-1 if not found)
                         >  # Increment by one

Verwendet die 05AB1E- Codierung. Probieren Sie es online! oder Überprüfen Sie alle Testfälle!

Adnan
quelle
2

Haskell, 113111 Bytes

import Data.List
last.((`elemIndices`([]:words"ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE"))=<<).subsequences

Probieren Sie es online!

Gibt zurück, 0wenn keine Ziffer gefunden wurde.

Suchen Sie alle Teilfolgen des eingegebenen Wortes in der Ziffernliste. Stellen Sie []am Index 0 eine leere Zeichenfolge voran, die Teil jeder Untersequenz ist. elemIndicesGibt eine Liste von Indizes zurück und =<<fasst sie zu einer einzigen Liste zusammen. Wählen Sie den letzten Index.

nimi
quelle
2

JavaScript (ES6), 121 Byte

f=
s=>[...s].map(c=>a=a.map(s=>s.slice(s[0]==c)),a=`ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE`.split` `)&&1+a.indexOf(``)
<input oninput=o.textContent=f(this.value)><pre id=o>0

Gibt die niedrigste erkannte Ziffer zurück oder 0wenn keine Ziffer erkannt wurde (+6, falls NOerforderlich).

Neil
quelle
2

Japt , 52 Bytes

1+`e two È(e fŒr five £x  v eight ͍`¸a@v fX¬q".*

Probieren Sie es online!

Luke
quelle
2

Retina , 160 126 120 Bytes

O.*N.*E
1
T.*W.*O
2
T.*H.*R.*E.*E
3
F.*O.*U.*R
4
F.*I.*V.*E
5
S.*I.*X
6
S.*E.*V.*E.*N
7
E.*I.*G.*H.*T
8
N.*I.*N.*E
9
\D

Probieren Sie es online!

Gibt eine leere Zeichenfolge zurück, wenn die Eingabe keine Ziffer enthält.

-6 Bytes dank @CalculatorFeline .

eush77
quelle
1 Byte speichern: verwenden 0statt NO.
CalculatorFeline
@CalculatorFeline Oder sogar eine leere Zeichenfolge, die 6 Zeichen speichert. Vielen Dank!
Eush77
1

PHP, 134 132 128 Bytes

<?=preg_match(strtr(chunk_split("#(ONE0TWO0THREE0FOUR0FIVE0SIX0SEVEN0EIGHT0NINE",1,".*"),[")|("]).")#",$argn,$m)?count($m)-1:NO;

Laufen Sie als Pipe mit -nFoder versuchen Sie es online .

Erstellt einen regulären Ausdruck mit den Wörtern in Klammern. dh jedes Wort Nist im Nth-Unterausdruck.
Wenn ein Wort gefunden wird, befindet sich die übereinstimmende Zeichenfolge im $m[0]und im Nth-Element, wobei die Elemente dazwischen leer und keine leere Zeichenfolge dahinter sind. dh $mhat N+1Elemente.

Titus
quelle
Großartig, ich liebe es
Jörg Hülsermann
1
Sie können 3 Bytes mit Ihrer eigenen Idee ein wenig verbessern <?=preg_match("#(".strtr(chunk_split(ONE0TWO0THREE0FOUR0FIVE0SIX0SEVEN0EIGHT0NINE,1,".*"),[")|("]).")#",$argn,$m)?count($m)-1:NO; Versuchen Sie es online!
Jörg Hülsermann
Können Sie meinen neuen Ansatz verwenden?
Jörg Hülsermann
1

Python , 148 Bytes

from itertools import*
lambda s:[tuple(w)in combinations(s,len(w))for w in("x ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE "+s).split()].index(1)%10

Eine unbenannte Funktion, die nur ein Wort in Großbuchstaben und die Ganzzahl ( 1bis 9) oder 0für zurückgibt NO.

Probieren Sie es online!

Wie?

Für eine Eingangskette sdurchläuft die Funktion durch eine Liste der Saiten: "x", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", und s. Sich der Suche nach irgendwelchen Streichhölzer *

Der verwendete Vergleich ist, ob diese Zeichenfolge weine ist, die aus einer Kombination von Buchstaben in der Reihenfolge der Eingabe gebildet werden kann. Die Funktion combinationserhält diese für uns (und nur diejenigen, die die erforderliche Länge verwenden len(w)), aber sie liegen in Form von Tupeln vor, sodass die Zeichenfolgen für den Vergleich in Tupel umgewandelt werden.

Von den elf Ergebnissen wird das für "x"immer sein False, während das für ssich immer sein wird True. Das "x"ist da, um sicherzustellen, dass der Index einer Übereinstimmung mit ONEthrough NINEden erforderlichen Werten entspricht (da Python-Listen 0-indiziert sind), das sist da, um sicherzustellen, dass der Aufruf von index(1)(synonym mit index(True)) nicht fehlschlägt, wenn kein Ziffernwort gefunden wurde, woraufhin das resultierende 10wird 0mit einem Modulo von zehn in ein umgewandelt %10.

* Wenn saus irgendeinem Grund Leerzeichen enthalten sind, ist die Liste der ws länger, der Vorgang funktioniert jedoch weiterhin, da die Ziffernwortübereinstimmungen auf die gleiche Weise funktionieren. Wenn keine übereinstimmen, wird die erste Teilzeichenfolge mit Leerzeichen sübereinstimmen und erneut angegeben 10und zurückkehren 0.

Wenn mehrstellige Wörter vorhanden sind, gibt die Funktion das minimale zurück.

Jonathan Allan
quelle
1

Java, 167 153 Bytes

s->{for(int i=0;i<9;)if(s.matches(".*"+"".join(".*","ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i++].split(""))+".*"))return i;return"NO";}

Eine eher naive Implementierung, passend zu Regex.

Test und ungolfed

import java.util.function.Function;

public class Main {

  public static void main(String[] args) {
    Function<String, Object> f = s -> {
      for (int i = 0; i < 9;) {
        if (s.matches(".*" + "".join(".*", "ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i++].split("")) + ".*")) {
          return i;
        }
      }
      return "NO";
    };

    String[] tests = {
      "BOUNCE",
      "ENCODE",
      "EIGHT",
      "BLACKJACK",
      "FABULOUS",
      "EXERCISE",
      "DRIFTWOOD",
      "SERVICEMAN",
      "INSIGNIFICANCE",
      "THROWDOWN",
      "ZERO",
      "OZNERO"
    };

    for (String test : tests) {
      System.out.printf("%s%n%s%n%n", test, f.apply(test));
    }
  }
}

Speichert

  • 167 -> 153: diverse optimierungen dank @KevinCruijssen
Olivier Grégoire
quelle
1
Sie verwenden nur das Array einmal, so dass Sie verwenden können , "ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i].split("")direkt in der for-Schleife, und loszuwerden String[]N=und ;. Und Sie können weitere 2 Bytes sparen, indem Sie die Reihenfolge der for-Schleife ändern: for(int i=0;i<9;)Verwenden Sie [i++]anstelle [i]der if-Prüfung, und entfernen Sie die +1in der Rückgabe.
Kevin Cruijssen
Sie können , indem ein weiteres Byte speichern "".joinzu s.join.
Kevin Cruijssen
1

Bash , 163 Bytes

a=NO;case $1 in *O*N*E*)a=1;;*T*W*O*)a=2;;*T*H*R*E*E*)a=3;;*F*O*U*R*)a=4;;*F*I*V*E*)a=5;;*S*I*X*)a=6;;*S*E*V*E*N*)a=7;;*E*I*G*H*T*)a=8;;*N*I*N*E*)a=9;;esac;echo $a

Probieren Sie es online!

a=NO;
case $1 in
 *O*N*E*)a=1;;
 *T*W*O*)a=2;;
 *T*H*R*E*E*)a=3;;
 *F*O*U*R*)a=4;;
 *F*I*V*E*)a=5;;
 *S*I*X*)a=6;;
 *S*E*V*E*N*)a=7;;
 *E*I*G*H*T*)a=8;;
 *N*I*N*E*)a=9;;
esac;
echo $a

Ich kenne RETINA nicht, aber es scheint ein klarer Beweis für diese Antwort zu sein.

marcosm
quelle
versuchte zu reduzieren *mit ‚s j=0;for i in ONE TWO .. ; do ((j++)); printf "%s)a=%s;;" $(sed 's/./\*&\*/g' <<<$i) $j ; done war aber länger
marcosm
0

Javascript, 121 Bytes

(s,a=0)=>'ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split``.map((p,i)=>RegExp(p.split``.join`.*`).exec(s)?a=i+1:0)&&a

oder 116

(s,a=0)=>' ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split` `.map((p,i)=>a|=~s.search(p.split``.join`.*`)&&i)&&a

Aber an dieser Stelle nur Material recyceln.

Steve Bennett
quelle
0

Pyth, -44- 41 Bytes

+1xm}dyQc."EX%~)Û#lº,îQÓCe¯4Aô4"\P1

Nimmt einen String in Anführungszeichen und gibt 0 für NO aus.

Versuch es!

Erläuterung

+1xm}dyQc."EX%~)Û#lº,îQÓCe¯4Aô4"\P1
         ."EX%~)Û#lº,îQÓCe¯4Aô4"      # Compressed string: "ONEPTWOPTHREEPFOURPFIVEPSIXPSEVENPEIGHTPNINE" (P is close to the other letters, makes the compression better)
        c                       \P    # split on P: ['ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE']
   m                                  # map over this list (variable: d)
    }dyQ                              # is d a (ordered) subset of the input (Q)? (= element of the powerset)
  x                                1  # get the index of the first true
+1                                    # add one, because the list was indexed at 0 and conveniently -1 (not found) becomes 0 
KarlKastor
quelle
0

Java, 254 Bytes

int g(String a,String b){int i=0,p=0;for(char c:a.toCharArray()){p=i;i=b.indexOf(c);if(i<=p)return 0;}return 1;}
String f(String a){String[]T={"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"};for(String t:T)if(g(t,a)>0)return t;return"NO";}

Versuchen Sie es online

boolean g(String a,String b)
{
    int i = 0, p = 0;
    for(char c:a.toCharArray())
    {
        p = i;
        i = b.indexOf(c);
        if(i <= p) return false;
    }
    return true;
}

String f(String a)
{
    String[]T={"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"};
    for(String t:T)if(g(t,a))return t;
    return"NO";
}
Khaled.K
quelle
0

C 198 Bytes

Versuchen Sie es online

char*T[]={"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"};
g(char*a,char*b){while(*a&*b)a+=(*b++==*a);return!*a;}
i;char*f(char*b){for(i=0;i<9;i++)if(g(T[i],b))return T[i];return"NO";}
Khaled.K
quelle
0

Python 2, 155 Bytes

import re;lambda k:next((i for i,j in enumerate([re.search('.*'.join(list(s)),k)for s in'ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split()])if j),-1)+1

Eine anonyme Funktion, die nach einer regulären Gruppe sucht. Nicht die beste Lösung hier in Python, sondern eine Alternative.

Gábor Fekete
quelle