Слова, що містять цифри


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: з правил: "Ви можете припустити, що жодне слово не містить більше однієї цифри"
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

Якщо виконуються лише вставки символів з однієї цифри як слово на вхід, вийдіть із програми з цифрою. Або змінити порядок 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 байти).
Тит

@Titus дуже приємна ідея із заміною на chunk_splitніколи я її ще не бачив. Ви повинні зробити запис у розділі порад
Йорг Гюльсерманн

нечестива ідея! Щоб відповісти на ваше запитання: я вивчу IntlChar::enumCharNames... завтра.
Тит

2
levenshtein()Здається , на роботу: <?for(;$i++<9;)levenshtein(IntlChar::charName("$i"),"DIGIT $argn",0,1,1)?:die("$i")?>NO.
користувач63956

@ 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

Математика, 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

Як ви використовуєте стислі рядки ??? > _> Компресор від Lynn не працює для мене, будь-які поради?
HyperNeutrino

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

1
Великі регістри не потрібні.
Ерік Атголфер

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-му під виразі.
Якщо слово знайдено, відповідна рядок буде знаходитись у $m[0]та- Nму елементі, причому елементи між ними порожні, а порожній рядок позаду; тобто $mмає N+1елементи.



1
Ви можете заощадити 3 байти за допомогою власної ідеї, дещо покращити <?=preg_match("#(".strtr(chunk_split(ONE0TWO0THREE0FOUR0FIVE0SIX0SEVEN0EIGHT0NINE,1,".*"),[")|("]).")#",$argn,$m)?count($m)-1:NO; Спробуйте в Інтернеті!
Йорг Гюльсерманн

Чи можете ви використовувати мій новий підхід?
Йорг Гюльсерманн

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

Безіменна функція, яка приймає лише великі слова та повертає ціле число ( 1до 9) або 0для 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перетворюється в a 0з модулем десять за допомогою %10.

* Якщо sмістять пробілу з деяких причин, список wз буде більше, але процес все одно буде працювати , так як цифра слово матчі будуть працювати точно так само, і якщо ніхто не співпаде з першою космічною роздвоєнням підрядка з 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-loop:, for(int i=0;i<9;)використовуйте [i++]замість [i]if-check і позбудьтесь +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

Не знаю, RETINA, але здається, що це відповідь прямо.


спробували скоротити *'s, j=0;for i in ONE TWO .. ; do ((j++)); printf "%s)a=%s;;" $(sed 's/./\*&\*/g' <<<$i) $j ; done але було довше
маркосм

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.