数字を含む言葉


20

数字の単語は、いくつかの文字を削除した後、1、2、3、4、5、6、7、8、9のいずれか1つの数字が残る単語です(ゼロではありません)。

たとえば、BOUNCEとANNOUNCEは数字の単語を含むため、数字の単語です。

ENCODEは、O、N、およびEを含んでいるにもかかわらず、数字ではありません。それらは順序が正しくないためです。

入力またはパラメーターとして単一の(大文字または小文字-選択)単語を受け取り、それが数字単語かどうかを判別するプログラム/関数を作成します。コードをできるだけ短くしてください。

単語が数字の単語でない場合は、「NO」、0、または「falsey」値を返す必要があります(これは言語によって異なる場合があります)。単語が数字の単語である場合、それに含まれる数字を数字として出力する必要があります。

単語に複数の数字が含まれていないと想定できるため、ONFIVEのようなものはありません。

テストケース

BOUNCE
1

ENCODE
NO

EIGHT
8

BLACKJACK
NO

FABULOUS
NO

EXERCISE
NO

DRIFTWOOD
2

SERVICEMAN
7

INSIGNIFICANCE
9

THROWDOWN
2

ZERO
NO

OZNERO
1

この課題は、BIO 2009の質問1から抜粋したものです(非常にわずかな修正です)。ほとんどのテストケースは、マークスキームから取得されます。


3
大文字のみを受け入れることは本当に重要ですか、それとも小文字を受け入れることを選択できますか?
グレッグマーティン

6
NOFELINEVET5と9の両方が含まれています...何を返す必要がありますか?
タイタス

3
0選択した言語で偽りではない場合でも、数字が見つからない場合に戻ることができますか?
-nimi

@Titus:ルールから:「あなたは何の単語が1桁以上含まれていないと仮定することができます」
nimi

@GregMartinまあ、それはチャレンジに何も追加しないと思うので、はい、小文字は許可されます。変更しました。
0WJYxW9FMN

回答:


9

Javascript(ES6)、101 99バイト

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>


7

PHP> = 7.0、87バイト

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

1つの数字から入力への単語としての文字の挿入のみが行われる場合、その数字でプログラムを終了します。またはlevenshtein("DIGIT $argn",IntlChar::charName("$i"),1,1,0)、文字の削除ではなくカウントするように順序を変更します

レベンシュタイン

IntlChar :: charName

PHP> = 7.0、112バイト

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

IntlChar :: charName

PHP、128バイト

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

オンラインでお試しください!

1桁以上の場合は143バイト

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;

オンラインでお試しください!


1
foreach(...)$r+=++$k*preg_match(...);echo$r?:NO;(-1バイト)。chunk_split($v,1,".*")代わりにjoin(...)(-2バイト)。
タイタス

@Titusとの非常に良いアイデアは、chunk_splitこれまで見たことのないものです。ヒントセクションにエントリを作成する必要があります
ヨルクヒュルサーマン

邪悪なアイデア!あなたの質問に答えるために:IntlChar::enumCharNames明日...を見てみましょう。
タイタス

2
levenshtein()動作しているようです:<?for(;$i++<9;)levenshtein(IntlChar::charName("$i"),"DIGIT $argn",0,1,1)?:die("$i")?>NO
user63956

@ user63956素晴らしいアイデアありがとうございます。サブシーケンスを見つけるためにヒントセクションに追加する必要があります
ヨルグヒュルサーマン

5

Python 3、150バイト

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]

combinations物事のすべての組み合わせを順番に返します。の2番目のパラメーターに番号を設定する方が簡単なcombinationsので、ラムダのパラメーターである元の文字列の末尾にスペースが追加されます。それは私のエントリーがどのように機能するかの簡単な説明です。さらに説明が必要かどうかを尋ねます。


5

Mathematica、83バイト(WindowsANSIエンコーディング)

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

±入力として小文字のリストを受け取り、などの形式の数字{{7}}または空のリストのいずれかを返す単項関数を定義します{}。ここで大量のゴルフのようなことをした気はありませんが、Characters@*IntegerName~Array~9ハードコーディングせずに検索する番号と名前の一致を生成します。

使用例:

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

収量{{9}}


1
使用法を明確にするために編集
グレッグマーティン

4

ゼリー31 28 バイト

小文字の入力が受け入れられる-2バイト

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

0偽の場合に使用して、小文字の入力を予期し、結果を出力する完全なプログラム。

文字のリストを取る単項リンクとして実際に単一が含まれている整数のリストを返し0falseyの場合、単一の間の整数19予想されるユースケースと複数の数が中に存在する場合には、複数のそのようなエントリに包含をワード。

オンラインでお試しください!

どうやって?

“¡¦ẇṆ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

圧縮された文字列の使用方法??? > _> Lynnのコンプレッサーは動作しません、ヒントはありますか?
ハイパーニュートリノ

Jellyチャットルームに行き、エラー/問題を投稿してください。
ジョナサンアラン

1
大文字は必要ありません。
エリックアウトゴルファー

3

Ruby + to_words49 48 + 12 = 61 60バイト

フラグを使用し-rto_words -nます。小文字を取ります。nil「数字」が見つからない場合に返します。

小文字の入力が許可さiれ、正規表現のフラグを削除できるようになった-1バイト。

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

外部gemを使用しない、より純粋なRubyの回答の場合、91 + 1 = 92バイト:

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

2

05AB1E、26バイト

ここでの偽の値は0です。

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

説明:

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

05AB1Eエンコードを使用します。オンラインでお試しください!またはすべてのテストケースを検証してください!


2

Haskell、113 111バイト

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

オンラインでお試しください!

0数字が見つからない場合に返します。

数字のリストで入力語のすべてのサブシーケンスを検索します。[]すべてのサブシーケンスの一部であるインデックス0に空の文字列を追加します。 elemIndicesインデックスのリストを返し、=<<それらを単一のリストにフラット化します。最後のインデックスを選択します。


2

JavaScript(ES6)、121バイト

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

検出された最下位の桁を返します。0桁が検出されなかった場合NO(必要な場合は+6 )を返します。



2

網膜160の 126 120バイト

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

オンラインでお試しください!

入力に数字が含まれていない場合は、空の文字列を返します。

@CalculatorFelineのおかげで-6バイト。


1バイトの保存:の0代わりに使用しますNO
CalculatorFeline

@CalculatorFelineまたは、6文字の保存である空の文字列です。ありがとう!
eush77

1

PHP、134132128バイト

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

でパイプとして実行する-nF、オンラインで試してください

括弧内の単語で正規表現を作成します。すなわち、各単語NNth部分式にあります。
単語が見つかった場合、マッチした文字列は、になります$m[0]し、中にNそれらの間の要素空にして、背後には空の文字列で、番目の要素。すなわち$mN+1要素があります。


私はそれが大好きです
ヨルクヒュルサーマン

1
あなたはあなた自身のアイデアで3バイトを節約することができます少し改善して<?=preg_match("#(".strtr(chunk_split(ONE0TWO0THREE0FOUR0FIVE0SIX0SEVEN0EIGHT0NINE,1,".*"),[")|("]).")#",$argn,$m)?count($m)-1:NO; くださいオンラインで試してみてください!
ヨルクヒュルサーマン

私の新しいアプローチを使用できますか?
ヨルクヒュルサーマン

1

Python、148バイト

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

大文字のみの単語を取り、整数(1to 9)または0for を返す名前のない関数NO

オンラインでお試しください!

どうやって?

入力文字列の場合はs関数は、文字列のリストを横断:"x""ONE""TWO""THREE""FOUR""FIVE""SIX""SEVEN""EIGHT""NINE"、とs。自分自身がどんな試合を探して*

使用される比較は、この文字列wが入力からの文字の組み合わせから形成される可能性があるかどうかです。関数combinationsはこれらを取得します(必要な長さのもののみを使用してlen(w))が、それらはタプルの形式であるため、文字列は比較のためにタプルにキャストされます。

11の結果のうちの1つ"x"は常にありますがFalsesそれ自身のための1つは常にですTrue"x"マッチのインデックスを確実にするために存在するONEスルーNINE(Pythonのリストは0インデックスであるため)に必要な値である、sへの呼び出しを保証することがあるindex(1)(と同義ではindex(True)ない桁ワードが得られ、そこで、見つからなかった場合に)失敗習慣10は、0を使用して10の法でaに変換され%10ます。

* IFがs何らかの理由でスペースのリストが含まwsが長くなりますが、プロセスはまだ仕事桁の単語ので、マッチは同じように動作しますし、どれも一致しない場合から部分第一の空間分割をs与え、再び、一致します10そして戻る0

複数の数字の単語が存在する場合、関数は最小の数字を返します。


1

Java、167 153バイト

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

正規表現に一致するかなり単純な実装。

テストおよび未使用

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

保存する

  • 167-> 153:@KevinCruijssenによるさまざまな最適化

1
あなただけが使用できるように、一度配列を使用する"ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i].split("")ためのループに直接、および取り除くString[]N=;。:そして、あなたはforループの順序を変更することにより、追加の2つのバイトを保存することができfor(int i=0;i<9;)、使用[i++]の代わりに、[i]IF-チェック中に、そして取り除く+1リターンで。
ケビンCruijssen

に変更"".joinすると、別のバイトを保存できますs.join
ケビンCruijssen

1

Bash、163バイト

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

オンラインでお試しください!

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

RETINAを知らないが、その答えのまっすぐなポートのようです。


を減らしよう*としましj=0;for i in ONE TWO .. ; do ((j++)); printf "%s)a=%s;;" $(sed 's/./\*&\*/g' <<<$i) $j ; done たが、長かった
-marcosm

0

Javascript、121バイト

(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

または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

しかし、この時点で材料をリサイクルするだけです。


0

Pyth、-44- 41のバイト

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

引用符で囲まれた文字列を受け取り、NOの場合は0を出力します。

それを試してみてください!

説明

+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 

0

Java、254バイト

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

オンラインで試す

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

0

C、198バイト

オンラインで試す

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

0

Python 2、155バイト

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

正規表現グループを検索する匿名関数。ここでのPythonでの最良の解決策ではなく、別の方法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.