Słowa, które zawierają cyfry

20

Słowo cyfrowe to słowo, w którym po ewentualnym usunięciu niektórych liter pozostaje jedna z pojedynczych cyfr: JEDNA, DWA, TRZY, CZTERY, PIĘĆ, SZEŚĆ, SIEDEM, OSIEM lub DZIEWIĘĆ (nie ZERO).

Na przykład BOUNCE i ANNOUNCE są cyframi, ponieważ zawierają cyfrę jeden.

ENCODE nie jest słowem cyfrowym, mimo że zawiera O, N i E, ponieważ nie są w porządku.

Napisz program / funkcję, która jako dane wejściowe lub parametr przyjmuje pojedyncze (wielkie lub małe litery - wybierasz) słowo i określa, czy jest to słowo cyfrowe. Ustaw kod tak krótko, jak to możliwe.

Jeśli słowo nie jest cyfrem, powinieneś zwrócić „NIE”, 0 lub dowolną wartość „falsey” (może się to różnić w zależności od języka). Jeśli słowo to jest cyfrą, powinieneś podać cyfrę, którą zawiera, jako liczbę.

Możesz założyć, że żadne słowa nie zawierają więcej niż jednej cyfry, więc nie będziesz mieć czegoś takiego jak ONFIVE.

Przypadki testowe

BOUNCE
1

ENCODE
NO

EIGHT
8

BLACKJACK
NO

FABULOUS
NO

EXERCISE
NO

DRIFTWOOD
2

SERVICEMAN
7

INSIGNIFICANCE
9

THROWDOWN
2

ZERO
NO

OZNERO
1

To wyzwanie zostało zaczerpnięte z (i jest bardzo niewielką modyfikacją) pytania 1 z BIO 2009 . Większość przypadków testowych pochodzi z systemu oceny .

0WJYxW9FMN
źródło
3
Czy to naprawdę ważne, że akceptujemy tylko wielkie litery, czy może zamiast tego możemy zaakceptować małe litery?
Greg Martin
6
NOFELINEVETzawiera zarówno 5, jak i 9 ... co mam zwrócić?
Tytus
3
Czy możemy powrócić 0w przypadku braku cyfr, nawet jeśli nie jest to fałsz w wybranym języku?
nimi
@Tytus: z zasad: „Możesz założyć, że żadne słowa nie zawierają więcej niż jednej cyfry”
nimi
@GregMartin Cóż, myślę, że to nie dodaje niczego do wyzwania, więc tak, małe litery są dozwolone. Zmieniłem to.
0WJYxW9FMN

Odpowiedzi:

9

JavaScript (ES6), 101 99 bajtów

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
źródło
7

PHP> = 7.0, 87 bajtów

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

Jeśli wstawione zostaną tylko znaki z jednej cyfry jako słowa na wejście, wyjdź z programu za pomocą cyfry. Lub zmień kolejność, aby levenshtein("DIGIT $argn",IntlChar::charName("$i"),1,1,0)nie liczyć usunięcia znaków

lewenshtein

IntlChar :: charName

PHP> = 7.0, 112 bajtów

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

IntlChar :: charName

PHP, 128 bajtów

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

Wypróbuj online!

143 bajtów na więcej niż 1 cyfrę

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;

Wypróbuj online!

Jörg Hülsermann
źródło
1
foreach(...)$r+=++$k*preg_match(...);echo$r?:NO;(-1 bajt). chunk_split($v,1,".*")zamiast join(...)(-2 bajtów).
Tytus
@Titus bardzo fajny pomysł z zamiennikiem na chunk_splitNigdy wcześniej go nie widziałem. Powinieneś zrobić wpis w dziale porad
Jörg Hülsermann
nikczemny pomysł! Aby odpowiedzieć na twoje pytanie: spojrzę na IntlChar::enumCharNames... jutro.
Tytus
2
levenshtein()wydaje się działać: <?for(;$i++<9;)levenshtein(IntlChar::charName("$i"),"DIGIT $argn",0,1,1)?:die("$i")?>NO.
user63956
@ user63956 Świetny pomysł Dziękujemy. powinieneś dodać go do sekcji wskazówek, aby znaleźć podsekwencje
Jörg Hülsermann
5

Python 3, 150 bajtów

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]

combinationszwraca wszystkie kombinacje rzeczy w kolejności. Łatwiej byłoby mieć ustawioną liczbę dla drugiego parametru combinations, więc spacje są dodawane na końcu oryginalnego ciągu, który jest parametrem mojej lambda. To prosty opis działania mojego wpisu. Zapytaj, czy chcesz uzyskać więcej wyjaśnień.

0WJYxW9FMN
źródło
5

Mathematica, 83 bajty (kodowanie WindowsANSI)

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

Definiuje jednoargumentową funkcję, ±która pobiera listę małych liter jako dane wejściowe i zwraca cyfrę w formie podobnej {{7}}lub pustą listę {}. Nie wydaje mi się, żebym zrobił tu mnóstwo golfowych rzeczy, z wyjątkiem tego, że Characters@*IntegerName~Array~9generuje dopasowania liczbowe bez szukania ich na stałe .

Przykładowe użycie:

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

daje {{9}}.

Greg Martin
źródło
1
Edytowane w celu wyjaśnienia sposobu użytkowania
Greg Martin
4

Galaretka , 31 28 bajtów

-2 bajty teraz, gdy małe litery są akceptowane

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

Pełny program, który oczekuje małych liter i wypisuje wynik, używając 0dla przypadku falsey.

Jako monadyczny link pobierający listę znaków, faktycznie zwraca listę liczb całkowitych, która zawiera jeden 0w przypadku falsey, pojedynczą liczbę całkowitą pomiędzy oczekiwanymi przypadkami użycia 1i 9włącznie, oraz wiele takich wpisów w przypadkach, gdy w słowo.

Wypróbuj online!

W jaki sposób?

“¡¦ẇṆ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
źródło
Jak korzystać ze skompresowanych ciągów ??? > _> Kompresor Lynn nie działa dla mnie, jakieś wskazówki?
HyperNeutrino
Wejdź do pokoju rozmów Jelly i opublikuj błąd / problem.
Jonathan Allan
1
Wielkie litery nie są wymagane.
Erik the Outgolfer
3

Ruby + to_words : 49 48 + 12 = 61 60 bajtów

Używa flag -rto_words -n. Przyjmuje małe litery. Zwraca, niljeśli nie znaleziono „cyfry”.

-1 bajt teraz, gdy dozwolone jest wprowadzanie małych liter, co pozwala na usunięcie iflagi z wyrażenia regularnego.

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

Aby uzyskać czystszą Rubinową odpowiedź bez zewnętrznych klejnotów, 91 + 1 = 92 bajty:

p (1..9).find{|i|$_=~/#{%w"0 ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE"[i].chars*".*"}/}
Wartość tuszu
źródło
2

05AB1E , 26 bajtów

Falsy ma tutaj wartość 0 .

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

Wyjaśnienie:

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

Wykorzystuje kodowanie 05AB1E . Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe!

Adnan
źródło
2

Haskell, 113 111 bajtów

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

Wypróbuj online!

Zwraca, 0jeśli nie znaleziono cyfry.

Znajdź wszystkie podsekwencje słowa wejściowego na liście cyfr. Przygotuj pusty ciąg []o indeksie 0, który jest częścią każdego podsekwencji. elemIndiceszwraca listę indeksów i =<<spłaszcza je w jedną listę. Wybierz ostatni indeks.

nimi
źródło
2

JavaScript (ES6), 121 bajtów

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

Zwraca najniższą wykrytą cyfrę lub 0jeśli nie wykryto żadnej cyfry (+6, jeśli NOjest wymagana).

Neil
źródło
2

Japt , 52 bajty

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

Wypróbuj online!

Luke
źródło
2

Siatkówka , 160 126 120 bajtów

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

Wypróbuj online!

Zwraca pusty ciąg, jeśli dane wejściowe nie zawierają cyfry.

-6 bajtów dzięki @CalculatorFeline .

eush77
źródło
Zapis 1 bajtowy: użyj 0zamiast NO.
CalculatorFeline
@CalculatorFeline Lub nawet pusty ciąg znaków, który jest zapisaniem 6 znaków. Dzięki!
eush77
1

PHP, 134 132 128 bajtów

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

uruchom jako potok z -nFlub spróbuj online .

Tworzy wyrażenie regularne ze słowami w nawiasach; tzn. każde słowo Njest w Npodwyrażeniu th.
Jeśli słowo zostanie znalezione, dopasowany ciąg będzie w $m[0]i w Nelemencie th, z elementami między nimi pustymi i bez pustych ciągów; tzn. $mma N+1elementy.

Tytus
źródło
Świetnie, uwielbiam to
Jörg Hülsermann
1
Możesz zapisać 3 bajty z własnym pomysłem, nieco ulepszyć <?=preg_match("#(".strtr(chunk_split(ONE0TWO0THREE0FOUR0FIVE0SIX0SEVEN0EIGHT0NINE,1,".*"),[")|("]).")#",$argn,$m)?count($m)-1:NO; Wypróbuj online!
Jörg Hülsermann
Czy możesz zastosować moje nowe podejście?
Jörg Hülsermann
1

Python , 148 bajtów

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

Funkcja bez nazwy, która bierze tylko wielkie litery i zwraca liczbę całkowitą ( 1do 9) lub 0dla NO.

Wypróbuj online!

W jaki sposób?

Dla ciągu wejściowego sfunkcja przechodzi przez listę ciągów: "x", "ONE", "TWO","THREE" , "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", i s. Sam szuka jakichkolwiek meczów *

Stosowane porównanie dotyczy tego, czy ten ciąg, wto taki, który może być utworzony z kombinacji liter w kolejności od wejścia. Funkcja combinationspobiera je dla nas (i tylko tych o wymaganej długości używa len(w)), ale są one w postaci krotek, więc łańcuchy są rzutowane na krotki dla porównania.

Z jedenastu wyników "x"zawsze będzie ten False, dla którego szawsze będzie True. Ma "x"to na celu zapewnienie, że indeks dopasowania z parametrem ONEthrough NINEjest wymaganymi wartościami (ponieważ listy w języku Python są indeksowane jako 0), właściwośćs jest tam, aby zapewnić połączenie do index(1)(synonim index(True)) przyzwyczajenie zawieść, gdy nie cyfra słowo zostało znalezione, po czym Otrzymana 10jest konwertowany na 0modulo dziesięciu przy użyciu %10.

* Gdyby s z jakiegoś powodu zawiera spacje, lista ws będzie dłuższa, ale proces będzie nadal działał, ponieważ dopasowania słów w cyfrach będą działać w ten sam sposób, a jeśli żadne nie pasuje do pierwszego podciągu z podziałem spacji sbędzie pasować, ponownie dając 10i wracam 0.

Jeśli istnieją słowa wielocyfrowe, funkcja zwróci słowo minimalne.

Jonathan Allan
źródło
1

Java, 167 153 bajtów

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";}

Raczej naiwna implementacja, pasująca do wyrażenia regularnego.

Przetestuj i bez golfa

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

Oszczędza

  • 167 -> 153: różne optymalizacje dzięki @KevinCruijssen
Olivier Grégoire
źródło
1
Używasz tablicy tylko raz, więc możesz użyć jej "ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i].split("")bezpośrednio w pętli for i pozbyć się String[]N=i ;. I możesz zapisać dodatkowe 2 bajty, zmieniając kolejność pętli for:, for(int i=0;i<9;)użyj [i++]zamiast [i]w sprawdzaniu if i pozbądź się +1w zamian.
Kevin Cruijssen
Możesz zapisać kolejny bajt, zmieniając "".joinna s.join.
Kevin Cruijssen
1

Bash , 163 bajty

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

Wypróbuj 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

Nie znam RETINY, ale wydaje się, że to prosta odpowiedź.

marcosm
źródło
próbował zmniejszyć *, j=0;for i in ONE TWO .. ; do ((j++)); printf "%s)a=%s;;" $(sed 's/./\*&\*/g' <<<$i) $j ; done ale był dłuższy
marcosm
0

JavaScript, 121 bajtów

(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

lub 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

Ale w tym momencie wystarczy recykling materiału.

Steve Bennett
źródło
0

Pyth, -44- 41 bajtów

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

Pobiera cytowany ciąg, zwraca 0 dla NIE.

Spróbuj!

wyjaśnienie

+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
źródło
0

Java, 254 bajty

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";}

Wypróbuj 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
źródło
0

C, 198 bajtów

Wypróbuj 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
źródło
0

Python 2, 155 bajtów

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

Anonimowa funkcja wyszukująca grupę wyrażeń regularnych. Nie najlepsze rozwiązanie w Pythonie, ale alternatywny sposób.

Gábor Fekete
źródło