Kata-kata yang Berisi Digit

20

Kata digit adalah kata di mana, setelah menghapus beberapa huruf, Anda hanya memiliki satu digit: SATU, DUA, TIGA, EMPAT, LIMA, ENAM, TUJUH, DELAPAN, DELAPAN atau SEMBILAN (bukan NOL).

Misalnya, BOUNCE dan ANNOUNCE adalah kata digit, karena mengandung kata digit.

ENCODE bukan kata digit, meskipun mengandung O, N dan E, karena mereka tidak berurutan.

Tulis program / fungsi yang menggunakan satu kata (huruf besar atau kecil - Anda pilih) sebagai input atau parameter dan menentukan apakah itu kata digit. Buat kode sesingkat mungkin.

Jika kata tersebut bukan kata digit, Anda harus mengembalikan nilai 'TIDAK', 0 atau 'falsey' (ini dapat bervariasi berdasarkan bahasa Anda). Jika kata itu adalah kata digit, Anda harus menampilkan digit yang dikandungnya, sebagai angka.

Anda dapat berasumsi bahwa tidak ada kata yang mengandung lebih dari satu digit, sehingga Anda tidak akan memiliki sesuatu seperti ONFIVE.

Uji Kasus

BOUNCE
1

ENCODE
NO

EIGHT
8

BLACKJACK
NO

FABULOUS
NO

EXERCISE
NO

DRIFTWOOD
2

SERVICEMAN
7

INSIGNIFICANCE
9

THROWDOWN
2

ZERO
NO

OZNERO
1

Tantangan ini diambil dari (dan sedikit modifikasi) dari Pertanyaan 1 dari BIO 2009 . Sebagian besar kasus uji diambil dari skema tanda .

0WJYxW9FMN
sumber
3
Apakah benar-benar penting bahwa kita hanya menerima kata-kata besar, atau bisakah kita memilih untuk menerima kata-kata kecil?
Greg Martin
6
NOFELINEVETmengandung 5 dan 9 ... apa yang harus saya kembalikan?
Titus
3
Bisakah kita kembali 0dalam case no-digit-found bahkan jika itu bukan kepalsuan dalam bahasa pilihan?
nimi
@Titus: dari aturan: "Anda dapat berasumsi bahwa tidak ada kata yang mengandung lebih dari satu digit"
nimi
@GregMartin Ya, saya kira itu tidak menambah tantangan, jadi ya, huruf kecil diperbolehkan. Saya sudah mengubahnya.
0WJYxW9FMN

Jawaban:

9

Javascript (ES6), 101 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
sumber
7

PHP> = 7.0, 87 Bytes

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

Jika hanya penyisipan karakter dari satu digit sebagai kata ke input selesai keluar dari program dengan digit. Atau ubah urutan untuk levenshtein("DIGIT $argn",IntlChar::charName("$i"),1,1,0)tidak menghitung penghapusan karakter

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;

Cobalah online!

143 Bytes untuk lebih dari 1 digit

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;

Cobalah online!

Jörg Hülsermann
sumber
1
foreach(...)$r+=++$k*preg_match(...);echo$r?:NO;(-1 byte). chunk_split($v,1,".*")bukannya join(...)(-2 byte).
Titus
@Itus ide yang sangat bagus dengan penggantian dengan chunk_splitsaya belum pernah melihatnya sebelumnya. Anda harus membuat entri di bagian tips
Jörg Hülsermann
ide jahat! Untuk menjawab pertanyaan Anda: Saya akan melihat IntlChar::enumCharNames... besok.
Titus
2
levenshtein()tampaknya pekerjaan: <?for(;$i++<9;)levenshtein(IntlChar::charName("$i"),"DIGIT $argn",0,1,1)?:die("$i")?>NO.
user63956
@ user63956 Ide bagus Terima kasih. Anda harus menambahkannya ke bagian tips untuk menemukan bagian selanjutnya
Jörg Hülsermann
5

Python 3, 150 byte

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]

combinationsmengembalikan semua kombinasi hal-hal secara berurutan. Akan lebih mudah untuk memiliki nomor yang ditetapkan untuk parameter kedua combinations, jadi spasi ditambahkan ke akhir string asli yang merupakan parameter dari lambda saya. Itulah deskripsi sederhana tentang cara kerja entri saya. Tanyakan apakah Anda ingin klarifikasi lagi.

0WJYxW9FMN
sumber
5

Mathematica, 83 byte (Pengodean WindowsANSI)

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

Menentukan fungsi unary ±yang mengambil daftar karakter huruf kecil sebagai input dan mengembalikan digit, dalam bentuk seperti {{7}}, atau daftar kosong {}. Saya tidak merasa seperti saya melakukan banyak hal golf di sini, kecuali yang Characters@*IntegerName~Array~9menghasilkan pencocokan nama-nomor untuk mencari tanpa hard-coding mereka.

Contoh penggunaan:

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

hasil panen {{9}}.

Greg Martin
sumber
1
Diedit untuk memperjelas penggunaan
Greg Martin
4

Jelly , 31 28 byte

-2 byte sekarang sehingga input huruf kecil dapat diterima

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

Program lengkap yang mengharapkan input huruf kecil dan mencetak hasilnya, gunakan 0untuk case falsey.

Sebagai tautan monadik yang mengambil daftar karakter, ia sebenarnya mengembalikan daftar bilangan bulat yang berisi satu 0dalam kasus falsey, satu integer di antara 1dan 9termasuk dalam kasus penggunaan yang diharapkan dan beberapa entri seperti dalam kasus di mana lebih dari satu angka ada di kata.

Cobalah online!

Bagaimana?

“¡¦ẇṆ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
sumber
Bagaimana Anda menggunakan string terkompresi ??? > _> Kompresor oleh Lynn tidak bekerja untuk saya, ada tips?
HyperNeutrino
Kepala ke chatroom Jelly dan memposting kesalahan / masalah.
Jonathan Allan
1
Huruf besar tidak diperlukan.
Erik the Outgolfer
3

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

Menggunakan bendera -rto_words -n. Mengambil kata-kata kecil. Kembali niljika tidak ada "angka" yang ditemukan.

-1 byte sekarang sehingga input huruf kecil diperbolehkan, memungkinkan untuk penghapusan iflag pada regex.

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

Untuk jawaban Ruby yang lebih murni tanpa permata eksternal, 91 + 1 = 92 byte:

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

05AB1E , 26 byte

Nilai falsy di sini adalah 0 .

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

Penjelasan:

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

Menggunakan penyandian 05AB1E . Cobalah online! atau Verifikasi semua kasus uji!

Adnan
sumber
2

Haskell, 113 111 byte

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

Cobalah online!

Kembali 0jika tidak ada digit yang ditemukan.

Temukan semua bagian selanjutnya dari kata input dalam daftar digit. Tambahkan string kosong []pada indeks 0 yang merupakan bagian dari setiap urutan. elemIndicesmengembalikan daftar indeks dan =<<meratakannya menjadi satu daftar. Pilih indeks terakhir.

nimi
sumber
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

Mengembalikan digit terendah yang terdeteksi atau 0jika tidak ada digit yang terdeteksi (+6 jika NOdiperlukan).

Neil
sumber
2

Japt , 52 byte

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

Cobalah online!

Luke
sumber
2

Retina , 160 126 120 byte

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

Cobalah online!

Mengembalikan string kosong jika input tidak mengandung digit.

-6 byte terima kasih kepada @CalculatorFeline .

eush77
sumber
Hemat 1 byte: gunakan 0alih-alih NO.
CalculatorFeline
@ CalculatorFeline Atau bahkan string kosong yang merupakan 6 char save. Terima kasih!
eush77
1

PHP, 134 132 128 byte

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

dijalankan sebagai pipa dengan -nFatau coba online .

Membuat regex dengan kata-kata dalam tanda kurung; yaitu setiap kata Ndalam Nsub-ekspresi th.
Jika sebuah kata ditemukan, string yang cocok akan berada di $m[0]dan di Nelemen th, dengan elemen di antara mereka kosong dan tidak ada string kosong di belakang; yaitu $mmemiliki N+1elemen.

Titus
sumber
Hebat aku suka itu
Jörg Hülsermann
1
Anda dapat menyimpan 3 Bytes dengan ide Anda sendiri sedikit meningkatkan <?=preg_match("#(".strtr(chunk_split(ONE0TWO0THREE0FOUR0FIVE0SIX0SEVEN0EIGHT0NINE,1,".*"),[")|("]).")#",$argn,$m)?count($m)-1:NO; Coba online!
Jörg Hülsermann
Bisakah Anda menggunakan pendekatan baru saya?
Jörg Hülsermann
1

Python , 148 byte

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

Fungsi tanpa nama mengambil hanya huruf besar dan mengembalikan integer ( 1ke 9), atau 0untuk NO.

Cobalah online!

Bagaimana?

Untuk string masukan sfungsi melintasi melalui daftar string: "x", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", dans . Sendiri mencari setiap pertandingan *

Perbandingan yang digunakan adalah apakah string ini w,, adalah yang dapat dibentuk dari kombinasi huruf sesuai urutan dari input. Fungsi combinationsmendapatkan ini untuk kita (dan hanya yang menggunakan panjang yang diperlukanlen(w) ), tetapi mereka dalam bentuk tupel, sehingga string dilemparkan ke tupel untuk perbandingan.

Dari sebelas hasil, satu untuk "x"selalu False, sedangkan satu untuk situ sendiri akan selalu True. Di "x"sana untuk memastikan indeks kecocokan dengan ONEmelalui NINEadalah nilai-nilai yang diperlukan (karena daftar Python diindeks 0), sada di sana untuk memastikan panggilan ke index(1)(identik dengan index(True)) tidak akan gagal ketika tidak ada kata angka ditemukan, dimana hasilnya dihasilkan 10dikonversi menjadi 0dengan modulo menggunakan sepuluh%10 .

* Jika smengandung spasi karena alasan tertentu, daftar ws akan lebih panjang, tetapi prosesnya masih akan bekerja karena angka yang cocok akan bekerja dengan cara yang sama, dan jika tidak ada yang cocok dengan substring spasi-pemisahan pertama sakan cocok, sekali lagi memberikan 10dan kembali 0.

Jika ada beberapa digit kata, fungsi akan mengembalikan yang minimal.

Jonathan Allan
sumber
1

Java, 167 153 byte

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

Implementasi yang agak naif, cocok dengan regex.

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

Menghemat

  • 167 -> 153: berbagai optimasi berkat @KevinCruijssen
Olivier Grégoire
sumber
1
Anda hanya menggunakan array sekali, jadi Anda bisa menggunakan "ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i].split("")langsung di for-loop, dan singkirkan String[]N=dan ;. Dan Anda dapat menyimpan 2 byte tambahan dengan mengubah urutan for-loop:, for(int i=0;i<9;)gunakan [i++]alih-alih [i]dalam if-check, dan singkirkan +1dalam pengembalian.
Kevin Cruijssen
Anda dapat menyimpan byte lain dengan mengubah "".joinke s.join.
Kevin Cruijssen
1

Pesta , 163 byte

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

Cobalah 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

Tidak tahu RETINA tetapi tampaknya jawaban langsung dari jawaban itu.

marcosm
sumber
mencoba mengurangi *denganj=0;for i in ONE TWO .. ; do ((j++)); printf "%s)a=%s;;" $(sed 's/./\*&\*/g' <<<$i) $j ; done tetapi lebih lama
marcosm
0

Javascript, 121 byte

(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

atau 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

Tetapi hanya bahan daur ulang pada saat ini.

Steve Bennett
sumber
0

Pyth, -44- 41 bytes

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

Mengambil string yang dikutip, menghasilkan 0 untuk TIDAK.

Cobalah!

penjelasan

+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
sumber
0

Java, 254 byte

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

Coba 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
sumber
0

C, 198 byte

Coba 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
sumber
0

Python 2, 155 byte

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

Fungsi anonim mencari grup regex. Bukan solusi terbaik di sini dengan Python tetapi cara alternatif.

Gábor Fekete
sumber