숫자가 포함 된 단어


20

숫자 단어는 일부 문자를 제거한 후에 하나, 두 개, 세 개, 네 개, 다섯 개, 여섯 개, 일곱 개, 여덟 개 또는 나인 (ZERO 아님) 중 하나의 숫자로 남겨진 단어입니다.

예를 들어 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
대문자 만 허용하는 것이 중요합니까, 아니면 소문자를 허용하도록 선택할 수 있습니까?
Greg Martin

6
NOFELINEVET5와 9가 모두 포함되어 있습니다. 무엇을 반환해야합니까?
Titus

3
우리는 반환 할 수 0는 선택한 언어로 falsey 아닌 경우에도 노 자리 발견 된 경우?
nimi

@Titus : 규칙에서 : "한 단어 이상의 숫자를 포함한다고 가정 할 수 없습니다"
nimi

@GregMartin 글쎄, 그것은 도전에 아무것도 추가하지 않는 것 같아요. 그렇습니다. 소문자는 허용됩니다. 나는 그것을 바꿨다.
0WJYxW9FMN 16:19에

답변:


9

자바 스크립트 (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

한 자리에서 문자를 입력으로 문자 만 삽입 한 경우에는 숫자로 프로그램을 종료하십시오. 또는 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

@Titus는 chunk_split내가 본 적이없는 대체품으로 아주 좋은 아이디어입니다 . 당신은 팁 섹션에 입력해야합니다
Jörg Hülsermann

사악한 생각! 귀하의 질문에 대답하기 위해 : 나는 IntlChar::enumCharNames내일을 살펴볼 것입니다.
Titus

2
levenshtein()작동하는 것 같습니다 : <?for(;$i++<9;)levenshtein(IntlChar::charName("$i"),"DIGIT $argn",0,1,1)?:die("$i")?>NO.
user63956

@ user63956 감사합니다. 감사합니다. 하위 시퀀스를 찾으려면 팁 섹션에 추가해야합니다.
Jörg Hülsermann

5

파이썬 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사물의 모든 조합을 순서대로 반환합니다. 의 두 번째 매개 변수에 설정된 숫자를 사용하는 것이 더 간단 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
사용법을 명확히하기 위해 편집
Greg Martin

4

젤리 , 31 28 바이트

소문자 입력이 허용되는 -2 바이트

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

소문자 입력을 예상 0하고 잘못된 경우를 사용하여 결과를 인쇄하는 전체 프로그램입니다 .

문자 목록을 가져 오는 모나드 링크로서 실제로 0거짓 인 경우 단일 , 예상 사용 사례 사이의 포함 된 단일 정수 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의 압축기가 작동하지 않습니다. 팁이 있습니까?
HyperNeutrino

젤리 대화방으로 가서 오류 / 문제를 게시하십시오.
Jonathan Allan

1
대문자는 필요하지 않습니다.
아웃 골퍼 Erik 14

3

루비 + to_words : 49 48 + 12 = 61 60 바이트

플래그를 사용합니다 -rto_words -n. 소문자를 사용합니다. nil"숫자"가 없으면 반환 합니다.

-1 바이트는 이제 소문자 입력이 허용 i되어 정규 표현식 에서 플래그를 제거 할 수 있습니다.

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

외부 보석이없는 더 순수한 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

하스켈, 113111 바이트

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

온라인으로 사용해보십시오!

0숫자가 없으면 반환 합니다.

숫자 목록에서 입력 단어의 모든 서브 시퀀스를 찾으십시오. []모든 하위 시퀀스의 일부인 인덱스 0에 빈 문자열 을 추가하십시오 . elemIndices인덱스 목록을 반환하고 =<<단일 목록으로 병합합니다. 마지막 색인을 선택하십시오.


2

자바 스크립트 (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)를 반환 합니다.




1

PHP, 134132128 바이트

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

파이프로 실행 -nF하거나 온라인으로 사용해보십시오 .

괄호 안의 단어로 정규식을 만듭니다. 즉, 각 단어 NN하위 표현에 있습니다.
단어가 발견되면 일치하는 문자열은 th 요소 $m[0]안에 있고 그 안에 N있는 요소는 비어 있고 빈 문자열은 없습니다. 즉 요소 $mN+1있습니다.


대단하다
Jörg Hülsermann

1
당신은 약간의 개선으로 자신의 아이디어로 3 바이트를 절약 할 수 있습니다 <?=preg_match("#(".strtr(chunk_split(ONE0TWO0THREE0FOUR0FIVE0SIX0SEVEN0EIGHT0NINE,1,".*"),[")|("]).")#",$argn,$m)?count($m)-1:NO; 온라인으로 사용해보십시오!
Jörg Hülsermann 2016 년

나의 새로운 접근법을 사용할 수 있습니까?
Jörg Hülsermann 1

1

파이썬 , 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)하지만) 튜플 형태이므로 문자열은 비교를 위해 튜플로 캐스팅됩니다.

열한 결과 중 하나 "x"는 항상False 이고 s그 자체는 항상 그렇습니다 True. (가) "x"와 일치의 인덱스 확인하기 위해이 ONE를 통해 NINE(파이썬리스트이기 때문에-인덱스 0) 필요한 값입니다을의이 s호출하기 위해이 index(1)(동의어를 index(True)더 자리 단어 그러자 그 결과, 발견되지 않은 경우) 실패 못해 100사용하여 모듈로가 10 인 a로 변환됩니다 %10.

* 경우 s, 목록 어떤 이유로 공백이 포함 된 wS가 더 길어질 수 있지만 프로세스가 계속 작업 숫자 단어 일치 같은 방식으로 작동하기 때문에, 그리고 아무도에서 첫 번째 공간 분할 문자열과 일치하지 않는 경우 것입니다 s일치를 다시 한번 제공 10그리고 반환 0합니다.

여러 자리 단어가 있으면 함수는 최소 단어를 반환합니다.


1

자바, 167153 바이트

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-loop :의 순서를 변경하여 추가 2 바이트를 절약 할 수 있고 if-check 대신에 for(int i=0;i<9;)사용 하고 return에서를 제거 할 수 있습니다. [i++][i]+1
케빈 크루이 센

로 변경 "".join하여 다른 바이트를 저장할 수 있습니다 s.join.
Kevin Cruijssen

1

배쉬 , 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

자바 스크립트, 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, -45- 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

자바, 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

파이썬 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

정규식 그룹을 검색하는 익명 함수 파이썬에서 가장 좋은 해결책은 아니지만 다른 방법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.