Rakam İçeren Kelimeler


20

Rakam kelimesi, bazı harfleri kaldırdıktan sonra, tek rakamlardan biriyle kaldığınız bir kelimedir: BİR, İKİ, ÜÇ, DÖRT, BEŞ, ALTI, YEDİ, SEKİZ veya DOKUZ (SIFIR değil).

Örneğin, BOUNCE ve ANNOUNCE basamaklı kelimelerdir, çünkü bir basamak içerirler.

ENCODE, sıralı olmadıkları için O, N ve E içermelerine rağmen bir rakam sözcüğü değildir.

Girdi veya parametre olarak tek (büyük veya küçük - seçtiğiniz) bir kelimeyi alan ve bir rakam sözcüğü olup olmadığını belirleyen bir program / işlev yazın. Kodu olabildiğince kısa yapın.

Sözcük basamaklı bir kelime değilse, 'HAYIR', 0 veya herhangi bir 'falsey' değeri döndürmelisiniz (bu, dilinize bağlı olarak değişebilir). Sözcük rakamdan oluşuyorsa, içerdiği rakamı sayı olarak çıkarmalısınız.

Hiçbir kelimenin birden fazla basamak içermediğini varsayabilirsiniz, böylece ONFIVE gibi bir şey elde edemezsiniz.

Test Durumları

BOUNCE
1

ENCODE
NO

EIGHT
8

BLACKJACK
NO

FABULOUS
NO

EXERCISE
NO

DRIFTWOOD
2

SERVICEMAN
7

INSIGNIFICANCE
9

THROWDOWN
2

ZERO
NO

OZNERO
1

Bu zorluk BIO 2009'dan Soru 1'den alınmıştır (ve çok küçük bir değişikliktir) . Test vakalarının çoğu işaret şemasından alınır .


3
Yalnızca büyük harfleri kabul etmemiz gerçekten önemli mi yoksa onun yerine küçük harfleri de kabul edebilir miyiz?
Greg Martin

6
NOFELINEVEThem 5 hem de 9 içerir ... ne dönmeliyim?
Titus

3
0Seçtiğiniz dilde yanlış olmasa bile, basamaksız bulunan davaya geri dönebilir miyiz ?
nimi

@Titus: kurallardan: "Hiçbir kelimenin birden fazla basamak içermediğini varsayabilirsiniz"
nimi

@GregMartin Sanırım zorluğa hiçbir şey eklemiyor, bu yüzden evet, küçük harfe izin var. Ben değiştirdim.
19WJYxW9FMN

Yanıtlar:


9

Javascript (ES6), 101 99 bayt

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 Bayt

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

Yalnızca bir basamaktan girişe sözcük olarak karakter ekleme işlemi yapılırsa, basamaktan programdan çıkın. Veya levenshtein("DIGIT $argn",IntlChar::charName("$i"),1,1,0)karakterlerin silinmesini saymamak için sıralamayı değiştirin

levenshtein

IntlChar :: charName

PHP> = 7,0, 112 Bayt

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

IntlChar :: charName

PHP, 128 Bayt

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

Çevrimiçi deneyin!

1 basamaktan fazla 143 bayt

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;

Çevrimiçi deneyin!


1
foreach(...)$r+=++$k*preg_match(...);echo$r?:NO;(-1 bayt). chunk_split($v,1,".*")yerine join(...)(-2 bayt).
Titus

@Titus çok güzel bir fikir ile değiştirme ile chunk_splitdaha önce hiç görmedim. İpuçları bölümüne bir giriş
yapmalısınız

kötü fikir! Sorunuzu cevaplamak için: IntlChar::enumCharNamesYarın bir göz atacağım .
Titus

2
levenshtein()işe görünüyor: <?for(;$i++<9;)levenshtein(IntlChar::charName("$i"),"DIGIT $argn",0,1,1)?:die("$i")?>NO.
user63956

@ user63956 Harika bir fikir Teşekkür ederim. alt
yazıları

5

Python 3, 150 bayt

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şeylerin tüm kombinasyonlarını sırayla döndürür. İkinci parametresi için ayarlanmış bir sayıya sahip olmak daha basit olurdu combinations, bu yüzden lambda'mın bir parametresi olan orijinal dizenin sonuna boşluklar eklenir. Bu, girişimin nasıl çalıştığının basit bir açıklaması. Daha fazla açıklama yapmak isteyip istemediğinizi sorun.


5

Mathematica, 83 bayt (WindowsANSI kodlaması)

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

±Küçük harflerin bir listesini giriş olarak alan ve bir rakam, benzeri bir form {{7}}veya boş bir liste döndüren tekli bir işlevi tanımlar {}. Burada bir sürü golf işi yaptığımı düşünmüyorum, ancak Characters@*IntegerName~Array~9bunları zor kodlamadan aramak için sayı adı eşleşmeleri oluşturur.

Örnek kullanım:

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

verim {{9}}.


1
Kullanımı açıklığa kavuşturmak için düzenlendi
Greg Martin

4

Jöle , 31 28 bayt

-2 bayt şimdi küçük harf girişi kabul edilebilir

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

0Falsey durumunu kullanarak küçük harf girişi bekleyen ve sonucu basan tam bir program .

Karakterlerin listesini alarak Birli bağlantı olarak aslında tek içeren sayının bir liste döndürür 0Falsey durumda, tek bir tamsayı arasında 1ve 9durumlarda beklenen kullanım durumları kapsayıcı ve çoklu tür girişler birden fazla numara var nerede sözcüğü.

Çevrimiçi deneyin!

Nasıl?

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

Sıkıştırılmış dizeleri nasıl kullanıyorsunuz ??? > _> Lynn'in kompresörü benim için çalışmıyor, ipucu var mı?
HyperNeutrino

Jelly sohbet odasına gidin ve hatayı / sorunu gönderin.
Jonathan Allan

1
Büyük harf gerekli değildir.
Outgolfer Erik

3

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

Bayrakları kullanır -rto_words -n. Küçük kelimeler alır. nil"Basamak" bulunmazsa döndürür .

-1 bayt şimdi küçük harf girişine izin verildi, ibu da regex üzerindeki bayrağın kaldırılmasına izin verdi .

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

Harici taşlar olmadan daha saf bir Ruby cevabı için 91 + 1 = 92 bayt:

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

2

05AB1E , 26 bayt

Buradaki falsy değeri 0'dır .

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

Açıklama:

æ                           # 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 kodlamasını kullanır . Çevrimiçi deneyin! veya Tüm test senaryolarını doğrulayın!


2

Haskell, 113 111 bayt

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

Çevrimiçi deneyin!

İade 0Hiçbir rakam bulunursa.

Rakam listesinde giriş kelimesinin tüm alt sıralarını bulun. Her dizinin bir []parçası olan 0 dizinine boş bir dize ekleyin . elemIndicesbir indeks listesi döndürür ve =<<tek bir liste halinde düzeltir. Son dizini seçin.


2

JavaScript (ES6), 121 bayt

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

Algılanan en düşük basamağı veya 0herhangi bir basamak algılanmadıysa döndürür (gerekirse +6 NO).



2

Retina , 160 126 , 120 bayt

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

Çevrimiçi deneyin!

Giriş bir rakam içermiyorsa boş bir dize döndürür.

@CalculatorFeline sayesinde -6 bayt .


1 bayt kaydetme: 0yerine kullanın NO.
CalculatorFeline

@CalculatorFeline Veya 6 karakterlik bir tasarruf olan boş bir dize. Teşekkürler!
eush77

1

PHP, 134121128 bayt

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

boru olarak çalıştırın -nFveya çevrimiçi deneyin .

Parantez içindeki kelimelerle normal ifade oluşturur; yani her kelime N, Nth alt-ifadesindedir.
Bir kelime bulunursa, eşleşen dize th öğesinin içinde $m[0]ve içinde olur, Naralarındaki öğeler boştur ve arkasında boş bir dize olmaz; yani $mvar N+1elemanları.


Harika, çok seviyorum
Jörg Hülsermann, 18:17

1
Kendi fikrinizle 3 Bayt tasarruf edebilirsiniz biraz geliştirin <?=preg_match("#(".strtr(chunk_split(ONE0TWO0THREE0FOUR0FIVE0SIX0SEVEN0EIGHT0NINE,1,".*"),[")|("]).")#",$argn,$m)?count($m)-1:NO; Çevrimiçi deneyin!
Jörg Hülsermann

Yeni yaklaşımımı kullanabilir misiniz?
Jörg Hülsermann

1

Python , 148 bayt

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

Yalnızca büyük harfli bir kelime alan ve tamsayıyı ( 1to 9) veya 0için döndüren adsız bir işlev NO.

Çevrimiçi deneyin!

Nasıl?

Bir giriş dizesi için s fonksiyon dizisi listesi içinden geçtiği: "x", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", ve s. Kendisinin herhangi maçları arayan *

Kullanılan karşılaştırma, bu dizginin, wgirişten sırayla bir harf kombinasyonundan oluşturulabileceğidir. Fonksiyon combinationsbunları bizim için (ve sadece gerekli uzunlukta olanları len(w)) alır, ancak tuples formundadır, bu nedenle dizeler karşılaştırma için tuples'e dökülür.

On bir sonuçtan biri "x"her zaman olacak False, skendisi için her zamanTrue . "x"Bir maçın indeksi sağlamak için orada ONEaracılığıyla NINE(Python listeleri olduğundan-endeksli 0) gerekli değerlerdir, siçin çağrı sağlamak için vardır index(1)(eş anlamlı index(True)hiçbir haneli kelime bunun üzerine Oluşan, bulunduğunda) başarısız olmaz "On" bir modulo ile a'ya 10dönüştürülür .0%10

* Herhangi bir snedenden dolayı boşluklar içeriyorsa, ws listesi daha uzun olacaktır, ancak basamaklı kelime eşleşmeleri aynı şekilde çalışacağı için işlem yine de çalışacaktır ve hiçbiri ilk boşluk bölünmüş alt dizeyle seşleşmezse eşleşir, bir kez daha verir 10ve geri dönüyor 0.

Birden fazla basamaklı kelime varsa, işlev en küçük kelimeyi döndürür.


1

Java, 167 153 bayt

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

Regex ile eşleşen oldukça naif bir uygulama.

Test ve çözülmemiş

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

kaydeder

  • 167 -> 153: @KevinCruijssen sayesinde çeşitli optimizasyonlar

1
Yalnızca kullanabilmesi için, bir kez diziyi kullanmak "ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i].split("")için-döngü içinde doğrudan ve kurtulmak String[]N=ve ;. Ve for-loop'un sırasını değiştirerek ek 2 bayt kaydedebilirsiniz: if-check yerine for(int i=0;i<9;)kullanın ve dönüşte kurtulun . [i++][i]+1
Kevin Cruijssen

Sen değiştirerek başka byte kaydedebilirsiniz "".joiniçin s.join.
Kevin Cruijssen

1

Bash , 163 bayt

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

Çevrimiçi deneyin!

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 bilmiyorum ama bu cevabın düz bir liman gibi görünüyor.


azaltmak için çalıştı *'ile s j=0;for i in ONE TWO .. ; do ((j++)); printf "%s)a=%s;;" $(sed 's/./\*&\*/g' <<<$i) $j ; done ama daha uzundu
marcosm

0

Javascript, 121 bayt

(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

veya 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

Ama sadece bu noktada malzeme geri dönüşümü.


0

Pyth, -44-41 bayt

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

Alıntılanan bir dize alır, NO için 0 çıktılar.

Dene!

açıklama

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

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

Çevrimiçi Deneyin

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 bayt

Çevrimiçi Deneyin

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 bayt

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

Normal ifade grubunu arayan anonim bir işlev. Burada Python'daki en iyi çözüm değil, alternatif bir yol.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.