Слова, содержащие цифры


20

Цифровое слово - это слово, в котором после возможного удаления некоторых букв у вас остается одна из единичных цифр: ОДНА, ДВА, ТРИ, ЧЕТЫРЕ, ПЯТЬ, ШЕСТЬ, СЕМЬ, ВОСЕМЬ или ДЕВЯТЬ (не ноль).

Например, BOUNCE и ANNOUNCE являются цифрами, так как они содержат цифру один.

ENCODE не является цифровым словом, даже если оно содержит O, N и E, поскольку они не в порядке.

Напишите программу / функцию, которая принимает одно (прописное или строчное - вы выбираете) слово в качестве ввода или параметра и определяет, является ли оно цифровым словом. Сделайте код максимально коротким.

Если слово не является цифрой, вы должны вернуть «НЕТ», 0 или любое другое значение «ложь» (это может варьироваться в зависимости от вашего языка). Если слово является цифровым словом, вы должны вывести содержащуюся в нем цифру в виде числа.

Вы можете предположить, что никакие слова не содержат более одной цифры, поэтому у вас не будет ничего похожего на 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

Эта задача взята из (и является очень незначительной модификацией) Вопроса 1 из BIO 2009 . Большинство тестовых случаев взяты из схемы оценки .


3
Действительно ли важно, что мы принимаем только заглавные слова, или мы можем вместо этого принимать строчные слова?
Грег Мартин

6
NOFELINEVETсодержит как 5, так и 9 ... что я должен вернуть?
Тит

3
Можем ли мы вернуться 0в случае отсутствия цифр, даже если это не фальшиво на выбранном языке?
Ними

@Titus: от правил: «Вы можете считать , что никакие слова не содержат более одной цифры»
Ними

@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

Если для ввода введены только символы из одной цифры в виде слова, выйдите из программы с этой цифрой. Или измените порядок, чтобы 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;

Попробуйте онлайн!

143 байта для более чем 1 цифры

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 байта).
Тит

@ Титус очень хорошая идея с заменой chunk_splitя никогда не видел ее раньше. Вы должны сделать запись в разделе советов
Jörg Hülsermann

злая идея! Чтобы ответить на ваш вопрос: я посмотрю 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возвращает все комбинации вещей в порядке. Было бы проще иметь номер набора для второго параметра 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букв и печатает результат, используя для случая фальси.

Как монадическая ссылка, берущая список символов, она на самом деле возвращает список целых чисел, который содержит единственное число 0в случае Фалси, одно целое число между 1и 9включительно в ожидаемых случаях использования и несколько таких записей в случаях, когда в слово.

Попробуйте онлайн!

Как?

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

Как вы используете сжатые строки ??? > _> Компрессор Линн у меня не работает, какие-нибудь советы?
HyperNeutrino

Зайдите в чат Jelly и опубликуйте сообщение об ошибке / проблеме.
Джонатан Аллан

1
Прописные буквы не требуются.
Эрик Outgolfer

3

Ruby + 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

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если цифра не обнаружена (+6, если NOтребуется).



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

Попробуйте онлайн!

Возвращает пустую строку, если на входе нет цифры.

-6 байт благодаря @CalculatorFeline .


Сохранение 1 байта: используйте 0вместо NO.
CalculatorFeline

@CalculatorFeline Или даже пустая строка, которая является 6-символьным сохранением. Благодарность!
eush77

1

PHP 134 132 128 байт

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

запустить как трубу с -nFили попробуйте онлайн .

Создает регулярное выражение со словами в скобках; т.е. каждое слово Nнаходится в Nпод-выражении th.
Если слово найдено, соответствующая строка будет в $m[0]и в Nэлементе th с элементами между ними пустыми и без пустой строки позади; т.е. $mимеет N+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) ), но они имеют форму кортежей, поэтому строки сравниваются в кортежи для сравнения.

Из одиннадцати результатов "x"всегда будет Falseодин для, а для sсебя - всегда True. Здесь "x"есть, чтобы убедиться, что индекс совпадения со ONEсквозными NINEзначениями являются необходимыми (поскольку списки Python имеют 0-индексированный индекс), он sслужит для того, чтобы гарантировать, что вызов index(1)(синонимичный index(True)) не завершится неудачно, когда не найдено ни одно цифровое слово, после чего результирующий 10преобразуется в по 0модулю десять с использованием %10.

* Если 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("")непосредственно в цикле for и избавиться от String[]N=и ;. И вы можете сохранить дополнительные 2 байта, изменив порядок цикла for:, for(int i=0;i<9;)используйте [i++]вместо [i]if в проверке и избавьтесь от +1возврата.
Кевин Круйссен

Вы можете сохранить другой байт, изменив "".joinна s.join.
Кевин Круйссен

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

Не знаю РЕТИНА, но кажется, что это прямой ответ.


пытался уменьшить *это с, 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

Принимает строку в кавычках, выводит 0 для NO.

Попытайся!

объяснение

+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

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, но альтернативный способ.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.